Приклади функцій theme_table() і theme_fieldset() в Drupal 7

09.05.2011
Examples of theme_table() and theme_fieldset() functions in Drupal 7
Автор:

В Drupal 7 API є цілий розділ, присвячений темізації створеного сайту. Всі елементи сайту без виключення повинні пройти процес темізації. Але спочатку потрібно налаштувати саму темізацію. Якщо подивитись зі сторони програмування, то майже все робиться за допомогою функцій. Найголовніша функція theme(). Існує багато функцій, які полегшують темізацію Drupal 7. Ми розглянемо лише 2 з них, а саме:

  • theme_table() – функція для формування таблиці.
  • theme_fieldset() – функція для випадаючого списку.

Наші завдання:

  1. Зробити таблицю з статичними даними розміром 3/3 за допомогою theme_table() .
  2. Організувати виведення всіх статей сайту з такими полями як: назва статті (в активному посиланні) і посилання на редагування статті. Зробити аналогічну таблицю, тільки поряд повенне бути посилання на видалення статті.
  3. Вивести 2 випадаючих списка за допомогою theme_fieldset() , де в 1 списку виводиться пояснення до таблиці про редагування нод, 2 список виводить інформацію про таблицю видалення нод.
  4. Зробити ще 2 випадаючі списка, в я ких повинні знаходитись наші таблиці.

Завдання 1

Почнемо з theme_table().

Створимо файл нашого модуля, в нас буде файл table_page.module, для початку нам потрібно створити сторінку, де буде розміщена наша таблиця. Для того, щоб створити сторінку, ми використовуємо  hook_menu, в нашому випадку це буде виглядати наступним чином:

php
/** 
 * Implements hook_menu(). 
 */ 
// оголошення функції 
function table_page_menu() {  
   // створюємо змінну, яка вказує, що шлях сторінки буде «наш_сайт/ table», 
   // в сторінці є наступні параметри 
  $items['table'] = array( 
     // це назва нашої сторінки 
    'title' => t('Page with table'),  
     // функція, яка формує дані для таблиці 
    'page callback' => 'main_table',  
     // і доступ, він в нас буде звичайно відкритий 
    'access arguments' => array('TRUE'),  
  );  
  // не забуваємо повернути нашу змінну 
  return $items; 
} 

/** 
 * Function main_table(). 
 */  
// створюємо функцію для виведення даних на створену сторінку
function main_table() {  
  // поки що залишимо сторінку порожньою. 
  return '';  
}

Далі давайте згадаємо, що таблиця в html з самого початку починається з тегів table, далі в таблиці формуються рядки, за допомогою тега tr, потім ми створимо в рядку клітинки, що робиться за допомогою тегу td. Саме так ми можемо сформувати найпростішу таблицю на веб-сторінці. Але формувати нам нічого не потрібно буде, бо з тегами буде працювати функція theme_table(), а ми займемось самою функцією.

В кожної правильної таблиці повинна бути "шапка", або header.$header – буде складатись з 1 рядка, і 3 клітинок в цьому рядку.

Робиться все ось як:

 php
// створюємо перемінну, яка вміщує масив  
$header = array( 
// далі створюєм ще масив, де вміщуються дані першої клітинки
  array('data' => t('Header cell1')),  
// другої клітинки 
  array('data' => t('Header cell2')), 
// і третьої клітинки 
  array('data' => t('Header cell3')) 
); 

Шапку таблиці ми створили, тепер давайте перейдемо в тіло таблиці. Там ми створимо 2 рядка, які теж матимуть по 3 клітинки.

php
// створюємо першу клітинку 
$row [] = array( 
  // виведення 1 клітинки в 1 рядку 
  array('data' => t('Row 1 – Cell 1')),  
  // друга клітинка 
  array('data' => t('Row 1 – Cell 2')),  
  // третя клітинка 
  array('data' => t('Row 1 – Cell 3'))  
); 
//виведення другого рядка 
$row [] = array(  
  // клітинка 1 
  array('data' => t('Row 2 – Cell 1')),  
  // клітинка 2 
  array('data' => t('Row 2 – Cell 2')),  
  // ячейка 3 
  array('data' => t('Row 2 – Cell 3'))  
); 

Ось ми і закінчили з даними, тепер потрібно правильно вказати функції, які ми хочемо вивести. В нашому випадку функція повинна мати наступний вигляд:

php
// використовуємо функцію theme і задаємо їй параметр table
theme('table',  
           //створюємо масив для даних 
           array( 
             // значення header буде в нас знаходитись в $header
             'header' => $header,  
             // значення rows буде в нас виводитись з $rows
             'rows'=> $rows  
           ) 
);

Тепер якщо ми візьмемо загальний вигляд нашого коду, матимемо наступне:

php
/** 
 * Implements hook_menu(). 
 */   
function table_page_menu() { 
  $items['table'] = array( 
    'title' => t('Page with table'), 
    'page callback' => 'main_table', 
    'access arguments' => array('TRUE'), 
  ); 
  return $items; 
} 

/** 
 * Function main_table(). 
 */  
function main_table() {  
  // створюємо змінну, яка вміщає масив  
  $header = array( 
    // далі створюємо ще масив, дезнаходяться дані першої клітинки
    array('data' => t('Header cell1')),   
    // другої клітинки 
    array('data' => t('Header cell2')),   
    // і третьої клітинки 
    array('data' => t('Header cell3'))   
  ); 
  // створюємо перший рядок 
  $rows[] = array( 
    // виводимо 1 клітинку в 1 рядку 
    array('data' => t('Row 1 – Cell 1')),  
    // друга клітинка 
    array('data' => t('Row 1 – Cell 2')),  
    // третя клітинка  
    array('data' => t('Row 1 – Cell 3'))   
  ); 
  //виведення другого ряду 
  $rows[] = array(  
    array('data' => t('Row 2 – Cell 1')),  
    array('data' => t('Row 2 – Cell 2')), 
    array('data' => t('Row 2 – Cell 3')) 
  ); 

  return theme('table', array('header' => $header, 'rows'=> $rows));
   
} 

Візуальний вигляд буде наступний:

Завдання 2

Тепер давайте виведемо всі ноди на сайті, де буде знаходитись посилання редагування. Зразу розпочнемо з нашої функції, і все виглядатиме ось так:

php
/** 
 * Function main_table(). 
 */  
//оголошуємо функцію 
function main_table() {  
  // створюємо $header, де знаходиться масив, що означає рядок  
  // клітинки мають наступний вміст 
  $header_table_edit = array(  
    // перша клітинка вміщує текст 'Title'  
    array('data' => t('Title')),  
    // друга клітинка має текст 'Link to edit'
    array('data' => t('Link to edit')) 
  ); 
  // робимо запит до БД, де обираємо номер нод і їх назви з таблиці
  $query = db_select('node', 'n') 
    ->fields('n', array('nid', 'title')) 
    ->execute() 
    ->fetchAll();  
  //виводимо всі наші дані в конструкції foreach  
  foreach ($query as $record_edit_table) { 
    //виводимо рядок, який вміщує 
    $rows_table_edit[] =  
      // клітинки      array(  
        // в першій клітинці знаходиться запис  
        array(   
          // в нашій клітинці запис посилання, де назва ноди виводиться 
          // з допомогою of $record_table_edit -> title, саме посилання матиме такий вигляд 
          // «'node/' . $record_table_edit -> nid» - тобто ми будемо переходити на адресу типу:  
          // «our_site/node/'node number'» 
          'data' => l($record_edit_table -> title, 'node/' . $record_edit_table -> nid)  
        ), 
        // друга клітинка має запис посилання  
        array(  
           //посилання буде зі значенням 'edit node',  
           //при натисканні на неї ми будемо переходити на адресу типу
           // «our_site / node / node_number/ edit» 
          'data' => l(t('edit node'), 'node/' . $record_edit_table -> nid . '/edit') 
        ) 
    );  
  } 
  // create $caption with row value 'Table for edit nodes'
  $caption_table_edit = t('Table for edit nodes'); 
  // create function theme, that has value 'table' and outputs
  return theme('table',   
      array( 
               // table header is situated in $header_edit_table
              'header' => $header_table_edit,   
              // table body is in $rows_edit_table 
              'rows'     => $rows_table_edit,   
              // table caption will be in $caption_edit_table
              'caption' => $caption_table_edit 
            ) 
  ); 
} 

При запуску скрипта ми побачимо наступне:

На сайті є лише 3 статті з виведеними назвами, і справа ми бачимо активне посилання для редагування конкретного контенту.

Далі давайте зробимо аналогічну таблицю, тільки справи в нас буде посилання на видалення ноди. Весь код таблиці матиме наступний вигляд:

php
// у всіх переміних в назвах буде додана цифра 2 
$header_table_delete = array(  
    array('data' => t('Title')),  
    array('data' => t('Link delete'))  
  ); 
  foreach ($query as $record_table_delete) { 
    $rows_table_delete[] = 
      array( 
        array( 
          'data' => l($record_table_delete -> title,'node/' .$record_table_delete -> nid) 
        ), 
        array( 
          // шлях до видаленої ноди 
          'data' => l(t('delete node'),'node/' .$record_table_delete -> nid . '/delete')  
        ) 
    );  
  } 
  // назва таблиці 
  $caption_table_delete = t('Table for delete nodes');  
  // тут в перемінну вміщуємо таблицю з редагуванням нод
  $table_edit = theme('table',   
    array('header'  => $header_table_edit,  
          'rows'    => $rows_table_edit, 
          'caption' => $caption_table_edit 
          ) 
  );  
  // в цій змінній побачимо функцію, яка буде  
  // формувати таблицю з посиланням на видалення ноди
  $table_delete = theme('table',
    array('header'  => $header_table_delete,  
          'rows'    => $rows_table_delete, 
          'caption' => $caption_table_delete 
          ) 
  ); 
  // повертаємо спочатку таблицю з посиланнями редагування($table_edit), 
  // далі виводимо таблицю з посиланнями на видалення ($table_delete).
  return "$table_edit" . "$table_delete"; 

Вигляд усієї таблиці буде таким:

Завдання 3

Зараз перед нами стоїть завдання зробити 2 випадаючі списки. Випадаючий список робиться за допомогою таких тегів як fieldset, legend і спеціальних класів CSS формує випадаючий список. Давайте розглянемо сам скрипт.

drupal_add_library('system', 'drupal.collapse');

дана функція є необхідною, так як тут ми загружаємо бібліотеку, яка підключить для нас необхідний клас.

php
// створюємо змінну для випадаючого списку   
// для виведення інформації на рахунок редагування нод 
$edit_element = array( 
                      // заголовок списку 
                      '#title'          => t('Table for edit node'), 
                      // вміст fieldset-а 
                      '#children'    => t('This is main text in fieldset! Table contains link for edit node'), 
                      // список нашої складної 
                      '#collapsible' => true,   
                      // і згорнутий 
                      '#collapsed'  => true, 
                      // в атрибутах вказуємо, що потрібно використовувати вказані класи
                      '#attributes'  => array(  
                                              'class' => array('collapsible', 'collapsed')
                                              ), 
                      ); 
// вміщуємо в $fieldset_edit функцію, яка виведе нам поле
$fieldset_edit = theme('fieldset', array('element' => $edit_element)); 

// тут все аналогічно як в попередньому скрипту 
$delete_element = array( 
                      '#title'       => t('Table for delete node'),
                      '#children'    => t('This is main text in fieldset! Table contains link for delete node'),
                      '#collapsible' => true, 
                      '#collapsed'   => true, 
                      '#attributes'  => array( 
                                              'class' => array('collapsible', 'collapsed')
                                              ), 
                      ); 
 $fieldset_delete = theme('fieldset', array('element' => $delete_element));
  // повертаємо наші дані 
  return "$fieldset_edit" . "$fieldset_delete ";    

В браузері ми побачимо наступну картину:

Якщо ж ми розкриємо списки, то побачимо наступне:

Як бачите, списки ми створили, тут немає нічого складного. Тепер беремось за останнє завдання.

Завдання 4

Нам потрібно помістити наші створені таблиці в fieldset-списки. Якщо Ви проходили всі попередні наші завдання, тоді Завдання 4 не буде для Вас складним. Давайте відразу ж переглянемо код, який варто змінити.

 php
$edit_element = array( 
                      '#title'         => t('Table for edit node'),
                      // тут ми додоаємо нашу таблицю редагування нод
                      '#children'    => t('This is main text in fieldset! Table contains link for edit node') . $edit_table, 
                      '#collapsible' => true, 
                      '#collapsed'   => true, 
                      '#attributes'  => array( 
                                              'class' => array('collapsible', 'collapsed')
                                              ), 
                      ); 
$fieldset_edit = theme('fieldset', array('element' => $edit_element));

$delete_element = array( 
                      '#title'           => t('Table for delete node'),
                       //  тут ми додоаємо нашу таблицю видалення нод
                      '#children'    => t('This is main text in fieldset! Table contains link for delete node') . $delete_table,  
                      '#collapsible' => true, 
                      '#collapsed'   => true, 
                      '#attributes'  => array( 
                                              'class' => array('collapsible', 'collapsed')
                                              ), 
                      ); 
 $fieldset_delete = theme('fieldset', array('element' => $delete_element));
  // і виводимо лише 2 fieldset-а 
  return "$fieldset_edit" . "$fieldset_delete";   

Результат ви можете подивитись на наступному скріні:

Ось і все, всі завдання виконано.

Голосів: 1 Рейтинг: 5

Також по темі

1

При розробці часом виникає необхідність виконати такі дії/команди, для яких недостатньо прав чи відсутній доступ до певних директорій у користувача з під якого запущений на сервері та виконується...

2

Однією з вагомих переваг Drupal 7 щодо його попередників є його гнучкість до налаштувань і систем. Розробники не обійшли стороною і запити до БД. В цьому релізі вони стали об'єктивно-орієнтованими...

3

В кінці квітня цього року в своєму офіціальному блозі представники Google Analytics оголосили про запуск бета-тестування нового інтерфейсу. А в цій статті я хочу розповісти про використання...

4

Стаття для тих, в кого виникає необхідність відобразити прикріплений PDF документ на сторінці перегляду вмісту. Реалізується це доволі просто...

5

Пакетні операції дають можливість обробляти форми на протязі декількох запитів. Це попереджує обривання обробки через тайм-аут РНР. Також користувачу надається інформація про хід здійснення таких...

Subscribe to our blog updates