Несколько раз на форуме попадались вопросы о том как сделать произвольное поле во вьюшках ссылкой, столкнулся сам с таким же вопросом. Решил при помощи минимальной модификации кода вот с этой страницы. Чую решение "через одно место" и корявое в целом, но как сделать лучше и чище - не знаю.
В той же теме на Друпал.орг упоминается, что можно перекрывать не вывод всей таблицы, а вывод отдельного поля, как это сделать не понял, но в случае когда нужна именно ссылка, наверняка будет правильнее.
Ну и сам код:
<?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'));
}
?>
Комментарии
да, решение через одно место, но не самое худшее Позже отпишусь как можно лучше, сейчас надо бежать
Вот спасибо-то
Как раз этим самым местом и чувствуется, что через него сделано.
Вот строчка из вашего варианта.
Она формирует темовый вызов вашего поля. Для того чтобы оттемить нужное поле, ваша функция теминга будет называться так:
// или можно еще просто 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 вверху экрана. После того, как правильно сформировали название темовой функции, грохаете свой первый выриант.
Звучит немного криво, но это из-за невозможности точно назвать название поля, поэтому и надо проверить его методом дебага.
В итоге вы получите функцию чисто для своего поля - красиво, правильно и эффективно.
YAHOO !
Спасибо!
А вот что получилось после апдейта.
<?php
function phptemplate_views_handle_field_node_data_field_shop_url_field_shop_url_value($fields, $field, $data){
$link = "nid."\">";
$link .= $data->node_data_field_shop_url_field_shop_url_value;
$link .="";
return $link;
}
?>
все гениальное - просто
(можете еще позаменять на одинарные кавычки, тогда не надо будет эскейпить кавычки внутри, да и быстрее в теории, но это больше уже по стилю кода)
спасибо, надо запомнить
в запоминалку
А можно доразжевать для чайника?
Насколько понял код полученный после апдейта вставляется в template.php той темы, которая установлена?
И если я хочу превратить в ссылку поле cck, имеющее имя field_ima_temp, то как изменится код? Или менять надо не код?
----------------------------------------------------------------
Уф, насилу разобрался, после прочтения схожего материала "Темизация views" - темизация полей. Для тех кто в танке. В template.php вашей темы в начало ставим кусок кода
print_r($field['queryname']);
}
В результате применения views, вверху экрана должна появиться искомая переменная, например node_data_field_ima_temp_field_ima_temp_value
Заменяем верхний тестовый код на рабочий:
$link = "<a href=\"/ссылка_куда_надо/".$data->nid."\">";
$link .= $data->ваше_полученное_значение;
$link .="</a>";
return $link;
}
Спасибо за информацию, здорово помогли, но неужели трудно толково расписать, что как делать - целый день разбирался.
Уж извините, последние несколько месяцев тут бываю очень редко.
Вставил код
function phptemplate_views_handle_field($fields, $field, $data){
print_r($field['queryname']);
}
Но ничего не происходит при применению views. Что-нибудь посоветуете?
А что если print_r($field['queryname']) выдает:
Array ( [0] => u [1] => n [2] => a [3] => y [4] => p [5] => a [6] => p [7] => n )