Rapida Форк на базе simpla 2.3.8

babahalki

Постоялец
Регистрация
6 Май 2016
Сообщения
247
Реакции
107
Прошло 2 года с момента открытия нашего интернет-магазина. Мы начали с Simpla, но потом под веянием моды перешли на OkayCMS. За это время в систему было внесена масса изменений, направленных на ускорение быстродействия. В итоге из OkayCMS было выпилено почти все, что заявлено, как преимущества этой системы.

Но самая большая претензия - система работает без ошибок, только если error_reporting установлен E_ALL & ~E_NOTICE
Т.е. когда включено отображение всех ошибок, система просто пестрит ошибками notice. Для сравнения в симпле, всего несколько мест, которые надо исправить в этой части.

Сейчас приняли решения пилить свой форк уже на основе simpla, потому что удалять/исправлять функционал окая и добавлять новую функциональность сложнее, чем просто добавлять что-то в Simpla.

Эту первую редакцию с трудом можно назвать форком, поскольку тут практически ничего не изменено по сравнению с оригинальной версией Simpla 2.3.8.

Данный релиз сделан для желающих использовать классическую Simplа.

Название Rapida выбрано потому, что система должна быть быстрой. Скорость для Rapida - основной приоритет.

Основная фишка этого релиза, модуль импорта YML.

rapida 0.0.1 simpla 2.3.8 fork
Данный форк сделан на базе SimplaCMS 2.3.8.

Изменения:
- Удалена проверка лицензий
- install.php исправлен для нормальной работы на php7
- simpla/pclzip/pclzip.lib.php исправлен для нормальной работы на php7
- config/config.php переименован в config.ini
- В метод api/Config.php внесены изменения в функции parse_ini_file добавлен параметр INI_SCANNER_TYPED
- Уровень отображения ошибок выведен в config.php, включено отображение всех ошибок
- Внесены изменения в файлах шаблона tpl, а также файлах view, чтобы не показывались ошибки notice (изменены view/CartView.php view/OrderView.php view/ProductView.php)
- Исправлена ошибка в файле simpla/GroupAdmin.php (лишний else)
- Исправлены ошибки в файле design/default/html/index.tpl (if $browsed_products $last_posts заменено на if !empty($browsed_products))
- Добавлен импорт из YML файлов
- В классе api/Database.php методы connect и query исправлены (теперь в случае длинных запросов, когда пауза между запросам обрывает коннект по таймауту, не приводит к ошибке, соедение устанавливается автоматически.
- В файле api/Simpla.php Добавлен второй класс для работы с БД db2, теперь можно одновременно выполнять 2 разных запроса к базе. (используется в yandex.php)
- Усовершенствован экспорт yml файла. Теперь экспортируются все изображения товара, если их больше 1, а также экспортируются свойства товаров(Старый yandex.php переименован в yandex.old.php)

 
Последнее редактирование:
RAPIDA 0.0.4 ecommerce CMS SimplaCMS 2.3.8 fork

****************
Changelog
****************



=================
v0.0.4 13.10.2017
=================
- Изменен метод db->results(string $field = null, string $group_field = null), теперь он работает аналогично, results_array с той разницей, что выдает массив с объектами внутри, а не массив с массивами внутри.
= Добавлены файлы для выполнения очереди задач через cron. Выполнить задания из очереди cron/queue_exec.php. Посмотреть кол-во заданий в очереди cron/queue_count.php
- Добавлен метод db->results_object(string $group_field = null) и изменен db->results_array(string $group_field = null). Работают сходным образом, с той разницей, что один выдает объект, а второй массив.
- На метод products->get_products() прикручен дисковый кеш через методы cache->set_cache_nosql() cache->get_cache_nosql(). Кеш пишет на диск вывод метода products->get_products в виде json строки, а при чтении из кеша, преобразует json строку обратно в объект.
- Мелким изменениям подверглись почти все файлы view/*.php и simpla/*.php в связи с использованием в методе products->get_products() нового метода db->results_object(). Пришлось изменить на новый метод в связи с тем, что дисковый кеш cache->set_cache_nosql() и cache->get_cache_nosql() используют для записи на диск функции json_decode json_encode, которые все пишут в объект. В результате при обратном преобразовании ф-цией json_decode данных из кеша с диска невозможно было восстановить, объекты, как объекты, а массивы, как массивы. Теперь все данные выводятся чистыми объектами.
- Внесены изменения в методы products->get_products() и products->get_related_products(), теперь результат выполнения сразу группируется по id, соответствующие изменения внесены во всех случаях использования этих методов.
- Изменен метод 'products->add_image()'. Оптимизирована работа. Кол-во запросов уменьшено до 2. Первый запрос определяет максимальную позицию изображений товара, 2 запрос добавляет новое изображение товара, сразу устанавливая позицию макс. знач. + 1.
- Исправлена ошибка в simpla/ProductAdmin.php message_error добавляется в шаблон в любом случае, если ошибки нет - добавляется пустой message_error.
- В файле simpla/index.php удалены указания на несуществующий дебагер, добавлен дебагер dtimer::show(), также как в файле /index.php
- в методе request->url иправлена ошибка. Если при парсинге адресной строки через $url = parse_url($_SERVER['REQUEST_URI']) в полученном массиве нет элемента 'query' (часть после ?) $url['query'] - вылетала ошибка. Теперь добавлена предварительная проверка и ошибка больше не вылетает.
- Удалена поддержка сервиса "Простые звонки"
- Исправлена ошибка в view\ProductsView.php в части перечисления свойств товаров $features.
- Устранены мелкие баги (Какие именно не помню)
=================
v0.0.3 13.10.2017
=================
- Добавлен метод в класс db public function results_array(string $field = null, string $group_field = null). Основная фишка - поле группировки, позволяет избежать двойной работы, когда сначала в методе db->results происходит перебор и запись строк в объект, а потом, например, во view/ProductsView.php происходит перебор:
foreach($this->products->get_products($filter) as $p)
$products[$p->id] = $p;
только, чтобы записать id товаров в виде ключей массива. $this->db->results_array(null, 'id') выдаст результат в виде массива с ключами из поля id.

=================
v0.0.2 12.10.2017
=================
- Добавлен отладчик ошибок dtimer в виде отдельной библиотеки api/Dtimer.php
- В config.ini выведена опция dtimer_disabled для включения/выпключения отладчика. Когда опция true, вызовы метода отладчика на запись dtimer::log('info') и на вывод журнала отладчика dtimer::show() не срабатывает и не забивает память. dtimer_disabled = false включает запись событий в отладчик, а также включает отображение журнала. Вызов происходит из файла index.php. Отладчик записывает текстовую строку, а также время записи этой строки в журнал отладчика.
- Добавлена библиотека кеширования cache api/Cache.php и библиотека очереди queue api/Queue.php. Пока используется для кеширования только одного метода product->count_products(). Механизм работы. При обращении к методу по входным параметрам в массиве $filter формируется md4 hash, который через метод cache->get_cache_integer() ищет в базе сохраненный кеш, если кеш не найден, происходит полное выполнение метода count_products(), в конце перед return происходит запись в кеш через метод cache->set_cache_integer(). Очередь заданий queue используется следующим образом. метод queue->addtask($keyhash, 'name', $task); пишет в очередь заданий задачу на выполнение count_products() без использования кеша с последующим обновлением результата в кеше. За счет этого кеш постоянно обновляется, но обновление происходит в отдельном процессе вызываемом планировщиком cron, т.е. для пользователя функция выполняется быстро, а сложная работа протекает на фоне.

Последняя версия на гитхабе:
Для просмотра ссылки Войди или Зарегистрируйся
тут есть дистрибутив:
Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
все стучалки вырезаны от simpla cms дырки есть?)
и вообще если не секрет, какие планы на развитие движка и проекта в целом?
 
все стучалки вырезаны от simpla cms дырки есть?)
и вообще если не секрет, какие планы на развитие движка и проекта в целом?

Стучалок в симпле нет, а проверка лицензий выпилена.
Зарабатывать на продаже не планирую, просто хочу сделать хороший движок для интернет-магазина, который сможет спокойно и на виртуальном хостинге быстро гонять 100 тыс. товаров в 700 разделах. Из всех движков, которые я просмотрел за все время, в том числе коммерческих, ничего лучше симплы мне встретить не удалось.

План простой, сделать систему максимально быстрой, сохранив возможность использовать шаблоны для simpla. Сейчас пока прикручиваю то, что уже опробовано и показало свою эффективность, это все твики по скорости работы.
Наверняка сделаю ЧПУ адреса.
Еще 1 мощное изменение, которое наверняка сделаю - нормальная работа фильтров по свойствам в разделах товаров. Кто внимательно изучал работу фильтров в симпле знает, что симпла корявенько работает с фильтрами. В отличие, например, от фильтров в яндекс маркете. Как сделать правильно я уже придумал и протестировал на нашем магазине, осталось прикрутить сюда.
Еще хочу проделать аудит по безопасности системы.
Хочу сделать удобный доступ к api системы для работы ajax, сейчас ajax в системе есть только в строго отведенных местах (информер корзины, импорт, экспорт товара). Хочу сделать больше, опять же в целях ускорения работы.

Конечно жду предложений от форумчан.
 
Последнее редактирование:
идея хорошая! по-тестирую на днях ваше решение, обязательно отпишусь!
 
RAPIDA Ecommerce CMS version 0.0.5
SimplaCMS 2.3.8 fork

****************
Changelog
****************



=================
v0.0.5 14.10.2017
=================
- Удалены лишние файлы simpla/LicenseAdmin.php и simpla/design/html/license.tpl
- Удалены хвосты из файла simpla/design/html/index.tpl от интеграции с сервисом "простые звонки"
- В целях удобства в классе config api/Config.php, который отвечает за работу с config.ini добавлена парсинг ini файла по секциям, теперь в классе создана публичная переменная $vars_sections, где настройки config.ini, распределены по секциям. Например, настройки кеша доступны $this->config->vars_sections['cache']
- устранена ошибка в методе cache->encode() (убрал лишний аргумент, который не использовался $param)
- настройки кеша выведены из api/Cache.php в config/config.ini
- Добавлено кеширование на диск по самой "тяжелой" функции системы features->get_options(). Пожалуй, кеширование этой функции - самый эффективный тюнинг скорости который можно сделать. Время загрузки не самого большого раздела сократилось до 170мс, без кеширования это время составляло около 4с.
- Исправлен баг с работой функции products->get_products(). В начале функции из $filter (аргумент функции) удалялись лишние параметры. Было сделано для того, чтобы не захламлять кеш лишней информацией, но применительно к функции get_products удалялись $filter['page'] $filter['limit'] $filter['sort'], в результате при переключении пагинации в разделах сайта, товары не изменялись.
- Исправлен баг с тем, что пользователь отображался авторизованным даже, когда авторизации не происходило. view/View.php
- в файле шаблона cart.tpl исправлен баг, приводящий к ошибке, когда пользователь не авторизован. {if $user->discount} заменено на {if isset($user->discount)}. Аналогичный баг исправлен в view/CartView.php в части $coupon_request, теперь, если действующих купонов нет, все равно в шаблон передается переменная $coupon_request, но со значением false. Стараюсь устранять ошибки, которые раньше не отображались в связи с тем, что отображение ошибок типа notice было принудительно отключено. К сожалению не всегда удается обойтись без исправлений в шаблоне. Потенциально в других шаблонах возможно повторение этих ошибок.
- Изменен метод features->get_features(), теперь он тоже, как и products->get_products() выдает объект сразу сгруппированный по id, соответствующие изменения внесены в другие места, где используется данный метод.

=================
v0.0.4 13.10.2017
=================
- Изменен метод db->results(string $field = null, string $group_field = null), теперь он работает аналогично, results_array с той разницей, что выдает массив с объектами внутри, а не массив с массивами внутри.
= Добавлены файлы для выполнения очереди задач через cron. Выполнить задания из очереди cron/queue_exec.php. Посмотреть кол-во заданий в очереди cron/queue_count.php
- Добавлен метод db->results_object(string $group_field = null) и изменен db->results_array(string $group_field = null). Работают сходным образом, с той разницей, что один выдает объект, а второй массив.
- На метод products->get_products() прикручен дисковый кеш через методы cache->set_cache_nosql() cache->get_cache_nosql(). Кеш пишет на диск вывод метода products->get_products в виде json строки, а при чтении из кеша, преобразует json строку обратно в объект.
- Мелким изменениям подверглись почти все файлы view/*.php и simpla/*.php в связи с использованием в методе products->get_products() нового метода db->results_object(). Пришлось изменить на новый метод в связи с тем, что дисковый кеш cache->set_cache_nosql() и cache->get_cache_nosql() используют для записи на диск функции json_decode json_encode, которые все пишут в объект. В результате при обратном преобразовании ф-цией json_decode данных из кеша с диска невозможно было восстановить, объекты, как объекты, а массивы, как массивы. Теперь все данные выводятся чистыми объектами.
- Внесены изменения в методы products->get_products() и products->get_related_products(), теперь результат выполнения сразу группируется по id, соответствующие изменения внесены во всех случаях использования этих методов.
- Изменен метод 'products->add_image()'. Оптимизирована работа. Кол-во запросов уменьшено до 2. Первый запрос определяет максимальную позицию изображений товара, 2 запрос добавляет новое изображение товара, сразу устанавливая позицию макс. знач. + 1.
- Исправлена ошибка в simpla/ProductAdmin.php message_error добавляется в шаблон в любом случае, если ошибки нет - добавляется пустой message_error.
- В файле simpla/index.php удалены указания на несуществующий дебагер, добавлен дебагер dtimer::show(), также как в файле /index.php
- в методе request->url иправлена ошибка. Если при парсинге адресной строки через $url = parse_url($_SERVER['REQUEST_URI']) в полученном массиве нет элемента 'query' (часть после ?) $url['query'] - вылетала ошибка. Теперь добавлена предварительная проверка и ошибка больше не вылетает.
- Удалена поддержка сервиса "Простые звонки"
- Исправлена ошибка в view\ProductsView.php в части перечисления свойств товаров $features.
- Устранены мелкие баги (Какие именно не помню)
=================
v0.0.3 13.10.2017
=================
- Добавлен метод в класс db public function results_array(string $field = null, string $group_field = null). Основная фишка - поле группировки, позволяет избежать двойной работы, когда сначала в методе db->results происходит перебор и запись строк в объект, а потом, например, во view/ProductsView.php происходит перебор:
foreach($this->products->get_products($filter) as $p)
$products[$p->id] = $p;
только, чтобы записать id товаров в виде ключей массива. $this->db->results_array(null, 'id') выдаст результат в виде массива с ключами из поля id.

=================
v0.0.2 12.10.2017
=================
- Добавлен отладчик ошибок dtimer в виде отдельной библиотеки api/Dtimer.php
- В config.ini выведена опция dtimer_disabled для включения/выпключения отладчика. Когда опция true, вызовы метода отладчика на запись dtimer::log('info') и на вывод журнала отладчика dtimer::show() не срабатывает и не забивает память. dtimer_disabled = false включает запись событий в отладчик, а также включает отображение журнала. Вызов происходит из файла index.php. Отладчик записывает текстовую строку, а также время записи этой строки в журнал отладчика.
- Добавлена библиотека кеширования cache api/Cache.php и библиотека очереди queue api/Queue.php. Пока используется для кеширования только одного метода product->count_products(). Механизм работы. При обращении к методу по входным параметрам в массиве $filter формируется md4 hash, который через метод cache->get_cache_integer() ищет в базе сохраненный кеш, если кеш не найден, происходит полное выполнение метода count_products(), в конце перед return происходит запись в кеш через метод cache->set_cache_integer(). Очередь заданий queue используется следующим образом. метод queue->addtask($keyhash, 'name', $task); пишет в очередь заданий задачу на выполнение count_products() без использования кеша с последующим обновлением результата в кеше. За счет этого кеш постоянно обновляется, но обновление происходит в отдельном процессе вызываемом планировщиком cron, т.е. для пользователя функция выполняется быстро, а сложная работа протекает на фоне.

 
Небольшие исправления

RAPIDA Ecommerce CMS 0.0.5.2
SimplaCMS 2.3.8 fork

****************
Changelog
****************
=================
v0.0.5.2 15.10.2017
=================
- После включения кеша, возник баг с открытием страниц товара в админке. Устранен.

=================
v0.0.5.1 15.10.2017
=================
- В демонстрационную инсталяционную базу, которая создается на этапе установке системы, добавлены недостающие таблицы s_queue рабочая очередь задач. s_queue_full очередь задач для сохранения всех задач (не очищается автоматически) s_cache_integer для записи кеша цифровых значений.
- Расположение файлового кеша по умолчанию изменено на cache в корневой директории системы
- Раньше к имени директории, которая создается для кеша в конце дописывался дефис. securityKey = mysite становилось mysite- Теперь так больше не делает.

Rapida 0.0.5.2



Для тех кто хочет сравнить скорость работы rapida и симпла, демонстрационная база из 42 товаров не подойдет. Вот файл яндекс маркета от нашего интернет магазина светильников sevenlight.ru (около 20 тыс. товаров), его можно быстро импортировать через модуль YML импорта, который есть в rapida, начиная с версии 0.0.1 (это практически полностью симпла)

sevenlight.ru.xml.gz
 
Последнее редактирование:
После установки сразу вылезло:
Catchable fatal error: Argument 1 passed to Cache::get_cache_nosql() must be an instance of string, string given, called in D:\OpenServer\domains\dev.loc\api\Products.php on line 48 and defined in D:\OpenServer\domains\dev.loc\api\Cache.php on line 315
 
После установки сразу вылезло:
Catchable fatal error: Argument 1 passed to Cache::get_cache_nosql() must be an instance of string, string given, called in D:\OpenServer\domains\dev.loc\api\Products.php on line 48 and defined in D:\OpenServer\domains\dev.loc\api\Cache.php on line 315
старая версия php, в 5 версии еще не было этой модной фишки, которую я запилил тут. уберу эту **е...., по старинке будем действовать. Эта хрень называется type hinting, зачем я ее запилил? Хотел покороче написать проверку аргументов у функций, а тут натолкнулся на этот type hinting, хорошо, что ты заметил сейчас, а то я уже успел понаделать этого добра.
Обратной совместимости нет, а пользы на 5 копеек. Уберу в следующей версии. Ты пока включи php7 просто.
 
Спасибо добрым людям, получил относительно продвинутые шаблоны, сразу стало понятно, что нужно будет дорабатывать. Чем круче шаблон, особенно, когда его сделали на каком нибудь диком фреймворке вроде Foundation, тем медленнее работает CMS. Вернее система работает также, но ощущение замедления работы видно невооруженным глазом. Поэтому в приоритетном списке для внедрения будет возможность получения данных API через ajax запросы. Сейчас в каждом шаблоне парочка своих костылей. Костыли у всех свои, поэтому систему приходится ставить под отдельных шаблон. Внедрение механизма доступа к api через ajax решит эту проблему, жаль что придется все равно шаблоны доделывать под это.

Еще надо решить вопрос с рейтингом, везде запиливают рейтинг по пятибальной системе, у нас за 2 года работы магазина никто ни разу не ткнул на эти звездочки. После упрощений соц. сетей, где есть только одна кнопка "Нравится", никто не хочет напрягать мозг и ставить оценку, как в советской школе.
Простую лайк. систему надо делать и в CMS.
<-------------- добавлено через 2215 сек. -------------->
Еще у меня несколько месяцев назад родилась идея, но довольна масштабная, поэтому я и не начал реализацию. Идея в том, чтобы прикрутить к CMS быструю систему морфологии. Мы активно использовали шаблоны с переменными для формирования заголовков и тайтлов у страниц, но предел таких манипуляций - сгенерировать "люстра красный металл для гостинной". А хотелось бы получать "красные металлические люстры для гостинной". В общем задача сделать хорошую php библиотеку морфологии. Задача реализуемая насколько я понял изучая вопрос, кто-то очень быструю морфологию делал и писал об этом на хабре. Так что это тоже дело на перспективу.
 
Назад
Сверху