web-dev-qa-db-ja.com

プログラムでユーザー参照フィールドを作成する

分類用語にユーザー参照フィールドを追加したい。私はフィールドを作成し、それはインスタンスです:

$field = ['field_name' => 'mymodule_employee',
        'label' => t('Employee'),
        'type' => 'entityreference',
        'cardinality' => 1,
        'settings' => [
            'target_type' => 'user',
            'handler' => 'base',
            'handler_settings' => [
                'target_bundles' => ['user']
            ],
        ],
];
field_create_field($field);

$instance = ['mymodule_employee' => [
            'entity_type' => 'taxonomy_term',
            'bundle' => 'my_vocabulary',
            'field_name' => 'mymodule_employee',
            'label' => t('Employee'),
            'widget' => array(
                'type' => 'options_select',
                'active' => 1,
            ),
            'settings' => array(
                'target_type' => 'user',
                'handler_settings' => array('target_bundles' => null),
                'handler' => 'base',
            ),
            'display' => array(
                'default' => array('label' => 'inline', 'type' => 'entityreference_label'),
            ),
            'required' => 0,
            'default_value' => null,
        ],
];
field_create_instance($instance);

すべてうまくいきます。しかし、用語を作成してユーザーを選択しようとすると、空のリストがあります。管理フォームのフィールド設定に移動して保存すると、すべてが機能し始めます。

フィールドとインスタンスの作成を忘れてしまいましたか?

1
menelai

ユーザーへの参照を追加するには、参照モジュールを使用し、それによって定義されたユーザー参照モジュールを有効にします。

次に、hook_enableまたはhook_install関数でフィールドを定義する必要があります。次のようなことをしてください:

$field = array(
  'field_name' => 'vendor_user_reference',
  'type' => 'user_reference',
  'cardinality' => 1,
  'entity_types' => array('commerce_product'),
  'translatable' => FALSE,
  'settings' => array(
            'referenceable_status' => array(
               0 => 0,
               1 => '1',
             ),  
    )       
);
field_create_field($field);

Referenceable_statusの値を定義する必要があります。そうしないと、ユーザーリストがインターフェイスに表示されません。また、この時点でreferenceable_roles配列を定義することもできます。これは次のようになります。 'referenceable_roles' => array(2 => 0、3 => 0、4 => '4'、5 => 0、6 => 0、)、

ここで、ロールテーブルから削除するロールを設定します。

次に、エンティティにフィールドのインスタンスを作成する必要があります。 Drupal Commerce Productに対して以下を実行しました。(Commerce Kickstart 2.0の場合、これは製品タイプエンティティのhook_commerce_product_type_insert($ product_type、$ skip_reset)にあります。)

$new_instance = array(
  'field_name' => 'vendor_user_reference',
  'entity_type' => 'commerce_product',
  'bundle' => $product_type['type'],
  'label' => t('Vendor User Reference'),
  'required' => TRUE,
  'widget' => array(
                'active' => 1,
                'module' => 'options',
                'settings' => array(
                        'apply_chosen' => '',
                ),
                'type' => 'options_select',
                'weight' => '40',
        ),
   'display' => array(),
);
field_create_instance($new_instance);

ここで、ユーザー用に作成された選択リスト(たとえば、ログインしているユーザー)の値を設定する場合は、hook_form_alter関数を変更して以下を追加する必要があります。

$entity_form['vendor_user_reference']['und']['#default_value'] = (string)$user->uid;

フォームに['und']が必要な理由はよくわかりませんが、フォームなしでは機能しません。

1
angms.bh

Entity Reference Autocomp leteモジュールが役立つかどうかを確認します。モジュールページは言う

このモジュールは、「entityreference」と呼ばれる新しいフォーム要素タイプを定義します。これにより、開発者はフォームにオートコンプリートフィールドを追加できるため、ユーザーはエンティティ参照フィールドを通じて行うのと同じ方法で任意のエンティティを参照できます。

1
arpitr