2011-02-07 為 form 增加新的 validation 規則
hook_form_alter() 本來是為了修改 form 的各種屬性
例如增加欄位, 修改欄位的預設值等等
但其實還可以增加 validation 規則和增加提交後的處理
增加 validation 規則:
<?php
function mymodule_form_alter(&$form,$form_state, $form_id) {
if($form_id=='user_register') { //只是一個例子, 你可以填入需要的 form id
//為 #validate 陣列增加一個元素, 元素的值就是新的 validate 函數名
$form['#validate'][] = 'mymodule_new_user_register_validation';
}
}
//然後定義新的 validate 函數, 帶入兩個參數
function mymodule_new_user_register_validation($form, &$form_state) {
//$form_state['values'] 儲存用戶提交的數據
if(strpos('admin',$form_state['values']['username'])===false) {
//用戶名字不可以有 admin 的字眼
form_set_error('username', '用戶名字不可以有 admin 的字眼');
}
}
?>
增加提交後的處理:
<?php
function mymodule_form_alter(&$form,$form_state, $form_id) {
if($form_id=='user_register') {
//為 #submit 陣列增加一個元素, 元素的值就是新的提交後處理函數
$form['#submit'][] = 'mymodule_new_user_register_submit';
}
}
//然後定義新的 validate 函數, 帶入兩個參數
function mymodule_new_user_register_submit($form, &$form_state) {
//$form_state['values'] 儲存用戶提交的數據
drupal_set_message('Welcome, '.$form_state['values']['username']);
}
?>
相關:
Drupal form API
hook_submit, hook_form_alter, hook_validate in Drupal 6.x
解決樹狀分類層級不明的問題 solving the unknown level of taxonomy trees
Taxonomy 分類是可以多層的, 樹狀的
但有一個很大的問題, 就是 taxonomy_get_term(), node_load() 的時候的分類並沒有有關層的參數
即是, 雖然分類有層級, 但我並不知道這個分類是最頂層, 中間, 還是最底
這個問題一直很困擾, 因為像以下的例子:
- China
- Beijing
- Shanghai
就不能輕易找出"城巿"了
最近找到一個比較可行的方法
1. hierarchical_select
一個方便的功能, 能令你的層級選擇的時候更人性化
我使用的設定是將每一層的分類都儲存, 而不是只是儲存末諯分類
2. content taxonomy
不使用原生的 分類連到 content type
而使用 cck 將 taxonomy 到 content type
3. computed field
最重要, 作用是將從 hierarchical_select 的分類分層, 再每一層記錄分類
如上例中, 需要建立兩個 computed field, 一個儲存國家, 一個城巿
需要有的資料的時候就從 computed field 取出
而不從一般的 taxonomy 最出
實際的代碼:
<?php
$country = array_slice($node->field_country,-2,1);
$t = taxonomy_get_term($country[0]['value']);
$node_field[0]['value'] = $t->name;
?>
有關 computed field 的使用方法可參考 Computed Field: 在另一個檔案提供代碼算式 compute in file
Computed Field: 在另一個檔案提供代碼算式 compute in file
Computed Field 是一種 cck 使用的 field type,
類似 imagefield, 但主要提供是一個地方,
放的是一個算式的結果.
例如有中英數三個整數欄位,
我可以加一個 computed field, 儲存的數值是他們三個的和
然後我就可以輕鬆根據這個數值, 使用 views, 例出, 排序學生們的總分
Computed field 提供一個 textarea 輸入算式, 但也提供以特定的函數命名提供算式
它自己的說明清楚提示這個命名, 但就沒有這個函數應該使用的參數和返回值, 實例如下:
<?php
/**
* <obj> $node that contains all field values
* <array> $field
* <array> $node_field that store this computed field value
**/
function computed_field_[field_name]_compute(&$node, $field, &$node_field) {
//$node_field[0]['value'] 就是實際存起來的結果
$node_field[0]['value'] = sum($node->field_math[0]['value'],$node->field_eng[0]['value']);
}
?>
Drupal book v2011-spring
List of Good books in 2011 spring:
1. Drupal’s Building Blocks: Quickly Building Web Sites with CCK, Views, and Panels
Most basic elements in building a website with Drupal. Config/backend stuff. A good start for Drupal developer.
2. Drupal 6 Themes
Frontend stuff, i.e., how drupal use html templates and the integration in between.
3. Using Drupal
advanced version of book1. More building elements in Drupal.
4. Pro Drupal 6 Development 2nd ed
Pure programming stuff. For customization that specific to special functions that no one did before. API, hooks, behind the scenes.
用 PHP 來提取 views 的結果: $view->preview()
EDIT 2010-01-13 <?php $view->access() ?>
之前有提及過用 PHP 來提取 views 的結果: 從 fid 提取上傳檔案的資料
但發覺這個方法不可以拿出 Filefield 的資料, 原因未明
因為效能問題不想使用 node_load(), 花了些時間挖
Views 的 AJAX paging 就是使用 <?php $view->preview()?>
(可以參考右欄 Recent content 的 paging)
實際使用:
<?php
$view = views_get_view($name);
if (is_object($view)) {
$output .= $view->preview($display_id,array($taxonomy->name)); //第二個 arg array() 是給views 用的 argments
}
?>
此方法可以完全使用 views 的 templates, display options 等, 真正方便
EDIT:
要檢查權限:<?php $view->access($display_id) ?>
再加一個方法:
<?php
views_embed_view($name, $display_id, $arg1, $arg2);
?>