обнаружила, что некий глобальный друпаловский фильтр срезает многие аттрибуты и некоторые теги даже когда их добавляет администратор, например при выводе вьюз или в "сообщении внизу сайта".
Например, пишу в "сообщении внизу сайта" на странице admin/settings/site-information такой код
<a href="#" onclick="blabla" style="blabla">ссылка</a>
а на выходе получаю
<a href="#">ссылка</a>
Как с этим бороться? Разрешила все таги во всех фильтрах, ничего не помогает.
Комментарии
http://www.drupal.ru/node/37243
Внизу сайта скорее всего никак, так как вроде все такие "настроечные" поля проходят через функцию
filter_xss_admin().
В вашем случае решение может быть таким: сделать регион в подвале и туда вывести блок с нужной вам надписью
На самом деле низ сайта я привела для примера. Мне надо добавить онклик в вывод вьюз. По-видимому, он тоже проходит через filter_xss_admin(). А возможно ли эту функцию как-то похакать?...
Если вьюс, то делайте темплейт для вывода, во вьюсе есть информация как и куда и там прописывайте нужные атрибуты
Ой, я нашла, как похакать вьюз.
Надо в файле views_handler_field.inc убрать все filter_xss_admin()
Мне хватило того, что в строчке 520 я сменила
$value = filter_xss_admin($alter['text']);
на
$value = $alter['text'];
Или кастомное поле с php-кодом, раз ссылка, то вам l() нужна
Мне надо, чтобы название материала выводилось кастомно, ставлю галочку в "Rewrite the output of this field" и пишу там:
<a href="#" onclick="blablabla">[title]</a>
Это надо для того, чтобы при клике на название открывалось другое поле (в онклике будет джаваскриптик небольшой)
Можно ли похакать красиво? Т.е. не лезть в views_handler_field.inc, а как-то, не трогая модуля? Помогут ли в этом случае темплейты? (я спрашиваю, потому что ни разу не делала этого)
<a href="#" onclick="blablabla">[title]</a>
поменять на функцию l()
Спасибо! Надеюсь, будет время заморочиться. Найденный "нехороший", но рабочий вариант расслабляет.
А где можно почитать о вставлении функций? в advanced_help?
api.drupal.ru
http://www.drupal.ru/node/38142
еще вариант решения в комменте
Я ведь в самом начале дал ссылку, - пользуйтесь техникой ненавязчивого яваскрипт. В хтмл-коде не должно быть никаких обработчиков. Все выводится во внешний файл.
gorr, внимательно прочитала, попробовала перенести функцию
// 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
Vetlan, а для этого надо подключать jQuery?
В любом случае, мне этот код надо внутрь, потому что он использует Token, я не думю, что значения [nid] и [field_coursedesc_value] можно вынести в отдельный джаваскрипт-файл.
<div id="expand_[nid]" style="display:none;">[field_coursedesc_value]</div>
<a href="/node/[nid]">open</a>
<div>[field_coursedesc_value]</div>
</div>
css:
JS:
$('div[id^=expand_] a').click(function(){
$('div',$(this).parents('div:first')).toggle(
function(event){ $(event.target).show(); },
function(event){ $(event.target).hide(); }
);
});
});
Как-то так. Я JS не знаю, думаю сейчас подключатся умные товарищи и напишут правильно. А не как я
Dan, спасибо, конечно, но вроде это совсем не то, что надо. Хотя я в джаваскрипте нибумбум.
jQuery входит в ядро драпала, но ненавязчивый яваскрипт можно подключать и без js-библиотек.
html
<a href="/node/[nid]">open</a>
<input type="text" />
</div>
js
$('.wrap input').hide();
$('.wrap a').bind('click', function(){
$('.wrap input').toggle('slow');
return false;
});
});
Класс .wrap естественно нужно поменять на свою обертку, которая там у вас есть, ну или проведите темизацию. Я думаю механизм понятен.
Никогда не используйте
так как пользователи с отключенными скриптами никогда поле не увидят
------------------------
Немного поправил код)
мудро. Спасибо!
Да через jQuery это самое мудрое решение.
Только вот мне нужно было навесить на ссылку предупреждение в JS, и только если нажать "Да", то произошел бы переход по ссылке, у меня через jQuery не получилось с полтычка. Слава богу у меня все самописное и я вставил код onclick в нужное место, с jQuery долго не разбирался (может чего не то сделал).
Ну вот, я же говорил, что придут и напишут правильно.
Да, expand_[nid] я зря сделал - можно же без него.
Ваш JS-код использует jQuery, так что без библиотек будет другой код
Да, Vetlan прав. Только я именно это и подразумевал. Нет JS - видим только ссылку и переходим по ней на ноду.
Еще, как вариант решения. Можно для нужного вьюса в шаблоне заменить вывод footer
<?php if ($footer): ?>
<div class="view-footer">
<?php print $footer; ?>
</div>
<?php endif; ?>
На свой код.
Для Drupal 7.
Если у Вас своя таблица.
1. Создать класс
class my_views_handler_field extends views_handler_field_custom
{
function render_altered($alter, $tokens)
{
$value = strtr($alter['text'], $tokens);
return $value;
}
}
2. В определение своей таблицы добавить:
...
$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.