Views 2 или handler наносит ответный удар

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

Аватар пользователя beliy_snow beliy_snow 16 марта 2007 в 13:17

Если вы знаете, как в модуле Views сделать блок выводящий информацию о текущей (и только текущей) просматриваемой ноде в любом удобном для Вас виде - дальше можете не читать. Если не знаете - попробуйте дочитать до конца, там сюрприз.

Поехали. Создали новое представление (читай блок), из этого поста узнали, как сделать так, чтобы информация выводилась только для текущей ноды, теперь будем извращаться. Причина извращений следующая:
1) те поля, которые выводятся в нашем блоке имеют следующий формат: Title - Value
2) надо же разобраться как работает этот модуль...

Теперь. Есть такая вещь, как кэш. Вещь заразная, сраз скажу... Особенно пугает вот эта строчка в коде: "Constructs the full table information array. Caches it into a global array so that it will only be called once per run." Это относится к селектам разделов Fields, Filters и Sorts. Т.е. таблицы эти создаются один раз и потом сколько не меняй код в файлах "modules/views/modules/*.inc" - результата ноль. Хакнем это... Открываем файл "modules/views/views_cache.inc", находим функцию "_views_get_tables()". Далеко ходить не надо, собака порылась тут:
<?php if (is_array($cache)) {
$views_tables = $cache;
}
else {
$table_data = module_invoke_all('views_tables');
?>
Комментируем строки, чтобы было вот так:
<?php if (is_array($cache)) {
/* $views_tables = $cache;
}
else {*/
$table_data = module_invoke_all('views_tables');
?>
Теперь все таблицы и изменения в них будут вступать в силу каждый раз при загрузке страницы, что не может не радовать. Кстати, когда наиграетесь с таблицами - не забудьте раскомментировать эти строчки, а то мало ли...

Что нам надо сделать? Аа... Блок, который выводит нам информацию в удобном виде. Не забываем вывести сам блок на страницу. Открываем следующий файл - "modules/views/modules/views_node.inc". Смотрим - нипонятно... Ищем определение поля 'nid'. Почему именно 'nid'? Потому что для получения информации о ноде нам необходимо знать ID ноды и больше ничего, остальное - производное. Делаем следующее:
<?php 'nid' => array(
'name' => t('Node: ID'),
'handler' => 'about_article_views_handler',
'sortable' => true,
'help' => t('Display the NID of a node.'),
),
?>
Волшебная строчка - "'handler' => 'about_article_views_handler'". Это, собственно, функция, которая будет создавать нам наш необходимый контент. Создаем:
<?php function about_article_views_handler($fieldinfo, $fielddata, $value, $data){
$node = node_load(array('uid' => $value));
// берем все, что нам нужно вывести...
$output = "Все наша данные о ноде, обрамленные в html";
return $output;
}
?>
Ловкость рук...

Теперь сюрприз. Всего этого можно было не делать. Можно было просто создать отдельный блок вручную, сделать тип ввода php и писать туда все, что хотим и как хотим. Хотя... Функция генерации html кода для блока есть, в ней надо только поменять "$node = node_load(array('uid' => $value));" на "$node = node_load(array('uid' => arg(1)));" и вставлять её вызов блок, т.к. менять код в функции гораздо удобнее, чем в админке. А ещё её можно запихнуть в файл template.php вашего шаблона.
Зато теперь Вы умеете делать изменения в файлах таблиц, что может Вам очень пригодиться при решении других задач. Я вот не умел и очень переживал по этому поводу...

P.s. Строчки не забыли раскомментировать?

Комментарии

Аватар пользователя dbzer0 dbzer0 19 марта 2007 в 5:17

>хм, а для чего это может быть нужным?
ну к примеру смотри прям тут в правом верхнем углу блок "Об авторе" текущей ноды