Показати форми у модальному вікні [закрито]


23

У мене є форма, і я використовую Drupal 7. Мені потрібно показувати цю форму у спливаючому вікні, коли користувач натискає посилання. Потім користувач повинен мати можливість заповнити форму, перебуваючи у спливаючому вікні. Я можу використовувати що-небудь на зразок Colorbox, модалі чи що завгодно. Мені просто хотілося дізнатись, який варіант кращий та які у мене варіанти для Drupal.

Відповіді:


11

Зараз я знаю 2 хороших варіанти: iframe (наприклад, у кольоровій коробці) та CTools. Який варіант використовувати, залежить від обставин. Я думаю, що ця інформація, яку я знайшов у файлі CTools modal.html, виявляє основну різницю:

CTools забезпечує простий модуль, який можна використовувати як спливаюче вікно для розміщення форм. Він відрізняється від звичайних модальних фреймворків тим, що не виконує свою роботу за допомогою iframe. Це і є перевагою, так і недоліком. Iframe просто перетворює звичайні сторінки в під-браузер, і вони можуть робити свою справу. Це робить його набагато простіше поставити довільні сторінки і форми в модальному. Однак, кадр iframe не дуже хороший у тому, щоб насправді повідомляти про зміни на головній сторінці, тому ви не можете відкрити модальний режим, дозволити йому виконати певну роботу, а потім змінити сторінку.

У мене немає особистого досвіду роботи з CTools з цього приводу, тому я не можу додати нічого іншого до цього, але я реалізував метод iframe в декількох проектах. У останньому я використовував плагін Colorbox, щоб показати кілька форм, створених за допомогою модуля Webform у спливаючому вікні . Я додам деякі приклади коду тут , в разі , якщо є якийсь - то інтерес.

Посилання на форму:

<a class="colorbox_form" href="'.url('node/5').'">'.t('Send message').'</a>

Javascript-код, щоб відкрити пов'язаний адреса в спливаючому вікні:

if ($('a.colorbox_form').length > 0) {
  var link = $("a.colorbox_form").attr('href');
  link = link.concat('?colorbox=true');
  // colorbox=true is attached for later use (read below).
  $("a.colorbox_form").attr('href', link);
  $("a.colorbox_form").colorbox({iframe:true, width:500, height:450});
}

У файлі шаблону теми:

function mytheme_preprocess_page(&$variables) {
  // Different template and additional stylsheet for colorbox content.
  if (isset($_GET['colorbox']) && $_GET['colorbox'] == TRUE) {
    $variables['theme_hook_suggestions'] = array('page__iframe'); // page--iframe.tpl.php
    drupal_add_css(path_to_theme() .'/iframe.css');
    $variables['styles'] = drupal_get_css();
  }
}

Я додав 'colorbox = true' до посилань за допомогою javascript, щоб користувачі з вимкненим JavaScript бачили форму із звичайним шаблоном. Шаблон IFrame має тільки ті повідомлення, заголовок і зміст друкованих.

Це вже працює, але я зіткнувся з проблемою із веб-формами: "colorbox = true" не було збережено, коли форму надсилали. Моя спроба виправити це:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if (isset($_GET['colorbox']) && $_GET['colorbox'] == TRUE) {
    // The id-s of the forms that are possibly shown within a popup.
    $form_ids = array('webform_client_form_2', 'webform_client_form_4');
    if (in_array($form_id, $form_ids)) {
      $form['#submit'][] = 'mymodule_webform_submit';
    }
  }
}

function mymodule_webform_submit(&$form, &$form_state) {
  //drupal_set_message('<pre>'.var_export($form_state['redirect'], TRUE).'</pre>');
  if (!isset($form_state['redirect'])) {
    $form_state['redirect'] = array($_GET['q'], array('query' => array('colorbox' => 'true')));
  }
  else {
    $form_state['redirect'][1]['query'] = array('colorbox' => 'true');
  }
}

8

Використовуйте CTools, які можуть вставити форму в модальний режим, коли користувач натискає посилання.

Перевірте наступний підручник: Вставте форму у спливаючу модуль разом із CTools та Drupal 7, що спрощує цей процес у кілька кроків.

В основному вам потрібно визначити hook_menu()зворотний виклик для модальної форми:

$items['mymodule/%ctools_js'] = array(
  'page callback' => 'mymodule_callback',
  'page arguments' => array(1),
  'access callback' => TRUE,
  'type' => MENU_CALLBACK,
);

потім створити генератор посилання, яка повертає HTML-код:

/**
 * Helper function to make a link.
 */
function _mymodule_make_link($link_text = '') {
  // Set a default value if no text in supplied.
  if (empty($link_text)) {
    $link_text = 'Magical Modal';
  }

  return '<div id="magical-modal-link">' . l($link_text, 'mymodule/nojs', array('attributes' => array('class' => 'ctools-use-modal'))) . '</div>';
}

так що вона може бути використана у вашій сторінці зворотного виклику, наприклад:

/**
 * An example page.
 */
function mymodule_page() {
  // Load the modal library and add the modal javascript.
  ctools_include('modal');
  ctools_modal_add_js();
  return _mymodule_make_link('Magical modal');
}

Коли користувач натискає на посилання, він робить запит або на /mymodule/ajaxабо /mymodule/nojs(в разі nojs), тому такі ручки зворотного виклику створити модальное:

/**
 * Ajax menu callback.
 */
function mymodule_callback($ajax) {
  if ($ajax) {
    ctools_include('ajax');
    ctools_include('modal');

    $form_state = array(
      'ajax' => TRUE,
      'title' => t('MyModule Modal Form'),
    );

    // Use ctools to generate ajax instructions for the browser to create
    // a form in a modal popup.
    $output = ctools_modal_form_wrapper('mymodule_form', $form_state);

    // If the form has been submitted, there may be additional instructions
    // such as dismissing the modal popup.
    if (!empty($form_state['ajax_commands'])) {
      $output = $form_state['ajax_commands'];
    }

    // Return the ajax instructions to the browser via ajax_render().
    print ajax_render($output);
    drupal_exit();
  }
  else {
    return drupal_get_form('mymodule_form');
  }
} 

Тепер вам просто потрібно створити форму та її обробник подачі, як показано нижче:

/**
 * Drupal form to be put in a modal.
 */
function mymodule_form($form, $form_state) {
  $form = array();

  $form['new_link_text'] = array(
    '#type' => 'textfield',
    '#title' => t('Link text'),
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );

  return $form;
}

/**
 * Drupal form submit handler.
 */
function mymodule_form_submit(&$form, &$form_state) {
  // Generate the new link using the submitted text value.
  $link = _mymodule_make_link($form_state['values']['new_link_text']);

  // Tell the browser to close the modal.
  $form_state['ajax_commands'][] = ctools_modal_command_dismiss();

  // Tell the browser to replace the old link with the new one.
  $form_state['ajax_commands'][] = ajax_command_replace('#magical-modal-link', $link);
}

Щоб перевірити це, перейдіть до: /mymodule/pageтам, де ви побачите посилання "Чарівний модуль", яке повинно відображати модальну форму після натискання.


6

Я б почав дивитись на Модальну форму , а не на Colorbox. Це спеціально існує, тому що використання Colorbox з формами працює дуже погано.

У модальній формі Ctools виконує всю роботу у фоновому режимі, яка має належну підтримку для обробки форми, яка просто не належить до Colorbox. Це також означає , що якщо вам потрібно «модальний» підтримуються форми , то ви завжди знаєте , що завдяки CTools є тверде API за тим , що ви можете перейти на замість.

Бонусні бали за подачу патча з підтримкою нової форми, якщо ви пишете його. ;)


Я не погоджуюся з рекомендацією Модальної форми або, принаймні, додаю кваліфікатор - вона працює лише за допомогою входу, запиту пароля, створення нових облікових записів та форм контактів за замовчуванням, і вони жорстко кодуються. Наразі ви не можете використовувати його у довільних формах. Найкраще, на даний момент, може бути реалізація модальних форм за допомогою спеціального модуля, використовуючи API модального вікна ctools, використовуючи modal_forms як модель.
— BrianV

Я оновив свою відповідь, щоб важити більше уваги до частини Ctools, хоча якщо модальна форма сама по собі вирішує проблему, ще краще.
— Летаріон

Відряджений. Сторінка модуля Colorbox рекомендує також не використовувати для цього Colorbox; підтримку цієї функції було видалено із серії 2.x Colorbox.
— Патрік Кенні

2

Я вважаю, що Простий діалог - це чудовий спосіб надання форм у Модалі. Він має перевагу у використанні інтерфейсу jQuery, який є в основі.

Все, що вам потрібно зробити - це надати посилання на форму з деякою додатковою інформацією. Я робив це двома способами:

  1. Модуль "Атрибути " меню, щоб забезпечити необхідні теги відносних і класних.
  2. topic_menu_link для зміни функції візуалізації посилань у меню.

Привіт. Чи можете ви трохи розширити свою відповідь? Для чого потрібні теги rel та class? Де їх можна встановити, якщо вони застосовуються?
— Молот

@Queenvictoria, чи можете ви надати приклад того, як відкрити форму у спливаючому вікні за допомогою модуля простого діалогу?
— АРУН

2

Вам потрібний модуль https://drupal.org/project/popup_forms , але для його застосування потрібно виконати деяке програмування (тобто його неможливо просто налаштувати через адміністраторський інтерфейс).


Але модуль не має стабільного випуску.
— Mathankumar

Випуск розробника працює чудово.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.