## Описание 
Основная библиотека для фреймворка **cmsgate**. Данный фреймворк будет в первую очередь полезен vendor-ам, которые занимаются
интеграцией своих решений (платежных шлюзов, служб доставки) с различными CMS системами (php-based). Основное его назначение 
- упростить разработку и поддержку плагинов для интеграции своих продуктов с большим количеством разнообразных CMS, скрывая
при этом большую часть внутренних особенностей самих CMS.

## Библиотеки (слои)
Любой конечный плагин состоит из 4-х слоев
* **core-слой** - ядро фреймворка с набором общих для всех плагинов классов. Большая часть классов абстрактны и должны
быть переопределены на других слоях
* **cms-слой** - различные врапперы, лоадеры, helper-ы, обеспечивающие взаимодействие ядра с данными и функциями конкретных CMS
Данные слой представлен ввиде отдельных библиотек, содержащих в имени название соответствующей CMS
    * cmsgate-bitrix-lib
    * cmsgate-opencart-lib
    * cmsgate-prestashop-lib
    * и т.д.    
* **paysystem-слой** - протоколы для взаимодействия с API конкретных платежных шлюзов; контроллеры содержащие бизнес-процессы;
враппер для настроек и т.д. Содержит классы, которые важны имеено для взаимодействия с конкретным шлюзом  
Данные слой представлен ввиде отдельных библиотек, содержащих в имени название соответствующей платежной системы:
    * cmsgate-hutkigrosh-lib
    * cmsgate-epos-lib
    * cmsgate-bgpb-lib
    * и т.д.   
* **cms-paysystem-слой** - самый верхний слой, по сути это уже плагин для конкретной cms и конкретной платежной системы

Важно четко разделять эти слои и понимать, к какому слою относится тот или иной функционал. 
Т.е. paysystem-слой ничего не знает об архитектуре конкретных CMS, а cms-слой не знает про конкретные платежные системы

## Основные сущности ядра
* **Wrapper** - обертки, для взаимодействия между ядром и другими слоями. Все врапперы абстракты и должны быть переопределены
на более высоких слоях
    * **ConfigWrapper** - враппер для настроек конкретной платежной системы. Должен быть переопределен на `paysystem-слое`, 
для декларации настроек необходимых для взаимодействия с платежной системой (например логины, пароль, api-key и т.д.). 
Будет содержать настройки, которые **не зависят от типа CMS**. Например:
        * ConfigWrapperHutkigrosh (из библиотеки cmsgate-hutkigrosh-lib)
        * ConfigWrapperEpos (из библиотеки cmsgate-epos-lib)
        За механизм доступа к настройкам в рамках CMS отвечает **ConfigStorageСms** (относится к `cms-слою`)    
    * **OrderWrapper** - враппер для получения информации о заказе (id, сумма, фио клиента, лист продуктов и т.д.). Должен быть 
    переопределен на `cms-слое` для инкапсуляции внутреннего механизма хранения этой информации в каждой конкретной CMS. То, где хранится
    номер заказа не зависит от платежной системы, а только от устройства самой CMS. Например:
        * OrderWrapperOpencart (из библиотеки cmsgate-opencart-lib)  
        * OrderWrapperBitrix (из библиотеки cmsgate-bitrix-lib)     
        * OrderWrapperVirtuemart (из библиотеки cmsgate-virtuemart-lib) 
        * и т.д.
    * **OrderProductWrapper** - враппер для получений информации о товаре, входящем в заказ. По аналогии с OrderWrapper должен быть переопределен на `cms-слое` 
* **ConfigStorageCms** - класс для получения и сохранения настроек внутри CMS. Должен быть переопределен на `cms-слое`. 
ConfigWrapper-ы получаются доступ к настройкам через него (хотя, при необходимости, могут и иначе, если переопределить метод ConfigWrapper:getConfig). Например:
    * ConfigStorageOpencart (из библиотеки cmsgate-opencart-lib)  
    * ConfigStorageBitrix (из библиотеки cmsgate-bitrix-lib)     
    * ConfigStorageVirtuemart (из библиотеки cmsgate-virtuemart-lib) 
* **LocaleLoader** - враппер для загрузки текущей локали. Должен быть переопределен на `cms-слое`. Например:
    * LocaleLoaderOpencart (из библиотеки cmsgate-opencart-lib)  
    * LocaleLoaderBitrix (из библиотеки cmsgate-bitrix-lib)     
    * LocaleLoaderVirtuemart (из библиотеки cmsgate-virtuemart-lib)
* **ConfigForm** - класс для генерации "форм" с настройками. Должен быть переопределен на `cms-слое`. По сути преобразует набор настроек в 
формат, с которым может работать CMS для отображения их в административной зоне. Т.к. разные CMS могут иметь совсем различные
форматы для задания настроек, наследники этого класса на входе получают настройки у `ManagedFieldsFactory` во внутреннем формате cmsgate (ConfigField*), а на выходе формируют: 
    * уже конечный html код
    * массив во внутреннем формате cms
    * xml-файл во внутреннем формате cms
    * и т.д.
Наследники ConfigForm не знают о настройках конкретных платежных система, а "работают" только с типами конфигурационных полей:
    * ConfigFieldList          
    * ConfigFieldFile          
    * ConfigFieldText          
    * ConfigFieldPassword
    * и т.д.        
* **ManagedFieldsFactory** - factory для гру      
* **CmsConnector** - factory для создания объектов `cms-слоя`. Используется для создания объектов LocaleLoader, OrderWrapper, ConfigStorageCms, ConfigForm
* **PaysystemConnector** - factory для создания объектов `paysystem-слоя`. Используется для создания объектов ConfigWrapper, Translator, ManagedFieldsFactory