Создание темы для сайта на основе уникального дизайна
Предыдущий этап: сочинение views'ов.
Первым делом беру за основу самую "лысую" тему, в которой нет ничего лишнего - это, как мне кажется, тема Foundation. Переименовываю в architect (не забываю поправить .info) что-бы она ни дай бог не обновилась, затем закидываю тему в sites/default/themes и включаю.
На CSS и резке особо не останавливаюсь, и приступаю к работе с tpl'ями.
В template.php ввожу пару своих функций:
<?php
/**
* Remove last breadcrumb if node type is 'image'
* Убрать из крошек последний элемент, если он типа image (так надо)
*/
function _architect_breadcrumb($breadcrumb,$node) {
if (!empty($breadcrumb)) {
if($node->type=='image'){ //unset last breadcrumb
unset($breadcrumb[count($breadcrumb)-1]);
$breadcrumb[count($breadcrumb)-1]=strip_tags($breadcrumb[count($breadcrumb)-1]);
}
return '<div class="breadcrumb">'. implode('<span>/</span>', $breadcrumb) .'</div>';
}
}
/**
* Don't allow theme destroy breadcrumb array
* Не даём теме угробить массив хлебных крошек строкой
*/
function architect_breadcrumb($breadcrumb) {
return $breadcrumb;
}
?>
Затем правлю page.tpl.php.
В самом начале ставлю вызов своей функции для хлебных крошек:
<?php /* $Id: page.tpl.php,v 1.4 2008/07/14 01:41:22 add1sun Exp $ */
$breadcrumb=_architect_breadcrumb($breadcrumb,$node);
?>
Всё остальное пока заходит без особых изменений.
Копирую из кишек друпала content-field.tpl.php. Уже не помню зачем, но скорее всего без него не работают переопределения вывода конкретных полей далее. Что-юы шаблоны полей подтянулись нужно заходить на страницу модулей и/или нажимать кнопку почистить кэш.
На базе content-field.tpl.php создаю content-field-field_image_big.tpl.php, который будет переопределять вывод поля для скачивания 3D изображения, подсовывая в качестве текста ссылки или умолчательный текст, или тот, что введён в description. Для корректного вывода русского текста из шаблонов не забываю преобразовать файл в UTF-8 (без BOM).
<?php if (!$field_empty) :
global $base_path;
?>
<div class="field field-type-<?php print $field_type_css ?> field-<?php print $field_name_css ?>">
<?php if ($label_display == 'above') : ?>
<div class="field-label"><?php print t($label) ?>: </div>
<?php endif;?>
<div class="field-items">
<?php $count = 1;
foreach ($items as $delta => $item) :
if (!$item['empty']) : ?>
<div class="field-item <?php print ($count % 2 ? 'odd' : 'even') ?>">
<?php if ($label_display == 'inline') { ?>
<div class="field-label-inline<?php print($delta ? '' : '-first')?>">
<?php print t($label) ?>: </div>
<?php } ?>
<?php
if(empty($item['data']['description'])){
$item['data']['description']='Скачать 3D изображение';
}
print '<a href="'.$base_path.$item['filepath'].'">'.$item['data']['description'].'</a>';
?>
</div>
<?php $count++;
endif;
endforeach;?>
</div>
</div>
<?php endif; ?>
Правлю вывод поля нормальной картинки в шаблоне content-field-field_image_normal.tpl.php чтобы срабатывал при нажатии вывод большой картинки в shadowbox (показан только изменённый кусочек кода):
<?php
if(!empty($node->field_image_big[0]['filepath'])){
print '<a href="'.>$base_path.$node->field_image_big[0]['filepath'].'" rel="shadowbox">'.$item['view'].'</a>';
}else{
print $item['view'];
}
?>
Затем разбираюсь с ссылками в названиях проектов в шаблоне content-field-field_page_works.tpl.php. Основная проблема, что ссылки для проектов с видео должны вести на якорь в сводной странице видео-проектов, а для остальных проектов, ссылка должна вести на первое изображение проекта, минуя собственно проект.
Показан только уникальный кусок кода.
<?php
$project=node_load($item['nid']);
if(empty($project->field_project_preview[0]['data']['alt'])){
$project->field_project_preview[0]['data']['alt']=$project->title;
}
switch($project->type){
case 'project_video':
print '<h4>'.$project->title.'</h4>';
print '<a href="'.url('node/10', array('absolute' => TRUE)).'#video_'.$project->nid.'"><img src="'.$base_url.'/'.$project->field_project_preview[0]['filepath'].'" alt="'.$project->field_project_preview[0]['data']['alt'].'" /></a>';
if(!empty($node->field_page_works_description[$delta]['value'])){
print '<p><b><a href="'.url('node/10', array('absolute' => TRUE)).'#video_'.$project->nid.'">'.$node->field_page_works_description[$delta]['value'].'</a></b></p>';
}
break;
case 'project':
print '<h4>'.$project->title.'</h4>';
$nImageId=preg_replace('/[^\d+]/','',strip_tags(views_embed_view('project_images','block_2',$project->nid)))80;">;
print '<a href="'.url('node/'.$nImageId, array('absolute' => TRUE)).'"><img src="'.$base_url.'/'.$project->field_project_preview[0]['filepath'].'" alt="'.$project->field_project_preview[0]['data']['alt'].'" /></a>';
if(!empty($node->field_page_works_description[$delta]['value'])){
print '<p><b><a href="'.url('node/'.$nImageId, array('absolute' => TRUE)).'">'.$node->field_page_works_description[$delta]['value'].'</a></b></p>';
}
break;
default:
print $item['view'];
break;
}
?>
Украшаю ссылки на скачивание видео-файлов в content-field-field_project_video_downloads.tpl.php:
<?php
if(empty($item['data']['description'])){
$item['data']['description']='Скачать видеоролик';
}
if(!empty($item['filesize'])){
$item['data']['description'].=' ('.ceil($item['filesize']/1048576).' Mb)';
}
print '<a href="'.$base_path.$item['filepath'].'">'.$item['data']['description'].'</a>';
?>
Настраиваю размер видео-роликов для проигрывания в sandbox т.к. размер flv'шки плеер затруднился определить. Размеры беру из названия файла, которые там закодированы в виде super_puper_file_400x300.flv:
<?php
$sWidthHeight='';
if(preg_match('/(\d+)x(\d+)/',$node->field_project_video_image[$delta]['filepath'],$regs)){
$sWidthHeight=';width='.$regs[1].';height='.$regs[2];
}
print '<a href="'.$base_path.$node->field_project_video_image[$delta]['filepath'].
'" rel="shadowbox['.$item['nid'].']'.
$sWidthHeight.'"><img src="'.$base_path.$item['filepath'].'" /></a>';
?>
Теперь начинаю править шаблоны полей для views'ов. Что-бы поднять новые шаблоны и понять, как их следует именовать, в каждом вьюсе есть специательный раздел Theme в котором присутствует список всех возможных названий шаблонов и большая кнопка "Rescan template files".
Первым попался views-view-field--best-projects--title.tpl.php, который решает ранее затронутую проблему с ссылками в названиях проектов. Его показываю полностью, т.к. он первый из шаблонов этого типа:
<?php
if(!empty($row->nid)){
$project=node_load($row->nid);
if(!empty($project->nid)){
if($project->type=='project'){
$nImageId=preg_replace('/[^\d+]/','',strip_tags(views_embed_view('project_images','block_2',$project->nid)));
if(!empty($nImageId)){
$output='<a href="'.url('node/'.$nImageId, array('absolute' => TRUE)).'">'.$project->title.'</a>';
}else{
$output=$project->title;
}
}
if($project->type=='project_video'){
$output='<a href="'.url('node/10', array('absolute' => TRUE)).'#video_'.$project->nid.'">'.$project->title.'</a>';
}
}
}
print $output;
?>
Формирую превьюшки проектов в views-view-field--category-projects--block-1--field-project-preview-fid.tpl.php:
<?php
if(!empty($row->nid)){
$project=node_load($row->nid);
if(!empty($project->nid)){
$nImageId=preg_replace('/[^\d+]/','',strip_tags(views_embed_view('project_images','block_2',$project->nid)));
if(!empty($nImageId)){
$output=preg_replace('/<a href="[^"]+/','<a href="'.url('node/'.$nImageId, array('absolute' => TRUE)),$output);
}else{
//no images in project
$output=preg_replace(array('/<a href="[^>]+>/','/<\/a>/'),array('',''),$output);
}
}
}
print $output;
?>
В коде используется вспомогательный view project_images block_2, который добывает id первой картинки в проекте. Можно было и напрямую добыть это из базы данных, но мне почему-то не захотелось так сильно насиловать друпал.
Фомирую заголовки проектов views-view-field--category-projects--block-1--title.tpl.php:
<?php
if(!empty($row->nid)){
$project=node_load($row->nid);
if(!empty($project->nid)){
$nImageId=preg_replace('/[^\d+]/','',strip_tags(views_embed_view('project_images','block_2',$project->nid)));
if(!empty($nImageId)){
$output='<a href="'.url('node/'.$nImageId, array('absolute' => TRUE)).'">'.$project->title.'</a>';
}else{
$output=$project->title;
}
}
}
print $output;
?>
Формирую вывод для каждого видео-проекта в views-view-field--video-projects--nid.tpl.php. Тупо вывожу всю ноду, предварительно настроенную в CCK c помощью Display Fields:
<?php
if(!empty($row->nid)){
$node=node_load($row->nid);
print node_view($node,true,true,true);
}
?>
И последний из шаблонов для view'сов views-view-field--video-projects--title.tpl.php, который опять-же решает проблему отсутствия у проекта с видео своей страницы, просто добавляя перед проектом уникальный якорь:
<?php
if(!empty($row->nid)){
print '<a name="video_'.$row->nid.'"></a>';
}
print $output;
?>
Теперь настраиваю вывод прочих блоков. Мне понадобится модуль menu_block, который умеет делать срез меню нужного уровня. Делаю его следующим образом и вставляю в область темы Content Top:
Создаю блок меню для нижних ссылок и запихиваю его в подвал. Туда-же кидаю блок для гуглового аналитика.
Кажись всё. Приступаю к созданию форм обратной связи.





Обзор AgeStar NSB3AS1T NAS для 3.5" SATA HDD
Комментариев и оценок: 183
Обзор AgeStar NSB3AS1T NAS для 3.5" SATA HDD - сетевого хранилища на базе 3.5" SATA HDD с возможностью подключения по USB. 10/100 Mbit, SATA 3.5"
AgeStar FUBCP USB2.0 to IDE/SATA Adapter
Комментариев и оценок: 93
AgeStar FUBCP - подключение IDE или SATA 2.5",3.5" или 5.25" устройств через USB
Обзор жесткого диска HDD 2ТБ Western Digital WD20EARS
Комментариев и оценок: 73
Краткий обзор жесткого диска HDD 2ТБ Western Digital WD20EARS-00MVWB0 с фотографиями и тестами производительности.Многофункциональное устройство Canon LaserBase MF3228
Комментариев и оценок: 52
Многофункциональное устройство Canon LaserBase MF3228. Описание, впечатления от работы, ссылка на драйвера.
AgeStar SUB2O1 2.5" SATA External Enclosure
Комментариев и оценок: 51
Обзор с картинками и тестами AgeStar SUB201 - внешней USB коробки для 2.5" SATA винчестеров.