Урок - Отображение таблиц в Drupal 7. Функция theme_table().

Главная » Курсы » Курс Drupal 7, Разработка модулей » Урок - Отображение таблиц в Drupal 7. Функция theme_table().

Обучающий онлайн курс
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'))
  );
  
// делаем запрос к БД где выбираем номера нод и их названия с таблицы node
  
$query db_select('node''n')
    ->
fields('n', array('nid''title'))
    ->
execute()
    ->
fetchAll(); 
  
//выводим все наши данные в конструкции foreach 
  
foreach ($query as $record_edit_table) {
    
//выводим строчку которая содержит
    
$rows_table_edit[] = 
      
// ячейки
      
array( 
        
// а в первой ячейке находится запись 
        
array(  
          
// в ячейке у нас находится запись ссылки, где название ноды выводиться 
          // с помощью $record_table_edit -> title, сама сылка будет у нас иметь такой вид 
          // «'node/' . $record_table_edit -> nid» - тоесть мы будем переходить на адрес типа: 
          // «наш_сайт/node/'номер ноды'»
          
'data' => l($record_table_edit -> title'node/' $record_table_edit -> nid)
        ),
        
// вторая ячейка имеет запись ссылки 
        
array( 
           
// ссылка у нас будет со значением 'edit node', при нажатии на нее мы будем
           // переходить на адрес типа: «наш_сайт / node / номер_ноды / edit»
          
'data' => l(t('edit node'), 'node/'  $record_table_edit -> nid  .  '/edit')
        )
    ); 
  }
  
// создаем   $caption с строковым значением 'Table for edit nodes'
  
$caption_table_edit t('Table for edit nodes');
  
// создаем функцию theme, которая имеет значение 'table' и ввыводит
  
return theme('table',  
      array(
               
// шапка таблицы находиться в $header_edit_table
              
'header' => $header_table_edit,  
              
// тело таблицы есть у нас в $rows_edit_table
              
'rows'     => $rows_table_edit,  
              
// и заголовок таблицы будет у нас в $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"
?>

 

Вид всей таблицы будет такой: