Сниппет вывода новостей с анонсами.

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

Аватар пользователя IIISpikerIII IIISpikerIII 17 января 2013 в 15:40

Здравствуйте! Недавно начал изучать Drupal и столкнулся с проблемой вывода новостей со ссылками на новость. Нашел такой код в интернете.
<?php
// Пошла выборка
$nodes = db_select('node', 'n')
->fields('n')
->condition('n.type', 'news') // Тип ноды: news, машинное имя
->orderBy('created', 'DESC') // Свежее вперед
->range(0, 3) // Показывать будем не более трех
->execute();
// В виде ненумерованного списка
echo '

    ';
    foreach ($nodes as $n) {
    // Получаем синоним пути
    $url = drupal_get_path_alias('node/'.$n->nid);
    // Небольшой трюк, избавляющий от 'node/node/nid" при просмотре самого материала
    echo '
  • true)).'">'.$n->title.
    '
    Создано: '.format_date($n->created, 'custom', "F j, Y в H:i").'
  • ';
    }
    echo '

';
unset($url, $n, $nodes); // Финальная зачистка
?>
После чего стали выводиться заголовки новостей с датой публикации. А вот как сюда добавить вывод вместо даты публикации краткий анонс новости. Пробовал вставить в нужное место $n->teaser или $n->body, но так ничего не получилось. Подскажите как решить эту проблему.

Комментарии

Аватар пользователя IIISpikerIII IIISpikerIII 18 января 2013 в 15:49

3xdimon я хочу разобраться со сниппетами, для выполнения в будущем более сложных задач. Ссылку же, которую вы мне дали, как я понимаю на вьюс.

Аватар пользователя enemis enemis 18 января 2013 в 16:44

Поле body не содержится в таблице node. Оно находится в field_data_body таблице. Откуда я это узнал открыл базу в phpmyadmin...
Для выбора нужно сделать join
На странице Join в d7 последний пример показывает как это сделать...

Аватар пользователя IIISpikerIII IIISpikerIII 19 января 2013 в 9:30

Спасибо enemis! Нашел в базе все нужные мне таблицы и из примера примерно понял что к чему. Для связи таблицы node и field_data_body использую такой код.
<?php
$nodes = db_select('node', 'n');
$nodes ->join('field_data_body', 'b', 'n.nid = b.entity_id');
$nodes
->fields('n', array('nid', 'title'))
->condition('n.type', 'news')
->condition('n.status', '1')
->orderBy('n.created', 'DESC')
->addTag('node_access');
?>
Как теперь я могу получить данные из этого запроса? Пробовал сделать так:
<?php
foreach ($nodes as $record) {
echo $record;
}
?>
тогда выводится значение Array. Также пробовал выводить $record->title в таком случае выводит ошибку. Подскажите как добраться теперь до данных?

Аватар пользователя IIISpikerIII IIISpikerIII 19 января 2013 в 12:00

natbampo спасибо большое! Может это элементарные вещи, но я немогу найти этого нигде)) Вот что у меня получилось в общих чертах:
<?php
$nodes = db_select('node', 'n');
$nodes->join('field_data_body', 'b', 'n.nid = b.entity_id');
$nodes
->fields('n')
->condition('n.type', 'news')
->condition('n.status', '1')
->orderBy('n.created', 'DESC')
->addTag('node_access');

$result = $nodes->execute();

foreach ($result as $record){
echo $record->title;
echo $record->body_value;
}
?>
В итоге $record->title выводит заголовки из таблицы node а по команде $record->body_value данные из таблицы field_data_body не выводятся. Как теперь из имеющегося запроса выбрать данные другой таблицы?

Аватар пользователя enemis enemis 19 января 2013 в 16:32
$nodes = db_select('node''n');
$nodes->join('field_data_body''b''n.nid = b.entity_id');
$nodes
  ->fields('n')->fields('b', array('body_value'))
  ->condition('n.type''news')
  ->condition('n.status''1')
  ->orderBy('n.created''DESC')
  ->addTag('node_access');

$result = $nodes->execute();

foreach ($result as $record){
  echo $record->title;
  echo $record->body_value;
}

Нужно также выбирать поля которые нужны из присоединяемой таблицы.

Аватар пользователя vitaboss vitaboss 21 января 2013 в 15:56

"IIISpikerIII" wrote:
3xdimon я хочу разобраться со сниппетами, для выполнения в будущем более сложных задач. Ссылку же, которую вы мне дали, как я понимаю на вьюс.

Сниппеты снижают производительность друпала, их использование вообще не рекомендовано, я считаю, это костыли. Все сложные задачи решаются модулями. Если вам нужно решить более сложные задачи, то можно рассмотреть вариант как создание своей цмс. Бывают, конечно задачи, которые без сниппетов в друпале вообще не решить, но не в этом случае.

Аватар пользователя enemis enemis 21 января 2013 в 16:23

"vitaboss" wrote:
Сниппеты снижают производительность друпала, их использование вообще не рекомендовано, я считаю, это костыли. Все сложные задачи решаются модулями.

Вы несколько ошибаетесь сниппеты - это блоки кода для повторного использования, а вот как они будут использоваться хардкодится или оборачиваться в отдельный модуль. То что вы описываете это хардкодинг внедрение исполняемого кода не постандартам(например формат ввода php, вставка логики в шаблон, внедрение кода в контрибут модули итд..) - это костыли и не всегда они снижают производительность но их трудно поддерживать.
"vitaboss" wrote:

Бывают, конечно задачи, которые без сниппетовкостылей в друпале вообще не решить, но не в этом случае.

Не существует таких задач. Это либо не до понимание апи друпала или php. Либо баг друпала.Баги патчатся, а все остальное приходит с опытом...

Аватар пользователя vitaboss vitaboss 21 января 2013 в 16:30

"enemis" wrote:

Я опытный пользователь друпала, но я не программист. С вами я могу только полностью согласиться.

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

Аватар пользователя aa2ndrew aa2ndrew 21 января 2013 в 19:21

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

Аватар пользователя IIISpikerIII IIISpikerIII 25 января 2013 в 15:51

Поскольку пошла такая дискуссия то задам вопрос по теме здесь же. Искав материалы по друпалу, я прочитал, что модуль вьюс один из самых тяжелых в друпале, а написание собственного кода меньше нагружает движок.

И еще аргумент к тому, что я решил использовать сниппет а не вьюс. Задача состояла в том, чтобы вывести не только список необходимых данных, но и подключить к этому списку плагин jQuery. Скрипт подключил в файле .info, но для работы плагина необходим список с определенным class и id.В модуле вьюс я нашел как задать только свой class.

После формирования списка модулем вьюс, получается достаточно большая структура списка со множеством вложений тегов и ко всему привязаны свои классы, что усложняет подключение плагина. При использовании сниппета же я сделал один запрос к базе и вывел нужную мне структуру списка. Может я слишком поверхностно изучил вьюс и пропустил важные моменты или возможно данную задачу лучше решать каким-то другим способом? Буду признателен за советы!

Аватар пользователя enemis enemis 25 января 2013 в 16:17

"IIISpikerIII" wrote:
Искав материалы по друпалу, я прочитал, что модуль вьюс один из самых тяжелых в друпале

Даже не начинайте)

Аватар пользователя IIISpikerIII IIISpikerIII 25 января 2013 в 17:22

enemis wrote:
Даже не начинайте)

Просто хотелось узнать, если я буду использовать на сайте в нескольких местах сниппеты, то это будет очень непрофессионально и безграмотно с моей стороны или это все же допустимо и приемлемо?

Аватар пользователя vitaboss vitaboss 25 января 2013 в 17:58

"IIISpikerIII" wrote:
Может я слишком поверхностно изучил вьюс и пропустил важные моменты или возможно данную задачу лучше решать каким-то другим способом? Буду признателен за советы!

Посмотрите статистику - модуль views используется на 571 029 сайтах. Как вы думаете, это много или мало? И еще, много ли сайтов на друпале работает без этого модуля?
Более того, есть очень много модулей расширяющие возможности модуля views.
Обязательно устанавливайте этот модуль! Я считаю, что на всякий случай вы этим самым вы защитите себя от изобретения велосипеда.
А то, что вы программист и знаете API друпала, это большой +!

Аватар пользователя enemis enemis 25 января 2013 в 21:19

"IIISpikerIII" wrote:
Просто хотелось узнать, если я буду использовать на сайте в нескольких местах сниппеты, то это будет очень непрофессионально и безграмотно с моей стороны или это все же допустимо и приемлемо?

Еще раз
"enemis" wrote:
сниппеты - это блоки кода для повторного использования, а вот как они будут использоваться хардкодится или оборачиваться в отдельный модуль это разные пути.

Использовать снипеты в полях материала с фильтром php это плохо. Обернуть приведенный выше снипет в отдельный модуль стандартная - хорошая практика. Использовать вьюс тоже хорошая практика все зависит от поставленных задач и предъявляемых требований...

Аватар пользователя IIISpikerIII IIISpikerIII 28 января 2013 в 22:45

Прочитал про создание модулей и сделал с помощью hook_menu страницу на которую и вывел результаты своих действий над полями. По сути получился тот же сниппет только в отдельном файле + сервисные функции. Все правильно сделал? Или я опять поизвращался?))

Аватар пользователя enemis enemis 28 января 2013 в 23:29

Да так правильно. Так как теперь ваш код может кочевать из проекта в проект и его легче поддерживать в дальнейшем...