Вы здесь

Как создать блок view с материалами старее чем текущий?

1

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

Версия Drupal: 
7.x
Связанные проекты: 
Views
Вопрос задан 06.06.2016 - 18:51
Аватар пользователя Sora
Sora
91

Ответы

1

Можно попробовать сделать так ...
Оформляете views, чтобы был вывод материалов, дата которых не менее, чем какая-то дата в далеком будущем, например, 01.01.3000 года.

Далее, пишете свой модуль, который перехватывает формирование этого views, если он был вызван на определенных страницах.
С ходу я Вам не назову, какой хук надо перехватывать, вот их список
http://xandeadx.ru/blog/drupal/761

Таким образом, если views вызывается на странице с материалом, то программно в этом хуке определяете дату этого материала и там же меняете дату во views c 01.01.3000 на дату этого материала.
Не думаю, что в результате будет большой код.

Но это в случае, если Вы решили делать это через views.

Можно спокойно сделать и без него. Например, в модуле определить блок с таким-то содержимым, формируя его через db_select, а template для вывода одной строки в блоке можно определить через hook_theme.

Ответ дан 07.06.2016 - 16:16

Спасибо, уже ближе к правде. Просто самому делать, возиться потом с ajax пангинацией.. Не делал никогда. Но по ходу придется :)

Комментарий оставлен 07.06.2016 - 20:37

Попробуйте с хуком для views.
В этом случае, думаю, вы сможете задействовать средства ajax для views.

Комментарий оставлен 07.06.2016 - 21:23

Короче сделал, сейчас только вспомнил, что хотел сделать :)

function news_block_older_views_pre_view(&$view, &$display_id, &$args)
{
    if ($view->name === 'news_in_content') {
        $nid = arg(1);
        $node = node_load($nid);
        $view->args['created'] = $node->created;
    }
}

function news_block_older_views_query_alter(&$view, &$query)
{
    if ($view->name === 'news_in_content') {
        $created = $view->args['created'];
        $condition = array(
            'field' => "node.created < :node_date_filter",
            'value' => [':node_date_filter' => $created],
            'operator' => 'formula',
        );
        $query->where[1]['conditions'][0] = $condition;
    }
}
Комментарий оставлен 27.07.2016 - 20:49
0

Может пригодится мой вариант, но он немного отличается. У меня была глобальная переменная "дата 1", задаваемая модератором, и в каждой ноде поле "дата 2".
Как я делал. Поставил модуль Views Php
После этого в представлении в фильтре появилась возможность добавить условие Global:Php
Дальше в этом фильтре доставал свою глобальную переменную Дата1, сравнивал с значением поля Дата2 и в зависимости от того больше или меньше дата - скрывал/показывал ноду. Для сравнения дат можно их перевести в Unix-формат.

В этом методе надо будет только придумать как достать время текущей ноды и вставить его в этот Global:Php фильтр.

Есть упрощенный вариант для вопроса конкретно в том случае, что описан.
Сравнивать не время а айди ноды, т.к. те, которые младше - всегда с меньшим айди.

Ответ дан 06.06.2016 - 20:30
0

до конца не ясно, что требуется. если речь про страницы материала, на которых блок, отображающий анонсы старых материалов, я бы тогда взял да и настроил бы контекстный фильтр, чтобы получить nid (из урла, если фигурирует, иначе php кодом)
в обычном, не контекстном, фильтре используем простенький php код, сравнивая, например timestamp'ы
о каких «глобальных переменных» вы говорите? это же бред сивой кобылы. мы можем выполнить, например

node_load($nid) 

и получить объект ноды, где есть дата создания. для материалов блока дату создания можно добавить в поля и использовать её для сравнения с датой из объекта ноды, подтянутой через контекстный фильтр. можно DB API

$title = db_query("SELECT created FROM {node} WHERE nid = :nid", array(':nid' => 11111))->fetchField();

использовать, не загружая всю ноду, а выбирая только нужное

Ответ дан 07.06.2016 - 07:56