Здравствуйте! Недавно начал изучать Drupal и столкнулся с проблемой вывода новостей со ссылками на новость. Нашел такой код в интернете.
<?php
// Пошла выборка
$nodes = db_select('node', 'n')
->fields('n')
->condition('n.type', 'news') // Тип ноды: news, машинное имя
->orderBy('created', 'DESC') // Свежее вперед
->range(0, 3) // Показывать будем не более трех
->execute();
// В виде ненумерованного списка
echo '
- ';
- true)).'">'.$n->title.
'Создано: '.format_date($n->created, 'custom', "F j, Y в H:i").'
foreach ($nodes as $n) {
// Получаем синоним пути
$url = drupal_get_path_alias('node/'.$n->nid);
// Небольшой трюк, избавляющий от 'node/node/nid" при просмотре самого материала
echo '
';
}
echo '
';
unset($url, $n, $nodes); // Финальная зачистка
?>
После чего стали выводиться заголовки новостей с датой публикации. А вот как сюда добавить вывод вместо даты публикации краткий анонс новости. Пробовал вставить в нужное место $n->teaser или $n->body, но так ничего не получилось. Подскажите как решить эту проблему.
Комментарии
http://drupal.org/project/views
3xdimon я хочу разобраться со сниппетами, для выполнения в будущем более сложных задач. Ссылку же, которую вы мне дали, как я понимаю на вьюс.
Поле body не содержится в таблице node. Оно находится в field_data_body таблице. Откуда я это узнал открыл базу в phpmyadmin...
Для выбора нужно сделать join
На странице Join в d7 последний пример показывает как это сделать...
Спасибо 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 в таком случае выводит ошибку. Подскажите как добраться теперь до данных?
<?php
$result = $nodes->execute();
foreach ($result as $record) {?>
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 не выводятся. Как теперь из имеющегося запроса выбрать данные другой таблицы?
$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;
}
Нужно также выбирать поля которые нужны из присоединяемой таблицы.
Спасибо большое!!! Вот то, что я хотел узнать!
Сниппеты снижают производительность друпала, их использование вообще не рекомендовано, я считаю, это костыли. Все сложные задачи решаются модулями. Если вам нужно решить более сложные задачи, то можно рассмотреть вариант как создание своей цмс. Бывают, конечно задачи, которые без сниппетов в друпале вообще не решить, но не в этом случае.
Вы несколько ошибаетесь сниппеты - это блоки кода для повторного использования, а вот как они будут использоваться хардкодится или оборачиваться в отдельный модуль. То что вы описываете это хардкодинг внедрение исполняемого кода не постандартам(например формат ввода php, вставка логики в шаблон, внедрение кода в контрибут модули итд..) - это костыли и не всегда они снижают производительность но их трудно поддерживать.
Не существует таких задач. Это либо не до понимание апи друпала или php. Либо баг друпала.Баги патчатся, а все остальное приходит с опытом...
Я опытный пользователь друпала, но я не программист. С вами я могу только полностью согласиться.
В данной теме поднялся вопрос, который решается в касание модулем вьювс. Я не выдержал и написал сюда, т.к. прочитал, что человек только изучает друпал и не изучив мощнейший его функционал, начинает что-то вставлять (код).
Лично мне кажется, что сниппеты больше подходят для пользователей и разработчиков, которые не знают API друпала. Конкретно эту задачу я бы решал с помощью своего модуля, ну и конечно, с использованием механизма кеширования.
Поскольку пошла такая дискуссия то задам вопрос по теме здесь же. Искав материалы по друпалу, я прочитал, что модуль вьюс один из самых тяжелых в друпале, а написание собственного кода меньше нагружает движок.
И еще аргумент к тому, что я решил использовать сниппет а не вьюс. Задача состояла в том, чтобы вывести не только список необходимых данных, но и подключить к этому списку плагин jQuery. Скрипт подключил в файле .info, но для работы плагина необходим список с определенным class и id.В модуле вьюс я нашел как задать только свой class.
После формирования списка модулем вьюс, получается достаточно большая структура списка со множеством вложений тегов и ко всему привязаны свои классы, что усложняет подключение плагина. При использовании сниппета же я сделал один запрос к базе и вывел нужную мне структуру списка. Может я слишком поверхностно изучил вьюс и пропустил важные моменты или возможно данную задачу лучше решать каким-то другим способом? Буду признателен за советы!
Даже не начинайте)
Просто хотелось узнать, если я буду использовать на сайте в нескольких местах сниппеты, то это будет очень непрофессионально и безграмотно с моей стороны или это все же допустимо и приемлемо?
Посмотрите статистику - модуль views используется на 571 029 сайтах. Как вы думаете, это много или мало? И еще, много ли сайтов на друпале работает без этого модуля?
Более того, есть очень много модулей расширяющие возможности модуля views.
Обязательно устанавливайте этот модуль! Я считаю, что на всякий случай вы этим самым вы защитите себя от изобретения велосипеда.
А то, что вы программист и знаете API друпала, это большой +!
Еще раз
Использовать снипеты в полях материала с фильтром php это плохо. Обернуть приведенный выше снипет в отдельный модуль стандартная - хорошая практика. Использовать вьюс тоже хорошая практика все зависит от поставленных задач и предъявляемых требований...
Прочитал про создание модулей и сделал с помощью hook_menu страницу на которую и вывел результаты своих действий над полями. По сути получился тот же сниппет только в отдельном файле + сервисные функции. Все правильно сделал? Или я опять поизвращался?))
Да так правильно. Так как теперь ваш код может кочевать из проекта в проект и его легче поддерживать в дальнейшем...
2 IIISpikerIII
http://xandeadx.ru/blog/drupal/88
пригодится
Ушла в закладки! Спасибо за полезный материал! Какраз его мне и не хватало в начале этой темы)