This version of the page http://aimatrix.itak.info/impera-cms-tutorials-callme.htm (0.0.0.0) stored by archive.org.ua. It represents a snapshot of the page as of 2012-11-18. The original page over time could change.
Impera CMS: подключение модуля Обратный звонок в шаблон сайта
это выгодно
  • мощная система
  • постоянно улучшают
  • учтены даже мелочи
  • Здесь отношение простое: нужна в магазине некая функция - значит делаем.
    это надежно
  • блокирует спамеров
  • противостоит атакам
  • фиксирует ip и хосты
  • Цель: достичь максимум безопасности для Вашего магазина и его финансов.
    это современно
  • содержит лучшее
  • система - труженица
  • оберегает магазин
  • Вы свободны заняться торговлей вместо мук искать движок лучше.

    Impera CMS уроки Подключение модуля "Обратный звонок" в шаблон сайта

    • админпанель 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> 
                   Комментарий: Здесь мы указали абсолютный адрес страницы функции Обратный звонок. Кроме
                   прочих переменных, движок передает в шаблонизатор Smarty переменную $site, равную url корневой
                   папки магазина на сайте. Скажем, если движок установлен в корень сайта, то значение этой переменной
                   будет равно например http://myshop.com/, и тогда полный адрес страницы получился бы
                   http://myshop.com/callme. При склейке абсолютного адреса страницы важно не забывать, что
                   содержимое этой переменной всегда завершается слешем.
                   

    Впрочем мы могли бы вместо {$site}callme записать адрес просто как callme, то есть в относительном виде. Обе записи справедливы, однако рекомендуется писать абсолютные адреса, чтобы всегда быть уверенным, что человек попадет на нужную страницу вне зависимости от строения человеко-понятных url на сайте.

    Кроме того, идеальное написание шаблонов под Smarty рекомендует защищать вывод переменных от случаев неинициализирования и попадания в нее разметочных символов. Первое достигается указанием через знак вертикальной черты | вслед за именем переменной модификатора default:'' - после двоеточия в кавычках пишут, какое значение считать по умолчанию, если такую переменную не инициализировали, вообще не передали в шаблон. Второе достигается указанием модификатора escape - заменить в значении переменной все специальные символы (угловые скобки, кавычки, амперсанды) их html сущностями (кодовыми аналогами).

    Таким образом, вместо {$site}callme правильнее делать все же безопасную запись {$site|default:''|escape}callme. Мы тоже станем придерживаться этой рекомендации, просто ниже по коду сначала будем вводить правки в упрощенной записи, чтобы было понятно, а на следующем шаге предыдущую правку заменять полной, безопасной записью.

    Теперь вносим в код ссылки вторую правку. Связана она с тем, что нажатие ссылки ведет к выпадению панельки, того самого 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> 
                   Комментарий: В любом файле шаблона доступна переменная $smarty. В числе прочих элементов,
                   она также содержит в себе элемент request - это копия известного массива $_REQUEST, где содержатся
                   переданные текущей странице параметры. Система трансляции человеко-понятных адресов страниц, реализованная
                   на модуле mod_rewrite веб сервера, добавляет в этот массив элемент module с именем модуля текущей
                   страницы.
                   

    Следовательно конструкцией $smarty.request.module на самом деле обращаемся к содержимому элемента module в массиве $_REQUEST и проверяем, равен ли он системному названию модуля Обратный звонок. Если не равен, то есть сейчас находимся не на собственной странице этой функции, тогда в тело ссылки пропускаем обработчик ее нажатия, иначе исключаем обработчик из ссылки.

    Еще лучше была бы запись {if $smarty.request.module|lower != 'callme'}. Здесь модификатором lower - перевести содержимое строковой переменной в нижний регистр - моделируем регистро-независимое сравнение с именем модуля. Ну и с модификатором default запись станет вообще безопасной, ведь нет гарантии, что в корневом файле .htaccess прописаны правила трансляции человеко-понятных адресов каждому типу страниц. Как пример, движок модифицирован третьей стороной с обретением новых страниц, логика которых не завязана на трансляцию адресов через mod_rewrite. Тогда на новых страницах ссылка получила бы ошибку, ибо в массиве $_REQUEST отсутствует элемент module, а запись сравнения не страховала от подобной ситуации.

    Переходим к третьей правке кода ссылки. Пишем обработчик ее нажатия. Суть работы: с помощью 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} 
                                           Комментарий: Чтобы подключить в тело одного файла содержимое другого файла, в шаблонизаторе
                                           Smarty предусмотрен тег include. Обязательным параметром в нем должен быть file
                                           с указанием имени подключаемого файла. В этот момент шаблонизатор переходит на разбор того файла,
                                           и результирующий контент вставляет вместо подключающего тега. В теге допустимо объявить произвольный
                                           набор параметров, причем внутри подключенного файла они будут выглядеть так, словно эти переменные были
                                           установлены самим движком. Поддержано наследование видимости переменных, то есть если из текущего
                                           файла доступна переменная, она же будет доступна из подключенного файла. Примечательно также перекрытие
                                           видимости переменных. Если в теге подключения объявить переменную с таким же именем, какая доступна
                                           из текущего файла, то в подключенном файле будет доступна именно эта вновь объявленная, как бы на время
                                           разбора закрывая собой оригинальную переменную.
                                         

    Если же вдобавок прибегнуть к оптимизации, выраженной в замене дважды повторяющегося условия сравнения на единственную булевую переменную, например названную $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> 
                     Комментарий: Обратите внимание, что в точках вывода переменных $message и $error
                     вообще не используется модификатор escape. Дело в том, что эти переменные предполагаются
                     содержать фрагменты HTML-текста. Например, ошибок может оказаться несколько, их строки могут
                     быть перечислены через переводы строк <br>. Если использовать модификатор, переводы
                     строк станут печатными символами и внешний вид сообщения испортится.
                   

    Пятая правка задает именование 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> 
                     Комментарий: Обратите внимание на обработку текущего транзитного содержимого поля ввода.
                     Мы создали непустую переменную-подсказку $hint и с помощью модификатора default назначили ее
                     текстом по умолчанию для переменной $post_phone. При первом открытии формы в поле ввода
                     будет текст подсказки, при открытии формы, отклоненной из-за ошибки, в поле ввода будет последнее
                     ее содержимое.
                   

    Смысл шестой правки состоит в написании визуальных эффектов взаимодействия. Это обработчик 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>

     
    Вы на странице: Impera CMS: подключение модуля Обратный звонок в шаблон сайта
    Описание: Данный документ описывает процесс подключения модуля "Обратный звонок" в шаблон (дизайн) сайта, построенного на базе Impera CMS - современной коммерческой системы управления интернет-магазином.
    Теги: impera cms, модуль, обратный звонок, callme, позвоните мне, перезвоните мне, заказать обратный звонок, постановка задачи, решение