УрокНемного о выводе любых 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
Аватар пользователя SplasH
SplasH написал:

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

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

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

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

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

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

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

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

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

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

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

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

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

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
Аватар пользователя SplasH
SplasH написал:

Понял. Смотрите - вот так должен выглядеть ваш код 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
Аватар пользователя SplasH
SplasH написал:

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

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
Аватар пользователя SplasH
SplasH написал:

Возможно, тут надо посмотреть /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
Аватар пользователя SplasH
SplasH написал:

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

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
Аватар пользователя SplasH
SplasH написал:

Добрый день.

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

<?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
Аватар пользователя SplasH
SplasH написал:

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

 
  $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
Аватар пользователя SplasH
SplasH написал:

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

$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
Аватар пользователя SplasH
SplasH написал:

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

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

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

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

Вы уверены что это 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

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

                                                                
88888888ba 88 88888888888 888888888888 88888888ba,
88 "8b 88 88 ,8P' 88 `"8b
88 ,8P 88 88 d8" 88 `8b
88aaaaaa8P' 88 88aaaaa ,8P' 88 88
88""""""' 88 88""""" d8" 88 88
88 88 88 ,8P' 88 8P
88 88 88 d8" 88 .a8P
88 88 88888888888 8P' 88888888Y"'

Enter the code depicted in ASCII art style.