Перейти к содержанию
Официальный форум поддержки Simpla

pikusov

Пользователь
  • Публикаций

    883
  • Зарегистрирован

  • Посещение

  • Победитель дней

    7

Сообщения, опубликованные pikusov

  1. Ну переопределить весь метод - это самое простое.

    Главное то бы другие модули точно так же не делали...

     

    И еще вопрос: 

    А как быть с изменениями шаблонов? 

    http://www.smarty.net/docs/en/advanced.features.template.inheritance.tpl

    {block 'footer'}
    Этот блок переопределен полностью
    {/block}
    
    {block 'pagination' prepend}
    Этот текст добавится перед блоком
    {/block}
    
    {block 'categories' append}
    Этот текст добавится после блока
    {/block}
    
    
    
  2. Ну это нужно будет перелопатить весь движок. И то не получится предсказать все желания для авторов модулей...

    Вот например если нужен JOIN? (это еще простые примеры)

     

    Еще один из возможных вариантов:
    

    Я например автор модуля MyModule2. Ты MyModule1.

    Как мне знать что нужно еще тебя наследовать? Или я не так смысл понял? 

    Вам не нужно знать кого наследовать, вы наследуете класс "class MyModule1 extends MyModule1\Products" а не "class MyModule1 extends Products". Симпла в итоге сама составит цепочку наследований class MyModule2 extends class MyModule1 extends Products

     

    Если нужен join - этот пример я привел первым. Ну или, в крайнем случае, вы можете вообще весь метод переопределить. В любом случае никакой "другой" модульностью вы не сможете сделать гибче чем предлагаю я.

  3. Ну конкретно о 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');
    	}
    }
    
  4. Поддерживаю! Я об этом когда-то писал Денису, но никакой реакции.

    В этой CMS используется шаблон проектирования HMVC, что в первую очередь нужно сделать в симпле.

    Он не решает указанной проблемы, вместо этого беспощадно усложняет архитектуру.

    Наследование же оставляет код симплы таким же простым как и раньше, при этом дает возможность изменить абсолютно любой код, а не только тот, который заранее спроектирован под возможность изменения

  5. Ну конкретно о 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;
    	}
    
    }
    
    
  6. то он возьмет файл уже с правками 1го модуля и добавит туда изменения которые внесет 2й. и тд

     

    PS:

     

    Конфликты модулей по любому какие то да будут. Этого никак не избежать.

    Например 1й (модуль) добавит метод get_xx в класс Products. И 2й - так же. 

    В итоге мы получим php ошибку на дубль метода.

    С этой стороны кажется что способ через наследования - лучше (если будут приоритеты и тд). 

    Но на мой взгляд это не так. Поскольку даже так нормальной работы обоих модулей не будет.

     

    Вот например добавить поле в sql выборку товара.

    Через наследование - это нужно подменять весь метод. Тогда как вообще будут работать 2 модуля с одним методом?  

    Если автор модуля будет культурным человеком, то он просто вызовет parent::get_xx, изменит то что ему нужно и выдаст результат дальше

  7. Ну если с наследованием классов - то да. Такая проблема будет.

    Но в 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 останется без изменений

    Всё равно не очень понятно - "Он берет нужный файл, вносит в него нужные правки и сохраняет в заданную директорию". А если другой модуль уже внес туда правки?

  8. Какая аналогичная проблема? Загрузка xml-ок?

    Если да то там просто через glob их берет.

     

    /vqmod/xml/mymod1.xml сработает раньше чем /vqmod/xml/mymod2.xml

    Проблема в какой последовательности подгружать разные модули, расширяющие один и тот же код

  9. Ну в таком случае будет много проблем...

    Можно конечно попробовать в имени файла задавать приоритет. Типа mymodule.11.php

    где перед расширением приоритет, если нет - какое то дефолтное значение.

     

    А вообще у меня есть еще такое предложение:

    Я когда то думал поцепить vqmod на симплу. Немного посмотрев, вроде бы все возможности есть...

    Это и было бы довольно удобной модульностью.

    Которой бы можно было делать врезки в стандартный функционал и добавлять свой.

    Останется лишь сделать какую то директорию для пользовательских модулей. 

    Что бы не было проблем с обновлением.

     

    А как у них решается аналогичная проблема?

  10. Однозначно нет. Должно быть какое то число приоритет которое задает разработчик модуля. 

    В случае конфликта модулей - разработчик это число меняет или устраняет конфликт. 

    Поскольку администратор может привести в неработоспособность весь сайт установив неправильный порядок для каких то модулей

     

     

     

    а как модули подхватываются?

     

    Модуль это просто класс, который наследует стандартный класс симплы. Как его "подхватывать", точнее в каком порядке подхватывать - в этом и сложность. На данный момент Симпла просто смотрит в папку /extensions/ и наследует стандартные классы теми, что нашлись в папке. Проблема последовательности может возникнуть когда несколько разных модулей переопределяют или дополняют один и тот же метод класса. 

  11. И в чем конкретно сложности?

    Хранить, например, можно в базе, и порядок настраивать как обычно настраивается порядок в таблицах.

    И другие варианты есть...

    Если хранить в базе - значит данные о модулях брать из базы через class Database? Но мы не можем создать класс Database, пока не проверим не унаследован ли он каким-то модулем, возможно даже и не одним. А чтобы это узнать, нужно сначала загрузить все модули, при чем в определенном порядке. Проблема курицы и яйца.

     

    Еще на счет порядка загрузки модулей - кто вообще его должен устанавливать? Стоит ли администратору давать такие права? Пока склоняюсь к тому, что это дело программиста и класть модули в папку /extensions, а загрузку сделать через /extensions_loader.php, в котором будет список include('extensions/modulename/module.php'); и отказаться от настройки модулей в админке.

  12. Заходим сюда http://base.uipv.org/searchbul/search.php? "Украинский институт интеллектуальной собственности"

    Из выпадающего списка выбираем "Відомості про видачу патентів України на винаходи"

    Заполнить достаточно одну или две строки по желанию. Например имя владельца патента и т.п. нажимаем поиск и читаем если что то есть если там нет идем далее в выпадающем списке вверху выбираем "Відомості про видачу свідоцтв України на знаки для товарів і послуг"

    А в форме ниже в поле ключевые слова вводим что ищем.... Например rozetka и поиск выдаст зарегистрирован данный логотип или патент и т.д если нет ничего разговор короткий!

    А при чем тут патенты? Авторское право на ПО в Украине регистрируется как художественное произведение а не как патент.

  13. А что мешает просто передать объект класса 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])}
    Именно так уже и сделано в будущем релизе )
×
×
  • Создать...