Ctools modal API. Приклад застосування

19.03.2012
Ctools Modal API. An Example of Using
Автор:

В унісон із новими віяннями моди  попапи здобули не на жарт серйозну популярність серед замовників, при чому в останніх сформувалось стійке відчуття, ніби сайт, в ідеалі, повинен бути в попапі. І якщо для шостого Друпал'а був модуль  Popups  API, то для сімки його немає, хоча стараннями того ж таки Ерла Майлза ми маємо чудовий інструмент - Ctools - модуль, який надає друпал-розробникам доволі потужний API. У цьому пості ми розглянемо лише малу частину можливостей тулзів.

Візьмемо для прикладу додавання відгуків до новин (новини та відгуки - це два окремі типи контенту). На новостній сторінці є блок із посиланням "Додати відгук".

Отже, поїхали. Для початку нам потрібно оголосити сторінку в hook_menu - саме до неї звертатиметься Ajax, а далі написати сам callback для оголошеної сторінки. На завершення оголошуємо блок з посиланням "Додати відгук". При всьому тому не забуваємо в hook_form_alter () виставити дефолтне значення для поля "node reference".

Ось, власне, і сам код:

/**
* Implements hook_menu().
*/
function examples_menu() {
 $items['add/%ctools_js/review'] = array(
   'page callback'    => 'examples_ctools_modal_review',
   'page arguments'   => array(1),
   'access arguments' => array('create review content'),
 );
 return $items;
}


/**
* Implements hook_block_info().
*/
function examples_block_info(){
 $blocks['add_review'] = array(
   'info' => t('Add review'),
 );
 return $blocks;
}


/**
* Implements hook_block_view().
*/
function examples_block_view($delta = '') {
 switch ($delta) {
   case 'add_review':
     ctools_include('ajax');
     ctools_include('modal');
     ctools_modal_add_js();
     $news_id = arg(1);
     if (is_numeric($news_id)) {
       // Link class must be "ctools-use-modal"    
       $block['content'] = l(t('Add a review'), "add/nojs/review/{$news_id}", array('html' => TRUE, 'attributes' => array('class' => "ctools-use-modal")));
     }
     break;
 }
 return $block;
}


/**
* Implements hook_form_alter().
*/
function examples_form_alter(&$form, &$form_state, $form_id) {
 switch ($form_id) {
   case 'review_node_form':
     $news_id = arg(3);
     if (is_numeric(arg(3))) {
       $lang = field_language('node', $form['#node'], 'field_news');
       // Declaration the default value for field on the comment creating form.
       $form['field_news'][$lang][0]['nid']['#default_value'] = $news_id;
     }
 }
}


/**
* Page callback for modal review creation.
*/
function examples_ctools_modal_review($js = FALSE) {
 // loading libraries ctools'a 
 ctools_include('node.pages', 'node', '');
 ctools_include('modal');
 ctools_include('ajax');
 global $user;
 $type = 'review';
 $node = (object) array(
   'uid' => $user->uid,  
   'name' => (isset($user->name) ? $user->name : ''),  
   'type' => $type,  
   'language' => LANGUAGE_NONE);
  // Loading node form with disabled scripts.
 if (!$js) {
   return drupal_get_form($type . '_node_form', $node);
 }
 // Create array $form_state.
 $form_state = array(
   'title' => t('Add Review'),
   'ajax'  => TRUE,
 );
 $form_state['build_info']['args'] = array($node);
 $output = ctools_modal_form_wrapper($type . '_node_form', $form_state);
 // Actions after form submit. 
 if (!empty($form_state['executed'])) {
   $output = array();
   // Close pop up.
   $output[] = ctools_modal_command_dismiss();
   $news_id = arg(3);
   // Insert  updated  view into a  page.
   if (is_numeric(arg(3))) {
     $output[] = ajax_command_html('.latest-reviews-full-style ', views_embed_view('reviews', 'block', arg(3)));
   }
 }
 print ajax_render($output);
} 

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

Приклади використання Ctools modal API можна подивитися тут (D7).

Демо є доступним для перегляду ось тут.

4 votes, Рейтинг: 4.8

Також по темі

1

Підключення до різних баз потрібно для експорту та імпорту даних. Розглянемо три способи виходу з такої ситуації.

2

У попередньому пості я приводив приклад використання Ctools modal API за допомогою однієї форми. У цьому ж я...

3

Початкова ідея #states полягає в тому, щоб уможливлювати створення динамічних форм без написання JavaScript коду, як такого.

4

Пропонуємо вам збірку інтернет-магазину CommerceBox, створену на основі Drupal 7 і...

5

XML-RPC – простий протокол виклику віддалених процедур. XML-RPC можна вважати праотцем одного із популярних протоколів SOAP. Попри свій вік (реалізований в 1998 році), XML-RPC не відходить в...

Subscribe to our blog updates