5

Drupal 6にはCCKを使用して、次のようなカスタムフォームにCCKフィールドをアタッチするメソッドがありました。

$field = content_fields('field_name');  // field_name is cck field
(text_field,text_Area,image_field anything.)
$form['#field_info'][$name] = $field;
$form += content_field_form($form, $form_state, $field);

Drupal 7で同じ機能を実現するにはどうすればよいですか?フォームがあり、作成したフィールドをコンテンツタイプに使用したいと思います。のすべてのファイルをfield.module調べましたが、何も見つかりませんでした。_attach_field、、などの関数が含まれてfield_info_Fieldfield_info_instanceますが、フォームフィールドとしてレンダリングすることはできません。

4

2 に答える 2

2

フォーム全体を追加して設定を解除するというソリューションが気に入っています。私は別の角度から攻撃しています。使い捨ての一時的なフォームを作成し、保存したいフィールドのみにコピーします。これが私がhttp://api.drupal.org/api/drupal/modules%21field%21field.attach.inc/function/field_attach_form/7#comment-45908に投稿したものです:

任意のエンティティバンドル(この場合はオートコンプリートノード参照テキストフィールド)から別のフォームに単一のフィールドを追加するには、フォームを一時的なフォームとフォームステートとして作成し、コピーしてそのフィールド定義を配置します。私の場合、コマースチェックアウトフォームの変更に取り組んでいます。

function example_form_commerce_checkout_form_checkout_alter(&$form, &$form_state, $form_id) {
  $tmpform = array();
  $tmpform_state = array();
  $tmpnode = new stdClass();
  $tmpnode->type = 'card';
  // Create the temporary form/state by reference
  field_attach_form('node', $tmpnode, $tmpform, $tmpform_state);
  // Create a new fieldset on the Commerce checkout form
  $form['cart_contents']['org_ref_wrap'] = array(
    '#type' => 'fieldset',
    '#title' => t('Support Organization'),
  );
  // Place a copy of the new form field within the new fieldset
  $form['cart_contents']['org_ref_wrap'][] = $tmpform['field_card_organization'];
  // Copy over the $form_state field element as well to avoid Undefined index notices
  $form_state['field']['field_card_organization'] = $tmpform_state['field']['field_card_organization'];

  ..

どちらのソリューションの利点も、「ソース」フォームの複雑さ(複雑すぎると、フォーム挿入メソッドで多くの設定が解除されることを意味します)と、ソースフォームが時間の経過とともに新しいフィールドを受け取るかどうか(新しいフィールドが表示されるかどうか)に依存する可能性があります。 form-insertメソッドの「宛先」フォーム)。

ソリューションを共有していただきありがとうございます。

于 2013-01-23T16:13:44.340 に答える
2

やっと答えが出ました。これを行うためのトリックは次のとおりです。

$node = new stdClass();
$node->type = 'video'; //content type
field_attach_form('node', $node, $form, $form_state);
unset($form['body']); //unset other fields like this.

これにより、フィールド API で追加されたすべてのカスタム フィールドが表示されます。そのため、フォームに表示したくない余分なフィールドを設定解除する必要があります。残りはITと同じです。

于 2012-10-14T18:13:14.220 に答える