2010-01-09 53 views
1

我正在使用CCK類型的hook_form_alter(對於您的drupal-ers)。我有一個字段,通常是我節點表單中的一個選擇列表。但是,在這種情況下,我想隱藏選擇列表,並用SQL查詢填充表單中的值。Drupal 6:只將值的第一個字符插入到MySQL

一切都很好。我可以看到我的期望值顯示在HTML源代碼中,所以我知道我的查詢正確執行。但是,當我提交表單時,它只插入值的第一個字符。我的一些測試值爲566,784,1004 - 列值分別爲5,7,1。

起初我以爲它必須是數據庫列的屬性,但當我刪除我的form_alter,使字段隱藏並手動選擇值,插入正確的值?!?

<?php 
function addSR_form_service_request_node_form_alter(&$form, $form_state) { 
     if (arg(0) == 'user' && is_numeric(arg(1))) { 
     $account = arg(1); 
     $club = 2589; 
     $form['field_sr_account'] = array('#type' => 'hidden', 
     '#value' => $club 
     ); 

      } 
} 


?> 

任何人都可以看到爲什麼只有第一個字符會被插入?

注:我嘗試刪除並重新創建列,使用#value & #default_value,它仍然只提交整數的第一個字符。此外,我刪除提交處理程序作爲一個可能的原因刪除它,仍然導致只提交一個字符

更多更新 - 仍在搜索! 好的,一些很好的問題。讓我回答:

  1. 的DB列類型是整數(4)
  2. 鉤產生的HTML是:

    INPUT TYPE = 「隱藏」 名稱= 「field_sr_account」 ID =」編輯場-SR-賬戶」值=‘2589’

最新:我認爲這個問題已經被縮小到陣列的結構。當我做的var_dump在這一領域的形式改變已被處理後,這是我得到的..

[43] => Array 
     (
      [#type] => hidden 
      [#default_value] => 2589 
      [#post] => Array 
       (
       ) 

      [#programmed] => 
      [#tree] => 
      [#parents] => Array 
       (
        [0] => field_sr_account 
       ) 

      [#array_parents] => Array 
       (
        [0] => field_sr_account 
       ) 

      [#weight] => 0.016 
      [#processed] => 1 
      [#description] => 
      [#attributes] => Array 
       (
       ) 

      [#required] => 
      [#input] => 1 
      [#process] => Array 
       (
        [0] => form_expand_ahah 
       ) 

      [#name] => field_sr_account 
      [#id] => edit-field-sr-account 
      [#value] => 2589 
      [#defaults_loaded] => 1 
      [#sorted] => 1 
     ) 

什麼是我可以設置表單值的字段的結構。這得是什麼像什麼abhaga是在暗示..

+0

我們能否看到您將代碼賦值給$ club的代碼? – 2010-01-09 21:59:19

+0

好的 - 我更新了原文。這是位於自定義模塊中的所有相關代碼。 – tpow 2010-01-09 22:09:44

回答

2

由於您嘗試更改的字段最初是使用選定的小部件,因此CCK將尋找$form_state['values']['field_sr_account'][0]['value']。通過將該字段設置爲#hidden類型並設置#value,您將在$form_state['values']['field_sr_account']中獲得其值。CCK將嘗試訪問該元素的第一個元素,並以該值的第一個字符結尾。

更新:完成你是什麼 試圖做的是對的

function addSR_form_service_request_node_form_alter(&$form, $form_state) { 
    if (arg(0) == 'user' && is_numeric(arg(1))) { 
    $account = arg(1); 
    $club = 2589; 
    // Use this property to store the value to restore back 
    $form['#field_sr_account'] = $club; 
    $form['field_sr_account'] = array('#type' => 'hidden','#value' => $club); 
    } 
} 

/*in your submit handler, restore the value in the proper format*/ 
$form_state['values']['field_sr_account'] = array('0' => array('value' => $form['#field_sr_account'])); 

老回答

方式一:實現你需要會做一些什麼樣的最簡單方法將整個 $form['field_sr_account']代入 $form['#field_sr_account']然後 通過SQL提供該值 以 提交處理程序本身的正確格式進行查詢。

+0

我曾經建議過一種更簡單的方法來實現你所需要的,儘管它並不感覺相當Drupal的方式:) – abhaga 2010-01-17 17:07:38

+0

嗯,這裏的東西是不對的。當我運行這段代碼時,我得到警告:preg_match()期望參數2是字符串,在777行的bootstrap.inc中給出的數組。我檢查了該函數,它是 - 函數drupal_validate_utf8($ text){ 〜777〜返回(preg_match('/^./ us',$ text)== 1);所以它無法驗證爲utf8。該字段的HTML值爲空。 – tpow 2010-01-17 17:25:05

+0

嗯..奇怪的是,我沒有得到一個錯誤,當我嘗試,但看官方文檔,#隱藏類型#值#只能是'文本或數字'。因此使用數組作爲值是有問題的。 您可以改爲將值保存在'$ form'的不同屬性中,並將其賦值回提交處理程序中的$ form_state ['values']。 – abhaga 2010-01-17 20:08:43

0

好看看http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html#hiddenhttp://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html#value

我們還建議您使用值,而不是隱藏。您可以在http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6

上找到此信息此外,類型隱藏不允許有分配給它的屬性,因此這可能會導致問題。任何使用表單API的問題都應該在這些資源中得到回答,因爲我對你想要完成的工作還有點不清楚......特別是使用提交按鈕。

舊的回答:

好吧,如果我理解正確此$ 俱樂部沒有被正確設置。如果 從查詢中的第一個結果是 你找那麼這 應該工作的數量。

嘗試調用

<?php print_r(db_fetch_array($result)) ?> 

拿到一看一切從查詢返回 。

我有點不清楚 設置不正確。如果它是 #value在您的關聯數組 中,那麼罪魁禍首必須是查詢。 如果#value被設置正確,並且 無論你如何處理它可能後來可能 是罪魁禍首(這裏沒有顯示)。如果 其$form_state I 中的值看不到您使用$club這裏 根本沒有。

而且,在你addSR_submit_function 你似乎沒有被使用$form 變量,或使用$俱樂部任何 除了用於設置 出現在頁面頂端的消息,您的 當它被稱爲。

我可能需要一些進一步的說明 至於究竟是哪裏出了問題。

另外,當你打電話 drupal_set_message功能,你是 只是做這個調試 的目的?

+0

這有點難,因爲在形式上有些元素根本不涉及問題。 1 - drupal_set_message用於調試。 2 - 在提交函數中未調用$ club的原因是表單的所有元素都應該使用自定義提交處理程序提交,即使未明確調用,對吧?我可能在這方面是錯的,但爲什麼它只提交第一個字符? 3-我可以通過查看通過螢火蟲輸入元素的HTML源代碼來驗證SQL查詢的結果是否正確。 – tpow 2010-01-09 23:53:08

+0

已更新的答案,希望能夠對您的問題有所瞭解。 – 2010-01-10 04:08:23

+0

我嘗試過#value(在當前文章)和#hidden,以及有和沒有附加屬性(#size和#maxlength),但沒有成功。由於特定於我的應用程序的原因,submit函數中的其他代碼覆蓋了節點的uid,但與此問題無關。 – tpow 2010-01-10 16:40:16

0

你是不是應該檢查

drupal_set_message($form_state['values']['field_sr_account']); 

代替

drupal_set_message($club); 
在addSR_submit_function

好吧,只是一個問題:不確定db_result返回什麼類型的查詢,可能與類型轉換有關嗎?所以這是爲了確保價值是整數。

'#value' => (int)$club 
+0

drupal_set_message($ form_state ['values'] ['field_sr_account']);在後面的頁面(插入後)輸出正確的值,但數據庫值相同(僅限第一個字符) – tpow 2010-01-10 17:05:14

+0

您可以將INSERT代碼發佈到數據庫中嗎? – Kniganapolke 2010-01-11 06:33:15

+0

沒有代碼 - Drupal自動將它帶入表單提交。此外,SQL是可靠的,所以它可以是我的數組的格式,也可以是CCK處理字段的錯誤。換句話說,每次正確的第一個字符到數據庫的事實讓我信任SQL並且懷疑代碼... – tpow 2010-01-11 07:02:17

0

cinqoTimo,出於好奇,這是什麼樣的CCK字段?它是一個整數,小數,浮點數?你有沒有通常默認情況下,該領域的任何特殊參數? db中的列類型是什麼?

你可以發佈窗體的html輸出。這可能會提供有關可能發生的事情的線索。

您是否使用任何javascript來編輯此字段的任何值?

您是否嘗試過從addSR_form_service_request_node_submit掛接輸出值結果?那裏有什麼區別。

對不起所有的問題。只是大聲思考,因爲你似乎已經覆蓋了大部分基地。