zf2 — нужна помощь в многостраничной форме на одной странице

Я только изучаю zf2, и базовый урок из официального документа великолепен. Теперь я хотел бы бросить вызов себе, чтобы создать многостраничную форму на одной странице, что-то вроде этого http://demo.stepblogging.com/multi-step-form/

Итак, в настоящее время у меня есть две формы, которые называются «Форма контакта» и «Форма альбома».

Идея в том, что я хочу разделить на 2 формы. Проблема в том, что когда я заполняю все поля в первой форме, я не уверен, как перейти к следующей форме. Я не уверен, что смогу выполнить логику в Controller, но я знаю, что большинство онлайн-уроков используют javascript для обработки кнопки «Далее» и «Назад». Или, может быть, есть идея получше?

Так что это моя страница контроллера.

 public function multipleAction(){
$formOne = new ContactForm();
$formTwo = new AlbumForm();

$formOne->get('next')->setValue('Next');
$request = $this->getRequest();

if($request->isPost()){
$aa = new ContactFilter();
$formOne->setInputFilter($aa);
$formOne->setData($request->getPost());

if ($formOne->isValid()) {
//save session
//maybe display second form or any other solution
}
}

моя страница множественных страниц содержит 2 формы

<ul id="signup-step">
<li id="contact" class="active">Contact</li>
<li id="album">Album</li>
</ul>

<?php
$form_one = $this->form_one;

//$form_one->setAttribute('action', $this->url('album', array('action' => 'multiple')));
$form_one->prepare();

//echo $_SESSION['name'];
echo $this->form()->openTag($form_one); ?>

<div id="contact-field">
<legend>Contact</legend>
<?php
echo $this->formHidden($form_one->get('id'));

echo $this->formLabel($form_one->get('name')).'<br>';
echo $this->formInput($form_one->get('name'))."<br>";
echo $this->formElementErrors($form_one->get('name'));

echo $this->formLabel($form_one->get('artist')).'<br>';
echo $this->formInput($form_one->get('artist'))."<br>";
echo $this->formElementErrors($form_one->get('artist'));


echo $this->formLabel($form_one->get('address')).'<br>';
echo $this->formInput($form_one->get('address'))."<br><br>";
echo $this->formElementErrors($form_one->get('address'));

echo $this->formSubmit($form_one->get('next'));
echo $this->form()->closeTag($form_one);
?>

 <?php
$form_two = $this->form_two;
$form_two->prepare();

echo $this->form()->openTag($form_two); ?>

<div id="album-field" >
<legend>Album</legend>
<?php
echo $this->formLabel($form_two->get('title')).'<br>';
echo $this->formInput($form_two->get('title'))."<br>";
echo $this->formElementErrors($form_two->get('title'));

echo $this->formLabel($form_two->get('artist'))."<br>";
echo $this->formInput($form_two->get('artist'))."<br>";
echo $this->formElementErrors($form_two->get('artist'));
echo $this->form()->closeTag($form_two);
?>

0

Решение

Код ниже очень грубый и предназначен только для примера (сделал это за 10 минут и выглядит так)

Таким образом, в основном все, что мы делаем, это следующее —

  1. Создание сеанса
  2. Проверка, есть ли какие-либо данные в сеансе для этой конкретной формы, если они есть, используйте setData (), чтобы установить данные в форме
  3. Если форма публикует данные, то проверьте & отфильтруйте его, а затем сохраните эти данные в сеансе
  4. Значение кнопки «Отправить» в форме используется для определения пути навигации, то есть на предыдущей или следующей странице.
  5. Последняя страница сохранит данные из сеанса в БД (или все, что вы хотите с ним делать) и, конечно, также уничтожит сеанс.

контроллер

/** @var Zend\Session\Container Session Object */
private $session;

public function __construct()
{
// Put a meaningful name in the constructor
$this->session = new Container();
}

public function page1Action()
{
// This should really be injected...
$form = new Form\Form1();

// Proper validation & filtering needs to be done for every form (this is example only)
$form->setInputFilter(new InputFilter());

// Populates form data from the session if it already exists
if (isset($this->session->form1Inputs)) {
$form->setData($this->session->form1Inputs);
}

$request = $this->getRequest();

if ($request->isPost()) {
$form->setData($request->getPost());

if ($form->isValid()) {
$formData = $form->getData();

// Saves the new data to the session
$this->session->form1Inputs = $formData;

// Redirects to next page
if ($formData['Next'] === 'Next') {
$this->redirect()->toRoute('application', ['controller' => 'Index', 'action' => 'page2']);
}
}
}

return new ViewModel(['form' => $form]);
}

public function page2Action()
{
// This should really be injected...
$form = new Form\Form2();

// Proper validation & filtering needs to be done for every form (this is example only)
$form->setInputFilter(new InputFilter());

// Populates form data from the session if it already exists
if (isset($this->session->form2Inputs)) {
$form->setData($this->session->form2Inputs);
}

$request = $this->getRequest();

if ($request->isPost()) {
$form->setData($request->getPost());

if ($form->isValid()) {
$formData = $form->getData();

// Saves the new data to the session
$this->session->form2Inputs = $formData;

// Redirects to next or previous page
if ($formData['Next'] === 'Next') {
$this->redirect()->toRoute('application', ['controller' => 'Index', 'action' => 'page3']);
} elseif ($formData['Previous'] === 'Previous') {
$this->redirect()->toRoute('application', ['controller' => 'Index', 'action' => 'page1']);
}
}
}

return new ViewModel(['form' => $form]);
}

public function page3Action()
{
// This should really be injected...
$form = new Form\Form3();

// Proper validation & filtering needs to be done for every form (this is example only)
$form->setInputFilter(new InputFilter());

// Populates form data from the session if it already exists
if (isset($this->session->form2Inputs)) {
$form->setData($this->session->form2Inputs);
}

$request = $this->getRequest();

if ($request->isPost()) {
$form->setData($request->getPost());

if ($form->isValid()) {
$formData = $form->getData();

// Saves the new data to the session
$this->session->form3Inputs = $formData;

// Finalise or redirect to previous page
if ($formData['Finalise'] === 'Finalise') {
// Save all data to DB from session & destroy
} elseif ($formData['Previous'] === 'Previous') {
$this->redirect()->toRoute('application', ['controller' => 'Index', 'action' => 'page2']);
}
}
}

return new ViewModel(['form' => $form]);
}

Форма 1

public function __construct($name = null)
{
parent::__construct($name);

$this->add(['name' => 'Form1Text1', 'type' => 'Text', 'options' => ['label' => 'Form 1 Text 1 : ']]);

$this->add(['name' => 'Form1Text2', 'type' => 'Text', 'options' => ['label' => 'Form 1 Text 2 : ']]);

$this->add(['name' => 'Next', 'type' => 'Submit', 'attributes' => ['value' => 'Next']]);
}

Форма 2

public function __construct($name = null)
{
parent::__construct($name);

$this->add(['name' => 'Form2Text1', 'type' => 'Text', 'options' => ['label' => 'Form 2 Text 1 : ']]);

$this->add(['name' => 'Form2Text2', 'type' => 'Text', 'options' => ['label' => 'Form 2 Text 2 : ']]);

$this->add(['name' => 'Next', 'type' => 'Submit', 'attributes' => ['value' => 'Next']]);
$this->add(['name' => 'Previous', 'type' => 'Submit', 'attributes' => ['value' => 'Previous']]);
}

Форма 3

public function __construct($name = null)
{
parent::__construct($name);

$this->add(['name' => 'Form3Text1', 'type' => 'Text', 'options' => ['label' => 'Form 3 Text 1 : ']]);

$this->add(['name' => 'Form3Text2', 'type' => 'Text', 'options' => ['label' => 'Form 3 Text 2 : ']]);

$this->add(['name' => 'Previous', 'type' => 'Submit', 'attributes' => ['value' => 'Previous']]);
$this->add(['name' => 'Finalise', 'type' => 'Submit', 'attributes' => ['value' => 'Finalise']]);
}
0

Другие решения

Я не думаю, что я понимаю, что именно вы хотите,
но если вы имеете в виду несколько шагов с различной формой, так что вам нужно просто поставить
результат предыдущего шага в сеансе,

0

Ваш вопрос нечеткий. данная ссылка также сделана с помощью jquery! … Насколько я понимаю, вы хотите, чтобы поведение демо-страницы не использовалось с помощью js / jquery.

1. break this one form into three form. For easiness add a hidden field step
2. make next and back button input type submit
3. after submit in your action check submitted value and determine what you want ...[show next form or whatever]
0
По вопросам рекламы [email protected]