- Вставьте iframe на странице (просмотр отображения узла) с помощью JS (прикрепленная библиотека). < /Li>
Iframe предназначен для обслуживания как элемент ввода, отправляя сообщение с Uuid обратно на Drupal на Click Events. Затем UUID используется для поиска соответствующего узла, встроенного многоэтапной формы рядом с iframe. < /Li>
Для многоэтапной формы: 1-й шаг-предоставить пользователю некоторые параметры вместе с подтверждающим сообщением, в которой указано информация соответствующего узла. 2 -й шаг - это либо форма добавления объекта, либо форма редактирования.
В настоящее время, чтобы упростить задачу, я должен только отредактировать в качестве опции на 1 -й шаг, так что у меня было только все, что у меня было все, что у меня было все, что у меня было все, что у меня было 2 -е шаг, но у меня все было. Заблокировано в какой -то момент: < /p>
Все начинаются в JS, где я написал этот Drupal Ajax, чтобы передать сообщение из iframe к контроллеру: < /p>
Код: Выделить всё
// Scripts.js
window.addEventListener('message', function (event) {
let ajaxPost = Drupal.ajax({
type: "POST",
dataType: "json",
base: false,
submit: event.data, // which contains my_uuid
url: Drupal.url(`my/controller/path`)
})
ajaxPost.execute();
});
< /code>
В контроллере я попробовал несколько способов, но в основном я обнаружил, что мне нужно объявить оба уровня здесь (даже думал, что 2 -й шаг еще не должен показывать еще). < /p>
// Controller.php
public function handler(Request $request)
{
$response = new AjaxResponse();
$my_uuid = $request->get('my_uuid');
$form['first_layer'] = \Drupal::formBuilder()->getForm('\my\first\layer\form', $my_uuid );
$form['second_layer'] = \Drupal::formBuilder()->getForm('\my\second\layer\form\which\is\an\edit\form, $my_uuid);
$response->addCommand(new ReplaceCommand('#first_form_wrapper', $form['first_layer']));
$response->addCommand(new ReplaceCommand('#second_form_wrapper', '' ));
return $response;
}
Попытка 1
Я попытался использовать URL атрибут на Ajax, установите его непосредственно в качестве объекта Edit.
Код: Выделить всё
// FirstStepForm.php
public function buildForm(array $form, FormStateInterface $form_state, $my_uuid = NULL)
{
$form_state->setRebuild();
$nodeId = $this->findTheContent($my_uuid); // [
'#type' => 'hidden',
'#value' => $nid,
]
];
$form = [
'#type' => 'container',
'#prefix' => '',
'#suffix' => ''
];
$form['primary_action'] = [
'#type' => 'radios',
'#title' => $this->t('Please Choose your Action:'),
'#name' => 'primary_action',
'#prefix' => '',
'#suffix' => '',
'#ajax' => [
'method' => 'replaceWith',
'wrapper' => 'my-module__dynamic-form-container',
'event' => 'click',
'url' => Url::fromRoute( 'entity.node.edit_form', ['node' => $nid] )
],
'#options' => [
self::EDIT => $this->t('Edit'),
]
];
return $form;
}
< /code>
С этим я достиг следующего: < /p>
[*] Форма редактирования встроена рядом с iframe < /li>
Пользователь может обновить контент при отправке формы, щелкая
savebutton. есть:
2 -й шаг всегда является формой редактирования, даже если я позже добавляю опцию, такую как создать новую сущность
[*] Если проверка формы не удалась, страница будет перенаправлена на/node/{nid}/edit 'replaceWith',
'wrapper' => 'my-module__dynamic-form-container',
'event' => 'click'
]
< /code>
обратный вызов: < /p>
public function primaryActionCb(array $form, FormStateInterface $form_state)
{
$action = $form_state->getValue('primary_action');
$response = new AjaxResponse();
$nid= $form_state->getValue('nid');
switch($action) {
case self::EDIT:
$wrapper = [
'#type' => 'container',
'#prefix' => '',
'#suffix' => '',
];
$form['secondary_action'] = \Drupal::formBuilder()->getForm('\Drupal\my_module\Form\NodeEditForm', $nid);
$response->addCommand(new ReplaceCommand('#my-module__dynamic-form-container > *', $item ));
break;
}
return $response;
}
< /code>
Для пользовательской формы редактирования я строю форму с Drupal \ core \ entity \ entity \ entityformdisplay: < /p>
namespace Drupal\my_module\Form;
class NodeEditForm extends FormBase
{
public function buildForm(array $form, FormStateInterface $form_state, $nid= null): array
{
$this->node = Node::load($nid);
if (!$this->node) {
return ['#markup' => $this->t("No node is found in the system.")];
} else {
$entityFormDisplayer = EntityFormDisplay::load('node.'.$this->node->getType().'.default');
$entityFormDisplayer?->buildForm($this->node, $form, $form_state);
$form['actions'] = [
'#weight' => 99
];
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
'#button_type' => 'primary',
'#submit' => [
[$this, 'submitForm'],
]
];
return $form;
}
}
< /code>
Тем не менее, основная блокировка здесь: < /p>
думал, что это может позволить мне лучше контролировать форму, но когда я нажимаю на SaveButton, независимо от того, как мой обработчик отправки, страница перенаправлена обратно на Controller.php, оставляя только пустую страницу с текстовой страницей, удерживающей стоимость всех команд ajax ... p> < /pr> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /r. /> Это до сих пор, где я добрался до.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... -an-iframe
Мобильная версия