Изменение параметров вида "на лету"

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

Аватар пользователя seaji seaji 10 ноября 2007 в 21:39

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

факты

любой вид можно экспортировать
делается это через через специальный массив $view что то типа:
<?php
$view = new stdClass();
$view->name = 'gallery';
$view->description = '';
$view->access = array (
); ?>
у вида есть спец. поле "argument handling code"
в этом поле можно например задавать аргументы поумолчанию и много другого
массив $view доступен для манипулирования в поле "argument handling code"
вот тут меня прошибло

Фактически это значит что ЛЮБЫЕ параметры вида, начиная от названия и кончая сортировкой можно менять в зависимости от аргументов.
Вот тут хорошая схема массива $view : http://www.flickr.com/photo_zoom.gne?id=511817875&size=o

пример

Имеем вид, который отображает ноды какой либо категории. В качестве аргумента передается Term ID.
Будем менять заголовок страницы вида и делать его именем категории.

<?php
$ter=taxonomy_get_term($args[0]);
$view->page_title= $ter->name;
if (empty($view->page_title)) {
$view->page_title = 'gallery';
}
?>

Комментарии

Аватар пользователя seaji seaji 11 ноября 2007 в 12:50

Нет, я не призываю отказываться от Views UI. Более того в 90% случаев пользовательского интерфейса вполне достаточно. Програмное изменение $view позволяет покрыть оставшиеся 10%.
Ну например сделать вид с изменяющимся набором полей методами Views UI нельзя.

Аватар пользователя jason32 jason32 12 ноября 2007 в 21:44

Что-то мне сомнительно, что это удобно и работать будет. При пересохранении же всё затрётся, разве нет? Причём заголовок страницы можно делать и стандартным GUI. Не испытывал, но на вскидку сомнительно и игра не стоит свеч и не факт, что будет работать

Аватар пользователя magway magway 13 ноября 2007 в 21:42

Вполне себе работает. При пересохранении ничего не затирается. Насчет смены заголовка думаю, что автор привел его как самый простой пример. Этот метод можно использовать для более сложных вещей (добавлять/убирать поля в зависимости от аргументов, возможно для любой другой динамики, которую не дает views ui).

Аватар пользователя Dimm Dimm 7 мая 2008 в 6:23

"Фактически это значит что ЛЮБЫЕ параметры вида, начиная от названия и кончая сортировкой можно менять в зависимости от аргументов."
К сожелению нельзя поменять количество нод на страницу - не работает т.к. этот код срабатывает где-то раньше, чем аргументы.

Аватар пользователя seaji seaji 7 мая 2008 в 16:24

Ну нет, не согласен, все должно работать.
Я так представляю работу views (по логике):
1. из адресной строки собираются аргументы
2. происходит билд объекта $view из заданных в форме параметров.
3. обработка кода для аргументов. изменение свойств объекта $view
4. сборка запроса к базе
5. запрос и выдача результата.

Аватар пользователя seaji seaji 7 июня 2008 в 0:48

Я недавно проглядывал старые записи на drupal.ru и как оказалось, эта мысль не оригинальна. Все это уже было, но только в частных конкретных решениях. Общую идею никто не высказывал.
Вот тут http://drupal.ru/node/2943 , например, происходит установка фильтра (конец статьи):
<?php
foreach($view->filter as $num => $item )
if($item['id'] === 'term_node_1.tid')
$view->filter[$num]['value'][0]=$tid->tid;
?>
а еще смена сортировки в зависимости от аргументов:
<?php
$view->query = $view->countquery = "";
foreach($view->field as $num => $item )
if($item['id'] == 'node.title')
$view->field[$num]['defaultsort']=arg(2);// второй аргумент: ASC или DESC

foreach($view->filter as $num => $item )
if($item['id'] == 'term_node.tid')
$view->filter[$num]['value'][0]=arg(1); // первый аргумент (номер терма)
?>

Аватар пользователя Serebron Serebron 1 января 2009 в 23:35

Простите, что поднимаю столь старую тему, но праздничная логика Smile подсказывает, что тема близка к моему вопросу.
Дано:
-Вьювс (пусть путь к ней будет /myrka/)
--Аргумент id термина словаря

Например идем по адресу /myrka/50/ и видим что-то (в принципе не важно что именно). Если ввести /myrka/50/sharik (где sharik - нечто зарание не известное) то получиться тоже самое, а хочиться вывести "sharik" на страницу.
Вероятно можно в *.tpl.php написать пару строк php для этого? только какие именно?