2008年9月20日 星期六

發現Drupal form的Bug !

今天發現 Drupal 5.10的 Form 處理上有個Bug !

  Bug出現在hidden & value元件, 在同一個頁面有多個form時, 在不同form中有同名的hidden or value元件, 這時在傳hidden or value元件的值, 都會得到第1個form的hidden or value元件的值 !

  這問題的發現, 是我想要在View中, 增加一個欄位, 這欄位可以在View中就直接可以增加或移除分類, 如下 :
我的程式如下 :

/*
* Views field for taxonomy add/remove.
*/
function committee_views_tables() {
$tables['committee'] = array(
'name' => 'committee',
'provider' => 'internal', // won't show up in external list.
'fields' => array(
'committee_modify' => array(
'name' => t('Committee: taxonomy add/remove'),
'handler' => 'committee_views_handler_taxomony',
'notafield' => TRUE,
),
),
);
return $tables;
}

/**
* display a link to the committee`s taxonomy remove with a destination return
*/
function committee_views_handler_taxomony($fieldinfo, $fielddata, $value, $data) {
global $user;

$access = node_access('edit',$data->node_type);
if ($access) {
$output .= drupal_get_form('committee_taxonomy_form', $data->nid);
}
return $output;
}

function committee_taxonomy_form($node_nid) {
$result = db_query("SELECT vid FROM {vocabulary} WHERE name = '%s'", COMMITTEE_VOCABULARY);
if (db_num_rows($result) > 0) {
$vol = db_fetch_object($result);
$set_vid = $vol->vid;
}
$form['committee'] = _taxonomy_term_select('', '', '', $set_vid, '', 0, '');
$form['option'] = array(
'#type' => 'select',
'#options' => array(t('Add'), t('Remove'))
);
$form['node_nid'] = array(
'#type' => 'hidden',
'#value' => $node_nid,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit')
);

return $form;
}

function committee_taxonomy_form_submit($form, $form_values) {
if ($form == 'committee_taxonomy_form') {
$result = db_query('SELECT * FROM {term_node} WHERE nid = %d AND tid = %d',
$_POST[node_nid], $form_values[committee]);
if (db_num_rows($result) > 0) {
if ($form_values[option] == 1) {
db_query("DELETE FROM {term_node} WHERE nid = %d AND tid = %d",$_POST[node_nid], $form_values[committee]);
}
} else {
if ($form_values[option] == 0) {
db_query("INSERT INTO {term_node} (nid,tid) VALUES (%d, %d)",$_POST[node_nid], $form_values[committee]);
}
}
}
}


  在 committee_taxonomy_form_submit函數中, form_values會傳回form裏面的每個元件值, 這時就出現錯誤了, 畫面中有3筆資料, 操作第1筆的資料是沒問題, 但第2筆之後問題就出來了, 由於我在committee_taxonomy_form函數中, 定義個hidden元件 -

$form['node_nid'] = array(
'#type' => 'hidden',
'#value' => $node_nid,
);

當這個form被submit之後, 在 committee_taxonomy_form_submit函數中, 就得到node_nid的值, 但無論你操作的是那一筆資料, 所得到的node_nid的值都是第1筆資料的node_nid的值 ==> Bug !

這時我只好在取node_nid元件值時, 使用$_POST[node_nid]來取值, 否則就會得到錯誤的值, 目前我發現 hidden & value元件會出錯, 其他像select, textfield是正常, 其他的元件就不得而知了 !

0 意見: