pikusov
-
Публикаций
883 -
Зарегистрирован
-
Посещение
-
Победитель дней
7
Сообщения, опубликованные pikusov
-
-
Ну переопределить весь метод - это самое простое.
Главное то бы другие модули точно так же не делали...
И еще вопрос:
А как быть с изменениями шаблонов?
http://www.smarty.net/docs/en/advanced.features.template.inheritance.tpl
{block 'footer'} Этот блок переопределен полностью {/block} {block 'pagination' prepend} Этот текст добавится перед блоком {/block} {block 'categories' append} Этот текст добавится после блока {/block}
-
Ну это нужно будет перелопатить весь движок. И то не получится предсказать все желания для авторов модулей...
Вот например если нужен JOIN? (это еще простые примеры)
Еще один из возможных вариантов:
Я например автор модуля MyModule2. Ты MyModule1.
Как мне знать что нужно еще тебя наследовать? Или я не так смысл понял?
Вам не нужно знать кого наследовать, вы наследуете класс "class MyModule1 extends MyModule1\Products" а не "class MyModule1 extends Products". Симпла в итоге сама составит цепочку наследований class MyModule2 extends class MyModule1 extends Products
Если нужен join - этот пример я привел первым. Ну или, в крайнем случае, вы можете вообще весь метод переопределить. В любом случае никакой "другой" модульностью вы не сможете сделать гибче чем предлагаю я.
-
Ну конкретно о 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'); } }
-
Поддерживаю! Я об этом когда-то писал Денису, но никакой реакции.
В этой CMS используется шаблон проектирования HMVC, что в первую очередь нужно сделать в симпле.
Он не решает указанной проблемы, вместо этого беспощадно усложняет архитектуру.
Наследование же оставляет код симплы таким же простым как и раньше, при этом дает возможность изменить абсолютно любой код, а не только тот, который заранее спроектирован под возможность изменения
-
Ну конкретно о 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; } }
-
то он возьмет файл уже с правками 1го модуля и добавит туда изменения которые внесет 2й. и тд
PS:
Конфликты модулей по любому какие то да будут. Этого никак не избежать.
Например 1й (модуль) добавит метод get_xx в класс Products. И 2й - так же.
В итоге мы получим php ошибку на дубль метода.
С этой стороны кажется что способ через наследования - лучше (если будут приоритеты и тд).
Но на мой взгляд это не так. Поскольку даже так нормальной работы обоих модулей не будет.
Вот например добавить поле в sql выборку товара.
Через наследование - это нужно подменять весь метод. Тогда как вообще будут работать 2 модуля с одним методом?
Если автор модуля будет культурным человеком, то он просто вызовет parent::get_xx, изменит то что ему нужно и выдаст результат дальше
-
то он возьмет файл уже с правками 1го модуля и добавит туда изменения которые внесет 2й. и тд
Но автор модуля не может знать на чистую систему его поставят или поверх других модулей
-
Ну если с наследованием классов - то да. Такая проблема будет.
Но в 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 останется без изменений
Всё равно не очень понятно - "Он берет нужный файл, вносит в него нужные правки и сохраняет в заданную директорию". А если другой модуль уже внес туда правки?
-
Какая аналогичная проблема? Загрузка xml-ок?
Если да то там просто через glob их берет.
/vqmod/xml/mymod1.xml сработает раньше чем /vqmod/xml/mymod2.xml
Проблема в какой последовательности подгружать разные модули, расширяющие один и тот же код
-
Ну в таком случае будет много проблем...
Можно конечно попробовать в имени файла задавать приоритет. Типа mymodule.11.php
где перед расширением приоритет, если нет - какое то дефолтное значение.
А вообще у меня есть еще такое предложение:
Я когда то думал поцепить vqmod на симплу. Немного посмотрев, вроде бы все возможности есть...
Это и было бы довольно удобной модульностью.
Которой бы можно было делать врезки в стандартный функционал и добавлять свой.
Останется лишь сделать какую то директорию для пользовательских модулей.
Что бы не было проблем с обновлением.
А как у них решается аналогичная проблема?
-
Однозначно нет. Должно быть какое то число приоритет которое задает разработчик модуля.
В случае конфликта модулей - разработчик это число меняет или устраняет конфликт.
Поскольку администратор может привести в неработоспособность весь сайт установив неправильный порядок для каких то модулей
а как модули подхватываются?
Модуль это просто класс, который наследует стандартный класс симплы. Как его "подхватывать", точнее в каком порядке подхватывать - в этом и сложность. На данный момент Симпла просто смотрит в папку /extensions/ и наследует стандартные классы теми, что нашлись в папке. Проблема последовательности может возникнуть когда несколько разных модулей переопределяют или дополняют один и тот же метод класса.
-
И в чем конкретно сложности?
Хранить, например, можно в базе, и порядок настраивать как обычно настраивается порядок в таблицах.
И другие варианты есть...
Если хранить в базе - значит данные о модулях брать из базы через class Database? Но мы не можем создать класс Database, пока не проверим не унаследован ли он каким-то модулем, возможно даже и не одним. А чтобы это узнать, нужно сначала загрузить все модули, при чем в определенном порядке. Проблема курицы и яйца.
Еще на счет порядка загрузки модулей - кто вообще его должен устанавливать? Стоит ли администратору давать такие права? Пока склоняюсь к тому, что это дело программиста и класть модули в папку /extensions, а загрузку сделать через /extensions_loader.php, в котором будет список include('extensions/modulename/module.php'); и отказаться от настройки модулей в админке.
-
Можно узнать что за сложности?
Например как настраивать порядок загрузки модулей и где этот порядок хранить
-
Пока не удается обойти некоторые сложности с модульностью, как только получится - выйдет бета
-
Спасибо большое, Денис, но Не работает.. все время капчу выдает.
Видимо яндексу не нравится ip вашего сервера. Попробуйте через прокси (настройки прокси вносить можно в этом же файле)
-
У яндекса изменился формат капчи. Вот новый get_info.php, его нужно обновить в папке /simpla/ajax
-
Заходим сюда http://base.uipv.org/searchbul/search.php? "Украинский институт интеллектуальной собственности"
Из выпадающего списка выбираем "Відомості про видачу патентів України на винаходи"
Заполнить достаточно одну или две строки по желанию. Например имя владельца патента и т.п. нажимаем поиск и читаем если что то есть если там нет идем далее в выпадающем списке вверху выбираем "Відомості про видачу свідоцтв України на знаки для товарів і послуг"
А в форме ниже в поле ключевые слова вводим что ищем.... Например rozetka и поиск выдаст зарегистрирован данный логотип или патент и т.д если нет ничего разговор короткий!
А при чем тут патенты? Авторское право на ПО в Украине регистрируется как художественное произведение а не как патент.
-
Noxter прав, api гугла в симпле не используется
-
Обновите файл /simpla/ajax/get_info.php
-
Действительно, спасибо
-
Там же <base href> есть, так что все пути от него начинаются
-
А откуда такая информация?говорят что автор её забросил.
-
Именно так уже и сделано в будущем релизе )А что мешает просто передать объект класса simpla?
в api/Design.php в конструктор добавить:
$this->smarty->assign('simpla', $this);
и далее в шаблоне вызывать:
{$my_product=$simpla->products->get_product(5)}
и так можно что угодно получить
{$featured_products=$simpla->products->get_products(['featured'=>1, 'in_stock'=>true])}
-
На демо парсер не обновлялся, а у себя посмотрите какая ошибка по такому адресу сайт/simpla/ajax/get_info.php?keyword=HTC%20Sensation"Error: parsererror" что на моем сайте, что на демо demo.simplacms.ru
Когда выйдет обновление?
в Новости Simpla CMS
Опубликовано
Откуда такая информация?