УрокНемного о выводе любых 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.
- SplasH
- 30.11.2010
- 11337
Комментарии
Спасибо, ты прямо как знал, что он мне нужен, почаще бы так)
Прошу прощения, но индивидуальные поля лучше выводить через печать переменной $имя_поля_rendered
Если брать последний пример, то это будет:
При таком выводе мы можем легко поменять отображение поля через админку, через управление отображением полями в CCK.
К примеру, поменять один пресет imagecache на другой или вообще LightBox навесить.
Возможно лучше и вашим способом, но ведь и через $node->field_lesson_image[0]['view'] тоже можно легко поменять вывод через админку, навесить пресет или лайтбокс к примеру :)
Оба-на! Спасибо сенсей!! Как раз хотел тебе урок заказать на эту тему))
А если такая ситуация:
Есть ццк поле, которое видят авторизованные юзеры. Как сделать проверку: если юзер - то все ок, показываем поле, а если анонимус - вместо поля показываем какой-нибудь текст (типа "Только зарегистрированные пользователи могут это лицезреть") ??
Интересует еще есть ли разница между 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
Здравствуйте. А я, чтобы вывести не одну запись 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-форматом, естественно)
Извиняюсь за глупый вопрос, во всем разобрался сам. Объяснять ничего не требуется (от себя) я просто затупил) Можно удалить мой пост.
Комментировать