Вы здесь

В чем разница между объявлением ajax-callback функции с $this и без него ?

0

Добрый день.

Допустим, есть форма с поддержкой Ajax Framework.
И есть некий элемент, который имеет callback-функцию с именем myFunction, которая также является public-методом формы .

Её можно задать вот так.

'callback' => [$this, 'myFunction']

А можно задать и вот так

'callback' =>  '::myFunction'

Вот объясните, пожалуйста, в чем функциональная разница между этими объявлениями ?

Версия Drupal: 
8.x
Категория: 
AJAXForm API
Вопрос задан 28.08.2017 - 20:54

Ответы

0
Ответ дан 28.08.2017 - 21:05
Аватар пользователя xandeadx
xandeadx
1461

Вот, к сожалению, в процессе работы над этой проблемой разницу я увидел.

В этом случае значение 'element_start' почему-то не наращивается.

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

        $i = $form_state->get('element_start') ?? 0;
        $i++;
        $form_state->set('element_start', $i);

        $form['es_wrapper'] = [
            '#type' => 'container',
            '#attributes' => [
                'id' => 'es-wrapper'
            ]
        ];

        $form['es_wrapper']['es'] = [
            '#type' => 'markup',
            '#markup' => $form_state->get('element_start') ?? 0,
        ];

           $form['add_more'] = [
                '#type' => 'button',
                '#value' =>  'Еще ...',
                '#ajax' => [
                    'callback' => '::addMore',
                    'event' => 'mouseup',
                    'progress' => [
                        'type' => 'none',
                    ]
                ]
            ];

        $form_state->setCached(FALSE);
        return $form;
    }

    public function addMore(array &$form, FormStateInterface $form_state){
        $ajax_responce = new AjaxResponse();
        $ajax_responce->addCommand(new HtmlCommand('#es-wrapper', Ajax::preRenderAjaxForm($form['es_wrapper']['es'])));
        return $ajax_responce;
    }

А вот если заменить на

'callback' => [$this, 'addMore'],

в этом случае работает.

Хотя, если этот каллбэк навесить на элемент select или checkbox, работает и так, и так ...

Комментарий оставлен 28.08.2017 - 21:42
-2

Смотрите примеры для ajax в https://www.drupal.org/project/examples съэкономите много времени

Ответ дан 31.08.2017 - 08:55

Смотрю постоянно, но для моих вопросов уже тех примеров недостаточно.

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

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

Комментарий оставлен 01.09.2017 - 08:11