-
админпанель
admin
-
кеш шаблонизатора
cache
-
каптча (в старых версиях)
captcha
-
компилированные части шаблона
compiled
-
конфиги шаблонизатора
configs
-
обработчики платежных систем
connectors
-
шаблоны сайта
design
-
стили глобальных субшаблонов
common
-
глобальные субшаблоны
common_parts
-
шаблон 1
default_new
-
шаблон 2
example
-
его стили
css
-
его разметка
html
- ...
-
страница "Обратный звонок"
callme.tpl
- ...
-
общий макет страницы
index.tpl
- ...
- ...
-
его графика
images
-
его частные скрипты
js
-
фото товаров
files
-
общие скрипты
js
-
валидатор полей формы
baloon
-
раскраска html-кода
codemirror
-
увеличитель картинок
enlargeit
-
фреймворк jQuery
jquery
-
передача формы Ajax-запросом
jquery-form
-
jQuery User Interface
jquery-ui
-
ползунок фильтра цен
js-trackbar
-
Flash Player
swfobject
-
навигатор страниц клавишами
ctrlnavigate.js
- ...
- ...
-
ядро движка
objects
-
шаблонизатор
Smarty
-
звуки событий
sounds
Следующий материал описывает процесс подключения модуля
Обратный звонок в шаблон
(дизайн) клиентской стороны сайта. Изложение сделано пошаговым, подробно комментируя
мелочи, чтобы Вы уловили каждую тонкость. Если Вы не знакомы с синтаксисом шаблонизатора
Smarty, но срочно требуется начать делать какие-то правки в шаблоне, непременно
прочтите этот материал. Некоторые азы по Smarty разъяснены здесь буквально "на пальцах".
Итак, приступим. Для простоты предположим, что уже есть некий готовый шаблон, условно
названный
example, и будто он скопирован на сайт в папку шаблонов.
Это изображено справа на примере структуры папок уже установленного движка: здесь видно,
что папка
design, в которой принято располагать разные дизайны
клиентской стороны сайта, сейчас содержит 2 каких-то шаблона - в нашем примере это
стандартный шаблон
default_new и рассматриваемый нами
шаблон
example. Ради наглядности папка последнего развернута
и помечена зеленым цветом.
Краткое пояснение. Всякий шаблон содержит в себе 4 папки:
css -
для стилевых файлов шаблона,
images - для графических файлов,
js - для личных ява-скриптов, то есть разработанных только под
этот шаблон (обратите внимание, в движке также есть папка
js
для общих ява-скриптов, универсальных к любому шаблону; эта папка выделена справа желтым
цветом),
html - для разметочных файлов. Под разметочными файлами
понимаются обычные HTM- или TPL-файлы, в нужных местах которых прописаны теги шаблонизатора
Smarty, куда требуется подставить ту или
иную переменную.
Комментарий по Smarty. Когда пользователь проходит на какую-то страницу сайта, движок
анализирует адрес страницы, зависимо от него обращается к нужной таблице базы данных и полученные
сведения отдает через именованные переменные в шаблонизатор, также сообщая ему, какой TPL-файл
надо отрисовать для текущей страницы. Шаблонизатор берет этот TPL-файл, согласно расставленным в нем
тегам вставляет вместо них содержимое заявленных переменных, и результат отправляется в браузер
пользователя.
Из сказанного ясно, что папка
html шаблона содержит некий набор разметочных
TPL-файлов, причем каждый файл отвечает за внешний вид какого-то фрагмента страницы. Если не вдаваться
в тонкости целезаменяющего именования файлов шаблона, то в общем случае можно сказать, что файл
index.tpl - это макет всякой страницы сайта без центрального блока.
Остальные TPL-файлы являют собой макеты этого центрального блока под каждый тип страницы.
Например файл
callme.tpl - это макет центрального блока, когда
пользователь перешел на страницу
Обратный звонок.
Постановка задачи

Начнем постановку задачи. Пусть надо сделать так, чтобы на любой странице сайта,
допустим где-то в шапке, имелась ссылка
Заказать обратный звонок. Нажатие на
ссылку чтобы приводило к выпадению поверх страницы панельки с формой запроса обратного
звонка. Мы не задаемся стилевым решением. Предположим, что это уже сделано, и вид панельки
продемонстрирован на картинке справа. Наша задача заключается в подключении ее на сайт.
Сразу следует заострить внимание на таком моменте. Сегодня стало модным и крайне удобным для
пользователей использовать всплывающие панельки и технику динамического обновления контента
без перезагрузки страницы. Достигается это за счет ява-скриптов, которые незаметно для
пользователя делают запрос на сайт отдельной части его страницы, размещенной по какому-то
адресу. Однако даже если запросы происходят незаметно, не стоит забывать, что такая страница
все же существует и может быть доступна без ява-скрипта, то есть прямым заходом на нее.
Когда страница служит вспомогательным целям, скажем выдача результатов автозаполнителю поиска - тут
понятно, что она не имеет собственного оформления, никому не интересна как самостоятельная,
а прямой просмотр в браузере даст какофонию букв. Другое дело, если страница является однозначно
самостоятельной, но в то же время ее стремятся анимировать в теле другой страницы.
Позвоните мне, Обратная связь, Корзина, Авторизация и прочее - все это примеры двухрежимных
страниц. Поэтому безупречно сделанный шаблон, качественное подключение модулей в него подразумевает
такое написание TPL-файла, что он одинаково хорошо подходит как для режима выпадения, так и
самостоятельной страницы.
Что получили от дизайнера
Сначала посмотрим, что передал нам дизайнер. Он спроектировал панельку, разверстал ее в HTML-код
и выдал нам следующий фрагмент кода.
<div class="over-page" id="callme-box">
<form action="" method="post" onsubmit="">
<h3>
Обратный звонок
</h3>
<div class="success">
<!-- уведомление об успехе -->
</div>
<div class="error">
<!-- ошибка, если была -->
</div>
<input name="" type="text" value="Введите ваш номер телефона" onfocus="">
<input name="" type="submit" value="Готово">
Мы перезвоним вам в течении часа. Так же вы можете <br>
связаться с нами по телефону: 7(495) 222-22-22
</form>
</div>
Здесь видим контейнерный
div, в него заключена форма запроса с полем
ввода и кнопкой отправки. Контейнер также имеет класс
over-page,
то есть над страницей. Нам это важно, так как рассматривая ниже объявление данного класса,
можем сказать, что без него контейнер удастся встроить всегда видимым статичным элементом
внутрь страницы
Обратный звонок, а с назначенным классом можем использовать контейнер
как невидимую плавающую панельку, проявляемую ява-скриптом при нажатии соответствующей ссылки.
Обращаться из скрипта к контейнеру сможем по его идентификатору
callme-box.
Теперь же приведем объявление стиля упомянутого класса: изначально невидимый, позиционирование
абсолютное.
.over-page {
display: none;
position: absolute;
}
Так как мы хотим, чтобы ответные сообщения программной части модуля оказались не за пределами
панельки, то нам еще важно, что дизайнер сразу вставил в форму над полем ввода div-контейнеры
класса
success и
error для уведомлений об
успехе или ошибке.
Ну и в согласии с задачей дизайнер еще передал нам HTML-код код ссылки
Заказать обратный звонок.
<a onclick="" href="">
Заказать обратный звонок
</a>
Начинаем решение: работаем со ссылкой
Первым делом вставим преподнесенную дизайнером ссылку. По задаче требовалось, чтобы ссылка
существовала на любой странице сайта. Следовательно сразу определяем TPL-файл шаблона, куда
ее поместим. Это будет файл
index.tpl, ведь он является макетом
страницы без центрального блока. Итак, вставляем в этот файл HTML-код ссылки, только вносим
в код
первую правку из 4 необходимых (ради наглядности каждая правка ниже по коду
будет выделяться синим цветом).
<a onclick="" href="{$site}callme">
Заказать обратный звонок
</a>
Теперь вносим в код ссылки
вторую правку. Связана она с тем, что нажатие ссылки ведет к выпадению
панельки, того самого div-контейнера с идентификатором
callme-box. Принимая во внимание,
что этот контейнер будет использован и как статичный элемент на собственной странице функции
Обратный звонок
(то есть по адресу
http://myshop.com/callme), и как выпадающая панель на остальных
страницах сайта, мы позже снабдим условием пропись класса
over-page внутри контейнера,
а выпадение панели реализуем в обработчике
onclick ссылки. Ведь нужно сделать так,
чтобы только на прочих страницах панель всплывала, на странице
Обратный звонок она будет как статичный
элемент и ей нет нужды иметь этот класс, причем там уже ссылка не должна иметь обработчик.
Раз очевидна условная работа ссылки, нужно это воспроизвести в шаблоне. Обратите внимание, как тегом
проверки условия
if шаблонизатора мы управляем вставкой / удалением обработчика
onclick в тело ссылки. Для удобства чтения новая правка также выделена синим цветом,
предшествующая правка - серым.
<a {if $smarty.request.module != 'CallMe'}
onclick=""
{/if} href="{$site|default:''|escape}callme">
Заказать обратный звонок
</a>
Переходим к
третьей правке кода ссылки. Пишем обработчик ее нажатия. Суть работы: с помощью jQuery
просто проявляем на экране контейнер с идентификатором
callme-box и возвращаем
false, тем самым запрещая браузеру переходить по ссылке. Это простой пример. Вы же можете написать свой
обработчик, с какой угодно красивой анимацией всплывания панели.
<a {if $smarty.request.module|default:''|lower != 'callme'}
onclick="javascript: jQuery('#callme-box').show(); return false;"
{/if} href="{$site|default:''|escape}callme">
Заказать обратный звонок
</a>
Далее сделаем последнюю
четвертую правку кода ссылки, а именно под ней подключим HTML-код
контейнера, заключив его в аналогичное вышеприведенному условие. Ведь на собственной странице
функции
Обратный звонок этот контейнер уже есть в качестве статичного элемента, а на
прочих страницах его вообще нет, и для таких страниц вполне резонно подключить контейнер сразу
за кодом ссылки, так как в этот момент он будет иметь класс
over-page,
то есть невидимый плавающий. Напомним, выше уже говорилось, что пропись этого класса в контейнере
позже снабдим условием.
Забегая вперед, скажем, что макетом собственной страницы (ее центрального блока) функции
Обратный звонок является файл
callme.tpl. Именно в этом TPL-файле
мы разместим HTML-код спроектированной дизайнером панельки. Именно этот же файл мы подключим сейчас
под код ссылки.
<a {if $smarty.request.module|default:''|lower != 'callme'}
onclick="javascript: jQuery('#callme-box').show(); return false;"
{/if} href="{$site|default:''|escape}callme">
Заказать обратный звонок
</a>
{if $smarty.request.module != 'CallMe'}
{include file = 'callme.tpl'}
{/if}
Если же вдобавок прибегнуть к оптимизации, выраженной в замене дважды повторяющегося условия сравнения
на единственную булевую переменную, например названную
$notCallme, и предварительно
один раз вычисленную в первой строке, то получим простой финальный код ссылки, готовый к вставке
в файл
index.tpl.
{$notCallme = $smarty.request.module|default:''|lower != 'callme'}
<a {if $notCallme}
onclick="javascript: jQuery('#callme-box').show(); return false;"
{/if} href="{$site|default:''|escape}callme">
Заказать обратный звонок
</a>
{if $notCallme}
{include file = 'callme.tpl'}
{/if}
Работаем с панелькой
Как уже было сказано, HTML-код спроектированной дизайнером панельки вставляем в файл
callme.tpl. Только сделаем в коде из 6 необходимых
первую правку:
зависимо от текущей страницы назначаем / отменяем контейнеру класс
over-page.
<div {if $smarty.request.module != 'CallMe'}
class="over-page"
{/if} id="callme-box">
<form action="" method="post" onsubmit="">
<h3>
Обратный звонок
</h3>
<div class="success">
<!-- уведомление об успехе -->
</div>
<div class="error">
<!-- ошибка, если была -->
</div>
<input name="" type="text" value="Введите ваш номер телефона" onfocus="">
<input name="" type="submit" value="Готово">
Мы перезвоним вам в течении часа. Так же вы можете <br>
связаться с нами по телефону: 7(495) 222-22-22
</form>
</div>
Вторая правка: прописываем у формы адрес собственной страницы функции
Обратный звонок.
Адрес подобен тому, какой задавали при работе с кодом ссылки.
<div {if $smarty.request.module|default:''|lower != 'callme'}
class="over-page"
{/if} id="callme-box">
<form action="{$site}callme" method="post" onsubmit="">
<h3>
Обратный звонок
</h3>
<div class="success">
<!-- уведомление об успехе -->
</div>
<div class="error">
<!-- ошибка, если была -->
</div>
<input name="" type="text" value="Введите ваш номер телефона" onfocus="">
<input name="" type="submit" value="Готово">
Мы перезвоним вам в течении часа. Так же вы можете <br>
связаться с нами по телефону: 7(495) 222-22-22
</form>
</div>
Третья правка касается управления сообщением об успехе. Когда форма отправлена
на сайт и принята успешно, движок передает в шаблонизатор уведомление в переменной
$message. Хорошая практика - вывести форму с уведомлением,
но убрать оттуда поля ввода. Такое организуется заключением соответствующих частей
формы в блоки условия
if - else. Сделаем это, опираясь
на проверку непустой переменной
$message, и сразу же подставим
в предназначенный ей контейнер вывод этой переменной.
<div {if $smarty.request.module|default:''|lower != 'callme'}
class="over-page"
{/if} id="callme-box">
<form action="{$site|default:''|escape}callme" method="post" onsubmit="">
<h3>
Обратный звонок
</h3>
{if $message != ''}
<div class="success">
{$message}
</div>
{else}
<div class="error">
<!-- ошибка, если была -->
</div>
<input name="" type="text" value="Введите ваш номер телефона" onfocus="">
<input name="" type="submit" value="Готово">
{/if}
Мы перезвоним вам в течении часа. Так же вы можете <br>
связаться с нами по телефону: 7(495) 222-22-22
</form>
</div>
Аналогичным образом сделаем
четвертую правку. Касаться она будет управления
сообщением об ошибке. Если таковая возникла, движок передает ее текст в переменной
$error.
<div {if $smarty.request.module|default:''|lower != 'callme'}
class="over-page"
{/if} id="callme-box">
<form action="{$site|default:''|escape}callme" method="post" onsubmit="">
<h3>
Обратный звонок
</h3>
{if $message|default:'' != ''}
<div class="success">
{$message}
</div>
{else}
{if $error != ''}
<div class="error">
{$error}
</div>
{/if}
<input name="" type="text" value="Введите ваш номер телефона" onfocus="">
<input name="" type="submit" value="Готово">
{/if}
Мы перезвоним вам в течении часа. Так же вы можете <br>
связаться с нами по телефону: 7(495) 222-22-22
</form>
</div>
Пятая правка задает именование input-элементов формы и отражает текущее транзитное содержимое поля
ввода с помощью одноименной переменной
$post_phone, а также добавляет в форму
скрытое поле
post_copystop, используемое движком для контроля ее репостинга,
то есть чтобы после принятия формы произвольное обновление страницы в браузере (например через клавишу F5)
не вело к повторному принятию уже принятой информации.
<div {if $smarty.request.module|default:''|lower != 'callme'}
class="over-page"
{/if} id="callme-box">
<form action="{$site|default:''|escape}callme" method="post" onsubmit="">
<h3>
Обратный звонок
</h3>
{if $message|default:'' != ''}
<div class="success">
{$message}
</div>
{else}
{if $error|default:'' != ''}
<div class="error">
{$error}
</div>
{/if}
{$hint = 'Введите ваш номер телефона'}
<input name="post_phone" type="text" value="{$post_phone|default:$hint}"
onfocus="">
<input name="post_submit" type="submit" value="Готово">
<input name="post_copystop" type="hidden" value="{$post_copystop}">
{/if}
Мы перезвоним вам в течении часа. Так же вы можете <br>
связаться с нами по телефону: 7(495) 222-22-22
</form>
</div>
Смысл
шестой правки состоит в написании визуальных эффектов взаимодействия. Это обработчик
onsubmit формы и обработчик
onfocus поля ввода,
где выполняется исчезновение подсказки в поле ввода, когда в него попал курсор.
<div {if $smarty.request.module|default:''|lower != 'callme'}
class="over-page"
{/if} id="callme-box">
<form action="{$site|default:''|escape}callme" method="post"
onsubmit="javascript: return true;">
<h3>
Обратный звонок
</h3>
{if $message|default:'' != ''}
<div class="success">
{$message}
</div>
{else}
{if $error|default:'' != ''}
<div class="error">
{$error}
</div>
{/if}
{$hint = 'Введите ваш номер телефона'}
<input name="post_phone" type="text" value="{$post_phone|default:$hint|escape}"
onfocus="javascript: if (this.value == '{$hint}') this.value = '';">
<input name="post_submit" type="submit" value="Готово">
<input name="post_copystop" type="hidden"
value="{$post_copystop|default:''|escape}">
{/if}
Мы перезвоним вам в течении часа. Так же вы можете <br>
связаться с нами по телефону: 7(495) 222-22-22
</form>
</div>