您在這裡

更改標題的方式

jimmy's 的頭像
jimmy 在 2006-12-07 (四) 13:59 發表

苦勞網有兩個需求,需要更改到新增文章時的表單機制

一個是需要多行的標題,原本的標題欄位只有單行,不符使用
一個是當沒有填寫標題欄位的時候,就拿內文的第一行來當標題(快速剪報時很好用)
如果都沒有,才會提示使用者必須輸入標題

要實現這樣的功能,就牽扯到使用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');
}
}
?>

回應

在一番測試之後,多行標題包含兩個部份

一個部份是輸入,這個可以直接改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;
}
}
?>

--
from open mind to open source~

若沒有填入標題,自動把第一段內文改成標題
更改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');
}
}
?>

--
from open mind to open source~