УрокНемного о выводе любых cck-полей программно через node.tpl.php

Сегодня я решил рассказать как выводить cck поля через шаблон node.tpl. Часто бывают такие ситуации, что, например, требуется, чтобы данные из cck полей автоматически закидывать в html-таблицу, или формировать её особым образом, требующим обёртки в дополнительные div'ы (или в любые другие тэги). Поэтому надо обязательно знать, каким образом вывести эти поля в своём шаблоне.

Алгоритм вывода не сложен:

<?php echo $node->имя_поля[0]['view']; ?>

Вместо имени поля надо подставлять полное имя поля, как на рисунке:
Вывод cck прогарммно
Тоесть, если поле будет называться как на рисунке - field_lesson_image, то вывести его можно будет таким куском кода:

<?php echo $node->field_lesson_image[0]['view']; ?>

Таким образом будет выведено то представление cck поля, которое вы укажите в отображении полей:
управление 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.

Комментарии

Аватар пользователя powerscin
powerscin написал:

Спасибо, ты прямо как знал, что он мне нужен, почаще бы так)

30.11.2010 14:02
Аватар пользователя seaji
seaji написал:

Прошу прощения, но индивидуальные поля лучше выводить через печать переменной $имя_поля_rendered
Если брать последний пример, то это будет:

print $field_lesson_image_rendered;

При таком выводе мы можем легко поменять отображение поля через админку, через управление отображением полями в CCK.
К примеру, поменять один пресет imagecache на другой или вообще LightBox навесить.

30.11.2010 15:10
Аватар пользователя Spleshka
Spleshka написал:

Возможно лучше и вашим способом, но ведь и через $node->field_lesson_image[0]['view'] тоже можно легко поменять вывод через админку, навесить пресет или лайтбокс к примеру :)

30.11.2010 16:13
Аватар пользователя D.Choomc
D.Choomc написал:

Оба-на! Спасибо сенсей!! Как раз хотел тебе урок заказать на эту тему))

А если такая ситуация:
Есть ццк поле, которое видят авторизованные юзеры. Как сделать проверку: если юзер - то все ок, показываем поле, а если анонимус - вместо поля показываем какой-нибудь текст (типа "Только зарегистрированные пользователи могут это лицезреть") ??

30.11.2010 18:51
Аватар пользователя Spleshka
Spleshka написал:
<?php 
  global $user;
  if ($user->uid > 0) {
    echo $node->field_img[0]['view'];
  }
  else {
    echo 'Только зарегистрированные пользователи могут это лицезреть';
  }
?>
30.11.2010 19:38
Аватар пользователя 866
866 написал:

Добрый день!
А как правильно сделать проверку перед выводом CCK поля, если на сайте используется модуль Field Permissions, с помощью которого установлены права доступа к отдельным полям в зависимости от того, является ли автором ноды просматривающий её юзер и какие роли ему назначены?

08.05.2013 17:22
Аватар пользователя AK47
AK47 написал:

Интересует еще есть ли разница между echo $node->field_имя поля[0]['view'];
и echo $node->field_имя поля[0]['value']; или как правильней ?

P.s. имеются ввиду текстовые поля, для картинки конечно - ['view'] :)

02.12.2010 18:17
Аватар пользователя Spleshka
Spleshka написал:

Разница есть даже для текстовых полей. Если для них включены форматы ввода - то view выведет корректно (с учётом форматирования), а value - только то, что вы ввели в текстовое поле

02.12.2010 21:22
Аватар пользователя sergldom
sergldom написал:

Здравствуйте.
Подскажите пожалуйста как можно переопределить вывод поля cck. Например выводится поле в одном месте, а нужно чтоб оно выводилась в другом, например над определенной строчкой. Можно переопределить позицию с помощью css, но как привязать позицию к другому полю, ведь position не может привязать одно поле к другому?

09.01.2011 17:53
Аватар пользователя Spleshka
Spleshka написал:

ну так урок этому и посвящён - как вывести сск поле в удобном для вас месте

09.01.2011 22:43
Аватар пользователя sergldom
sergldom написал:

Уточню то, что имею в виду:

На скриншоте отображено поле перечеркнутое красным - имя field_old_prise

я внес код

<?php print $node->field_old_prise[0]['view'] ?> 
в 
node-product.tpl.php:
 
        <?php $product_details = $fusion_uc_weight || $fusion_uc_dimensions || $fusion_uc_list_price || $fusion_uc_sell_price || $fusion_uc_model || $fusion_uc_cost; ?>
        <div id="product-details" class="clear<?php if (!$product_details): ?> field-group-empty<?php endif; ?>">
          <div id="field-group">
            <?php print $fusion_uc_weight; ?>
            <?php print $fusion_uc_dimensions; ?>
            <?php print $fusion_uc_model; ?>
            <?php print $fusion_uc_list_price; ?>
            <?php print $node->field_old_prise[0]['view'] ?> 
            <?php print "<br>$fusion_uc_sell_price"; ?>
            <?php print $fusion_uc_cost; ?>
          </div>

теперь отображает в нужном месте то, что нужно, но получается теперь 2 вывода одного и того же. Мне интерестно чтоб выводило именно перечеркнутое красное на место серого.

11.01.2011 00:03
Аватар пользователя sergldom
sergldom написал:

Скриншот:

11.01.2011 00:05
Аватар пользователя sergldom
sergldom написал:

Скопировал 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

но с этим кодом вообще не выводит поле нигде.

в дивах пришлось стрелочки убрать - не отображались вообще

11.01.2011 13:15
Аватар пользователя Spleshka
Spleshka написал:

Понял. Смотрите - вот так должен выглядеть ваш код node-product.tpl.php:

        <?php $product_details = $fusion_uc_weight || $fusion_uc_dimensions || $fusion_uc_list_price || $fusion_uc_sell_price || $fusion_uc_model || $fusion_uc_cost; ?>
        <div id="product-details" class="clear<?php if (!$product_details): ?> field-group-empty<?php endif; ?>">
          <div id="field-group">
            <?php print $fusion_uc_weight; ?>
            <?php print $fusion_uc_dimensions; ?>
            <?php print $fusion_uc_model; ?>
            <?php print $fusion_uc_list_price; ?>
            <!-- оборачиваем в <div> -->
            <div class = "field-old-prise">
               <?php print $node->field_old_prise[0]['view'] ?> 
            </div>
            <?php print "<br>$fusion_uc_sell_price"; ?>
            <?php print $fusion_uc_cost; ?>
          </div>

Теперь осталась проблема дублирования цены. Переходите на страницу /admin/content/node-type/product/display и рядом с полем field_old_prise ставите две галочки на Exclude (Исключить). С дублированием покончено :)

В данном случае даже нет необходимости перекрывать шаблон CCK

11.01.2011 14:24
Аватар пользователя sergldom
sergldom написал:

Спасибо за ответ.
Когда поставил галочку на Exclude в этом поле, после сохранения, нижнее поле никуда не пропало.
Вышел из ситуации кинув в папку с темой пустой файл content-field-field_old_prise.tpl.php
Спасибо огромное за помощь.

11.01.2011 15:18
Аватар пользователя Spleshka
Spleshka написал:

Странно, поле не должно выводиться вообще) Почистите кэш на сайте, может быть в этом было дело

11.01.2011 16:02
Аватар пользователя sergldom
sergldom написал:

В том то и дело, что пока настраивается и наполняется сайт, кеш отключен вообще.

11.01.2011 21:04
Аватар пользователя sergldom
sergldom написал:

Можно еще один вопросик?

<?php
			function first_function() {<div class="name-field-old-prise">Старая цена: </div> <div class="summ-field-old-prise"><?php print $node->field_old_prise[0]['view'] ?> грн.</div>}
			if ("<?php print $node->field_old_prise[0]['view']?>" > 0) {
				first_function()
			}
			else {
				print 'Нет акции'
			}
			?>

Это попробовал прикрутить проверку.
Занести дивы с внутренностями в функцию и по проверке если поле больше нуля тогда выводить функцию, если меньше или равно нуля тогда ничего не выводить (только незнаю как пропустить и сделал print 'Нет акции')
Код неработает у меня.

12.01.2011 01:28
Аватар пользователя powerscin
powerscin написал:

А зачем ты в пхп-коде еще открываюшие теги ставишь?

получается, что в этом месте ты останавливаешь выполнение функции:

  [0]['view']<strong>?></strong>" > 0)

Не выводи через функцию. В данном случае даже смысла в ней нет. Сделай просто вот так:

<?php
 
  if ( $node->field_old_prise[0]['view'] > 0) {
    <div class="name-field-old-prise">Старая цена: </div> 
    <div class="summ-field-old-prise">'. $node->field_old_prise[0]['view'] .'грн</div>';
  }
  else {
    echo 'Нет акции';
  }
 
?>
12.01.2011 02:24
Аватар пользователя sergldom
sergldom написал:

Спасибо за помощь. Вывел таким кодом:

<?php
			if  ($node->field_old_prise[0]['view'] != 0) {
				echo '<div class="name-field-old-prise">Старая цена: </div>';
				echo '<div class="summ-field-old-prise">'; 
				echo $node->field_old_prise[0]['view'];
				echo "грн.</div>";
			}
			?>
16.01.2011 15:59
Аватар пользователя span4ez
span4ez написал:

Проблема в следующем установил модуль для CCK вот этот FileField. Но после добавление картинки он ее не показывает :( путь устанавливает верный. В чем может быть трабла?

05.03.2011 18:45
Аватар пользователя raf
raf написал:

возможно название картинки на русском языке и/или с пробелами... У меня как то раз была такая проблема. Включил транслитерацию для загружаемых файлов - всё стало ок.

05.03.2011 19:43
Аватар пользователя Spleshka
Spleshka написал:

Возможно, тут надо посмотреть /admin/content/node-type/ТИП_КОНТЕНТА/display

05.03.2011 22:30
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Вставил код как в примере:
echo $node->имя_поля[0]['view'];

После этого выдает ошибку именно в этой строке где вставил код:
Notice: Undefined offset: 0 в функции include() (строка 340 в файле Z:\home\site.ru\www\sites\all\themes\th\node.tpl.php).

31.03.2011 12:20
Аватар пользователя Spleshka
Spleshka написал:

Что это поле выводит?

01.04.2011 11:52
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Ошибку убрал (ваша статья под 6 друпал). У меня седьмой, поля выводятся в семерке немного по другому ...
Обычное текстовое поле...

01.04.2011 12:35
Аватар пользователя Lana
Lana написал:

Подскажите, пожалуйста, как получить название файла (для поля типа file) чтобы потом вставить его в ссылку.

11.04.2011 06:17
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

А как в Drupal 7 программно вывести ссылку на термин (теги)? Мне надо чтобы термины отображались над заголовком статьи.

13.06.2011 14:41
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Drupal 7: Theming Fields and Nodes with Templates Помогло! для Drupal 7

08.07.2011 14:47
Аватар пользователя Радуга
Радуга написал:

Здравствуйте. А я, чтобы вывести не одну запись cck поля, использовал такой код:

    <?php foreach ((array)$node->field_color as $item) { ?>
      <div class="color"><?php print $item['view'] ?></div>
    <?php } ?>

Но не могу понять, как вывести заголовок (label) этого поля. Подскажите пожалуйста, как сделать так, чтобы заголовок выводился только в том случае, если есть что выводить. Например: Есть cck поле Цвет. В нем значения касный, синий, зеленый. Можно выбрать два цвета. Если пользователь ничего не выбирает, соответственно ничего и не отображается.
Спасибо.

04.08.2011 11:22
Аватар пользователя dakanca
dakanca написал:

Добрый день. Часто захожу к Вам, очень нравится.

У меня есть вопрос. Использовал конструкцию к множественным полям. А как сделать чтобы еще выводилось alt текст к картинке? Конечно можно продублировать и подставить в эту же конструкцию любое значение, но важно чтобы выводило вместе. Img и alt.

Заранее спасибо.

06.10.2011 15:18
Аватар пользователя Spleshka
Spleshka написал:

Добрый день.

Если я вас правильно понял - то выводится так:

<?php 
  $i = 0;
  while ($node->field_lesson_image[$i]['view']) {
    echo 
     '<div class = "photo">' . $node->field_lesson_image[$i++]['view'] . $node->field_lesson_image[$i++]['data']['alt'] . '</div>';
  }
?>
06.10.2011 20:31
Аватар пользователя dakanca
dakanca написал:

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

UPD: выводи изображения четные, то есть, по порядку загрузки 2 4 6. подгружаю без массовых загрузчиков.

10.10.2011 09:46
Аватар пользователя Spleshka
Spleshka написал:

А, да) Опечатался в коде, извиняюсь. Так правильно:

 
  $i = 0;
  while ($node->field_lesson_image[$i]['view']) {
    echo 
     '<div class = "photo">' . $node->field_lesson_image[$i]['view'] . $node->field_lesson_image[$i]['data']['alt'] . '</div>';
    $i++;
  }
10.10.2011 20:19
Аватар пользователя dakanca
dakanca написал:

Спасибо. То что нужно.

12.10.2011 07:14
Аватар пользователя Vladimir
Vladimir написал:

Большое спасибо за приведенные примеры. Пользуюсь вашим кодом для вывода нескольких значений CCK поля. То есть есть выпадающий список в котором можно выбрать несколько значений и ваш код прекрасно все выводит:

<?php 
	$i = 0; 
	while ($node->field_myfield[$i]['view']) { 
		echo ''. $node->field_myfield[$i]['view'] .', '; $i++;
	} 
?>

Из кода видно что я пытаюсь разделять значения в выводе запятой. То есть по сути получается такой вывод:

WAV, MP3, WMA,

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

08.10.2011 17:39
Аватар пользователя Vladimir
Vladimir написал:

Вопрос снимается, решил вот таким способом:

<?php 
     $i = 0; 
     $st = '';
     while ($node->field_myfield[$i]['view'])
     { 
      $st=$st.$node->field_myfield[$i]['view'].', ';
      $i++; 
     } 
 echo  substr($st,0,-2); 
?>

Может быть не "друпально" но работает. :HAPPY:

08.10.2011 23:14
Аватар пользователя Spleshka
Spleshka написал:

Главное что работает :)
А вообще можно написать например так:

$fields = array();
foreach ($node->field_myfield as $field) {
  $fields[] = $field['view'];
}
echo implode(', ', $fields);

Результат будет тот же, а код немного красивее :)

09.10.2011 12:27
Аватар пользователя Vladimir
Vladimir написал:

Большое спасибо. Возьму на заметку. :)

09.10.2011 15:04
Аватар пользователя Serik Yeleussizov
Serik Yeleussizov написал:

Добрый день!
а как реализовать эту в node D7?

место $node надо писать через render?

18.02.2012 12:21
Аватар пользователя Sergey
Sergey написал:

Доброго времени.
Вывожу на странице все данные только через запросы вида

<?php echo $node->имя_поля[0]['view']; ?>

Все хорошо, все работает.
Но теперь понадобилось вывести комментарии с формой комментирования. Получилось вывести форму только функцией

<?php print $content ?>

Но тогда дублируется все, что было выведено через

<?php echo $node->имя_поля[0]['view']; ?>

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

15.10.2011 20:28
Аватар пользователя Spleshka
Spleshka написал:

Какая версия Друпала?

15.10.2011 23:59
Аватар пользователя Sergey
Sergey написал:

6 друпал.
Пока решил проблему стерев все из node.tpl.php. Теперь комментарии и форма комментариев появляется без лишней информации.

16.10.2011 10:10
Аватар пользователя Spleshka
Spleshka написал:

Вы уверены что это 6й Друпал? В 6й версии вывод комментариев не зависит вообще от шаблона node.tpl.php. Для комментариев есть свой отдельный шаблон comment.tpl.php

16.10.2011 15:06
Аватар пользователя Sergey
Sergey написал:

Да, 6й. Все верно, через comment.tpl.php сейчас темизирую вывод комментариев, а вот если на странице информация выводится только через поля CCK, то как вывести комментарии и форму добавления комментария? У меня получилось только при добавлении в шаблон переменной

<?php print $content; ?>

а эта переменная дублировала вывод информации которую я уже вывел через доп. поля CCK. После того как я удалил всю информацию из файла node.tpl.php лишняя информация не выводится, а выводятся только комментарии с формой комментирования. Во как запутано :) Это не правильно и в идеале нужно выводить комментарии и форму добвления через какие ни будь функции или все отлично и можно не забивать голову?

16.10.2011 19:30
Аватар пользователя Acho
Acho написал:

(CCK, PHP)
Подскажите, какой самый лайтовый способ прикрепить URL из LinkField к кнопке из ImageField ?
Можно ли это сделать php запросом в page-node.tpl.php ?

26.02.2012 16:37
Аватар пользователя Антон2012
Антон2012 написал:

Подскажите, как в шаблоне вывести поле CCK определенной ноды?
Т.е. как в этом коде

<?php print $node->field_name[0]['view']; ?>

использовать nid?

18.03.2012 10:07
Аватар пользователя Илья
Илья написал:

Подскажите пожалуйста, почему у меня может ничего не выводиться вообще? Например echo $node->field_project_date[0]['view']; - у меня ничего не выводит( Хотя поле заполнено, всё как надо.
И еще, не совсем понял, разве обязательно этот код использовать в шаблоне? Разве не всё равно, если например я его использую в блоке? (php-форматом, естественно)

28.03.2012 19:07
Аватар пользователя Илья
Илья написал:

Извиняюсь за глупый вопрос, во всем разобрался сам. Объяснять ничего не требуется (от себя) я просто затупил) Можно удалить мой пост.

29.03.2012 08:33
Аватар пользователя Валерий
Валерий написал:

Спасибо очень полезно

Дополнительные изображения вывел так:

<?php foreach ((array)$node->field_image_cache as $item) { ?>
      <div class="color"><?php print $item['view'] ?></div>
<?php } ?>

Но не как не пойму как изменить размер выводимых доп изображений

13.06.2012 09:26
Аватар пользователя Petr213
Petr213 написал:

Очень помогла.
А есть способ выводить по аналогии группы полей? Т.е. при добавлении поля в группу оно автоматом выводилось бы.

29.06.2012 23:12
Аватар пользователя Михаил
Михаил написал:

Пожалуйста, подскажите
Пытаюсь вывести по такому сценарию
$node->field_top_text[0]['view']
Но ничего не выводится. Сделал var_dump($node->field_top_text[0]), массив не пустой, но индекса view в нем нет

20.01.2013 22:40
Аватар пользователя Гость
Гость написал:

Сделал как вы и писали

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'] . '';
}

Но произошло задвоение поля ... В чем проблема?

24.04.2013 00:56
Аватар пользователя Spleshka
Spleshka написал:

Это поле ещё надо убрать из вывода в переменной $content; Если не ошибаюсь:

hide($content['field_chenok']);
24.04.2013 11:00
Аватар пользователя Вадим
Вадим написал:

Подскажите, пожалуйста, как быть, если выводимое поле содержит несколько изображений? Требуется вывести первое из них в полном формате, а остальные ­— в формате превью (или другого размера).

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

27.05.2013 20:53
Аватар пользователя Вадим
Вадим написал:

Спасибо за пост!

Решил задачу с помощью кода

<?php foreach ((array)$node->field_image_cache as $item) { ?>
      <div class="color"><?php print $item['view'] ?></div>
<?php } ?>

который привёл один из комментаторов чуть выше, и настроил в отображении поля изображения вывод его через Galleria. Правда, не смог сделать перелистывание с помощью jCarousel, но, видимо, он и не работает со стабильной версией модуля Galleria, как пишут в обсуждениях на Drupal.org.

28.05.2013 13:44
Аватар пользователя Вадим
Вадим написал:

Решил проблему совместимости модулей установкой Galleria 6.x-1.0 и jCarousel 6.x-1.1.

28.05.2013 22:42
Аватар пользователя Игорь
Игорь написал:

Скажите, пожалуйста, как получить содержимое одного поля в другом с помощью поля типа "Computed"??

$node=menu_get_object();
if(isset($node->field__2)) {
$b = render(field_view_field('node', $node, 'field__2')); }

Так не получается.. выдает дикую ошибку.

PDOException: SQLSTATE[21S01]: Insert value list does not match column list.. и тд.

Помогите, пожалуйста, очень надо..
ЗЫ drupal 7

18.07.2013 22:32
Аватар пользователя iXodes
iXodes написал:

Спасибо афтар! очень уж помогла статейка! Очень к стати! ))) http://newhome53.com/dom/project-28 сделал цены табличкой, как и хотел! Респект!

07.07.2014 01:08
Аватар пользователя Алексей Свиридов
Алексей Свиридов написал:

А как сделать, чтобы выводилось дефолтное значение, если в поле нет значений? Если поле заполнено, выводить содержимое, иначе - дефолтное значение

15.02.2015 12:17
Аватар пользователя Константин
Константин написал:

А как сделать вывод полей не в ноде, а при создании комментария к этой ноде?

08.03.2015 13:22

Комментировать