簡體   English   中英

Drupal,hook_form_alter在節點中添加字段編輯/創建

[英]Drupal, hook_form_alter add field in node edit / create

我有一個節點,我需要以編程方式填充字段,所以這是我的工作:

 $campaigns = $client->get_campaigns();
    $tab_campaign = array(""=>"Dernière newsletter");
    foreach ($campaigns->response as $camp){
      $tab_campaign[$camp->CampaignID] = $camp->Name;
    }


    $form['field_last_newsletter'] = array(
      '#type' => 'select',
      '#required' => true,
      '#options' => $tab_campaign,
      '#title' => 'Choisir la dernière newsletter',
    );
  }

這項工作,我的選擇字段已填充,但是當我選擇一個並單擊“保存”時,不保存任何內容,如果返回編輯頁面,則選擇具有默認值,我在做什么錯了?

謝謝。

我認為您正在尋找選項字段的allowed_values_function設置。 對於具有動態選項的字段,這是一個完美的解決方案。

首先,您需要更改當前字段設置以使用該功能設置允許的值。 為此,請修改功能中的字段設置(如果使用):

// Exported field_base: 'field_last_newsletter'
// my_module.features.field_base.inc
$field_bases['field_last_newsletter'] = array(
  // ....
  'settings' => array(
    'allowed_values' => array(),
    'allowed_values_function' => 'my_module_field_last_newsletter_allowed_values',
  ),
  // ....
);

如果您不使用功能,則可以通過執行PHP代碼或使用hook_update_N進行hook_update_N

/**
 * Implements hook_update_N().
 * Update the field_last_newsletter field settings to use callback for allowed_values.
 */
function my_module_update_N(&$sandbox) {
  // get default status for field using machine name of field
  $default_stats_field = field_info_field('field_last_newsletter');
  // unset the allowed values
  $default_stats_field['settings']['allowed_values'] = '';
  // function name that provides array of values
  $default_stats_field['settings']['allowed_values_function'] = 'my_module_field_last_newsletter_allowed_values';
  // update value with new value.
  field_update_field($default_stats_field);
}

保存新設置后,您需要為動態允許值實現回調函數。

/**
 * Allowed values callback for field_last_newsletter.
 */
function my_module_field_last_newsletter_allowed_values() {
  // ...
  $campaigns = $client->get_campaigns();
  $tab_campaign = array(""=>"Dernière newsletter");
  foreach ($campaigns->response as $camp){
    $tab_campaign[$camp->CampaignID] = $camp->Name;
  }

  return $tab_campaign;
}

這里的問題是,您正在代碼中定義一個字段,並且由於未通過UI創建該字段,因此未創建用於存儲其值的數據庫表。 我建議您通過UI(/ admin / structure / types / manage / xxxxx / fields)創建此字段,然后在hook_form_alter中,只需更改#options數組即可填充它。 這樣,將為您的數據創建一個數據庫表,Drupal將處理保存數據,填充保存的值等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM