УрокНемного о выводе любых cck-полей программно через node.tpl.php
Сегодня я решил рассказать как выводить cck поля через шаблон node.tpl. Часто бывают такие ситуации, что, например, требуется, чтобы данные из cck полей автоматически закидывать в html-таблицу, или формировать её особым образом, требующим обёртки в дополнительные div'ы (или в любые другие тэги). Поэтому надо обязательно знать, каким образом вывести эти поля в своём шаблоне.
Алгоритм вывода не сложен:
<?php echo $node->имя_поля[0]['view']; ?>
Вместо имени поля надо подставлять полное имя поля, как на рисунке:
Тоесть, если поле будет называться как на рисунке - field_lesson_image, то вывести его можно будет таким куском кода:
<?php echo $node->field_lesson_image[0]['view']; ?>
Таким образом будет выведено то представление cck поля, которое вы укажите в отображении полей:
Для 1 - наш код будет выводить в анонсе материла фото через пресет модуля imagecache post_images_150x100. А
для 3 - в полной версии выведет фотку через пресет post_images_300x250
Не забудьте поставить галочку на Exclude - чтобы удалить вывод своего поля из переменной $content в файле node.tpl.php (иначе выведется 2 раза).
Так же стоит помнить, что если мы оборачиваем поле в дополнительный html код, то очень желательно выполнять проверку, не является ли наше сск поле пустым (незаполненным), чтобы вы выводить пустые и ненужные тэги (сказывается на SEO оптимизации). Пример:
if ($node->field_lesson_image[0]['view']) { echo '<div class = "node_photo">' . $node->field_lesson_image[0]['view'] . '</div>'; }
С выводом одного сск поля разобрались. Но что делать, если в сск поле можно загрузить не одну фотографию (строку текста и т.д.) ? Для этого надо немного изменить вид вывода поля, а попросту - просто его зациклить:
$i = 0; while ($node->field_lesson_image[$i]['view']) { print '<div class = "photo">' . $node->field_lesson_image[$i++]['view'] . '</div>'; }
Вот и вся хитрость. Таким образом выводятся не только фотографии, а ЛЮБЫЕ поля, созданные при помощи модуля CCK, включая fivestar_voting.
- Spleshka
- 30.11.2010
- 89187
Комментарии
Спасибо, ты прямо как знал, что он мне нужен, почаще бы так)
Прошу прощения, но индивидуальные поля лучше выводить через печать переменной $имя_поля_rendered
Если брать последний пример, то это будет:
При таком выводе мы можем легко поменять отображение поля через админку, через управление отображением полями в CCK.
К примеру, поменять один пресет imagecache на другой или вообще LightBox навесить.
Возможно лучше и вашим способом, но ведь и через $node->field_lesson_image[0]['view'] тоже можно легко поменять вывод через админку, навесить пресет или лайтбокс к примеру :)
Оба-на! Спасибо сенсей!! Как раз хотел тебе урок заказать на эту тему))
А если такая ситуация:
Есть ццк поле, которое видят авторизованные юзеры. Как сделать проверку: если юзер - то все ок, показываем поле, а если анонимус - вместо поля показываем какой-нибудь текст (типа "Только зарегистрированные пользователи могут это лицезреть") ??
Добрый день!
А как правильно сделать проверку перед выводом CCK поля, если на сайте используется модуль Field Permissions, с помощью которого установлены права доступа к отдельным полям в зависимости от того, является ли автором ноды просматривающий её юзер и какие роли ему назначены?
Интересует еще есть ли разница между echo $node->field_имя поля[0]['view'];
и echo $node->field_имя поля[0]['value']; или как правильней ?
P.s. имеются ввиду текстовые поля, для картинки конечно - ['view'] :)
Разница есть даже для текстовых полей. Если для них включены форматы ввода - то view выведет корректно (с учётом форматирования), а value - только то, что вы ввели в текстовое поле
Здравствуйте.
Подскажите пожалуйста как можно переопределить вывод поля cck. Например выводится поле в одном месте, а нужно чтоб оно выводилась в другом, например над определенной строчкой. Можно переопределить позицию с помощью css, но как привязать позицию к другому полю, ведь position не может привязать одно поле к другому?
ну так урок этому и посвящён - как вывести сск поле в удобном для вас месте
Уточню то, что имею в виду:
На скриншоте отображено поле перечеркнутое красным - имя field_old_prise
я внес код
теперь отображает в нужном месте то, что нужно, но получается теперь 2 вывода одного и того же. Мне интерестно чтоб выводило именно перечеркнутое красное на место серого.
Скриншот:

Скопировал content-field.tpl.php content-field-field_old_prise.tpl.php в папку с темой.
В node-product.tpl.php в нужном месте (над Цена: 270 грн.)
Определил div class="field-old-prise" /div
И вопрос можно ли используя перекрытие шаблона CCK вывести поле field_old_prise в div class="field-old-prise"?
Как то так:
content-field-field_old_prise.tpl.php:
div class="field-old-prise"
print $node->field_old_prise[0]['view']
/div
но с этим кодом вообще не выводит поле нигде.
в дивах пришлось стрелочки убрать - не отображались вообще
Понял. Смотрите - вот так должен выглядеть ваш код node-product.tpl.php:
Теперь осталась проблема дублирования цены. Переходите на страницу /admin/content/node-type/product/display и рядом с полем field_old_prise ставите две галочки на Exclude (Исключить). С дублированием покончено :)
В данном случае даже нет необходимости перекрывать шаблон CCK
Спасибо за ответ.
Когда поставил галочку на Exclude в этом поле, после сохранения, нижнее поле никуда не пропало.
Вышел из ситуации кинув в папку с темой пустой файл content-field-field_old_prise.tpl.php
Спасибо огромное за помощь.
Странно, поле не должно выводиться вообще) Почистите кэш на сайте, может быть в этом было дело
В том то и дело, что пока настраивается и наполняется сайт, кеш отключен вообще.
Можно еще один вопросик?
Это попробовал прикрутить проверку.
Занести дивы с внутренностями в функцию и по проверке если поле больше нуля тогда выводить функцию, если меньше или равно нуля тогда ничего не выводить (только незнаю как пропустить и сделал print 'Нет акции')
Код неработает у меня.
А зачем ты в пхп-коде еще открываюшие теги ставишь?
получается, что в этом месте ты останавливаешь выполнение функции:
Не выводи через функцию. В данном случае даже смысла в ней нет. Сделай просто вот так:
Спасибо за помощь. Вывел таким кодом:
Проблема в следующем установил модуль для CCK вот этот FileField. Но после добавление картинки он ее не показывает :( путь устанавливает верный. В чем может быть трабла?
возможно название картинки на русском языке и/или с пробелами... У меня как то раз была такая проблема. Включил транслитерацию для загружаемых файлов - всё стало ок.
Возможно, тут надо посмотреть /admin/content/node-type/ТИП_КОНТЕНТА/display
Вставил код как в примере:
echo $node->имя_поля[0]['view'];
После этого выдает ошибку именно в этой строке где вставил код:
Notice: Undefined offset: 0 в функции include() (строка 340 в файле Z:\home\site.ru\www\sites\all\themes\th\node.tpl.php).
Что это поле выводит?
Ошибку убрал (ваша статья под 6 друпал). У меня седьмой, поля выводятся в семерке немного по другому ...
Обычное текстовое поле...
Подскажите, пожалуйста, как получить название файла (для поля типа file) чтобы потом вставить его в ссылку.
А как в Drupal 7 программно вывести ссылку на термин (теги)? Мне надо чтобы термины отображались над заголовком статьи.
Drupal 7: Theming Fields and Nodes with Templates Помогло! для Drupal 7
Здравствуйте. А я, чтобы вывести не одну запись cck поля, использовал такой код:
Но не могу понять, как вывести заголовок (label) этого поля. Подскажите пожалуйста, как сделать так, чтобы заголовок выводился только в том случае, если есть что выводить. Например: Есть cck поле Цвет. В нем значения касный, синий, зеленый. Можно выбрать два цвета. Если пользователь ничего не выбирает, соответственно ничего и не отображается.
Спасибо.
Добрый день. Часто захожу к Вам, очень нравится.
У меня есть вопрос. Использовал конструкцию к множественным полям. А как сделать чтобы еще выводилось alt текст к картинке? Конечно можно продублировать и подставить в эту же конструкцию любое значение, но важно чтобы выводило вместе. Img и alt.
Заранее спасибо.
Добрый день.
Если я вас правильно понял - то выводится так:
То что нужно, но почему то показывает всего 2 изображения из большого колличества. вот как я задумывал.
UPD: выводи изображения четные, то есть, по порядку загрузки 2 4 6. подгружаю без массовых загрузчиков.
А, да) Опечатался в коде, извиняюсь. Так правильно:
Спасибо. То что нужно.
Большое спасибо за приведенные примеры. Пользуюсь вашим кодом для вывода нескольких значений CCK поля. То есть есть выпадающий список в котором можно выбрать несколько значений и ваш код прекрасно все выводит:
Из кода видно что я пытаюсь разделять значения в выводе запятой. То есть по сути получается такой вывод:
WAV, MP3, WMA,
И вот собственно вопрос, можно ли как нибудь сделать так чтобы запятая у последнего выводимого значения не ставилась?
Вопрос снимается, решил вот таким способом:
Может быть не "друпально" но работает. :HAPPY:
Главное что работает :)
А вообще можно написать например так:
Результат будет тот же, а код немного красивее :)
Большое спасибо. Возьму на заметку. :)
Добрый день!
а как реализовать эту в node D7?
место $node надо писать через render?
Доброго времени.
Вывожу на странице все данные только через запросы вида
Все хорошо, все работает.
Но теперь понадобилось вывести комментарии с формой комментирования. Получилось вывести форму только функцией
Но тогда дублируется все, что было выведено через
Как можно избавиться от мусора и вывести только форму комментирования с комментариями? Еще желательно бы научиться выводить все это в произвольном месте страницы.
Помогите, пожалуйста.
Какая версия Друпала?
6 друпал.
Пока решил проблему стерев все из node.tpl.php. Теперь комментарии и форма комментариев появляется без лишней информации.
Вы уверены что это 6й Друпал? В 6й версии вывод комментариев не зависит вообще от шаблона node.tpl.php. Для комментариев есть свой отдельный шаблон comment.tpl.php
Да, 6й. Все верно, через comment.tpl.php сейчас темизирую вывод комментариев, а вот если на странице информация выводится только через поля CCK, то как вывести комментарии и форму добавления комментария? У меня получилось только при добавлении в шаблон переменной
а эта переменная дублировала вывод информации которую я уже вывел через доп. поля CCK. После того как я удалил всю информацию из файла node.tpl.php лишняя информация не выводится, а выводятся только комментарии с формой комментирования. Во как запутано :) Это не правильно и в идеале нужно выводить комментарии и форму добвления через какие ни будь функции или все отлично и можно не забивать голову?
(CCK, PHP)
Подскажите, какой самый лайтовый способ прикрепить URL из LinkField к кнопке из ImageField ?
Можно ли это сделать php запросом в page-node.tpl.php ?
Подскажите, как в шаблоне вывести поле CCK определенной ноды?
Т.е. как в этом коде
использовать nid?
Подскажите пожалуйста, почему у меня может ничего не выводиться вообще? Например
echo $node->field_project_date[0]['view'];
- у меня ничего не выводит( Хотя поле заполнено, всё как надо.И еще, не совсем понял, разве обязательно этот код использовать в шаблоне? Разве не всё равно, если например я его использую в блоке? (php-форматом, естественно)
Извиняюсь за глупый вопрос, во всем разобрался сам. Объяснять ничего не требуется (от себя) я просто затупил) Можно удалить мой пост.
Спасибо очень полезно
Дополнительные изображения вывел так:
Но не как не пойму как изменить размер выводимых доп изображений
Очень помогла.
А есть способ выводить по аналогии группы полей? Т.е. при добавлении поля в группу оно автоматом выводилось бы.
Пожалуйста, подскажите
Пытаюсь вывести по такому сценарию
$node->field_top_text[0]['view']
Но ничего не выводится. Сделал var_dump($node->field_top_text[0]), массив не пустой, но индекса view в нем нет
Сделал как вы и писали
if ($node->field_chenok[0]['view']) {
echo '' . $node->field_chenok[0]['view'] . '';
}
$i = 0;
while ($node->field_chenok[$i]['view']) {
print '' . $node->field_chenok[$i++]['view'] . '';
}
Но произошло задвоение поля ... В чем проблема?
Это поле ещё надо убрать из вывода в переменной $content; Если не ошибаюсь:
Подскажите, пожалуйста, как быть, если выводимое поле содержит несколько изображений? Требуется вывести первое из них в полном формате, а остальные — в формате превью (или другого размера).
Или, может быть, подскажите, как реализовать вот такой функционал: чтобы при клике на превьюшку менялось изображение в полном формате (то есть полное изображение заменялось другим, которое в превьюшке).
Спасибо за пост!
Решил задачу с помощью кода
который привёл один из комментаторов чуть выше, и настроил в отображении поля изображения вывод его через Galleria. Правда, не смог сделать перелистывание с помощью jCarousel, но, видимо, он и не работает со стабильной версией модуля Galleria, как пишут в обсуждениях на Drupal.org.
Решил проблему совместимости модулей установкой Galleria 6.x-1.0 и jCarousel 6.x-1.1.
Скажите, пожалуйста, как получить содержимое одного поля в другом с помощью поля типа "Computed"??
Так не получается.. выдает дикую ошибку.
PDOException: SQLSTATE[21S01]: Insert value list does not match column list.. и тд.
Помогите, пожалуйста, очень надо..
ЗЫ drupal 7
Спасибо афтар! очень уж помогла статейка! Очень к стати! ))) http://newhome53.com/dom/project-28 сделал цены табличкой, как и хотел! Респект!
А как сделать, чтобы выводилось дефолтное значение, если в поле нет значений? Если поле заполнено, выводить содержимое, иначе - дефолтное значение
А как сделать вывод полей не в ноде, а при создании комментария к этой ноде?
Комментировать