Донецкий техникум промышленной автоматики

Програмне створення блоків в Drupal 7

  1. hook_block_info () - Відображення блоку в списку блоків
  2. hook_block_configure () - Форма настройки блоку
  3. hook_block_save () - Збереження інформації на сервері
  4. hook_block_view () - Висновок вмісту блоку
  5. висновок

Зараз я покажу на прикладі, як в Drupal створити модуль, який реалізує блок, у якого, на додаток до стандартних елементів, також є текстова область і поле для завантаження зображення.

процес створення модуля я тут описувати не буду, так як і без цього стаття вийшла об'ємною, приступимо відразу до створення блоку.

Для того, щоб блок з'явився серед списку інших блоків і його можна було налаштовувати, мінімально необхідно визначити два хука: hook_block_info () і hook_block_view () . Для повноцінної-же реалізації задуманих можливостей, треба реалізувати наступні хукі:

  • hook_block_info () - відображення блоку в списку доступних блоків
  • hook_block_configure () - настройка додаткових параметрів блоку
  • hook_block_save () - збереження інформації, введеної в формі редагування блоку
  • hook_block_view () - Висновок вмісту блоку

hook_block_info () - Відображення блоку в списку блоків

Даний хук відповідає за появу створюваного блоку в адміністративному меню. Повертає він масив, що складається з елементів, які описують створювані модулем блоки. Ці елементи, в свою чергу, самі є асоціативними масивами. Інформацію про допустимі ключі і їх значення дивіться на сторінці hook_block_info () . Зверніть увагу, що в імені функції слово hook замінено на ім'я модуля в даному випадку test_block

/ ** * Implements hook_block_info (). * / Function test_block_block_info () {$ blocks = array (); $ Blocks [ 'my_block'] = array ( 'info' => t ( 'Test Block'),); return $ blocks; }

Після збереження змін та оновлення сторінки, серед інших, з'явиться блок з ім'ям 'Test Block':

На даному етапі, якщо відкрити форму настройки цього блоку, з'явиться стандартна форма, яка містить набір параметрів блоку за замовчуванням. Для того, щоб додати більше опцій для настройки, потрібно додати ще трохи коду.

hook_block_configure () - Форма настройки блоку

З помомщью хука hook_block_configure () можна додати додаткові елементи, які відображаються під час налаштування блоку. В даному випадку це поле для завантаження зображення #managed_file і текстове поле #text_format , Але ви, якщо буде потрібно, можете додати ті поля, які вам заманеться. Список доступних типів полів ви можете знайти на сторінці Form API Reference .

Примітка: #managed_file є не просто елементом введення, а віджетом, який підтримує AJAX, відображення превьюшек, перевірку типу завантаження і багато іншого.

Для опису елемента форми #text_format знадобляться #type, #title і #default_value - тип, заголовок і значення за замовчуванням відповідно.

Для елемента форми #managed_file знадобляться #name, #type, #title, #description, #default_value, #upload_location і #upload_validators.

/ ** * Implements hook_block_configure (). * / Function test_block_block_configure ($ delta = '') {$ form = array (); switch ($ delta) {case 'my_block': // Text field form element $ form [ 'text_body'] = array ( '#type' => 'text_format', '#title' => t ( 'Enter your text here in WYSIWYG format '),' #default_value '=> variable_get (' text_variable ',' '),); // Select file form element $ form [ 'file'] = array ( '#name' => 'block_image', '#type' => 'managed_file', '#title' => t ( 'Choose an Image File' ), '#description' => t ( 'Please select image. Only * .gif, * .png, * .jpg, and * .jpeg images allowed.'), '#default_value' => variable_get ( 'test_block_image_fid', ''), '#upload_location' => 'public: //', '#upload_validators' => array ( 'file_validate_extensions' => array ( 'gif png jpg jpeg'),),); break; } Return $ form; }

Після сохранененіе змін в модулі, форма редагування блоку повинна містити додані елементи:

hook_block_save () - Збереження інформації на сервері

для збереження введеної інформації, слід використовувати хук hook_block_save () , Який приймає на вході два агрумент $ delta і $ edit. Строкова змінна $ delta містить ідентифікатор блоку, що відправив інформацію, а в масиві $ edit міститься сама відправляється інформація.

Для збереження інформації, введеної в текстовому полі, використана функція variable_set () , Якої в якості аргументів передані ім'я змінної і її значення, яке береться з змінної $ edit [ 'text_body'] [ 'value']

Для того, щоб зберегти зображення, слід трохи більше попрограмміровать, а саме:

  1. Створити об'єкт $ file для завантаженого файлу. Робиться це за допомогою функції file_load () .
  2. Далі потрібно встановити статус файлу FILE_STATUS_PERMANENT (Нонстанта, що дорівнює одному). Спочатку, після завантаження файлу через віджет #managed_file, файл має статус FILE_STATUS_TEMPORARY і видаляється з часом DRUPAL_MAXIMUM_TEMP_FILE_AGE .
  3. Далі, використовуючи функцію file_save () , Слід зберегти оновлений об'єкт $ file в базі.
  4. Для того, щоб вказати системі, що файл використовується блоком, слід скористатися функцією file_usage_add () . Це запобіжить видалення файлу, в разі виклику функції file_delete (). У звичайному режимі, видалений може бути файл, який не має записів в таблиці file_usage. Один з параметрів, що приймаються функцією file_usage_add () є ідентифікатор блоку, тому, щоб отримати цей ідентифікатор, слід викликати функцію block_load () . Ну і наостанок, коли запис про використання файлу зроблена, використовуючи функцію variable_set () , Слід зберегти інформацію про зображення.
/ ** * Implements hook_block_save (). * / Function test_block_block_save ($ delta = '', $ edit = array ()) {switch ($ delta) {case 'my_block': // Saving the text element value variable_set ( 'text_variable', $ edit [ 'text_body'] [ 'value']); // Changing file to a permanent state $ file = file_load ($ edit [ 'file']); $ File-> status = FILE_STATUS_PERMANENT; file_save ($ file); // Adding usage for file. Saving information about image. $ Block = block_load ( 'test_block', $ delta); file_usage_add ($ file, 'test_block', 'block', $ block-> bid); variable_set ( 'test_block_image_fid', $ file-> fid); break; }}

hook_block_view () - Висновок вмісту блоку

Останній етап - це за допомогою хука hook_block_view () , Вивести вміст блоку, в тому числі і додані поля на екран.

Для підвищення читаності коду, логіка даного етапу буде розбита на дві функції: власне сам хук hook_block_view () і викликається з нього функція my_block_view (), в якій формується масив.

/ ** * Implements hook_block_view (). * / Function test_block_block_view ($ delta = '') {$ block = array (); switch ($ delta) {case 'my_block': $ block [ 'content'] = my_block_view (); break; } Return $ block; } / ** * Assemble renderable array for test block content. * @Return * returns a renderable array of block content. * / Function my_block_view () {$ block = array (); // Capture the image file path and convert into HTML with some css attributes $ image_file = file_load (variable_get ( 'test_block_image_fid', '')); $ Image_path = ''; if (isset ($ image_file-> uri)) {$ image_path = $ image_file-> uri; } $ Image = theme_image (array ( 'path' => ($ image_path), 'alt' => t ( 'Image description.'), 'Title' => t ( 'This is our block image title.'), 'attributes' => array ( 'class' => 'class_name'),)); // Load text from variable $ text = variable_get ( 'text_variable', ''); // Block output in HTML with div wrappers around elements $ block = array ( 'message' => array ( '#prefix' => '<div>', '#type' => 'markup', '#markup' = > $ text, '#suffix' => '</ div>',), 'image' => array ( '#prefix' => '<div>', '#type' => 'markup', '# markup '=> $ image,' #suffix '=>' </ div> ',),); return $ block; }

От і все. Тепер блок готовий до використання:

висновок

Як бачите, для програмного створення блоку, потрібно докласти зовсім небагато зусиль, зате розібравшись у всіх тонкощах роботи Form API Drupal 7 для вас відкриються необмежені можливості створювати блоки самої різної складності, а то, що ви все це робите у вигляді окремого модуля, дозволить вам задіяти ці блоки повторно у всіх ваших проектах. У доданому файлі до статті ви знайдете готовий модуль, описаний вище.