![Page 1: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/1.jpg)
![Page 2: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/2.jpg)
Боремся с «лишними» переходамина сайте, или еще пара слов
о попапах и аяксах
Талдыкин ЕгорArdas Group
![Page 3: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/3.jpg)
#ahah в Drupal6
// В конструкторе формы$form['country'] = array( '#type' => 'select', '#title' => t('Country'), '#options' => get_countries(), '#ahah' => array( 'path' => 'ahah/get-sities-list', 'wrapper' => 'sities', ),);
![Page 4: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/4.jpg)
Недостатки #ahah в D6
Необходимость реализовывать menu callback Необходимость работы с кешем формы Сложность изменения Drupal.settings Сложность добавления js/css-файлов Изменение одной области страницы в
результате ahah-запроса
![Page 5: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/5.jpg)
#ajax в D7 Элементу изменяющему'#ajax' => array( 'callback' => 'sities_ajax_callback', 'wrapper' => 'sities',),
Элементу изменяемому'#prefix' => '<div id="sities">','#suffix' => '</div>'
Callback-функцияfunction sities_ajax_callback($form, $form_state) {
return $form['sity'];}
![Page 6: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/6.jpg)
ajax-сабмит формы
#prefix/#suffix для всей формы Callback-функция возвращает всю форму graceful degradation
![Page 7: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/7.jpg)
Мультистеповые формы
Хранение текущего шага и данных предыдущих шагов в $form_state['storage']
В конструкторе формы switch/case для вывода нужного шага
В submit-е формы:― сохранение данных текущего шага― $step++― $form_state['rebuild'] = TRUE
![Page 8: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/8.jpg)
Ajax-комманды
function test_ajax_callback($form, $form_state) { $commands = array( ajax_command_replace('#wrapper', drupal_render($form)),
ajax_command_invoke('.selected', 'hide'), );
return array( '#type' => 'ajax', '#commands' => $commands);}
![Page 9: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/9.jpg)
Ajax submit for any form (asaf)
Позволяет сохранять любую форму через ajax Вызывает хуки hook_asaf_form_ajax_commands_alter и hook_asaf_form_FORM_ID_ajax_commands_alter для измениния списка ajax-комманд.
Добавляет комманды:― обновить страницу (asaf_ajax_command_reload)― перейти по урлу (asaf_ajax_command_redirect)
![Page 10: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/10.jpg)
Popup
Для «временного» или «быстрого» контента, которому не нужен постоянный урл
fancybox вместо overlay
2 режима:― inline― iframe
![Page 11: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/11.jpg)
inline popup
Для контента уже присутсвующего на странице
Реализуется переносом ветки DOM-объектов внутрь popup-а, а потом назад, для обеспечения работоспособности навешенных js-обработчиков
![Page 12: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/12.jpg)
iframe popup
Iframe для изоляции js/css родителя и popup-а
Get-параметр для определения режима popup
Отключение рендеринга регионов
$list = &drupal_static('list_themes', array());global $theme;unset($list[$theme]->info['regions'][$region]);
![Page 13: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/13.jpg)
Интеграция popup-ов и форм
Внутри popup-ов все формы сабмитятся ajax-ом (модуль asaf)
Дополнительные ajax-комманды:― обновить popup/родителя― перейти по урлу в popup-е/родителе― закрыть popup
Управление коммандами из аттрибутов ссылки (destination и битовая маска режима)
<a href="/feedback" class="popup-link" data-popup-mode="4" data-popup-destination="feedback/thanks">Contact us</a>
![Page 14: Боремся с "лишними" переходами на сайте, или еще пара слов о попапах и аяксах](https://reader033.vdocuments.net/reader033/viewer/2022061304/5498878cb47959204a8b461e/html5/thumbnails/14.jpg)