web-dev-qa-db-ja.com

カスタムモジュールフォームでコンテンツタイプのフィールドをレンダリングする方法

私はDrupal 8を初めて使用し、コンテンツタイプ階層をフェッチしてajaxコールバックを使用してそのフィールドを表示できるフォームを作成しようとしていますが、残念ながら、どのフィールドも表示されません。 ajaxは正常に動作し、コールバック関数は正しく実行されましたか?ContentTypeのフィールドタイプは{body:text_with_summary、price:decimal、title:string}です。デバッグで試したところ、コードでこれらのタイプをフォームフィールドタイプとして定義できないようです

myForm.phpファイルのコードは次のとおりです。

public function level3SelectedCallback(array &$form, FormStateInterface $form_state) {
    $ajax_response = new AjaxResponse();
    $fields = MyController::contentTypeFields('MY_VOC');

    foreach ($fields as $field){
        $name = $field->id();
        $label = $field->label();
        $type = $field->getType();
        $desc = $field->getDescription();
        $form['fields_wrapper']['field_'.$label] = array(
            '#type' => $type,
            '#description' => $desc,
            //'#options' => '',
            '#attributes' => array(
                'class' => array(
                    'myField'
                ),
            ),
            );
        $ajax_response->addCommand(new HtmlCommand('#fields-wrapper', $form['fields_wrapper']['field_'.$label]));

    }

    $ajax_response->addCommand(new InvokeCommand('#fields-wrapper', 'change'));
    $form_state->setRebuild(True); 

    return $ajax_response;
}

私のコントローラー機能は:

static function contentTypeFieldsAsFields($contentType) {
    // Get the definitions
    $fields = array_filter(
            \Drupal::service('entity.manager')->getFieldDefinitions('node', $contentType), function ($field_definition) {
                return $field_definition instanceof \Drupal\field\Entity\FieldConfig;
            }
    );
    return $fields;
}
3
Emad Karhely

コンテンツタイプの空のフォームを取得するには、次のようなコードを使用します。

$node = \Drupal\node\Entity\Node::create(['type' => 'page']);
$form = \Drupal::service('entity.form_builder')->getForm($node);

このフォームをajaxで開くには、コントローラーにフォームを配置します。

public function contenttypeform(NodeTypeInterface $node_type) {
    $node = $this->entityTypeManager()->getStorage('node')->create([
      'type' => $node_type->id(),
    ]);
    return $this->entityFormBuilder()->getForm($node);
  }

このコントローラーのルートを構成し、ConfigSync.phpからこの例のようなajaxモーダルでフォームを開きます。

$links['view_diff'] = array(
            '#type' => 'link',
            'title' => $this->t('View differences'),
            'url' => Url::fromRoute($route_name, $route_options),
            'attributes' => array(
              'class' => array('use-ajax'),
              'data-dialog-type' => 'modal',
              'data-dialog-options' => json_encode(array(
                'width' => 700
              )),
            ),
          );
1
4k4

@ 4k4に感謝しますが、drupal 8での使用方法は解決しました。ここにFormBuildコードがありますが、残念ながらすべてのフィールドにタイトルだけが表示されているわけではなく、警告が表示されています。コンソール:

メインスレッドでの同期XMLHttpRequestは、エンドユーザーのエクスペリエンスに悪影響を与えるため非推奨です。さらにヘルプが必要な場合は、 https://xhr.spec.whatwg.org/ を確認してください。 VM3435:19 [CKEDITOR]エラーコード:editor-incorrect-destroy。 VM3435:19 [CKEDITOR]このエラーの詳細については、 http://docs.ckeditor.com/#!/guide/dev_errors-section-editor-incorrect-destroy

そしてこれが私のフォームビルドコードです:

$form['fields_wrapper'] = [
        '#type' => 'container',
        '#attributes' => ['id' => 'fields-wrapper', 'class' => ['hiddenselect']],
    ];


    if ($form_state->getValue('level1') != false) {
        $val = $form_state->getValue('level1');
        $this->fields = MY_Controller::contentTypeFieldsAsFields($val);
        $node = \Drupal\node\Entity\Node::create(['type' => $val]);
        $myform = \Drupal::service('entity.form_builder')->getForm($node);

        foreach ($this->fields as $field) {
            //$name = $field->id();
            $n = $field->getName();
            $form['fields_wrapper'][$n] = $myform[$n];
        }

そしてこれが私のajaxコールバックコードです:

public function level1SelectedCallback(array &$form, FormStateInterface $form_state) {
    // Instantiate an AjaxResponse Object to return.
    $ajax_response = new AjaxResponse();
    $val = $form_state->getValue('level1');

    foreach ($this->fields as $field) {
        $n = $field->getName();
        $ajax_response->addCommand(new HtmlCommand('#fields-wrapper', $form['fields_wrapper'][$n]));
    }
    $ajax_response->addCommand(new InvokeCommand('#fields-wrapper', 'change'));

    $form_state->setRebuild(True);

    return $ajax_response;
}
1
Emad Karhely

使用する

_\Drupal::entityManager()->getFieldDefinitions('entity_type','bundle');
_

コンテンツタイプに関連するすべてのフィールドが表示されます。

EntityFieldManagerInterface::getFieldDefinitions()

0
Ajay Reddy