- accordion(1)
- active-trail(1)
- ajax(1)
- angular(1)
- apache(3)
- bash(4)
- block(2)
- browsers(1)
- button styles(1)
- checkboxes(1)
- code key(1)
- compress(1)
- console(4)
- css(1)
- ctools(1)
- date(1)
- db_query(2)
- db_select(2)
- debian(1)
- dom function(1)
- drag and drop(1)
- drupal 6(3)
- drupal 7(3)
- drupal functions(6)
- drupal_goto()(1)
- drupal_mail(1)
- errors(1)
- eslint(1)
- fancybox(1)
- fedora(1)
- firefox(2)
- firefox addons(1)
- firefox profiles(1)
- form(1)
- form api(5)
- format_date(1)
- git(1)
- hooks(2)
- hook_mail(1)
- hook_theme(1)
- hotkey(1)
- httpd(1)
- husky(1)
- ie(2)
- javascript(2)
- jquery(7)
- jquery plugin(2)
- jquery regex(1)
- js templates(1)
- kb(1)
- like button(1)
- link(1)
- linux(4)
- linux commands(2)
- list(1)
- list styles(1)
- markup(1)
- menu(3)
- mobile(1)
- modal(2)
- module develop(2)
- modules(1)
- monorepo(1)
- mootools(1)
- mysql(2)
- node_save(1)
- opacity(1)
- opensuse(5)
- opera mini(1)
- padStart(1)
- page.tpl.php(1)
- password hash(1)
- patch(1)
- pdf(1)
- python(1)
- radiobuttons(1)
- reg_ex(2)
- sass(1)
- scripts(1)
- search form(1)
- selenium(1)
- share button(1)
- sms(1)
- ssh(2)
- styles(4)
- switch case(1)
- table style(1)
- tar(1)
- taxonomy(1)
- taxonomy menu(1)
- templates(1)
- theme(4)
- toggle(2)
- touchpad(1)
- tray(1)
- trigger(1)
- typescript(2)
- typescript-eslint(1)
- ubuntu(3)
- usefull function(1)
- views(1)
- virtual hosts(2)
- virtualbox(2)
- vmware(1)
- webdriver(1)
- youtube(1)
- кроссбраузерность(1)
Ctools форма в модальном окне
И так детки сегодня я расскажу как сделать форму в модальном окне с помощью ctools.
Для простоты будем выводить форму логина в модальном окне.
Для начало создадим info файл для нашего модуля (ul_modal.info):
;; название модуля
name = User Form Modal
;; описание
description = User Form in modal
;;
package = J Custom Modules
;; версия ядра
core = 7.x
;; зависимость
dependencies[] = user
dependencies[] = ctools
;; файлы модуля
files[] = ul_modal.module
;; версия модуля
version = "7.x-dev"
Далее начнем писать основную часть (ul_modal.module). Для начало нам нужно зарегистрировать адрес в меню для нашей формы:
* hook_menu()
*/
function ul_modal_menu() {
$items = array();
$items['ul_modal/%ctools_js'] = array (
'page callback' => 'ul_modal_ctools_form',
'page arguments' => array(1),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
Ничего особенного здесь нет, не буду уходить в подробности. Далее напишем коллбэк ul_modal_ctools_form:
//проверяем запрос от js или нет, если нет рендерим форму на странице
return drupal_get_form('user_login');
}
//подключаем ctools скрипты
ctools_include('modal');
ctools_include('ajax');
ctools_modal_add_js();
ctools_add_js("ajax-responder");
//прописываем нужные параметры нашей форме
$form_state = array(
'title' => t('User login'),
'ajax' => TRUE,
);
//получаем форму форму для вывода через drupal ajax
$commands = ctools_modal_form_wrapper('user_login', $form_state);
//если форма успешно отправлена
if (!empty($form_state['executed'])) {
// We'll just overwrite the form output if it was successful.
$commands = array();
//сообщение об успешной отправке (тайтл, сообщение)
$commands[] = ctools_modal_command_display(t("Sending form"), "Вхожу...");
//грубо говоря закрываем форму
$commands[] = ctools_ajax_command_reload();
}
//выводим все в json для ajax
print ajax_render($commands);
exit;
}
Следующем шагом будет подключение необходимых скриптов на сайте, для этого обычно используется хук init. Наверное будет правильно не подключать скрипты если мы залогинины, так что добавим проверку:
* Add js to page
*
*/
function ul_modal_init() {
//проверяем залогинины или нет, если да то выходим
global $user;
if ($user->uid != '0') {
return ;
}
//подключаем скрипты
// Include the CTools tools that we need.
ctools_include('modal');
ctools_include('ajax');
// Add CTools' javascript to the page.
ctools_modal_add_js();
ctools_add_js('ajax-responder');
//создаем настройки темы
// Create our own javascript that will be used to theme a modal.
$modal_style = array(
'ul_modal' => array(
//можно сделать фиксированный размер окно
/*'modalSize' => array(
'type' => 'fixed',
'width' => 500,
'height' => 300,
),*/
'modalOptions' => array(
'opacity' => .5,
'background-color' => '#000',
),
'animation' => 'fadeIn',
//название нашей темы
'modalTheme' => 'CToolsULModal',
//прописываем картинку и тайтл окна для прелоода
'throbber' => theme('image', array('path' => ctools_image_path('ajax-loader.gif', 'ul_modal'), 'alt' => t('Loading...'), 'title' => t('Loading'))),
),
);
//подключаем настройки темы
drupal_add_js($modal_style, 'setting');
//подключаем наш js
ctools_add_js('ul_modal', 'ul_modal');
//подключаем наш css
ctools_add_css('ul_modal', 'ul_modal');
}
Здесь стоит обратить внимание на несколько моментов, при подключение скриптов/стилей через функции ctools_add_js()/ctools_add_css() не нужно прописывать путь до них просто первым параметром пишем название модуля, вторым имя файла, и третьем, название папки с файлами, если они отключаются от дефолтных js/css. Про ctools_image_path() аналогично.
Создадим шаблон нашего модального окна, файл ul_modal.js и положим его в папочку js с нашим модулем :
* Provide the HTML to create the modal dialog.
*/
//прошу обратить внимание, в конце название переменной - название нашей темы
Drupal.theme.prototype.CToolsULModal = function () {
var html = '';
//необходимая часть
html += '<div id="ctools-modal">';
//тут наш html
html += ' <div id="ul_modal-block" class="ul_modal-block ">';
//тут вставляется тайтл оставляем без изменений
html += ' <span id="modal-title" class="modal-title"></span>';
//кнопка закрытия окна
html += ' <span class="popups-close"><a class="close" href="#"></a></span>';
//тут наш html
html += ' <div class="clear-block"></div>';
//далее выводиться контент
html += ' <div class="popups-container">';
html += ' <div class="modal-scroll"><div id="modal-content" class="modal-content popups-body"></div></div>';
html += ' </div>';
//тут наш html
html += ' <div class="clearboth"></div>';
html += ' </div>';
html += '</div>';
return html;
}
Этот шаблончик можно переделывать как душе угодно главное оставить блоки с нужными id для вставки контента (ctools-modal, modal-title, modal-content ...)
Практически все готово, осталось вывести ссылку на нашу форму, для простоты будем выводить в блоке:
$blocks['ul_modal'] = array(
'info' => 'User Login Block Link',
'cache' => DRUPAL_NO_CACHE,
);
return $blocks;
}
function ul_modal_block_view($delta = '') {
if ($delta == 'ul_modal') {
//выводим ссылку, параметры: название ссылки, путь, alt, класс
$output = ctools_modal_text_button(t('User login'), 'ul_modal/nojs', t('User login'), 'ctools-modal-ul_modal');
$block = array(
'content' => $output,
);
}
return $block;
}
Обращаем внимание, в классе должно содержаться название наших стилей ctools-modal-ul_modal, что мы делали при подключение скриптов.
Последнее прописываем стили, в файле ul_modal.css в папочке css нашего модуля:
color: red;
}
#ul_login-block {
position: fixed;
left: 50%;
margin-left: -250px;
width : 500px;
top: 10%;
z-index: 10000;
background: #fff;
padding: 25px;
-webkit-border-radius: 15px;
-moz-border-radius: 15px;
border-radius: 15px;
text-align: left;
}
.popups-close .close {
position: absolute;
width: 25px;
height: 25px;
/* background: white;*/
right: 10px;
top: 10px;
display: block;
background: transparent url(/modules/overlay/images/close.png) no-repeat 0 0;
}
#modal-title {
font-size: 16px;
font-weight: bold;
}
#ul_login-block .messages {
font-size: 11px;
}
Вот, что у меня получилось в итоге:
P.S. Для более подробного знакомства можно посмотреть модуль Chaos Tools (CTools) AJAX Example, входящий в ctools.