Создаю views'ы для вывода контента

После окончания работ над сайтом университета появилась довольна приличная куча вьюсов.

Основное их назначение - красиво попадать в табы от quick tabs. Есть ещё пара-тройка вспомогательных для "атипичных" подразделений учебного заведения.

drupal_bgatu_views_all.gif

Сдесь опишу парочку самых весёлых.

Простой views, который выбирает одно или более полей для вывода его в нужно табе quick tab'а. Данный пример формирует табик "О кафедре".

Сам вьюс:

drupal_bgatu_views_kafedra_about.gif

Результат его работы:

drupal_bgatu_views_kafedra_about_output.jpg

 

Теперь рассмотрим более навороченный. Этот вьюс выводит сотрудников кафедры. Навороченность заключается в том, что в теме осуществляется перелопачивание вывода.

Сам вьюс:

drupal_bgatu_views_kafedra_ludi.gif

Подробнее о полях. Первое содержит анонс, который выводится над списком людей кафедры. Выделенное поле собственно содержит список сотрудников.

Его вывод:

drupal_bgatu_views_kafedra_ludi_output.gif

Таблица формируется из шаблона на базе nid сотрудника.

Происходит это следующим образом: в файле views-view-field.tpl.php произвожу вызов моей функции из template.php, которая кардинальным образом переопределят внешний вид. Использую в случаях, когда приатаченный вьюс уже не помогает.

<?php
// $Id: views-view-field.tpl.php,v 1.1 2008/05/16 22:22:32 merlinofchaos Exp $
 /**
  * This template is used to print a single field in a view. It is not
  * actually used in default Views, as this is registered as a theme
  * function which has better performance. For single overrides, the
  * template is perfectly okay.
  *
  * Variables available:
  * - $view: The view object
  * - $field: The field handler object that can process the input
  * - $row: The raw SQL result that can be used
  * - $output: The processed output that will normally be used.
  *
  * When fetching output from the $row, this construct should be used:
  * $data = $row->{$field->field_alias}
  *
  * The above will guarantee that you'll always get the correct data,
  * regardless of any changes in the aliasing that might happen if
  * the view is modified.
  */
if(!empty($field->content_field['field_name'])){
    switch($field->content_field['field_name']){
        case 'field_kafedra_sotrudniki_prepod':
            if(!empty($field->field_values[$row->nid])){
                $output=_batu_getEmployeeSotrudnikiKafedraDataById($field->field_values[$row->nid]);
            }
        break;
    }
}
    print $output;

?>

А вот и функция, которая формирует таблицу на базе массива nid'ов сотрудников.

<?php
function _batu_getEmployeeSotrudnikiKafedraDataById($aId,$bTitle=true,$bUrl=true){
    global $base_url;
    $out='';
    // print_r($aId);
    if(!empty($aId[0]['nid'])){
        $out.='<div class="field-items">';
        $out.='<table>';
        $out.='<tr><th>Фамилия Имя Отчество</th><th>Учёное звание<br />Учёная степень</th><th>Телефон</th></tr>';
        $zebra='even';
        foreach($aId as $key=>$aValue){
            if(!empty($aValue['nid'])){
                $nId=$aValue['nid'];
                if($zebra=='even'){
                    $zebra='odd';
                }else{
                    $zebra='even';
                }
                $out.='<tr class="field-item '.$zebra.'">';
                $employee=node_load($nId);
                if(!empty($employee)){
                    if($bTitle){
                        $out.='<td>';
                        if($bUrl){
                            $out.='<a href="'.url('node/'.$nId).'">'.$employee->title.'</a>';
                        }else{
                            $out.=$employee->title;
                        }
                        $out.='</td>';
                    }
                    $out.='<td>';
                    // $out.=print_r($employee->taxonomy,true);
                    if(!empty($employee->taxonomy[8]->name)){
                        $out.=$employee->taxonomy[8]->name;
                        if(!empty($employee->taxonomy[11]->name)){
                            $out.='<br />';
                        }
                    }
                    if(!empty($employee->taxonomy[11]->name)){
                        $out.=$employee->taxonomy[11]->name;
                    }
                    $out.='</td><td>';
                    if(!empty($employee->field_employee_phone_work[0]['value'])){
                        $out.=$employee->field_employee_phone_work[0]['value'];
                    }
                    $out.='</td>';
                    // echo '<pre>';
                    // print_r($employee);
                    // print_r($row);
                    // print_r($field);
                    // echo '</pre>';
                }
                $out.='</tr>';
            }
        }
        $out.='</table>';
        $out.='</div>';
    }

    return $out;
}
?>

 

Устал. Допишу позже...

Тэги:

Drupal
RSSAdd to Google

Обсуждение:

  • Автор: (Анонимус)
  • Тема: Сайт учебного заведения
  • Привет, очень позновательный материал
    пытаюсь попробовать что-то подобное, но так как я новичок в Друпал возникли следующие проблемы
    1. Не понимаю как проще связать сущности подразделение с выводом в quicktabs, а именно как передавать аргументы. Непосредственно создавать QTблок для каждого подразделения с указанием в нем аргументов - не очень хорошее решение. Как вы реализовывали выбор аргументов для вывода?

    2. При редактировании текстовых CCK полей не подхватывается fckeditor, поэтому возникнут сложности у некоторых пользователей.

    Буду благодарен если сможете помочь.

  • Отправлено:
  • Автор: Dmitrii Varvashenia
  • Тема: QuickTab
  • Приветствую, Андрей.

    1. Избежать создания своего QT для каждого подразделения для меня было важно.
    Сначала я создал нужные view's и требуемую структуру табов. В моём случае она была двухуровневая. Типами таба для первого уровня были вложенные QuickTab'ы, для второго - view'ы.
    Следом настроил вывод QuickTab'овых блоков в нужных местах.
    Привязку к типам страницы сделал php-кодом, т.к. для логики работы важно что-бы табы отображались только на страницах кафедр и факультетов:

    <?
    
    if (arg(0) == 'node' and is_numeric(arg(1)) and arg(2)!='edit') {
        $node = node_load(arg(1));
        if ($node->type=='kafedra'){
          return true;
        }
    }
    
    ?>
    

    В свойствах QuickTab'ов включил AJAX, при котором все табы грузятся сразу, иначе возникали проблемы с передачей nid во view.
    Если всё выше сделано правильно, то во view'ы из табов будет очень легко передать nid cck факультета или кафедры. Во view'сах он принимается как аргумент Node: Nid и, имея nid на руках, достать любое поле из cck уже не представляет сложности.

    Моя версия QuickTab не умела динамически передавать параметры - сейчас возможно что-то поменялось, т.к. прошел уже год - гляньте у них на сайте -- может быть всё стало гораздо проще.

    2. Гляньте права доступа к fckeditor для ролей ваших пользователей: /admin/user/permissions

  • Отправлено:

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



















Тема:

Мысль:

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

Почта:

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

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

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