Ссылка в поле Views

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

Аватар пользователя Roof Roof 10 апреля 2008 в 19:45

Несколько раз на форуме попадались вопросы о том как сделать произвольное поле во вьюшках ссылкой, столкнулся сам с таким же вопросом. Решил при помощи минимальной модификации кода вот с этой страницы. Чую решение "через одно место" и корявое в целом, но как сделать лучше и чище - не знаю.
В той же теме на Друпал.орг упоминается, что можно перекрывать не вывод всей таблицы, а вывод отдельного поля, как это сделать не понял, но в случае когда нужна именно ссылка, наверняка будет правильнее.

Ну и сам код:

<?php

function test_views_view_table($view, $nodes, $type) {
$header = array();
foreach ($view->field as $field) {
$cell['data']=$field['label'];
$cell['class']=$field['header'];
$header[] = $cell;
}
$fields = _views_get_fields();
foreach ($nodes as $node) {
$row = array();
foreach ($view->field as $field) {
if ($field['queryname'] == 'node_data_field_shop_url_field_shop_url_value' || $field['queryname'] == 'profile_shop_url_value') {
$a_href = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);
$cell['data'] = "".$a_href."";
} else {
$cell['data'] = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);
}
$cell['class']='view-field-'.$field['queryname'];
$row[] = $cell;
}
$rows[] = $row;
}
return theme('table', $header, $rows, array('class' => 'show-table'));
}

?>

Комментарии

Аватар пользователя neochief neochief 10 апреля 2008 в 21:03

Вот строчка из вашего варианта.

$cell['data'] = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);

Она формирует темовый вызов вашего поля. Для того чтобы оттемить нужное поле, ваша функция теминга будет называться так:

function phptemplate_views_handle_field_VIEW_NAME_FIELD_NAME($fields, $field, $data){
// или можно еще просто phptemplate_views_handle_field_FIELD_NAME
print_r('test');
$link = '';// собственно теминг.
// В параметрах вам передадуться нужные данные. Сформируйте из них и вашего фильтра ссылку

return $link;
}

VIEW_NAME - название вьюсы
FIELD_NAME - название поля. Оно эквивалентно $field['queryname'] в коде выше. Ставите print_r($field['queryname']); после $cell['data'] = ...; и выбираете нужное поле. После этого составляете правильное название функции. И если все сработало, то появится test вверху экрана. После того, как правильно сформировали название темовой функции, грохаете свой первый выриант.

Звучит немного криво, но это из-за невозможности точно назвать название поля, поэтому и надо проверить его методом дебага.
В итоге вы получите функцию чисто для своего поля - красиво, правильно и эффективно.

Аватар пользователя neochief neochief 10 апреля 2008 в 22:50

все гениальное - просто Smile

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

Аватар пользователя Serg_M Serg_M 2 марта 2009 в 13:44

А можно доразжевать для чайника?
Насколько понял код полученный после апдейта вставляется в template.php той темы, которая установлена?
И если я хочу превратить в ссылку поле cck, имеющее имя field_ima_temp, то как изменится код? Или менять надо не код?
----------------------------------------------------------------

Уф, насилу разобрался, после прочтения схожего материала "Темизация views" - темизация полей. Для тех кто в танке. В template.php вашей темы в начало ставим кусок кода

function phptemplate_views_handle_field($fields, $field, $data){
print_r($field['queryname']);
}

В результате применения views, вверху экрана должна появиться искомая переменная, например node_data_field_ima_temp_field_ima_temp_value

Заменяем верхний тестовый код на рабочий:

function phptemplate_views_handle_field_ваше_полученное_значение($fields, $field, $data){

$link = "<a href=\"/ссылка_куда_надо/".$data->nid."\">";
$link .= $data->ваше_полученное_значение;
$link .="</a>";

return $link;
}

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

Аватар пользователя Чуб Чуб 22 ноября 2009 в 10:41

Вставил код
function phptemplate_views_handle_field($fields, $field, $data){
print_r($field['queryname']);
}

Но ничего не происходит при применению views. Что-нибудь посоветуете?