Создаём всплывающее окно авторизации для Joomla
Эффект «всплывающего окна» на сайтах не редкость. Каждый использует его по собственному усмотрению, одни пытаются создать красивый и анимированный объект, а другие просто экономят места на странице. Чаще всего такой приём использую для создания полноценной галереи, чтобы изображения открывались в полный размер. На странице устанавливают миниатюру картинки и добавляют к ней особое значение в тегах, после нажатия по миниатюре скрипт находит оригинал и грузит его на передний план монитора. Как бы там ни было, уметь создавать подобный эффект будет полезно каждому. Сегодня мы рассмотрим всплывающее окно, в котором будет располагаться модуль авторизации (зайти на сайт под логином и паролем). Создадим кнопку на сайте, при помощи которой будет открываться форма авторизации. Особой версии joomla для этого не требуется, как в прочем и неважно какой шаблон используется. Но для чистоты эксперимента, у меня Joomla 3.x и стандартный protostar.
1. Создаём файлы для всплывающего окна
Первым делом создаём файлы facebox.js и facebox.css при помощи программы notepad++. Их мы кладём в папку с тем же названием facebox:
facebox.js отвечает за анимацию, но не умеет определять что конкретно необходимо показать. Он работает только с теми элементами, которые имеют определённое значение в тегах. И даже в этом случае придётся ему подсказать, где они. Поэтому на странице будем дописывать небольшой скрипт. Но об этом позже, а сейчас в facebox.js вставляем это:
jQuery код:
(function($) { $.facebox = function(data, klass) { $.facebox.loading() if (data.ajax) fillFaceboxFromAjax(data.ajax, klass) else if (data.image) fillFaceboxFromImage(data.image, klass) else if (data.div) fillFaceboxFromHref(data.div, klass) else if ($.isFunction(data)) data.call($) else $.facebox.reveal(data, klass) } $.extend($.facebox, { settings: { opacity : 0.2, overlay : true, loadingImage : '', closeImage : '', imageTypes : [ 'png', 'jpg', 'jpeg', 'gif' ], faceboxHtml : '\ <div id="facebox" style="display:none;"> \ <div> \ <div> \ </div> \ <a href="#">close</a> \ </div> \ </div>' }, loading: function() { init() if ($('#facebox .loading').length == 1) return true showOverlay() $('#facebox .content').empty() $('#facebox .body').children().hide().end(). append('<div><img src="'+$.facebox.settings.loadingImage+'"/></div>') $('#facebox').css({ top: getPageScroll()[1] + (getPageHeight() / 10), left: $(window).width() / 2 - 205 }).show() $(document).bind('keydown.facebox', function(e) { if (e.keyCode == 27) $.facebox.close() return true }) $(document).trigger('loading.facebox') }, reveal: function(data, klass) { $(document).trigger('beforeReveal.facebox') if (klass) $('#facebox .content').addClass(klass) $('#facebox .content').append(data) $('#facebox .loading').remove() $('#facebox .body').children().fadeIn('normal') $('#facebox').css('left', $(window).width() / 2 - ($('#facebox .popup').width() / 2)) $(document).trigger('reveal.facebox').trigger('afterReveal.facebox') }, close: function() { $(document).trigger('close.facebox') return false } }) $.fn.facebox = function(settings) { if ($(this).length == 0) return init(settings) function clickHandler() { $.facebox.loading(true) var klass = this.rel.match(/facebox\[?\.(\w+)\]?/) if (klass) klass = klass[1] fillFaceboxFromHref(this.href, klass) return false } return this.bind('click.facebox', clickHandler) } function init(settings) { if ($.facebox.settings.inited) return true else $.facebox.settings.inited = true $(document).trigger('init.facebox') makeCompatible() var imageTypes = $.facebox.settings.imageTypes.join('|') $.facebox.settings.imageTypesRegexp = new RegExp('\.(' + imageTypes + ')$', 'i') if (settings) $.extend($.facebox.settings, settings) $('body').append($.facebox.settings.faceboxHtml) var preload = [ new Image(), new Image() ] preload[0].src = $.facebox.settings.closeImage preload[1].src = $.facebox.settings.loadingImage $('#facebox').find('.b:first, .bl').each(function() { preload.push(new Image()) preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1') }) $('#facebox .close').click($.facebox.close) $('#facebox .close_image').attr('src', $.facebox.settings.closeImage) } // getPageScroll() by quirksmode.com function getPageScroll() { var xScroll, yScroll; if (self.pageYOffset) { yScroll = self.pageYOffset; xScroll = self.pageXOffset; } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict yScroll = document.documentElement.scrollTop; xScroll = document.documentElement.scrollLeft; } else if (document.body) {// all other Explorers yScroll = document.body.scrollTop; xScroll = document.body.scrollLeft; } return new Array(xScroll,yScroll) } // Adapted from getPageSize() by quirksmode.com function getPageHeight() { var windowHeight if (self.innerHeight) { // all except Explorer windowHeight = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode windowHeight = document.documentElement.clientHeight; } else if (document.body) { // other Explorers windowHeight = document.body.clientHeight; } return windowHeight } function makeCompatible() { var $s = $.facebox.settings $s.loadingImage = $s.loading_image || $s.loadingImage $s.closeImage = $s.close_image || $s.closeImage $s.imageTypes = $s.image_types || $s.imageTypes $s.faceboxHtml = $s.facebox_html || $s.faceboxHtml } function fillFaceboxFromHref(href, klass) { // div if (href.match(/#/)) { var url = window.location.href.split('#')[0] var target = href.replace(url,'') if (target == '#') return $.facebox.reveal($(target).html(), klass) // image } else if (href.match($.facebox.settings.imageTypesRegexp)) { fillFaceboxFromImage(href, klass) // ajax } else { fillFaceboxFromAjax(href, klass) } } function fillFaceboxFromImage(href, klass) { var image = new Image() image.onload = function() { $.facebox.reveal('<div><img src="' + image.src + '" /></div>', klass) } image.src = href } function fillFaceboxFromAjax(href, klass) { $.get(href, function(data) { $.facebox.reveal(data, klass) }) } function skipOverlay() { return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null } function showOverlay() { if (skipOverlay()) return if ($('#facebox_overlay').length == 0) $("body").append('<div id="facebox_overlay"></div>') $('#facebox_overlay').hide().addClass("facebox_overlayBG") .css('opacity', $.facebox.settings.opacity) .click(function() { $(document).trigger('close.facebox') }) .fadeIn(200) return false } function hideOverlay() { if (skipOverlay()) return $('#facebox_overlay').fadeOut(200, function(){ $("#facebox_overlay").removeClass("facebox_overlayBG") $("#facebox_overlay").addClass("facebox_hide") $("#facebox_overlay").remove() }) return false } $(document).bind('close.facebox', function() { $(document).unbind('keydown.facebox') $('#facebox').fadeOut(function() { $('#facebox .content').removeClass().addClass('content') $('#facebox .loading').remove() $(document).trigger('afterClose.facebox') }) hideOverlay() }) })(jQuery);
В facebox.css вставляем следующие:
CSS код:
#facebox { position: absolute; top: 0; left: 0; z-index: 100; text-align: center; } #facebox .popup{ width: 410px; position: fixed; border: 3px solid rgba(0,0,0,0); -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; -webkit-box-shadow: 0 0 18px rgba(0, 0, 0, 0.71); -moz-box-shadow: 0 0 18px rgba(0, 0, 0, 0.71); box-shadow: 0 0 18px rgba(0, 0, 0, 0.71); } #facebox .content { display: table; width: 370px; padding: 30px 20px 10px; background: #fff; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } #facebox .content > p:first-child{ margin-top: 0; } #facebox .content > p:last-child{ margin-bottom: 0; } #facebox .close{ position: absolute; top: 5px; right: 5px; padding: 2px; background: #fff; } #facebox .close img{ opacity: 0.3; } #facebox .close:hover img{ opacity: 1.0; } #facebox .loading { text-align: center; } #facebox .image { text-align: center; } #facebox img { border: 0; margin: 0; } #facebox_overlay { position: fixed; top: 0px; left: 0px; height: 100%; width: 100%; } .facebox_hide { z-index: -100; } .facebox_overlayBG { background-color: #000; z-index: 99; }
С эффектом мы закончили.
2. Устанавливаем в шаблон
Теперь нужно полученную папку facebox разместить у себя в шаблоне. Я бросаю её к себе в protostar (путь по умолчанию …/templates/protostar/). Далее открываем файл index.php всё того же шаблона и перед тегом </body> в самом низу страницы вставляем следующее:
HTML код:
<div id="login-modal" style="display:none;"> <jdoc:include type="modules" name="login" style="none" /> </div>
Здесь мы заключили, пока ещё не созданный, модуль в теги div с идентификатором id="login-modal". А так же скрыли вывод на странице сайта при помощи style="display:none;". Суть в том, что при использовании идентификатора со значением login-modal, скрипт даст команду для вывода на странице, при условии, что кнопка нажата. Этот элемент должен быть скрыт, чтобы форма авторизации всегда возвращалась в положение display:none;.
3. Создаём позицию под модуль
Во втором пункте мы уже добавили модуль в index.php с названием login. Но такой позиции пока не существует в нашем шаблоне. Поэтому открываем файл templateDetails.xml (путь по умолчанию …/templates/protostar/templateDetails.xml) и дописываем следующее:
XML код:
<position>login</position>
После сохраняем, и теперь при добавлении модуля в панели управления появилась позиция login. Это нужно было для того, чтобы в итоге наш модуль авторизации оказался скрытым от всех.
4. Добавляем стили
Таблица стилей, отвечающая за показ всплывающего окна, уже есть в файле facebox.css. Однако стили кнопки ещё не написаны. Поэтому открываем файл template.css (путь по умолчанию …/templates/protostar/css/temlate.css) и дописываем в самом низу это:
CSS код:
#login-button { background: #2a6c90; border-radius: 0 0 5px 5px; color: #f9f9f9; display: block; font-size: 11pt; height: 30px; left: 60%; line-height: 20pt; position: absolute; text-align: center; top: 0; width: 10%; text-decoration: none; } #login-button:hover { background: #007dbb; }
5. Делаем кнопку на сайте и подключаем скрипты
Для начала нам понадобиться подключить скрипты. Для этого снова открываем файл index.php шаблона и между тегами <head></head> вставляем этот код:
jQuery код:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> <script src="/templates/<?php echo $this->template ?>/facebox/facebox.js"></script> <link href="/templates/<?php echo $this->template ?>/facebox/facebox.css" rel="stylesheet" type="text/css" /> <script type="text/javascript"> jQuery(document).ready(function(jQuery) { jQuery('a[rel*=facebox]').facebox({ }) }) </script>
Здесь подключена библиотека jquery, а так же файлы, созданные и расположенные в папке facebox. Ниже есть небольшой скрипт, без него работать всё, что мы сделали, не будет. Его основная задача определить на странице элементы, имеющие значения rel="facebox" в тегах и сработать по нажатию на них. Если такие элементы есть, а наша кнопка имеет такое значение, то будет открываться скрытый модуль (форма авторизации). На самом деле не обязательно всю эту работу проделывать ради того чтобы создать красивый вход на сайт, это могут быть и другие модули. Кстати, принцип вывода картинок из миниатюр в оригинал тот же самый. То есть, там так же определяется наше значение и скрипт показывает, отличие только в том, что создаётся специальная ссылка с двумя картинками одновременно со значением href=”” вместо кнопки.
Теперь необходимо вставить кнопку. Вы можете делать это где угодно, у меня это сразу после открывающегося тега <body>:
HTML код:
<a id="login-button" href="#login-modal" rel="facebox">Войти</a>
6. Добавляем форму авторизации
Осталось только создать модуль. Открываем панель управления, идём «расширения – менеджер модулей» и нажимаем «создать». Тип модуля выбираем «Вход на сайт». Заполняем заголовок и обязательно выбираем позицию login ранее добавленную в templateDetails.xml. Остальные настройки по желанию, после сохраняемся и открываем сайт для проверки. Вот как должно получиться, если на кнопку нажать:
Заключение
Кнопка входа установлена в верхней части сайта и не подвижка, а вот форма имеет фиксированное положение в зависимости от экрана. То есть в центре по ширине и остаётся в таком положении при скроллинге страницы. Для того чтобы окно скрылось, нажимаем на любое место вне окошка. Стили модуля в этом примере мы не рассматривали. Менять стандартные не правильно, так как при обновлении движка или шаблона всё потеряется (у нас ведь стандартный protostar). В этом случае, лучше создавать копию модуля и менять внешний вид по собственному усмотрению.
Соседние материалы | ||||
Дополнительный пункт меню в панели управления Joomla | Создание модуля для панели управления в Joomla 3 |