Вы здесь

Добавить строчку текста в ctools модальное окно с Webform

1

Вывожу webform в модальном окне с помощью ctools. Сделал для этого модуль. И никак не могу понять как из этого модуля добавить произвольный текст, пару строчек выше полей формы.

function ctoolspopups_menu() {
   $items['wfcart/%ctools_js/%'] = array(
       'title' => '',
       'page arguments' => array(1, 2),
       'access callback' => TRUE,
       'page callback' => 'ctoolspopups_webform_callback',
       'type' => MENU_CALLBACK,
   );
   return $items;
}

function ctoolspopups_webform_callback($js = NULL, $tovar_nid) {
  $wf_nid = 65;
  $tovar = node_load($tovar_nid);
  $webFormNode = node_load($wf_nid);

  if (!$js) {
    return drupal_get_form('webform_client_form_'.$wf_nid, $webFormNode, FALSE);
  }

  $form_state = array(
    'title' => $webFormNode->title,
    'ajax' => TRUE,
  );
  // Sending the necessary parameters to the webform.
  $form_state['build_info']['args'] = array($webFormNode, FALSE);

  $form_state += array(
    'rebuild' => FALSE,
    're_render' => FALSE,
    'no_redirect' => !empty($form_state['ajax']),
  );

  $form_state['build_info']['args'][0]->webform['components'][7]['value'] = $tovar->nid; //ID товара
  $form_state['build_info']['args'][0]->webform['components'][8]['value'] = $tovar->title; //Наименование
  $form_state['build_info']['args'][0]->webform['components'][9]['value'] = $tovar->field_prdisp_cena[LANGUAGE_NONE][0]['value']; //цена

  // Outputting the webform in the popup.
  ctools_include('modal');
    //ctools_include('ajax');

  $output = ctools_modal_form_wrapper('webform_client_form_'.$wf_nid, $form_state);

  //так не работает
  $output['form_id']['#markup'] = '<div class="wfcart-tovar-title">'.$tovar->title.'</div>';

  print ajax_render($output);
  drupal_exit();
}
Версия Drupal: 
7.x
Категория: 
AJAX
Вопрос задан 21.01.2016 - 17:41

Добавте пример кода в свой вопрос, чтобы люди поняли как именно вы выводите форму в модальном окне.

Комментарий оставлен 21.01.2016 - 17:51

В $output попадает список ajax-команд, а не форма. Сделайте:

drupal_set_message('<pre>debug:' . check_plain(print_r($output, 1)) . '</pre>');

и посмотрите, какая у вас структура $output.

Комментарий оставлен 21.01.2016 - 20:33
debug:Array
(
    [0] => Array
        (
            [command] => modal_display
            [title] => Оформление заявки
            [output] => <form class="webform-client-form webform-client-form-65 webform-client-form-65" enctype="multipart/form-data" action="/wfcart/ajax/48" method="post" id="webform-client-form-65" accept-charset="UTF-8"><div><div  class="form-item webform-component webform-component-hidden webform-component--id-tovara" style="display: none">
 <input type="hidden" name="submitted[id_tovara]" value="48" />

</div>
<div  class="form-item webform-component webform-component-hidden webform-component--naimenovanie-tovara" style="display: none">
 <input type="hidden" name="submitted[naimenovanie_tovara]" value="48254028.09" />

</div>
<div  class="form-item webform-component webform-component-hidden webform-component--cena-tovara" style="display: none">
 <input type="hidden" name="submitted[cena_tovara]" value="Quadrum" />

</div>
<div  class="form-item webform-component webform-component-textfield webform-component--kolichestvo-tovara">
  <label for="edit-submitted-kolichestvo-tovara">Количество товара </label>
 <input type="text" id="edit-submitted-kolichestvo-tovara" name="submitted[kolichestvo_tovara]" value="" size="60" maxlength="128" class="form-text" />
</div>
<div  class="form-item webform-component webform-component-textfield webform-component--vash-telefon">
  <label for="edit-submitted-vash-telefon">Ваш телефон </label>
 <input type="text" id="edit-submitted-vash-telefon" name="submitted[vash_telefon]" value="" size="60" maxlength="128" class="form-text" />
</div>
<input type="hidden" name="details[sid]" />
<input type="hidden" name="details[page_num]" value="1" />
<input type="hidden" name="details[page_count]" value="1" />
<input type="hidden" name="details[finished]" value="0" />
<input type="hidden" name="form_build_id" value="form-j-sZ7q5u7lEgEqpoxZtVcT6gjPTxjVnnRsoyZkqXKP4" />
<input type="hidden" name="form_token" value="geKhB0AbVxZgBcsaJG705Hg9wMCrhu_dpXKHPRoIuXo" />
<input type="hidden" name="form_id" value="webform_client_form_65" />
<div class="form-actions"><input class="webform-submit button-primary form-submit" type="submit" name="op" value="Отправить заявку" /></div></div></form>
        )

)
Комментарий оставлен 21.01.2016 - 21:21

это уже отрендеренная форма получается

Комментарий оставлен 21.01.2016 - 21:22

Ответы

0

Можно попробовать так:
1. В самой форме вставляйте поле markup.
2. Используйте ajax_command_before:
После строчки

$output = ctools_modal_form_wrapper('webform_client_form_'.$wf_nid, $form_state); 

добавляете:

$output .= ajax_command_before($selector, $html, $settings = NULL);

где $selector - class или id формы. $html - что нужно вставить

А вообще тут хорошая статья по работе с модальными окнами http://www.drupaler.by/lessons/ctool-modal-api-rabota-s-modalnymi-oknami

Ответ дан 21.01.2016 - 22:56
Аватар пользователя shu
shu
176

Работает, спасибо!
Я взял прям отсюда http://www.drupaler.by/lessons/kak-vyvesti-webform-v-popape пример, и добавил строчку:

$html = '<div class="wfcart-tovar-title">'.'text'.'</div>';
$commands[] = ajax_command_before('.webform-client-form-65', $html, $settings = NULL);

Ну и надпись появилась :)

Комментарий оставлен 24.01.2016 - 21:34

Можете поставить галочку, что ответ правильный. Тогда и мне баллы добавятся и вопрос пометится как решённый. :)

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

Остановился на варианте с hook_form_alter, он будет работать в случае если js отключен.

Комментарий оставлен 02.02.2016 - 20:29
0

Добавьте #markup-элемент с помощью hook_form_alter .

Ответ дан 23.01.2016 - 14:33

блин, гениально же! :) Действительно работает!

function example_form_webform_client_form_65_alter(&$form, &$form_state) {
  $form['tovar_title'] = array(
   '#markup' => 'test tovar title',
   '#weight' => -50,
  );
 }

но надпись появляется ниже всех полей, над кнопкой "отправить". А мне бы выше полей её поднять. '#weight' => -50 не помогает. Как тут быть?

Комментарий оставлен 24.01.2016 - 21:26

Скорее всего дело в свойстве #weight или вашей верстке. Проверьте стили и веса остальных элементов формы. Также может быть проблема в специфической сортировке элементов вебформы, в таком случае можно сымитировать свойство, отвечающее за сортировку элементов вебформы.

Комментарий оставлен 25.01.2016 - 13:55

Разобрался! Чтобы свойство #weight работало, элемент tovar_title должен быть на одном уровне с другими элементами формы, т.е. внутри элемента submitted. Т.е. вот так:

  $form['submitted']['tovar_title'] = array(
   '#markup' => 'test tovar title',
   '#weight' => -50,
  );

обсуждалось здесь https://www.drupal.org/node/235354

Комментарий оставлен 25.01.2016 - 21:51
0

А пропробуйте написать так:

$output['form_id']['webform_client_form_65']['#markup'] = '<div class="wfcart-tovar-title">'.$tovar->title.'</div>';
Ответ дан 21.01.2016 - 18:22
$output['test']['#markup'] = '<div class="wfcart-tovar-title">'.$tovar->title.'</div>';

и так не работает

Комментарий оставлен 21.01.2016 - 19:54
0

Тупо в webform сверху вставляем поле БАААЛЬШОЙ ТЕКСТ
Всё остальное - стилями

Ответ дан 21.01.2016 - 22:02
Аватар пользователя Pavel
Pavel
-47
0

в tools есть help файлы.

Ответ дан 22.01.2016 - 11:41
0

А если вот так попробовать:

<?php
$my_text = '<div class="wfcart-tovar-title">'.$tovar->title.'</div>';
$output[0]['output'] = $my_text . $output[0]['output'];
Ответ дан 22.01.2016 - 12:45