CTools(Chaos Tools)是一系列的API和工具,可以很大程度上的方便開發。包括幾個大組件:AJAX、上下文(Context)、CSS格式化與壓縮、物件導出、表單工具、導覽表單、臨時緩存、以及插件系統等。
AJAX元件是CTools提供用來方便Drupal中Ajax操作的一系列工具,包括:
1.模式彈出視窗(Modal)
模式彈出視窗可以把頁面內容以及表單通過彈出視窗顯示,並且可以很方便的處理返回值。生成鏈結點擊彈出視窗,先包含需要檔並添加js和樣式:
ctools_include('ajax'); // 使用 CTools Ajax 組件須引入
ctools_include('modal'); // 使用 CTools Modal 組件須引入
|
ctools_modal_add_js();
$sample_style = array(
'ctools-sample-style' => array(
'modalSize' => array(
'type' => 'fixed',
'width' => 500,
'height' => 300,
'addWidth' => 20,
'addHeight' => 15,
),
);
drupal_add_js($sample_style, 'setting'); // 樣式的詳細定制語法見CTools模組的幫助
|
為需要在彈出視窗中顯示內容的鏈結定制css,只要給鏈結指定類名’ctools-use-modal’即可,如果要指定樣式,使用ctools-modal-ID,ID即上面定義的樣式名。也可以用快捷命令:
// 輸出的鏈結html
<a href="ctools_ajax_sample/nojs/animal" class="ctools-use-modal ctools-modal-ctools-sample-style">
Wizard (default modal)</a>
// 生成模式視窗的文字鏈結,最後一個參數指定樣式名,需要加上'ctools-modal-'首碼
ctools_modal_text_button(t('Wizard (default modal)'), 'ctools_ajax_sample/nojs/animal', t('Pick an animal'),
'ctools-modal-ctools-sample-style');
|
如果用按鈕來啟動ajax模式視窗,先定義form中一個url隱藏域保存url,再定義按鈕:
$form['url'] = array(
'#type' => 'hidden',
// 這裏的類名必須是下面定義的按鈕id加上-url的尾碼
'#attributes' => array('class' => array('ctools-ajax-sample-button-url')),
'#value' => url('ctools_ajax_sample/nojs/animal'),
);
|
$form['ajax_button'] = array(
'#type' => 'button',
'#value' => 'My boutton',
'#attributes' => array('class' => array('ctools-use-modal')),
'#id' => 'ctools-ajax-sample-button',
);
|
在hook_menu()中定義彈出視窗的路徑和回調函數,最好在路徑中包含%ctools_js,這樣回調函數中可以直接讀取頁面是否支援js。訪問鏈結時,%ctools_js寫作nojs。
$items['ctools_ajax_sample/%ctools_js/login'] = array(
'title' => 'Login',
'page callback' => 'ctools_ajax_sample_login',
'page arguments' => array(1),
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
|
彈出視窗中如果不包含form表單,在回調函數中用ctools_modal_render來輸出並結束
ctools_modal_render($title, $output);
|
如果包含form表單,需要先建立form_state陣列,然後輸出自定義的form或者現存form:
ctools_include('modal');
ctools_include('ajax');
// 基本的$form_state陣列,可以定義其他需要使用的資訊
$form_state = array(
'title' => t('Title of my form'),
'ajax' => $js,
);
// 包裝自定義的form
$commands = ctools_modal_form_render($form_state, drupal_render($form));
print ajax_render($commands);
exit();
// 包裝已有的form
$output = ctools_modal_form_wrapper('my_form', $form_state);
if ($form_state['executed'] && $js) { //可用from_state檢測表單提交狀態
$commands = array();
$commands[] = ctools_modal_command_dismiss(t('Login Success'));
print ajax_render($commands);
exit;
}
|
還可以使用ajax命令作為鏈結回調函數的輸出,這點用法是和標準一致的:
$commands = array();
$commands[] = ajax_command_html('#ctools-sample', $output);
print ajax_render($commands);
exit;
|
2.下拉鏈結功能表(Drop Down Menu)
下拉鏈結功能表是一個CTools Ajax元件,通過下拉選項的方式來顯示鏈結,使用方法很簡單,先定義一組鏈結陣列,然後調用theme_ctools_dropdown()輸出可以了:
return theme('ctools_dropdown', array('title' => t('Click to Drop Down'), 'links' => $links));
|
3.可折疊Div
可折疊Div有點像Drupal 6.x以前的fieldset,即可以控制下面的某段內容顯示或者折疊,也只需要通過theme輸出就可以了:
$handle = t('Click to Collapse');
return theme('ctools_collapsible', array('handle' => $handle, 'content' => $content, 'collapsed' => FALSE));
|
4.跳轉選單
跳轉功能表擴充了select選擇框的功能,只要選擇某項即可跳轉到對應鏈結,只需要用ctools_jump_menu()函數來生成表單:
1
2
3
4
|
$form_state = array();
// 第三個參數幾選擇框選項,鍵為鏈結,值為文字
$form = ctools_jump_menu(array(), $form_state, array($url => t('Jump!')), array());
return $form;
|
5.級聯選擇(dependent)
級聯選擇是很常見的一種表單形式,也就是當某個可選表單元素,如選擇框、核取方塊、單選框中的某項被選中後,會自動顯示相關聯的隱藏表單。CTools提供了簡單的實現方式。先包含dependecnt元件,然後再被關聯的隱藏表單上設置依賴關係:
ctools_include('dependent');
|
$form['menu']['title'] = array(
* '#title' => t('Title'),
* '#type' => 'textfield',
* '#default_value' => '',
* '#description' => t('If set to normal or tab, enter the text to use for the menu item.'),
* '#dependency' => array('radio:menu[type]' => array('normal', 'tab', 'default tab')),
* );
|
#dependency項設置了依賴關係,這裏的意思是,如果名為menu-type的單選框被選中,且選擇的值為‘normal’、’tab’或者’default’的時候,這個文本框就會顯示出來供輸入資料。
‘radio:menu[type]‘是對於單選框的特殊格式,如果是選擇框或者核取方塊,只要填上id就可以了。
如果被關聯的隱藏表單是單選框或者核取方塊,需要用#prefix和#suffix屬性加上兩層div。因為表單並不自帶div容器。
from
http://www.drupalla.com/project/ctools
$form_info 相關參數:
Defaults to $form_info['id']._finish if function exists.
Defaults to $form_info['id']._cancel if function exists.
Defaults to $form_info['id']._return if function exists.
Defaults to $form_info['id']._next if function exists.