yr4ik Posted October 5, 2016 Report Share Posted October 5, 2016 Проблема в какой последовательности подгружать разные модули, расширяющие один и тот же код Ну если с наследованием классов - то да. Такая проблема будет.Но в vqmod то нет этого... Там в итоге получится один закешированный файл со всеми внесенными правками который и будет выполнятся... Там ведь суть какая:Нужные include|require подменяются на обработчик vqmod.Далее он читает xml-файлы (модули) в которых прописаны какие файлы и что в них поменять.Он берет нужный файл, вносит в него нужные правки и сохраняет в заданную директорию.Если файлы не менялись то он берет уже сформированный. Вот небольшой пример как бы выглядел модуль на добавление поля "field_xx" к sql выборке товара <?xml version="1.0" encoding="UTF-8"?> <modification> <id>product_field_xx</id> <version>1</version> <vqmver required="true">2.5.0</vqmver> <author>yr4ik</author> <file name="api/Products.php"> <search position="after">p.name,</search> <add>p.field_xx,</add> </file> </modification> В итоге данный xml сделает кеш-файл в определенной папке с именем api_Products.php и уже с измененным запросом SELECT.В результате будет выполнятся не api/Products.php, а api_Products.php.А api/Products.php останется без изменений Link to post Share on other sites
pikusov Posted October 5, 2016 Report Share Posted October 5, 2016 Ну если с наследованием классов - то да. Такая проблема будет.Но в vqmod то нет этого... Там в итоге получится один закешированный файл со всеми внесенными правками который и будет выполнятся... Там ведь суть какая:Нужные include|require подменяются на обработчик vqmod.Далее он читает xml-файлы (модули) в которых прописаны какие файлы и что в них поменять.Он берет нужный файл, вносит в него нужные правки и сохраняет в заданную директорию.Если файлы не менялись то он берет уже сформированный. Вот небольшой пример как бы выглядел модуль на добавление поля "field_xx" к sql выборке товара <?xml version="1.0" encoding="UTF-8"?> <modification> <id>product_field_xx</id> <version>1</version> <vqmver required="true">2.5.0</vqmver> <author>yr4ik</author> <file name="api/Products.php"> <search position="after">p.name,</search> <add>p.field_xx,</add> </file> </modification> В итоге данный xml сделает кеш-файл в определенной папке с именем api_Products.php и уже с измененным запросом SELECT.В результате будет выполнятся не api/Products.php, а api_Products.php.А api/Products.php останется без измененийВсё равно не очень понятно - "Он берет нужный файл, вносит в него нужные правки и сохраняет в заданную директорию". А если другой модуль уже внес туда правки? Link to post Share on other sites
Noxter Posted October 5, 2016 Report Share Posted October 5, 2016 Таблица s_products унаследовала ненужные индексы от старых версий, предлагаю их удалить в следующем релизе. Link to post Share on other sites
yr4ik Posted October 5, 2016 Report Share Posted October 5, 2016 (edited) Всё равно не очень понятно - "Он берет нужный файл, вносит в него нужные правки и сохраняет в заданную директорию". А если другой модуль уже внес туда правки? то он возьмет файл уже с правками 1го модуля и добавит туда изменения которые внесет 2й. и тд PS: Конфликты модулей по любому какие то да будут. Этого никак не избежать.Например 1й (модуль) добавит метод get_xx в класс Products. И 2й - так же. В итоге мы получим php ошибку на дубль метода.С этой стороны кажется что способ через наследования - лучше (если будут приоритеты и тд). Но на мой взгляд это не так. Поскольку даже так нормальной работы обоих модулей не будет. Вот например добавить поле в sql выборку товара.Через наследование - это нужно подменять весь метод. Тогда как вообще будут работать 2 модуля с одним методом? Edited October 5, 2016 by yr4ik Link to post Share on other sites
pikusov Posted October 5, 2016 Report Share Posted October 5, 2016 то он возьмет файл уже с правками 1го модуля и добавит туда изменения которые внесет 2й. и тд Но автор модуля не может знать на чистую систему его поставят или поверх других модулей Link to post Share on other sites
yr4ik Posted October 5, 2016 Report Share Posted October 5, 2016 (edited) Но автор модуля не может знать на чистую систему его поставят или поверх других модулей Ну эта проблема везде будет присутствовать... Edited October 5, 2016 by yr4ik Link to post Share on other sites
pikusov Posted October 5, 2016 Report Share Posted October 5, 2016 то он возьмет файл уже с правками 1го модуля и добавит туда изменения которые внесет 2й. и тд PS: Конфликты модулей по любому какие то да будут. Этого никак не избежать.Например 1й (модуль) добавит метод get_xx в класс Products. И 2й - так же. В итоге мы получим php ошибку на дубль метода.С этой стороны кажется что способ через наследования - лучше (если будут приоритеты и тд). Но на мой взгляд это не так. Поскольку даже так нормальной работы обоих модулей не будет. Вот например добавить поле в sql выборку товара.Через наследование - это нужно подменять весь метод. Тогда как вообще будут работать 2 модуля с одним методом? Если автор модуля будет культурным человеком, то он просто вызовет parent::get_xx, изменит то что ему нужно и выдаст результат дальше Link to post Share on other sites
yr4ik Posted October 5, 2016 Report Share Posted October 5, 2016 Если автор модуля будет культурным человеком, то он просто вызовет parent::get_xx, изменит то что ему нужно и выдаст результат дальше Ну конкретно о sql запросе. 2 модуля на добавление поля field1 (модуль1) и field2 (модуль2) в запрос на get_product. Как будут выглядеть модули через наследование? Link to post Share on other sites
ABSORBER Posted October 6, 2016 Report Share Posted October 6, 2016 На мой взгляд, удачная архитектура модульности предложена в ImageCMS. Link to post Share on other sites
Noxter Posted October 6, 2016 Report Share Posted October 6, 2016 На мой взгляд, удачная архитектура модульности предложена в ImageCMS.Поддерживаю! Я об этом когда-то писал Денису, но никакой реакции.В этой CMS используется шаблон проектирования HMVC, что в первую очередь нужно сделать в симпле. Link to post Share on other sites
pikusov Posted October 6, 2016 Report Share Posted October 6, 2016 Ну конкретно о sql запросе. 2 модуля на добавление поля field1 (модуль1) и field2 (модуль2) в запрос на get_product. Как будут выглядеть модули через наследование? Во-первых в get_product будет запрос SELECT * - так что поле подтянется само, если есть в базеЕсли же эти поля, например, внешние ключи от других таблиц, то два модуля могут выглядеть примерно так: class MyModule1 extends MyModule1\Products { public function get_product($id) { $product = parent::get_product($id); $product->some_data1 = $this->db->***; return $product; } } class MyModule2 extends MyModule2\Products { public function get_product($id) { $product = parent::get_product($id); $product->some_data2 = $this->db->***; return $product; } } Link to post Share on other sites
pikusov Posted October 6, 2016 Report Share Posted October 6, 2016 Поддерживаю! Я об этом когда-то писал Денису, но никакой реакции.В этой CMS используется шаблон проектирования HMVC, что в первую очередь нужно сделать в симпле.Он не решает указанной проблемы, вместо этого беспощадно усложняет архитектуру.Наследование же оставляет код симплы таким же простым как и раньше, при этом дает возможность изменить абсолютно любой код, а не только тот, который заранее спроектирован под возможность изменения Link to post Share on other sites
pikusov Posted October 6, 2016 Report Share Posted October 6, 2016 Ну конкретно о sql запросе. 2 модуля на добавление поля field1 (модуль1) и field2 (модуль2) в запрос на get_product. Как будут выглядеть модули через наследование? Еще один из возможных вариантов: class Products extends Simpla { protected fields = array('name', 'price'); public function get_product($id) { $this->db->query('SEELCT ?@ FROM products WHERE id=?', $this->fields, $id); return $this->db->result(); } } class MyModule1 extends MyModule1\Products { public function __construct() { parent::__construct(); $this->fields = array_push(parent::$fields, 'новоеполе1'); } } class MyModule1 extends MyModule2\Products { public function __construct() { parent::__construct(); $this->fields = array_push(parent::$fields, 'новоеполе2'); } } Link to post Share on other sites
ABSORBER Posted October 6, 2016 Report Share Posted October 6, 2016 Он не решает указанной проблемы, вместо этого беспощадно усложняет архитектуру.Наследование же оставляет код симплы таким же простым как и раньше, при этом дает возможность изменить абсолютно любой код, а не только тот, который заранее спроектирован под возможность измененияПри HMVC не сильно то и усложнится архитектура.Любой веб-программист, разбирающийся в MVC, с легкостью напишет модуль под CMS.Если вы боитесь увеличить код ядра на 2 тысячи строк, тогда да... Это проблема. К примеру когда писал модуль для ImageCMS, мне понадобилось менее 4х дней на создание конструктора форм.Достаточно просто написать вменяемую документацию для разработчиков. Link to post Share on other sites
ABSORBER Posted October 6, 2016 Report Share Posted October 6, 2016 Для новой версии я бы перевел класс database в Query Builder, типа того как используется в LaravelОчень удобная вещь! Link to post Share on other sites
yr4ik Posted October 6, 2016 Report Share Posted October 6, 2016 Во-первых в get_product будет запрос SELECT * - так что поле подтянется само, если есть в базеЕсли же эти поля, например, внешние ключи от других таблиц, то два модуля могут выглядеть примерно так: Ну это нужно будет перелопатить весь движок. И то не получится предсказать все желания для авторов модулей...Вот например если нужен JOIN? (это еще простые примеры) Еще один из возможных вариантов: Я например автор модуля MyModule2. Ты MyModule1.Как мне знать что нужно еще тебя наследовать? Или я не так смысл понял? Link to post Share on other sites
pikusov Posted October 6, 2016 Report Share Posted October 6, 2016 Ну это нужно будет перелопатить весь движок. И то не получится предсказать все желания для авторов модулей...Вот например если нужен JOIN? (это еще простые примеры) Еще один из возможных вариантов: Я например автор модуля MyModule2. Ты MyModule1.Как мне знать что нужно еще тебя наследовать? Или я не так смысл понял? Вам не нужно знать кого наследовать, вы наследуете класс "class MyModule1 extends MyModule1\Products" а не "class MyModule1 extends Products". Симпла в итоге сама составит цепочку наследований class MyModule2 extends class MyModule1 extends Products Если нужен join - этот пример я привел первым. Ну или, в крайнем случае, вы можете вообще весь метод переопределить. В любом случае никакой "другой" модульностью вы не сможете сделать гибче чем предлагаю я. Link to post Share on other sites
yr4ik Posted October 6, 2016 Report Share Posted October 6, 2016 (edited) Вам не нужно знать кого наследовать, вы наследуете класс "class MyModule1 extends MyModule1\Products" а не "class MyModule1 extends Products". Симпла в итоге сама составит цепочку наследований class MyModule2 extends class MyModule1 extends Products Если нужен join - этот пример я привел первым. Ну или, в крайнем случае, вы можете вообще весь метод переопределить. В любом случае никакой "другой" модульностью вы не сможете сделать гибче чем предлагаю я. Ну переопределить весь метод - это самое простое.Главное то бы другие модули точно так же не делали... И еще вопрос: А как быть с изменениями шаблонов? Edited October 6, 2016 by yr4ik Link to post Share on other sites
Kors Posted October 6, 2016 Report Share Posted October 6, 2016 Ну переопределить весь метод - это самое простое.Главное то бы другие модули точно так же не делали... И какая же получается модульность? Вот я один буду как барин - что хочу, то и ворочу, и вы там, все прочие, делайте аккуратно и по мелочи только, чтоб мой великий код не попортить... Пока все похоже на дележ шкуры неубитого медведя... Вы бы привели со своей модульностью какой нибудь несложный, но реально полезный пример. Скажем, так:модуль 1 добавляет поле в таблицу заказов и покупателей, чтобы новое поле работало везде, где работают текущие,модуль 2 добавляет поле только в таблицу заказов,модуль 3 добавляет поле только в таблицу покупателей,модуль 4 добавляет ДВА поля только в таблицу покупателей, при регистрации требуется, чтобы хотя бы одно из полей было заполнено,модуль 5 добавляет ДВА поля только в таблицу заказов, при заказе требуется, чтобы хотя бы одно из полей было заполнено. Как это будет выглядеть реально код, очень интересно бы посмотреть. Я пока слабо представить, как примерно надо писать подобные модулей, чтоб можно было эти модули ставить в разных вариациях и все работало... Link to post Share on other sites
yr4ik Posted October 6, 2016 Report Share Posted October 6, 2016 (edited) опять началось!Корс хватит флудить! Вот тебе форум. Там оценят твои способности по достоинству Все то что ты пишешь обсуждалось еще начиная с #20 поста Edited October 6, 2016 by yr4ik Link to post Share on other sites
pikusov Posted October 7, 2016 Report Share Posted October 7, 2016 Ну переопределить весь метод - это самое простое.Главное то бы другие модули точно так же не делали... И еще вопрос: А как быть с изменениями шаблонов? http://www.smarty.net/docs/en/advanced.features.template.inheritance.tpl {block 'footer'} Этот блок переопределен полностью {/block} {block 'pagination' prepend} Этот текст добавится перед блоком {/block} {block 'categories' append} Этот текст добавится после блока {/block} Link to post Share on other sites
yr4ik Posted October 7, 2016 Report Share Posted October 7, 2016 http://www.smarty.net/docs/en/advanced.features.template.inheritance.tpl {block 'footer'} Этот блок переопределен полностью {/block} {block 'pagination' prepend} Этот текст добавится перед блоком {/block} {block 'categories' append} Этот текст добавится после блока {/block} Ну это опять же потребует правок для адаптации по всему движку...Ну ладно, будем ждать релиза. По поводу приоритета модулей вижу 2 варианта:1) Использовать имена файлов модулей и читать по очереди просто. Или можно добавить жесткие требования к имени и тогда даже грузить их по необходимости. пример: products_1_mymodule.php 2) Через какой то пусковой файл который будет хранить настройки заданные юзером (вкл/выкл, приоритет + может еще что то). Link to post Share on other sites
Julius123 Posted October 7, 2016 Report Share Posted October 7, 2016 Предлагаю еще сделать адаптивный шаблон админки. Очень часто приходится заходить в админку со смартфона и сайзить пальцами чтобы что-то увидеть. Link to post Share on other sites
Noxter Posted October 8, 2016 Report Share Posted October 8, 2016 Предлагаю еще сделать адаптивный шаблон админки. Очень часто приходится заходить в админку со смартфона и сайзить пальцами чтобы что-то увидеть.Это нужно -1% владельцам магазина. Link to post Share on other sites
Kors Posted October 8, 2016 Report Share Posted October 8, 2016 Предлагаю еще сделать адаптивный шаблон админки. Очень часто приходится заходить в админку со смартфона и сайзить пальцами чтобы что-то увидеть. Возникал уже подобный вопрос. Аж 4 спеца взялись и анносировали скорый выпуск "адаптивной админки". Но времени прошло более года, оные спецы из темы ушли, по вопросу глухо молчат. Разве что могут отвечать с агрессией в сторону спрашивающего, когда в теме спросят - как мол, ребята, дела - вроде как пообещали выложить "скоро", а месяцы и даже годы бегут... Тот же Noxter в той теме писал1. "Моя наработка (будет бесплатна), делаю понемногу, использую Bootstrap v3.3.2 (намного новее чем ТС)."2. "Мой знакомый занимается тем же самым, скорее всего он быстрее закончит чем ТС и выложит бесплатно."Было это более года тому назад. Сравните с тем, что он сообщает теперь... Должно, не потянули спецы работу, оказалась сложнее, чем думали... Подробности тут:http://forum.simplacms.ru/topic/6727-%D0%B2-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5-bootstrap-simpla-admin/page-3?do=findComment&comment=90717 Link to post Share on other sites
Recommended Posts