Как разрешить аттрибут onclick? [решено для модуля views]

Главные вкладки

Аватар пользователя Лампочка Лампочка 16 декабря 2009 в 13:51

обнаружила, что некий глобальный друпаловский фильтр срезает многие аттрибуты и некоторые теги даже когда их добавляет администратор, например при выводе вьюз или в "сообщении внизу сайта".

Например, пишу в "сообщении внизу сайта" на странице admin/settings/site-information такой код
<a href="#" onclick="blabla" style="blabla">ссылка</a>

а на выходе получаю
<a href="#">ссылка</a>

Как с этим бороться? Разрешила все таги во всех фильтрах, ничего не помогает.

Комментарии

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 16 декабря 2009 в 14:11

Внизу сайта скорее всего никак, так как вроде все такие "настроечные" поля проходят через функцию
filter_xss_admin().
В вашем случае решение может быть таким: сделать регион в подвале и туда вывести блок с нужной вам надписью

Аватар пользователя Лампочка Лампочка 16 декабря 2009 в 14:35

На самом деле низ сайта я привела для примера. Мне надо добавить онклик в вывод вьюз. По-видимому, он тоже проходит через filter_xss_admin(). А возможно ли эту функцию как-то похакать?...

Аватар пользователя Лампочка Лампочка 16 декабря 2009 в 14:52

Мне надо, чтобы название материала выводилось кастомно, ставлю галочку в "Rewrite the output of this field" и пишу там:
<a href="#" onclick="blablabla">[title]</a>

Это надо для того, чтобы при клике на название открывалось другое поле (в онклике будет джаваскриптик небольшой)

Можно ли похакать красиво? Т.е. не лезть в views_handler_field.inc, а как-то, не трогая модуля? Помогут ли в этом случае темплейты? (я спрашиваю, потому что ни разу не делала этого)

Аватар пользователя Лампочка Лампочка 16 декабря 2009 в 16:11

Спасибо! Надеюсь, будет время заморочиться. Найденный "нехороший", но рабочий вариант расслабляет.
А где можно почитать о вставлении функций? в advanced_help?

Аватар пользователя Northruler Northruler 16 декабря 2009 в 18:21

Я ведь в самом начале дал ссылку, - пользуйтесь техникой ненавязчивого яваскрипт. В хтмл-коде не должно быть никаких обработчиков. Все выводится во внешний файл.

Аватар пользователя Лампочка Лампочка 17 декабря 2009 в 11:32

gorr, внимательно прочитала, попробовала перенести функцию

  function render_altered($alter, $tokens) {
    // Filter this right away as our substitutions are already sanitized.
    $value = filter_xss_admin($alter['text']);
    $value = strtr($value, $tokens);

    return $value;
  }

которая находится в файле views\includes\views_handler_field.inc
в template.php моей темы и убрать оттуда filter_xss_admin

Но ничего не работает. Только если убрать фильтр в самом views_handler_field.inc

Аватар пользователя Лампочка Лампочка 17 декабря 2009 в 11:40

Vetlan, а для этого надо подключать jQuery?

В любом случае, мне этот код надо внутрь, потому что он использует Token, я не думю, что значения [nid] и [field_coursedesc_value] можно вынести в отдельный джаваскрипт-файл.

<a href="#" onclick="document.getElementById('expand_[nid]').style.display='block';">open</a>
<div id="expand_[nid]" style="display:none;">[field_coursedesc_value]</div>
Аватар пользователя Dan Dan 17 декабря 2009 в 16:43
<div id="expand_[nid]">
  <a href="/node/[nid]">open</a>
  <div>[field_coursedesc_value]</div>
</div>

css:

  .hidden-block { display: none; }

JS:

  $(function(){
    $('div[id^=expand_] a').click(function(){
      $('div',$(this).parents('div:first')).toggle(
        function(event){ $(event.target).show(); },
        function(event){ $(event.target).hide(); }
      );
    });
  });

Как-то так. Я JS не знаю, думаю сейчас подключатся умные товарищи и напишут правильно. А не как я Smile

Аватар пользователя Northruler Northruler 17 декабря 2009 в 23:14

jQuery входит в ядро драпала, но ненавязчивый яваскрипт можно подключать и без js-библиотек.
html

<div class="wrap">
  <a href="/node/[nid]">open</a>
  <input type="text"  />
</div>

js

 $(function(){
    $('.wrap input').hide();    
    $('.wrap a').bind('click', function(){
       $('.wrap input').toggle('slow');
       return false;
    });
  });

Класс .wrap естественно нужно поменять на свою обертку, которая там у вас есть, ну или проведите темизацию. Я думаю механизм понятен.
Никогда не используйте

.hidden-block { display: none; }

так как пользователи с отключенными скриптами никогда поле не увидят Smile
------------------------
Немного поправил код)

Аватар пользователя seaji seaji 17 декабря 2009 в 23:31

Да через jQuery это самое мудрое решение.
Только вот мне нужно было навесить на ссылку предупреждение в JS, и только если нажать "Да", то произошел бы переход по ссылке, у меня через jQuery не получилось с полтычка. Слава богу у меня все самописное и я вставил код onclick в нужное место, с jQuery долго не разбирался (может чего не то сделал).

Аватар пользователя Dan Dan 18 декабря 2009 в 0:36

Ну вот, я же говорил, что придут и напишут правильно.
Да, expand_[nid] я зря сделал - можно же без него.

"Vetlan" wrote:
jQuery входит в ядро драпала, но ненавязчивый яваскрипт можно подключать и без js-библиотек.

Ваш JS-код использует jQuery, так что без библиотек будет другой код Smile

"Vetlan" wrote:
так как пользователи с отключенными скриптами никогда поле не увидят :)

Да, Vetlan прав. Только я именно это и подразумевал. Нет JS - видим только ссылку и переходим по ней на ноду.

Аватар пользователя WiseMan WiseMan 18 декабря 2009 в 10:49

Еще, как вариант решения. Можно для нужного вьюса в шаблоне заменить вывод footer

<?php if ($footer): ?>
    <div class="view-footer">
      <?php print $footer?>
    </div>
  <?php endif; ?>

На свой код.

Аватар пользователя adisk adisk 12 июля 2011 в 15:05

Для Drupal 7.
Если у Вас своя таблица.

1. Создать класс

// Файл MODULE.views.inc
class my_views_handler_field extends views_handler_field_custom
{
    function render_altered($alter, $tokens)
    {
        $value = strtr($alter['text'], $tokens);

        return $value;
    }
}

2. В определение своей таблицы добавить:

// Файл MODULE.views.inc
...
    $data['products']['MODULE_link_field'] = array(
        'title' => t('Javascript link'),
        'help' => t('Javascript link'),
        'field' => array(
            'handler' => 'my_views_handler_field', // <- класс
            'click sortable' => TRUE,
        ),
        'sort' => array(
            'handler' => 'views_handler_sort',
        ),
        'filter' => array(
            'handler' => 'views_handler_filter_string',
        ),
        'argument' => array(
            'handler' => 'views_handler_argument_string',
        ),
    );
...

Думаю можно переопределить и custom_field.