web-dev-qa-db-ja.com

プログラムによるエンティティ参照フィールドの更新

私はDrupalの開発に慣れていないため、やろうとしていることで少し迷っています。

私の会社にはいくつかの場所があり、各場所が私の会社のWebサイトに独自のページを持つことができる方法を開発しています。

ロケーションマネージャーがログインしてそれぞれのロケーションに関するニュース記事を投稿し、それらの記事を適切なロケーションページに表示できるようにしたいと考えています。

「場所」と「サイト記事」にコンテンツタイプを設定しています。 「サイト記事」には、場所への参照タイプである「場所」フィールドがあります。

さまざまなサイト管理者が自分の場所ではない場所を選択する機能を制限するために、hook_form_alter()を使用して、管理者が属するサイトを読み取る「サイト記事」コンテンツタイプの「場所」エンティティ参照を調整しています。ユーザーアカウント設定で、マネージャーサイトのみが表示されるようにフォームを調整します。そのコードは次のようになります。

function smg_site_articles_form_alter(&$form, &$form_state){
global $user;
$account = user_load($user->uid);
if(!empty($form['field_site_news_article_location'])){        
     $entity_node = node_load($account->field_user_location['und'][0]['target_id']);
     $form['field_site_news_article_location'] = array(
      '#title' => 'location',
      '#type' => 'select',  
      '#options' => array(
          0 => t($entity_node->title)
        ),
      '#default_value' => $entity_node->title);        

私が実行している問題は、Articleを保存するときに、 "Location"エンティティ参照が入力されず、必要な方法でビューフィルターを追加できないことです。

問題は、hook_form_alter()の「Location」エンティティ参照フィールドを変更する方法にあると想定していますが、データを正しく更新する方法について少し迷っています。

誰か助けてもらえますか?

3
gev125

フォームのフィールドは楽しいです。それらについての情報があります here

要約すると、変更しようとしている要素は次のようになります

$form['field_site_news_article_location'][LANGUAGE_NONE][0]['target_id'];

すべてを置き換えるのではなく、既存のオプション配列を置き換えるだけの方が賢明ですが、これにも小さな変更が必要になります。

選択オプションはキー=>表示なので、0をキーとして使用すると、バックエンド(この場合はノードID)の何とも一致せず、フォームは適切に保存されません。同様に#default_valueはノードのタイトルではなくキーを期待しています。

次のようなものでうまくいくはずです。

...
$options = array($entity_node->nid => $entity_node->title);
$form['field_site_news_article_location'][LANGUAGE_NONE][0]['target_id']['#options'] = $options;
$form['field_site_news_article_location'][LANGUAGE_NONE][0]['target_id']['#default_value'] = $entity_node->nid;
2
Clive

変更することでなんとか機能させることができました

$form['field_site_news_article_location'][LANGUAGE_NONE][0]['target_id']['#options'] = $options;
$form['field_site_news_article_location'][LANGUAGE_NONE][0]['target_id']['#default_value'] = $entity_node->nid;

$form['field_site_news_article_location']['und']['#options'] = $options;
$form['field_site_news_article_location']['und']['#default_value'] = $entity_node->nid;

基本的に[0]と['target_id']を削除すると、値が設定され、完璧に機能します。

しかし、なぜこれが機能し、もう一方が機能しないのか、私にはわかりません。これがどのように機能するかを説明する人はいますか?

手伝ってくれてありがとう!

1
gev125