Drupal → Как открыть в Fancybox любую страницу сайта

26.02.2011

Код, по клику на элементе #fancy-contact открывает в Fancybox форму контактов расположенную по адресу /contact:

Drupal 6:

$(function() {
  $('#fancy-contact').click(function() {
    $.fancybox.showActivity();
    $.get(Drupal.settings.basePath + 'contact', function(data) {
      var form = $('#contact-mail-page', data);
      $.fancybox({content:form});
    });
    return false;
  });
});

В Drupal 7 нужно дополнительно обернуть код в:

(function($) {
  ...
}(jQuery));

Форма контактов в Fanxybox

Алгоритм такой:

  1. По клику показываем анимацию загрузки.
  2. Подгружаем целиком нужную страницу (в нашем случае это /contact).
  3. Извлекаем из неё нужный контент (в нашем случае это форма с идентификатором contact-mail-page).
  4. Показываем извлечённый контент в Fancybox.
Написанное актуально для
Drupal 6, Drupal 7, Fancybox 1
Похожие записи

Комментарии

Гость
27.02.2011, 01:40

Никто не в курсе, есть ли в лайтбоксе возможность сделать вот это: $.fancybox({content:content});
То есть открыть модальное окно с определенным контентом.
Там можно через rel="lightmodal" загрузить уже готовую страницу..

Кстати, кто не знает - поддержка модальных окон для контактной формы и авторизации в лайтбоксе уже есть в модуле, нужно в настройках галочку поставить.

Скажите я правильно понимаю, что друпал автоматом убирает page.tpl.php из вывода когда видит в хедере запроса метод аякса ??? тоесть пофигу на какую страницу запрос делаешь в результате получишь чистое содержание переменной $content ???

нет, друпал не умеет отдавать page callback-и без вызова theme_page. почитайте алгоритм под скриншотом.

Ах точно, невнимательно посмотрел заметку ... эх столько компромисов и костылей, порой друпал так раздражает своей неповоротливостью)

ну у вас всегда есть шанс написать свой модуль, который исправит эту ситуацию ;)

Я подозреваю, что такой модуль будет ещё одним костылем :)
В любом случае спасибо за наводку, буду пользоваться по мере необходимости.

sibero777
01.03.2011, 11:47

Сейчас смотрю модуль popups, хочу часть административных функций сделать в всплывающем окне. Это решению тоже испробую. Спасибо

Гость
04.04.2011, 17:39

Подскажите как заставить чтобы в всплывающей форме подгружался js.

Те . я вывожу форму добавления материала в которой есть поле Hierarchical Select
Оно там не работает, пишет "You don't have Javascript enabled."

Спасибо

перед показом формы подгрузите нужные скрипты с помощью $.getScript

Гость
04.04.2011, 18:33

а как это сделать?
где именно прописать?

Гость
04.04.2011, 19:07

пишу
$.getScript("/sites/default/files/js/js_69e826c765d2c77bb668b8af5c93220e.js");
те. загружаю собственно все скрипты

форма вообще не грузится

нужно подгружать файлы Hierarchical Select а не все скрипты, плюс окно надо показывать после загрузки скриптов, смотрите документацию по getScript

Гость
04.04.2011, 19:27

к сожалению для меня js это темный лес, не могли бы вы привести пример открытия формы создания страницы с подгрузкой скажем стандартного /misc/collapse.js ?
я так понял js вообще не загружаются в fancybox

спасибо

$.getScript('/misc/collapse.js', function(){
  // всё что после $.fancybox.showActivity();
});
Гость
04.04.2011, 19:45

делаю так

 $(document).ready(function(){ 
	  
        
         $('.add-q').click(function(){
            $.fancybox.showActivity();
            $.getScript('/misc/collapse.js', function(){
            $.get(Drupal.settings.basePath + 'node/add/q', function(data){
                var form = $('#main-content-inner', data);
                $.fancybox({content:form});
        })};
           
});
       
     });
	

не работает

посчитайте число открытых и закрытых скобок

Гость
04.04.2011, 20:45

понял, не закрыл $(document).ready(function(){
но не помогло

попробуйте перед $.fancybox({content:form}); вызвать Drupal.attachBehaviors(form);

dmitriy_k
18.04.2011, 16:29

добрый день! не подскажете как такое же сделать с Colorbox ? мне нужно контактную форму открыть в колорбоксе. вход на сайт, регистрацию сделал с модулем Fancylogin, очень неплохой модуль, а вот с контактной формой пока не разобрался. Drupal 7 . заранее спасибо за ответ.

посмотрите api колорбокса, там ничего сложного

dmitriy_k
20.04.2011, 21:24

к сожалению не силен еще в работе с API , чуть глубже можно подсказку?

dmitriy_k
21.04.2011, 15:17

совсем туплю похоже, у меня на странице "контакты" есть кнопка "написать нам", при клике на которую должно открыться всплывающее окно с контактной формой, куда я должен вставить данный вызов Colorboxa ?

dmitriy_k
21.04.2011, 15:28

т.е я должен создать новый js файл со своим названием , туда прописать данный вызов и добавить этот файл в .info в моей теме ? я правильно понял?

dmitriy_k
21.04.2011, 15:31

а вы имели ввиду другой вариант?

Не поможете тоже самое сделать с Colorbox'ом? Сколько не пытался, не получается.

Сделал ссылку:
<a class="colorbox-inline" id="contacts" title="Контакты" href="/contact">Контакты</a>
Отдельный .js файл подключил:

jQuery(document).ready(function() {
$('#colorbox-inline').click(function(){
    $.get(Drupal.settings.basePath + 'contact', function(data){
        var form = $('#contact-site-form', data);
		$.colorbox({href:form});
    });
    return false;
});
});

И еще, необходимо такое делать не только для формы контактов, но и для других страниц (нод). А там как быть? Там же нет форм?

$('.colorbox-inline')
$.colorbox({html:form.html()});
Там же нет форм?

селектор можно указать любой

Решил все таки остановится на Fancybox.
Через плагин ссылка открывается, а через ваш код нет. Drupal 7.

Сделал ссылку:
<p><a id="fancy-contact" href="/contact">контакт</a></p>
В page.tpl.php добавил:

<script type="text/javascript">
$('#fancy-contact').click(function(){
    $.fancybox.showActivity();
    $.get(Drupal.settings.basePath + 'contact', function(data){
        var form = $('#contact-site-form', data);
        $.fancybox({content:form});
    });
    return false;
});
</script>

Поменял только #contact-site-form
Не хочет работать.

Ура, спасибо помогло оборачивание в jQuery(document).ready(function($) { });

dmitriy_k
29.06.2011, 19:30

здравствуйте! снова вернулся к колорбоксу, решил что все-таки нужно завершить начатое. остановился на таком моменте - в файле page.tpl.php прописываю написать нам - на всех страницах отображается ссылка НАПИСАТЬ НАМ , но дальше контактная форма открывается в колорбоксе только со страницы /myIP/mySyte/ как только переходим на любую другую страницу - то колорбокс открывается без контактной формы. подскажите куда копать дальше.

копать в сторону дебага яваскрипта

dmitriy_k
29.06.2011, 19:33
<div id="node-72"><a class="colorbox-inline" href="colorbox/form/contact_site_form?destination=контактная-форма&width=500&height=330">написать нам</a></div>

извиняюсь код забыл завернуть в теги и он отобразился ссылкой НАПИСАТЬ НАМ.

dmitriy_k
29.06.2011, 19:37

можно посильнее пинок? базовых знаний пока не хватает, хотя и стараюсь, пока могу только как обезьяна по аналогии действовать.

Dmitry Pogodaev
10.02.2012, 04:31

Здравствуй, постоянно курю все твои статьи, решил, заодно задать вопрос, над которым думаю уже пару дней:
"Как сделать, чтобы при отправке формы данные отсылались и все validate и submit'ы проходили, в страница не перезагружалась и, вместо этого, окно просто закрывалось. А если validate не пройден, то в этом же окне юзер и видел ответ. То есть полностью на аяксе сделать весь процесс работы с формой, а не только загрузку."

Dmitry Pogodaev
10.02.2012, 17:12

А для 6-ки нет ? забывал указать, что до сих пор пишу только на ней

Гость
18.05.2012, 11:11

Спасибо за пример, всё работает, вопрос такой: как сделать чтобы после нажатия на кнопку Отправить формы контактов, результат отправки показывался тоже в Fancybox, т.е. чтобы не уходить с текущей страницы.

Сергей
28.09.2012, 23:21

Здравствуйте,

А если нужно чтобы страница открывалась в модальном окне не при нажатии на ссылку, а при введении url в адресную строку браузера. Например есть задача: после совершения какого-либо экшена идёт редирект на страницу, которая должна открыться в модальном окне.

Спасибо

Гость
31.10.2012, 11:22
$(function() {
  $('#fancy-contact').click(function() {
    $.fancybox.showActivity();
    $.get(Drupal.settings.basePath + 'contact', function(data) {
      var form = $('#contact-mail-page', data);
      $.fancybox({content:form});
    });
    return false;
  });
});

А куда это вставлять? Хочу поставить на $buttons в формах типа node/add

Игорь
16.01.2013, 12:23

А куда это вставлять?

Этот вопрос конечно омрачает... люди, что второй день в друпале. Купите книгу? Сейчас кстати по 7-ке на русском наконец то достойная вышла.

В IE 8 Не работает

Этот код из примера статьи плохо работает. Да и firefoxe пришлось понять, что в версии выше 2.0 http://fancyapps.com/fancybox/#license этого - $.fancybox.showActivity(); - нет! то есть не нужно.
А DEMO - смотрите в папке demo прекрасно работает.

Николай
17.04.2013, 07:25

А если у меня на странице пошаговая форма? Сама-то форма вызывается, но при переходе на второй шаг окошко сворачивается и загружается сама страничка (причем результат выбора с первого не передается). Можно ли таким методом открывать страницы с многошаговыми формами?

Николай
19.04.2013, 11:56

ctools, конечно тоже вариант... Подскажите, как можно вызвать модальное окно (используя ctools) автоматически при загрузке сайта. Что нужно прописать в hook_init?
Заранее спасибо

Добрый день

а не подскажите как сделать так чтоб в сплывающем окне отработал эскрипт из этого модуля In Field Labels http://drupal.org/project/In-Field-Labels просто так срабатывает а с fancy не хочет

при этом этот же модуль коректно работает с модулем popup

Вячеслав
21.06.2013, 22:47

Для тех у кого не получилось (Drupal 7.22 и fancyBox 7.x-2.0-alpha5 для формы contact):
1. Не забываем включить модули fancyBox и Contact.
2. Не забываем скачать и закинуть в папку /sites/all/libraries/fancybox содержимое скачанного архива (source, lib, demo) со страницы: http://fancyapps.com/fancybox/.
3. Для JavaScript кода из Drupal 6 незабываем обёрточку как в статье.
4. В версии 2 fancyBox: $.fancybox.showActivity(); заменяем на $.fancybox.showLoading();
5. fancy-contact - id HTML элемента по которому жмякаем для появления окна, contact - относительный URL на сайте, а contact-mail-page - id HTML формы в загружаемой странице (например в Drupal 7, форма контактов на странице contact имеет ID: contact-site-form).

:)

Гость
20.01.2014, 09:15

а нельзя ли просто перечислить селекторы в fancyBox Selectors? не могли бы вы написать законченный пример для семерки? а то не получается у меня

Гость
21.01.2014, 14:31

нет, автор, если вы списали, то дайте ссылку источника, может там я найду ответ.

а нельзя ли просто включить голову и не задавать идиотских вопросов?

Гость
21.01.2014, 14:37

эти пункты я выполнил, но все же...
1. Не забываем включить модули fancyBox и Contact.
2. Не забываем скачать и закинуть в папку /sites/all/libraries/fancybox содержимое скачанного архива (source, lib, demo) со страницы: http://fancyapps.com/fancybox/.
3. Для JavaScript кода из Drupal 6 незабываем обёрточку как в статье.
4. В версии 2 fancyBox: $.fancybox.showActivity(); заменяем на $.fancybox.showLoading();
5. fancy-contact - id HTML элемента по которому жмякаем для появления окна, contact - относительный URL на сайте, а contact-mail-page - id HTML формы в загружаемой странице (например в Drupal 7, форма контактов на странице contact имеет ID: contact-site-form).

Гость
22.01.2014, 09:38

уважаемый xandeadx прошу, для семерки покажи нормальный пример

Гость
23.01.2014, 06:40

в общем разобрался, был конфликт jquery из-за чего не получалось. теперь вопрос как устранить эту беду. у меня подключен jquery 1,8 или 1,9 версия, обновить не получится так как на сайте работает плагин datatables. как разрешить обновременную работу как jquery 1.7 и 1,8 или 1,9

Николай
01.02.2014, 20:24

Спасибо за информацию. А как туда поместить ноду? т.е. без шапки футера и т.д.

Игорь
01.02.2014, 22:13

Краткость - сестра таланта! )))
Николай, вы задали вопрос - очень примитивный, сразу видно что с js вы не работали. Здесь же не курсы для новичков. Вам стоит пройти курс. Я тоже когда то посмотрел.

Андромеда
19.03.2014, 21:53

Здравствуйте! Вопрос уже поднимался здесь, но у меня никак не получается сделать по аналогии с выводом нод, но через Lightbox. Подскажите, пожалуйста, на что заменяется $.fancybox.showActivity();? Вообще, $.fancybox? Простая замена на lightbox ничего не дает..

grafdegan
11.05.2014, 18:45

Будет ли работать аякс в этом попапе, на предмет проверки валидности полей?
И закроется ли окно после успешной отправки сообщения?

Николай
06.02.2015, 10:50

Подскажите, как в открытой странице через fancybox провести валидацию полей (для формы)?
Предположим, я открыл через fancybox форму регистрации пользователя. Если я не ввел обязательные поля, то окно закрывается, а меня перекидывает на страницу регистрации и уже там выдаются ошибки. Как сделать, чтобы проверка проходила ВНУТРИ окна fancybox и ошибки выводились там же?

Игорь
06.02.2015, 12:29

Гуглить это хорошо, но тяжело ;-)
Проще взять модуль и глянуть код: https://www.drupal.org/project/commerce_buy_one_click
Смотрите функцию валидации!

И снова я к xandeadx обращусь:
В Drupal 7 нужно дополнительно обернуть код в:

(function($) {
  ...
})(jQuery);

Так правильнее? Или одинаково?

Гость
23.12.2015, 02:29

В fancybox 2.x .showActivity() заменили на .showLoading()

Кочанов Сергей
07.02.2016, 16:16

Здравствуйте, нестандартная ситуация с FancyBox.
В модальном окне выводится форма обратной связи.
При первом нажатии кнопки вызова указанная форма выходит за пределы модального окна, появляются полосы прокрутки

При повторных вызовах форма обратной связи принимает форму модального окна.

http://scalemodels-tu154.ru/articles/7_4_Tu_154M_RA_85694.htm

С чем это может быть связано?

Добавить комментарий