Cakephp: Как сохранить форму заполненной при временном переходе в другую форму?

в cakephp 2.3:

Предположим, у меня есть форма, сгенерированная controllerX. Начинаю заполнять данные, а где-то есть кнопка для выполнения какой-то задачи, которая откроет новую форму (модальное окно), сгенерированную controllerY для ModelY. Всякий раз, когда я заканчиваю вторую форму, я теряю все, что заполнил в первой форме. Я пробовал несколько вещей, включая перенаправление на $this->referrer(), но все не работает.

Спасибо

Обновление 1) Я добавляю фрагмент кода: Примечание. Я использую twitter bootstrap. Ниже код из «нарушения» добавить вид. Внутри этой формы я хочу, чтобы пользователь мог добавить новую организацию.

<script type="text/javascript">

        /****** helper functions *******/
    function onClickAddOrgLink() {
        $('#myModal').modal();
    }

</script>

<?php
echo $this->Form->create();
echo $this->Form->input('number');
echo $this->Form->input('organization_id');
//Add new organization button
echo '<a id="addOrgLink" href="#myModal" role="button" class="btn" data-toggle="modal">Add new Org</a>';
$this->Js->get('#addOrgLink')->event('click', 'onClickAddOrgLink()');

echo $this->Form->input('remarks', array('type'=>'textarea','rows'=>'6'));
echo $this->Form->end(array('class'=>'btn btn-primary', 'div'=>false,'name'=>'submit', 'label' => 'add'));
?>
<!-- Modal -->
<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h3 id="myModalLabel">adding a new org</h3>
    </div>
    <div class="modal-body">
        <p>
            <?php
            echo $this->Form->create('Organization', array('controller'=>'organizations', 'action'=>'add'));
            echo $this->Form->input('company_name', array('div'=>false));
            echo $this->Form->input('address1', array('div'=>false));

            echo '  <div class="modal-footer">
                    <button class="btn" data-dismiss="modal" aria-hidden="true">cancel</button>&nbsp;&nbsp;';
            echo $this->Form->end(array('class'=>'btn btn-primary', 'div'=>false, 'name'=>'submit', 'label' => 'ADD'));
            echo '</div>';
            ?>
        </p>
    </div>
</div>

Вот добавить новое действие организации:

var $helpers=array('Session', 'Js', 'Html');

    public function add() {
        $this->autoRender=false;
        $this->Organization->create();
        $this->Organization->save($this->request->data);
        $this->redirect($this->referer());
    }

person Miracle    schedule 03.04.2013    source источник


Ответы (1)


Не «полный» ответ, а некоторые предложения, которые могут помочь в реализации решения;

вариант 1 - Автосохранение (черновик)

Реализовать autosave; на любой странице, содержащей форму, добавьте JavaScript, который отправляет форму (через AJAX) обработчику автосохранения на стороне сервера с определенным интервалом (например, каждые xx секунд) или, когда пользователь уходит для страница.

Обработчик на стороне сервера сохраняет отправленные данные внутри сеанса, используя URL-адрес страницы в качестве «идентификатора» (например, /Users/edit/123). При возврате на страницу проверьте, присутствует ли черновик (автосохранение) в сеансе, и используйте эту информацию для заполнения данных запроса;

public function beforeRender() {
    if (!$this->request->is('post')) {
        // restore autosave data for the current url if no form is posted
        $this->request->data = $this->AutosaveComponent->restore($this->request->here);
    } else {
        // form is posted; flush the autosave data for the current URL
        $this->AutosaveComponent->flush($this->request->here);
    }
}

Вариант 2 - лайтбокс

Другой вариант — открыть «прерывающую» форму в лайтбоксе; форма, над которой в данный момент ведется работа, останется открытой, и отправка формы лайтбокса не прервет ее.

обновление - некоторые предложения

По сути, вы пытаетесь достичь;

  • пользователь выбирает организацию, вводит примечания и отправляет форму
  • если организация еще не существует, разрешите пользователю добавить новую организацию через модальное/всплывающее окно. Выберите эту организацию после добавления ее через Модальное окно, введите примечания и заполните форму.

Используйте AJAX для отправки модального окна

В настоящее время ваши модальные окна будут отправляться через «обычную» отправку, а не через AJAX, поэтому страница будет перезагружена после отправки модального окна.

Вы должны отправить модальное поле через AJAX, а затем добавить вновь созданную организацию в раскрывающийся список, используя обработчик завершения AJAX.

Однако, поскольку вам также придется отображать ошибки проверки для организации внутри модального окна, может быть лучше загрузить форму «добавить организацию» через AJAX как Что ж.

Все это потребует некоторых изменений в вашем коде и дополнительного JavaScript для выполнения обработки AJAX.

Создайте новую организацию и одновременно отправьте примечание

По сути, объедините обе формы в одну форму;

  • По умолчанию поля ввода для «Организации» скрыты.
  • Если пользователь выбирает существующую организацию из раскрывающегося списка, поля «Организация» остаются скрытыми.
  • Если пользователь выбирает «другая организация...» из раскрывающегося списка, поля «Организация» становятся видимыми, и пользователь может ввести данные для новой организации.

После отправки формы:

  • если пользователь выбрал «другую организацию...», вставьте новую организацию и вставьте «примечание», используя «идентификатор» новой организации.
  • если пользователь выбрал существующую организацию, вставьте только примечание.
person thaJeztah    schedule 03.04.2013
comment
Я уже упоминал, что использую модальное окно (т.е. всплывающее окно). Однако это тоже не работает - person Miracle; 06.04.2013
comment
Но после этого вы перенаправляете первую/исходную страницу? Почему? - person thaJeztah; 06.04.2013
comment
Я обновил исходный пост. Не могли бы вы взглянуть на это? - person Miracle; 06.04.2013
comment
Спасибо, я думаю, понятно, чего вы пытаетесь достичь. Не думаю, что я смогу предоставить полное решение в контексте StackOverflow, но я попытаюсь добавить некоторые «указатели» к своему ответу. - person thaJeztah; 06.04.2013
comment
Большое спасибо за объяснение. Я ценю вашу помощь. - person Miracle; 06.04.2013
comment
Надеюсь, ты сможешь добиться того, чего хочешь. Удачи! - person thaJeztah; 06.04.2013