Вход для клиентовВход для клиентов  Блог О компании
Поиск:

Помощь » База знаний » Shop-Script » Инструкции и советы »

Общая информация для разработчика

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

Общая логика работы Shop-Script

Точки входа

published/SC/html/scripts/frame.phpменю навигации в администрировании
published/SC/html/scripts/index.phpвитрина и администрирование, основная точка входа
published/SC/html/callbackhandlers/paymenthandler.phpскрипт взаимодействия с платежными системами, адрес получения ответов от серверов платежных систем
published/SC/html/scripts/get_file.phpскачивание файлов, которые требуют проверки прав доступа (экспортированные в файл данных, купленные электронные продукты)
published/SC/html/scripts/imgval.phpгенератор CAPTCHA
shop/index.phpальтернативный адрес витрины
shop/get_file.phpальтернативный адрес для скачивания файлов
shop/callbackhandlers/paymenthandler.phpальтернативный адрес скрипта взаимодействия с платежными системами

Обращение к файлу published/SC/html/scripts/index.php

  1. Инициализация приложения (общие переменные окружения и параметры подключения к базе данных).
  2. Подключение к базе данных.
  3. Проверка необходимости выполнения метаобновления (если обновленная версия скриптов была установлена через Installer, но обновление базы данных еще не выполнено).
  4. Инициализация прикладных (пользовательских) настроек приложения (константы вида CONF_*, хранимые в таблице базы данных SC_settings), например, название магазина, настройки подключения к платежным системам и т. п.
  5. Анализ адреса запроса: класс fUrl определяет по переданным параметрам ($_REQUEST), какой экран надо показать пользователю, какую команду выполнить и т. п.
  6. Инициализация шаблонизатора Smarty.
  7. Получение идентификатора did вызываемого раздела (division). Вызываемый раздел определяется по адресу запроса (шаг 5).
  8. Проверка прав доступа к экрану (только в режиме администрирования магазина).
  9. Получение списка интерфейсов вызываемого раздела, которые хранятся в таблице SC_division_interface. Интерфейсы выполняют роль связи разделов (division) и функциональный модулей (module). Они выполняют связь между действиями пользователя и функционалом скриптов.
  10. Получение списка наследуемых интерфейсов (Inheritable Interfaces).
  11. Вызов полученных интерфейсов один за другим:
    1. инициализация модуля, содержащего интерфейс;
    2. выполнение кода для этого интерфейса (код содержится в модуле).
  12. Инициализация темы оформления магазина.
  13. Отображение шаблона с помощью шаблонизатора Smarty. В ходе обработки шаблона подключаются и выполняются дополнительные компоненты, подключенные в шаблоне с помощью редактора дизайна (списки товаров, новостей и пр.). Вывод полученного HTML в поток.

Структура приложения

Разделы

Разделы — это иерархическая структура («скелет магазина») магазина. Вся структура разделов (которые можно называть страницами) хранится в виде дерева в таблице базы данных SC_divisions, где и определяется иерархия. Каждый раздел имеет свой числовой идентификатор did. В режиме администрирования обращение к разделу осуществляется по did. Для пользовательской части (витрины) используется строковый ключ ukey, значение которого извлекается из текущего URL (например, category, home, cart  и т. д.).

Модули

Модули — это «функциональная начинка» магазина. Все модули расположены в директории published/SC/html/scripts/modules/. Каждый модуль представляет собой отдельную поддиректорию с некоторым набором файлов. Каждый модуль представлен обязательным XML-файлом описания модуля с именем вида %module_name%.xml и в элементе <File> содержит название файла основного класса, реализующего функционал модуля.

<Connector>
    <Class>
        <Name>%ModuleClassName%</Name>
        <File>%module_file_name.php%</File>
        <Title>%module_title%</Title>
        <Description>%module_description%</Description>
        <SingleInstallation>true</SingleInstallation>
    </Class>
</Connector>

Определенный в элементе <File> файл %module_file_name.php% (рекомендуется, чтобы имя файла без расширения совпадало с директорией модуля) должен существовать и описывать класс, являющийся дочерним по отношению к классу Module или AbstractModule.

Информация об установленных модулях хранится в таблицах SC_modules и SC_module_configs, связанных между собой по полю ModuleID.

Интерфейсы

Интерфейсы представляют собой код, вызываемый в контексте модулей. Такой код может быть реализован в виде методов класса модуля либо в виде внешних файлов в поддиректории _methods/ модуля, которые подключаются при вызове соответствующих файлам интерфейсов. Описание доступных интерфейсов модуля содержится в параметре Interfaces модуля либо в XML-файлах в директории _methods/ модуля и инициализируется в методе initInterfaces модуля. Ключ интерфейса совпадает с именем файла интерфейса и его описания без расширений.

<interfaces>
    <interface>
        <name>Localization strings search</name>
        <key>find_local</key>
    </interface>
</interfaces>
$this->Interfaces = array(
'bnews' => array(//b_news – ключ интерфейса
'name' => 'Manage news',
'method' => 'methodBNews',//указан явно метод класса модуля
),
'b_subscribers' => array(
'name' => 'Manage subscribers',
'type' => INTDIVAVAILABLE,
//метод не указан, поэтому будет вызываться код из файла _methods/b_subscribers.php
),
);

Связь интерфейсов и разделов

Связь между разделом и интерфейсами модулей определяется в таблице SC_division_interface. По идентификатору раздела xDivisionID формируется строка xInterface вида [число]_[строка], где число — это идентификатор модуля в таблице SC_modules_configs, а строка — идентификатор (ключ) интерфейса модуля. C одним разделом может быть связано несколько интерфейсов, вызываемых в порядке xPriority, также интерфейс может быть наследуемым xInheritable для дочерних разделов.

Компоненты

Компоненты — это информационные блоки в шаблонах страниц. Во встроенном редакторе дизайна витрины они представлены в виде списка элементов страницы, которые можно перемещать по шаблону вместе с изменением ряда свойств. Компоненты являются обособленным типом интерфейсов модуля, имеющим описание применимых настроек и свойств, а также списком шаблонов, в которых они могут использоваться.

Коллекции модулей

Коллекции модулей — это модули, предоставляющие набор «подмодулей». Например, модуль оплаты payment предоставляет набор «подмодулей» для различных платежных систем.

Соблюдение жестких правил именования PHP-файлов модулей не является обязательным, но рекомендуется формат class.%class_name%.php, поскольку информация о самом модуле добавляется в начало файла модуля в виде специальных тегов формата phpDoc.

Обязательным в файле модуля является тег connect_module_class_name, содержащий имя класса модуля. В ряде модулей используются также дополнительные теги.

Пример описания:

<?php
/**
 * @connect_module_class_name PPExpressCheckout
 * @package DynamicModules
 * @subpackage Payment
 */

class PPExpressCheckout extends PaymentModule {

В методе _initVars объявляются свойства модуля (название title, описание description, список настроек модуля Settings). В методе _initSettingFields задается описание настроек модуля в виде ассоциативного массива. Настройки сохраняются в таблице SC_settings, имеющей следующий формат:

module_id — численный идентификатор экземпляра модуля
module_type — численный тип модуля (доставка, оплата, печатные формы и т. п.)
module_name — наименование модуля
ModuleClassName — имя класса модуля

Установка и удаление экземпляров модулей осуществляется методами install() и uninstall(). Модули могут допускать несколько экземпляров в приложении, если параметр SingleInstall имеет значение false. Методы установки и удаления добавляют необходимые записи о настройках модуля в базу данных.

Модули доставки

Расположены в директории published/SC/html/scripts/modules/shipping/ и используются для определения возможности и расчета стоимости доставки до того момента, когда заказ оформлен.

Метод allow_shipping_to_address() проверяет, возможна ли доставка по указанному покупателем адресу.

Метод calculate_shipping_rate() вычисляет стоимость доставки для адреса, указанного покупателем.

Модули оплаты

Файлы модулей расположены в директории published/SC/html/scripts/modules/payment/.

Существуют следующие типы модулей:

PAYMTD_TYPE_CC — оплата кредитными картами
PAYMTD_TYPE_ONLINE — оплата через различные платежные системы
PAYMTD_TYPE_MANUAL — ручная обработка платежей
PAYMTD_TYPE_REPLACE — оплата, совмещаемая с альтернативным способом оформления заказа (googlecheckout/paypal), когда оформление заказа происходит не на сайте магазина, а на стороннем сайте

Метод payment_form_html() используется для генерации HTML-кода формы оплаты.
Метод after_processing_php() вызывается после записи данных о заказе в базу данных.
Метод payment_process() осуществляет проверку и отправку данных о заказе серверу платежного шлюза; в базовом классе представлен заглушкой, возвращающей единицу (1).
Метод after_processing_html() вызывается после записи данных о заказе в базу данных и возвращает HTML-код кнопки перехода на сайт платежного шлюза.

Модули печатных форм

Файлы модулей расположены в директории published/SC/html/scripts/modules/printforms/. Шаблоны и графические ресурсы, используемые модулями, располагаются в директории published/SC/html/scripts/templates/forms/. Модули используются для генерации различных печатных форм, связанных с заказами, например, счетов или квитанций.

Метод display() используется для отображения печатной формы.

Хранение файлов на сервере

Файлы, которые загружаются в режиме администрирования магазина Shop-Script, сохраняются в один из следующих каталогов:

  • data/

    Защищенные файлы, которые нельзя получить напрямую по HTTP (доступ запрещен серверными методами, например, с помощью файла .htaccess), и которые отдаются на скачивание только скриптами после проверки прав доступа. Например, файлы электронных продуктов, которые можно скачать после покупки.

  • published/publicdata/

    Файлы, доступ к которым разрешен напрямую по HTTP: CSS, изображения, используемые в дизайне витрины, фотографии продуктов.

Локализация

Shop-Script поддерживает языковую локализацию не только интерфейса, но и содержимого базы данных. Список поддерживаемых языков и инструмент перевода находится режиме администрирования «Инструменты -> Языки и перевод».

При добавлении нового языка выполняются SQL-запросы, которые добавляют новые поля в таблицы основных сущностей, требующих перевода на новый язык. Список многоязычных полей таблиц содержится в файле published/SC/html/scripts/cfg/database_structure.xml. Например, при добавлении немецкого языка с идентификатором «de» в таблицу продуктов будут добавлены поля product_name_de, brief_description_de, description_de.

Локализация интерфейса редактируется в режиме администрирования и сохраняется в таблице SC_locals, где id — идентификатор строки локализации, lang_id — идентификатор языка, value — переведенная строка, group — группа строки локализации (для витрины загружаются строки локализации из групп hidden, front, general, а для административной части — back и general), subgroup — подгруппа строки локализации (published/SC/html/scripts/cfg/localgroup.xml).

Локализация строковых констант установленных модулей (например, модулей оплаты) расположена в поддиректории languages/ соответствующего модуля в виде PHP-файлов с форматом наименования %iso2%.%class_name%.php, в которых определяются строковые константы локализации. При отображении информации о модуле в администрировании магазина подключается языковой файл для текущего языка пользователя. Эта часть перевода не хранится в базе данных.

Кеширование

В текущей версии Shop-Script данные кешируются в отдельных файлаx:

  • Настройки подключения к базе данных: temp/scdb/.settings.%dbkey%
  • Локализация: data/%dbkey%/attachments/SC/temp/loc_cache/serlang***
  • Список разделов (division) и интерфейсов разделов (division interface) и custom_html-компонентов в дизайн-редакторе: data/%dbkey%/attachments/SC/temp/.cache.***
  • Кеш сжатого JS-файла визуального редактора текста: temp/.cache.tiny_mce_***.gz
 
 
Наш новый проект:

Фреймворк Webasyst

PHP-фреймворк для быстрого создания
веб-приложений для бизнеса.

www.webasyst.com