苦勞網有兩個需求,需要更改到新增文章時的表單機制
一個是需要多行的標題,原本的標題欄位只有單行,不符使用
一個是當沒有填寫標題欄位的時候,就拿內文的第一行來當標題(快速剪報時很好用)
如果都沒有,才會提示使用者必須輸入標題
要實現這樣的功能,就牽扯到使用hook_form_alter和hook_nodeapi的機制了。
參考資源
http://drupal.org/node/79671
這篇code是在文章要送測validate的時候,順變更改一下title的值。比較會有問題的是function hook_nodeapi裡頭的$form = teaser;
,其實在validate時,傳入的不是$teaser而是整個$form。
<?php
function mymodule_form_alter($form_id, &$form) {
// Check if we are on a node editing form for our type.
if (isset($form['#node']) && ($node = $form['#node']) && $form_id == $node->type .'_node_form') {
if ($node->type == 'type-to-change') {
// As we are going to construct the title ourself, there should
// not be any edit box for the title. As there is still a validator
// on the title field, we need to input a dummy value.
$form['title']['#type'] = 'value';
$form['title']['#value'] = 'this will not be used';
}
}
return $form;
}
function mymodule_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
if ($op == 'validate' && $node->type == 'type-to-change') {
//這裡變數雖然叫teaser,但validate時傳入的其實是整個form
$form = $teaser;
form_set_value($form['title'], 'some new value');
}
}
?>
回應
Re: 更改標題的方式 - 多行標題
在一番測試之後,多行標題包含兩個部份
一個部份是輸入,這個可以直接改form['title']成為textarea,而不需要增加新的cck field,因為增加新的cck field並不是一個好的解決方式,後續會有資料重複的問題,所以最好還是用既有的title form來達成。
code 範例:
<?php
function mymodule_form_alter($form_id, &$form) {
// bala .. bala
if (isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id) {
$form['title']['#type'] = 'textarea';
$form['title']['#rows'] = 3;
$form['title']['#required'] = 0;
}
}
?>
另一部份是輸出,輸出可以把\n取代為,就要利用drupal_set_title來做了。
下面是code範例:
<?php
function mymodule_nodeapi(&$node, $op, $teaser = NULL, $page = NULL){
switch($op){
case 'view':
drupal_set_title(str_replace("\n", '', $node->title));
break;
}
}
?>
Re: 更改標題的方式 - 自動標題
若沒有填入標題,自動把第一段內文改成標題
更改form的值,必須在validate階段時
關鍵在於form_set_value的使用
<?php
function mymodule_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
if ($op == 'validate' && $node->type == 'type-to-change') {
//這裡變數雖然叫teaser,但validate時傳入的其實是整個form
$form = $teaser;
form_set_value($form['title'], 'some new value');
}
}
?>