私は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;
}
コンテンツタイプの空のフォームを取得するには、次のようなコードを使用します。
$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
)),
),
);
@ 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;
}
使用する
_\Drupal::entityManager()->getFieldDefinitions('entity_type','bundle');
_
コンテンツタイプに関連するすべてのフィールドが表示されます。