Вы здесь

Как добавить AJAX форме, выведенной с помощью модуля contact_block?

0

Вывожу форму в блоке с помощью contact_block.
Очень хочу чтобы это было на AJAX но не могу нагуглить никаких простых решений для этого.

Версия Drupal: 
8.x
Категория: 
AJAXForm API
Связанные проекты: 
Contact Block
Вопрос задан 29.03.2016 - 13:47

Ответы

0

Положу сюда свой говнокод, вдруг кому поможет.

  $ВКЛЮЧИСЬ-ПХП-ПОДСВЕТКА!; // Это файл модуль.module
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\CssCommand;
use Drupal\Core\Ajax\HtmlCommand;
use Drupal\Core\Ajax\ChangedCommand;
use Drupal\Core\Ajax\ReplaceCommand;
use Drupal\Core\Ajax\InvokeCommand;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
function модуль_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  // Preview
  if($form_id == 'contact_message_callback_form'){
    //dsm($form_id);
    $lp_form_key = rand(100000, 999999);

    $form['#prefix'] = '<div id="lp-form-wrapper-'.$lp_form_key.'">';
    $form['#suffix'] = '<div id="err-message-'.$lp_form_key.'"></div></div>';
    $form['actions']['preview']['#access'] = FALSE;
    $form['actions']['submit']['#ajax'] = array(
      'callback' => '_модуль_form_submit',
      'effect' => 'fade',
      'progress' => array(
        'type' => 'throbber',
        'message' => "Отправляем",
      ),
    );
    $form['lp-form-key'] = array( //Мастер костылей - начало
      '#type' => 'hidden',
      '#value' => $lp_form_key,
      '#name' => 'lp-form-key',
    ); 
  }
}
function _модуль_form_submit(&$form,  FormStateInterface $form_state) {
  $response = new AjaxResponse();
  $phone = $form['field_form_phone']['widget'][0]['value']['#value'];
  $form_token_val = $form['#token']['#default_value'];
  $lp_form_key = $_POST['lp-form-key']; //Мастер костылей - продолжение

  if($phone){
    $otvet = '<p class="f-ok">Спасибо, ваше сообщение получено.</p>';
    $comand = new ReplaceCommand('#lp-form-wrapper-'.$lp_form_key,$otvet);
    $response->addCommand($comand);            
  }else{
    $css = array('border' => '1px solid red');
    $message = t('Укажите телефон');
    $response->addCommand(new CssCommand('#err-message-'.$lp_form_key, $css));
    $response->addCommand(new HtmlCommand('#err-message-'.$lp_form_key, $message));
  }
  return $response;
}

lp-form-key - нужна для того, чтобы вставить форму много раз на странице (лендинг). Как это описано тут http://niklan.net/blog/80

$ВКЛЮЧИСЬ-ПХП-ПОДСВЕТКА!; // Это файл тема.theme
function тема_preprocess_page(&$variables) {
  $form_name = 'callback';
  $variables['lp_form']   =  _adaptive_get_form($form_name);
  $variables['lp_form_2'] =  _adaptive_get_form($form_name);
  $variables['lp_form_3'] =  _adaptive_get_form($form_name);
  $variables['lp_form_4'] =  _adaptive_get_form($form_name);
  $variables['lp_form_5'] =  _adaptive_get_form($form_name);
}
function _тема_get_form($form_name = 'callback', $button = 'Заказать'){
  $entity = \Drupal::entityManager()
    ->getStorage('contact_form')
    ->load($form_name);
  $message = \Drupal::entityManager()
    ->getStorage('contact_message')
    ->create(array(
      'contact_form' => $entity->id(),
  ));
  //dsm($message);
  //use Drupal\Core\Entity\EntityFormBuilder;
  $form = \Drupal::service('entity.form_builder')->getForm($message);
  $form['actions']['submit']['#value'] = $button;
  return $form;
}
Ответ дан 30.03.2016 - 17:39
0

Надо самостоятельно прикрутить к форме AJAX. Документация, пример.

Ответ дан 29.03.2016 - 23:54
Аватар пользователя xandeadx
xandeadx
1541

AJAX прикрутил, но не могу понять одну вещь: что нужно полжить в колбек

ajax' => array(
  'callback' => 'Что сюда положить?',
Комментарий оставлен 30.03.2016 - 08:59

Функцию, которая выполнится при наступлении события.

Комментарий оставлен 30.03.2016 - 09:33
0

и можно посмотреть в модуле examples директории ajax_example и form_example
код прокомментирован

Ответ дан 30.03.2016 - 00:17