Боремся с "лишними" переходами на сайте, или еще...
DESCRIPTION
TRANSCRIPT
Боремся с «лишними» переходамина сайте, или еще пара слов
о попапах и аяксах
Талдыкин ЕгорArdas Group
#ahah в Drupal6
// В конструкторе формы$form['country'] = array( '#type' => 'select', '#title' => t('Country'), '#options' => get_countries(), '#ahah' => array( 'path' => 'ahah/get-sities-list', 'wrapper' => 'sities', ),);
Недостатки #ahah в D6
Необходимость реализовывать menu callback Необходимость работы с кешем формы Сложность изменения Drupal.settings Сложность добавления js/css-файлов Изменение одной области страницы в
результате ahah-запроса
#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'];}
ajax-сабмит формы
#prefix/#suffix для всей формы Callback-функция возвращает всю форму graceful degradation
Мультистеповые формы
Хранение текущего шага и данных предыдущих шагов в $form_state['storage']
В конструкторе формы switch/case для вывода нужного шага
В submit-е формы:― сохранение данных текущего шага― $step++― $form_state['rebuild'] = TRUE
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);}
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)
Popup
Для «временного» или «быстрого» контента, которому не нужен постоянный урл
fancybox вместо overlay
2 режима:― inline― iframe
inline popup
Для контента уже присутсвующего на странице
Реализуется переносом ветки DOM-объектов внутрь popup-а, а потом назад, для обеспечения работоспособности навешенных js-обработчиков
iframe popup
Iframe для изоляции js/css родителя и popup-а
Get-параметр для определения режима popup
Отключение рендеринга регионов
$list = &drupal_static('list_themes', array());global $theme;unset($list[$theme]->info['regions'][$region]);
Интеграция 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>