Создание темы для сайта на основе уникального дизайна

Предыдущий этап: сочинение 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) ?>:&nbsp;</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) ?>:&nbsp;</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).'&nbsp;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:

block menu level2

Создаю блок меню для нижних ссылок и запихиваю его в подвал. Туда-же кидаю блок для гуглового аналитика.

Кажись всё. Приступаю к созданию форм обратной связи.

RSSAdd to Google

Обсуждение:

  • Автор: (Анонимус)
  • Тема: Функция или шаблон?
  • Подскажи, пожалуйста, я правильно понимаю логику: я могу выводить в теме нужные мне поля (ССК) либо определив сначала соотв. переменные(переменная=значение поля) в препроцесс-функциях, а потом просто печатать их в шаблоне, либо (как здесь) прямо в шаблоне докапываться до нужного поля? Т.е. это два способа достижения одного и того же р-та?
  • Отправлено:
  • Автор: Dmitrii Varvashenia
  • Наверное проще для будущих поколений программистов, которые когда нибудь будут дальше поддерживать проект, всё делать в шаблоне конкретного поля. Хотя над содержимым полей можно ещё издеваться и как и в функциях темы, так и в доп модулях.
    Но я стараюсь внешний вид и расположение полей максимально делать стандартными друпаловскими галочками и только когда нет другого выхода, издеваюсь над ними программно. Если тема проекта может меняться - делаю модулем, если такого в обозримом будущем не предвидится - делаю в теме.
  • Отправлено:

Как вам материальчик? *



















Тема:

Мысль:

Как звать-то:

Почта:

PS: Комментарии публикуются только после проверки модератором.

PPS: E-mail'ы не публикуются.

* обязательные поля