УрокПример перекрытия шаблона CCK
В прошлом уроке я обещал показать пример, как можно перекрывать шаблоны ССК полей. А раз обещал - значит вынь да полож.
Пример
Надо к статье добавить поле, которое будет выводить неограниченное количество картинок с их описанием, введённое в поле "описание (description)".
По умолчанию это поле не выводится, поэтому надо лезть в шаблон и дописывать его вывод. Заодно уменьшить количество лишних классов, мало ли, для seo пригодится ;) Итак, поехали по порядку.
Действие номер раз
Сначала добавляем ССК поле в свою статью. Для этого нам понадобится модули CCK, Filefield и Imagefield. Ложим эти модули в папку \sites\all\modules (если какой-то папки нет - создать). Лезем в админке в настроку модулей /admin/build/modules и в группе CCK включаем Content , Filefield и Imagefield. После чего лезем в управление контентом (content management) и выбираем "Типы материала (content types)". Напротив нужного вам материала кликаем "управлять полями (manage fields)". Урл, на котором вы будете находиться, должен выглядеть так: http://имя_сайта/admin/content/node-type/имя_типа_содержимого/fields.
Тут добавляем ССК поле таким образом:
Метку поля (label) можно делать любой, она будет отображаться у вас над этим полем при добавлении содержимого. Имя поля лучше делать осмысленной, по принципу имяТипаМатериала_чтоБудетХраниться. У меня тип материала - story, а записывать туда я буду фотки. Потом когда будете работать с модулем Views вы без труда разберётесь для чего вам это поле служит. В противном же случае, при большом количестве полей вы рискуете просто запутаться в них, и потратить кучу времени на поиск ошибки. Остальные аттрибуты оставьте такими, как на скриншоте. Жмём сохранить. Вас переадресует на страницу с настройками поля. Пока измените только одно значение - количество значений у поля, чтобы мы могли загружать больше одной фотографии
Действие номер два
Теперь этим картинкам надо менять размер при их отображении в материале, ведь их размер может быть совершенно разнообразным, а когда картинки каждый раз разного размера - это довольно некрасиво. Да и самому каждый раз их подрезать лениво. Поэтому был придуман модуль Imagecache, который умеет ловко обрабатывать фотографии, уменяшая/увеличивая их размер до необходимого. Для того, чтобы он работал нам надо скачать модули Imce, ImageApi и Imagecache. Опять закидываем их в папку с модулями (разархивированными, естественно!) и включаем их в настройках модулей. IMCE - это модуль, позволяющий загружать картинки, ImageAPI и ImageCache - модуля, позволяющие работать с картинками (изменять размер и т.п.).
Теперь нам нужно создать пресет, т.е. указать, как наши фотографии будут изменять размер при отображении. Для этого идём в admin/build/imagecache, создаём новый пресет. Называем его как-нибудь в духе дляЧего_размерИзображения, например gallery_150x100. Там задаём необходимые параметры изменения размера фотографии (сами побалуйтесь, там всё просто). Сохраняем пресет.
Теперь возвращаемся в управление типами содержимого, и напротив нашего типа нажимаем "показать поля (display fields)". Здесь можно настроить вывод метки (на скриншоте - метка будет спрятана), вывод картинки в анонсе материала (на скриншоте я тоже его убрал) и вывод картинки в полной версии материала (на скриншоте - он использует пресет 150х100). Сохраняем.
Всё, работу с сайтом закончили. Теперь наконец переходим к созданию шаблонов.
Шаг намбер три
Из модуля ССК копируем в папку с темой файл content-field.tpl.php. После чего дублируем этот файл в эту же папку, но назвав его content-field-field_story_images.tpl.php. Открываем этот файл.
Всё, что нам надо в нём оставить:
<div class="field-story-images"> <?php $count = 0; foreach ($items as $delta => $item) : if (!$item['empty']) : ?> <div class="field-item"> <?php echo $item['view']; ?> <div class="field-label"> <?php echo $node->field_story_photo[$count]['data']['description']; ?> </div> </div> <?php $count++; endif; endforeach;?> </div>
Фактически, я тут оставил только вывод самой картинки и её описания. Вот и всё. Закидываем файлы на сервер, чистим кэш - и дело сделано!
- Spleshka
- 19.08.2010
- 14980
Комментарии
Thanx man)) полезно) добавил тебя в ридер))
Без проблем, если будут вопросы - задавай! :) Всегда рад помочь!
Скажи, пожалуйста, какое преимущество этого способа перед изменением самого шаблона node.tpl.php?
Мне никогда не приходилось изменять шаблоны вывода полей cck, я всегда правлю шаблон ноды. Возможно, это плохое решение.
Надо поступать в зависимости от ситуации. Предположим, у вас есть 20 типов нод, из которых половина использует данный в статье пример. Придётся создавать 10 шаблонов для этих нод, и в них указывать, каким образом выводить фотографии. Понимаете, не надо взрывать всё поле, чтобы выкопать пару картошин :) С перекрытием cck-поля мы меняем только его. В противном же случае мы поменяем вывод всех нод.
Вдруг откуда ни возьмись появилось
field-story-images
причём, кажется, вместо
field_story_photo
Или я чего-то не понял?
ну это же просто класс ддля css :) Он никакой важной роли не играет
Почему он перекрывает шаблон именно для этого поля? если файл называется одним именем
а поле называется другим именем...
И фраза "Из модуля ССК копируем в папку с темой файл ..." в папку с какой темой? обратно куда? в
"all/modules/cck/theme/" или еще куда?
Для поля с названием field_story_images шаблон перекрытия будет называться именно content-field-field_story_images.tpl.php. Примите это как факт, т.к. так было задумано разработчиками.
Поясняю фразу "Из модуля ССК копируем в папку с темой файл ...":
Всех с Новым Годом!:HI:
Сделал, как здесь написано, но повилась еще одна фотка рядом с первой:SAD:
И второй вопрос, как такое проделать с текстовым полем, чтоб можно было применить стили:HAPPY:
наверное, ты не исключил фотографию из вывода сск полей)
а текстовое поле просто заверни в шаблоне node.tpl.php в какой-нибудь div и укажи стили к нему)
С изображением все получилось. Огромное спасибо!
Сделал в node.tpl.php вот так:
[code]
ob_start();
echo art_node_title_output($title, $node_url, $page);
$metadataContent = ob_get_clean();
if (trim($metadataContent) != ''):
echo $metadataContent;
endif;
if ($submitted):
echo art_submitted_worker($date, $name);
endif;
print $picture;
echo $content;
echo $node->field_field_price[0]['view'];
if (isset($node->links['node_read_more'])) { echo '<div class="read_more">'.get_html_link_output($node->links['node_read_more']).'</div>'; }
ob_start();
echo $output;
endif; endif;
$metadataContent = ob_get_clean();
if (trim($metadataContent) != ''):
echo $metadataContent;
endif;
[/code]
В CSS назначил класс:
[code].field_price {
color: red;
}[/code]
Ничего не меняеться.
Может сделать как в первом примере, только не знаю как. :-(
Дело все в том, что тут:
в блок .field_price будут вложены другие блоки, так что тебе нужно применить свой стиль ко внутренним блокам. Должно помочь :)
Это происходит по тому, что где то стили внутренних блоков, по части цвета шрифта, уже определены, а что бы их переопределить тебе нужно явно прописать стили для них.
Исходный код этого фрагмента:
Мне надо изменить цвет "от 150 руб"
При этом пробовал прописывать стили для всех DIVов ничего не помогает
Может все таки перекрыть стиль как нибудь?
;-(
Напишите так:
если это не поможет попробуйте:
Цвет поменялся и в поле: Нименование товара :-(
тогда так:
Сейчас сработало!
Огромное спасибо!:-)
И запомни - артистир - зло ))
Зло-незло, а темы нормальные делает, быстро и красиво :-)
Один минус- резиновый каркас не может делать
говнокода =) И кстати, Яндекс банит за артистирУже два сайта с шаблонами от Артистера, в выдаче Яндекса присутствуют :-)
Правда на Joomla. Сейчас вот осваиваю Друпал, возможностей действительно больше.
Правда темы придеться потом делать самому, это я прекрасно понимаю.
Но всему свое время :-)
Еще раз спасибо за поддержку и понимание.
Сайт у Вас классный! Но, что-то не доработанно со смайликами, приходиться впечатывать вручную :-)
Спасибо за отзыв о сайте! Со смайликами проблему знаю, но всё никак руки не доходят)) Скоро сделаю, чесслово
Доброго времени суток!
Не посчитайте за назойливость.
Сейчас испльзую другой шаблон не от артистера, кто знает называеться Danland.
Дело в другом. Есть модуль галерея, так вот на странице с картинкой никак не могу ее выровнять по левому краю, уже мозги дымяться, чего только не писал в стилях.
У вас мозги по-моложе, может чего подскажете :-)
Еще раз извините, вот фрагмент кода со страницы:
Так довольно сложно, сказать что то дельно, может есть ссылка на сайт? Было бы намного быстрее.
Сайт на локалке :-)
Жаль, что способ работает только для вывода материала, для Views, выводимого полями, не катить :SAD:
Есть поле user reference. Оно выводит логин пользователя. Как переопределить поле, чтобы выводилось логин (в идеале realname) + аватар пользователя?
В user reference может быть несколько значений.
Перекрывайте шаблон так же, как и в статье. Далее надо пройтись по всему массиву с user reference. Этот массив будет содержать uid пользователя. Вам необходимо загрузить пользователя по этому uid и вывести его аватарку и имя:
спасибо за ответ.
Попробовал вставить код, но он вывле аватарку анонимного пользователя. То есть получается не зацепил он user_load($uid).
Видимо я не сделал это "Далее надо пройтись по всему массиву с user reference"...
То есть я просто вставил код в шаблон поля
Естественно, просто так работать не будет. Надо обойти в цикле массив, получая на каждой итерации uid пользователя.
можете вы привести пример кода или ссылку на пример кода? я совсем-совсем не программист ))
Для шестерки давно использую этот метод. Сейчас для семерки ищу решение выводить описание под фоткой. Подскажите как.
Практически тоже самое. Только шаблон надо брать не из модуля cck, а из field (который в ядре).
Я так и понял :) а код можете написать? Я там на друпале тоже вопрос задал, потом кину ссылку на вас в ответе, если решение напишите.
В модуле field в папке theme лежит файл field.tpl.php. Копируете его себе в тему. Далее копируете его ещё раз туда же, переименовав в field--имя-поля.tpl.tpl. Таким образом в корне темы лежат и field.tpl.php и field--имя-поля.tpl.php.
Для того, чтобы вывести, например, атрибут alt, содержимое field--имя_поля.tpl.php должно быть таким:
Спасибо вам большое! Несколько дней мучался и и пробовал выводить через вьювс с перезаписью полей. Ваш метод прост и главное работает!
Оказывается, не всё так просто. При выводе ноды через вьювс пропадает альт. Не подскажите куда нужно вписать ваш код, что бы и при использовании вьювс выводился альт под картинками?
Я весь мозг сломал, не получалось. Какие только имена не пробовал. В итоге оказалось файл нужно было назвать field--field_имяполя.tpl.php
Спасибо, спасибо, Спасибо!!!!!
Чувак, я люблю тебя!)
2 дня убил на эту хрень - image caption отказывался выводиться вместе с colorbox. И вот оно решение. Дас ист фантастишь!
Отлично! Спасибо, работает. Оказалось еще проще чем в 6.
Ссылку кинул на этот пост, как и обещал.
Извините за нубство! Подскажите, плз, куда именно в тему копировать эти два файла? И как конкретно назвать второй файл, н-р: field--alt_foto.tpl.php?
Комментировать