Встроить многоэтапную форму, которая взаимодействует с iframePhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Встроить многоэтапную форму, которая взаимодействует с iframe

Сообщение Anonymous »

Я хотел бы, чтобы любой, кто испытывает опыт Drupal и Ajax API, может указать мне в правильном направлении. Я просто не могу найти именно то, что может помочь мне прояснить эту загадку. Это было бы отличной помощью, кроме слов, если бы кто -то мог пролить свет на проблему, которую я застрял более чем на месяц. Цель: < /p>
  • Вставьте 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 -й шага, чтобы запустить 2 -й шаг:
Попытка 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 
, где Iframe не существует
'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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»