it-swarm-ja.com

機能しているフィールドウィジェットフォームを単独で表示することはできますか?

ノード編集フォーム全体のコンテキストの外にフィールドウィジェットフォームを埋め込むことに興味があります。

過去に drupal_get_form を使用して完全なフォームを表示しましたが、それは単独のフィールドフォームには適用されないようです。

有効なフィールドウィジェットフォームを表示できますか?そうするための最良の方法は何でしょうか?

フィールドウィジェットと「通常の」フォームはどちらも非常に似ているため、これが不可能な場合、ウィジェットフォームを通常のフォームに「変更」するには何が必要ですか。

これは question が似たようなものを求めているようですが、答えがわかりません。その答えは hook_field_widget_form_alter の使用を指定しています。私が理解していないのは、作成されたフィールドフォームをフックする方法ではなく、フィールドフォームを表示する方法です。

21
SMTF

VBOは、modify.action.incで次のようなことを行います。

$form_key = 'bundle_' . $bundle_name;
$form[$form_key] = array(
  '#type' => 'fieldset',
  '#title' => $label,
  '#parents' => array($form_key),
);  
field_attach_form($context['entity_type'], $entity, $form[$form_key], $form_state, LANGUAGE_NONE);  

そのため、エンティティタイプ、エンティティ(バンドルキーセットのみの空のオブジェクトであり、実際に使用されるもの)、ウィジェットが追加されるフォーム、および言語が必要です。ウィジェットをフォームの奥深く($ formではなく、$ form [$ form_key]のように、またはさらに深く)埋め込みたい場合は、そのフォーム配列に#parentsを設定する必要があります。

もちろん、これにより、そのエンティティタイプとバンドルに属するすべてのフィールドのウィジェットが埋め込まれることに注意してください。これが、アタッチ関数の記述方法です。それを回避するには、かなりの数のコードを再発明する必要があります。 実際のコード を参照してください。私が行うことは、フィールドインスタンスを調べて、各$ field_nameを取得し、そのフィールドタイプに興味がない場合は、$form[$form_key][$field_name]['#access'] = FALSE;これらのウィジェットを見えなくします。

編集:さて、ctoolsにはctools_field_invoke_field()があり、理論的にはフィールド単位で作業できます。私はそれを使ったことがありません。上記のテキストは私の直接の経験です。

18
Bojan Zivanovic

私はttkによって提案された機能を集中的に使用していましたが、最近の更新で混乱が生じたと思います...

これは、Drupal 7.22およびctools 7.x-1.3でうまく機能する、以前のソリューションの新しいバージョンです。

したがって、前の投稿と同様に、次のようにカスタム関数を呼び出します。

my_field_attach_form('field_body', 'node', 'blog',  $node, $form, $form_state, LANGUAGE_NONE);

エンティティbundleがパラメーターになっていることに注意してください。この機能を使用してユーザーを編集していたので、これを行いました。このように、分類用語やその他のエンティティにも使用できます。

そしてその my_field_attach_form と定義されている:

function my_field_attach_form($field_name, $entity_type, $bundle, $entity, &$form, &$form_state, $langcode = NULL) {

  // Set #parents to 'top-level' if it doesn't exist.
  $form += array('#parents' => array());

  // If no language is provided use the default site language.
  $options = array(
    'language' => field_valid_language($langcode),
    'default' => TRUE,
  );

  // Append to the form
  ctools_include('fields');
  $field_instance = field_info_instance($entity_type, $field_name, $bundle);
  $form += (array) ctools_field_invoke_field($field_instance, 'form', $entity_type, $entity, $form, $form_state, $options);
}

この機能により、多くの時間を節約できました。

7
jmcouillard

以下は、ctools_field_invoke_field()メソッドを使用したソリューションです。カスタムフォーム関数に、以下を追加します。

$form = array();
$node = new stdClass();
$node->type = 'blog';
my_field_attach_form('field_body', 'node', $node, $form, $form_state, LANGUAGE_NONE);

どこ my_field_attach_form関数は次のように定義されます

function my_field_attach_form($field_name, $entity_type, $entity, &$form, &$form_state, $langcode = NULL) {
  // Set #parents to 'top-level' if it doesn't exist.
  $form += array('#parents' => array());

  // If no language is provided use the default site language.
  $options = array(
    'language' => field_valid_language($langcode),
    'default' => TRUE,
  );
  module_load_include("inc","ctools","includes/fields");
  $form += (array) ctools_field_invoke_field($field_name, 'form', $entity_type, $entity, $form, $form_state, $options);
}

サイトでctoolsを有効にする必要があることに注意してください。 Drupalにデフォルトでこのようなヘルパー関数が含まれていないのは残念です。

5
ttk

私はctoolsメソッドを動作させることができず、代わりにこのようにすることにしました。

このコードはフォーム関数内にあるため、$ formと$ form_stateはすでに渡されています。

function form_function($form, &$form_state) {

まず、レンダリングしようとしているフィールドを持つタイプの空のノードを作成します。

    $entity = new stdClass();
    $entity->title = "Temp Object";
    $entity->type = "node_type";
    node_object_prepare($entity);

オリジナルを壊さないようにフォーム変数を複製しました。

    $temp_form       = $form;
    $temp_form_state = $form_state;
    field_attach_form("node", $entity, $temp_form, $temp_form_state);

探しているフィールドを引き出して、フォームに追加します。

    $form["field"] = $temp_form["existing_field"];
}

このメソッドを使用して、カスタムフォームに分類選択ウィジェット、分類チェックボックスウィジェット、および 階層選択 ウィジェットをレンダリングしました。 (分類オートコンプリートウィジェットはレンダリングされますが、送信時にエラーをスローします)

最後にレンダリングして印刷する

drupal_render(drupal_get_form("form_function"))
2
Scott Joudry

私は使用して個々の分野からフォームを作成しました

field_default_form('entity_type', $entity, $field,$field_instance,LANGUAGE_NONE,$default_value, $form, $form_state);

これは、次のような任意のフォームで使用できる必要なウィジェットフォームを返します。

 $custom_form['form_element_to_display'] = field_default_form('entity_type', $entity, $field,$field_instance,LANGUAGE_NONE,$default_value, $custom_form, $custom_form_state);

上記の2つのパラメーターの値を取得するには、以下を使用します。

$field = field_info_field($field_name);
$field_instance = field_info_instance('node', $field_name, $node_type);

他のパラメーターについては、APIリンクを確認できます ここ

これにより、コンテンツタイプフィールドで定義されたデフォルトのウィジェットフォームが返されます。

これが誰かを助けることを願っています:)

0
akshay daxini