Answers:
我目前知道2个不错的选择:iframe(例如在colorbox中)和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();
}
}
我使用javascript将'colorbox = true'附加到链接上,以便关闭javascript的用户将看到带有普通模板的表格。iframe模板仅打印消息,标题和内容。
这已经可以工作,但是我遇到了Webforms的问题:提交表单时未保留'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');
}
}
使用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
您应该看到“ Magical Modal”链接,该链接应在单击后向您显示模态形式。
我将开始查看Modal form,而不是Colorbox。它特别存在是因为将Colorbox与表单一起使用确实很糟糕。
在模式形式下,Ctools在后台完成所有工作,它对表单处理提供了适当的支持,而这种处理不属于Colorbox。这也意味着,如果您需要“模式化”不受支持的表单,那么您始终知道,由于使用了Ctools,它背后有一个可靠的API,您可以改为使用它。
如果编写了带有新表格支持的补丁,则可以得到加分。;)
我发现“ 简单对话框”是在Modals中提供表单的好方法。它具有使用核心jQuery UI的优势。
您所需要做的就是提供带有一些其他信息的表单链接。它提供了一个基于类和rel标记的简单方法,或者是一个主题方法,用于更精细的控制。我已经通过两种方式做到这一点:
您需要的模块是https://drupal.org/project/popup_forms,但是您需要进行一些编程才能应用它(即不能仅通过管理界面对其进行配置)。