Вы здесь

Как сохранить переменную между ajax запросами формы?

0

Допустим, есть форма, у которой есть несколько элементов, имеющих ajax-callback - функции.
То есть, используется Form API + Ajax Framework.
И есть некая переменная, значение которой изменяется внутри callback-функций.
Вот где и как эту переменную хранить, чтобы её значение не терялось после завершения работы callback-функции ?
Какое, на ваш взгляд, наиболее оптимальное решение для этого ?

P.S. Вот пример кода, в котором предполагается, что значение переменной $i будет наращиваться каждый раз при нажатии кнопки. Но, естественно, этого не происходит. Вот каким средством лучше всего воспользоваться для сохранения значений переменной ?

class MyForm extends FormBase {
    public $i = 0;

public function buildForm(array $form, FormStateInterface $form_state){
    ...
    $form['add_more'] = [
        '#type' => 'submit',
        '#value' => 'Add More ...',
        '#ajax' => [
            'callback' => '::addMore',
        ]
    ];
    ...
}

public function addMore(array &$form, FormStateInterface $form_state){
    ...
    $this->i++;
    ...
}
}
Версия Drupal: 
8.x
Категория: 
AJAXForm API
Вопрос задан 27.08.2017 - 19:44

Ответы

0

Приблизительно так:

public function buildForm(array $form, FormStateInterface $form_state){
    $iterator = $form_state->get('my_iterator');
    if (!isset($iterator)) {
        $iterator = 0;
        $form_state->set('my_iterator', $iterator);
    }

    ...
}

public function addMore(array &$form, FormStateInterface $form_state){
    $iterator = $form_state->get('my_iterator') + 1;
    $form_state->set('my_iterator', $iterator);
    $form_state->setRebuild();
}

ЗЫ - посмотри модуль Examples - там есть такой пример.

Ответ дан 27.08.2017 - 23:16

Вот, к сожалению, не работает.
Даже пример работы через buildForm не работает, ниже код.

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;

class TestForm extends FormBase {

    public function buildForm(array $form, FormStateInterface $form_state){

        $form['counter'] = [
            '#type' => 'markup',
            '#markup' => $form_state->getValue('elem') ?? 1,
        ];

        $form['btn'] = [
            '#type' => 'submit',
            '#value' => 'Btn',
            '#ajax' => [
                'callback' => '::addMore',
            ]
        ];

        $i = $form_state->get('elem') ? $form_state->get('elem') : 1;
        $trigger = $form_state->getTriggeringElement();

        if (isset($trigger['#ajax']['callback']) && $trigger['#ajax']['callback'] === '::addMore') {
            $i++;
        }
        $form_state->set('elem', $i);

        return $form;
    }

    public function getFormId(){
        return 'test_form';
    }

    public function submitForm(array &$form, FormStateInterface $form_state){

    }

    public function addMore(array &$form, FormStateInterface $form_state){
        return $form;
    }
}
Комментарий оставлен 28.08.2017 - 08:56
-2

$_SESSION

Ответ дан 28.08.2017 - 09:01

Можете привести пример работающего кода для Drupal 8, где бы переменная сохранялась через сессию ?

Комментарий оставлен 28.08.2017 - 16:47

В принципе, мне уже удалось решить эту проблему.
Сохранение нужно делать внутри функции buildForm()

Комментарий оставлен 02.09.2017 - 10:39