Предложение по расширению функциональности классов виджетов

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
psiloger
Сообщения: 2
Зарегистрирован: 2014.01.18, 12:34

Предложение по расширению функциональности классов виджетов

Сообщение psiloger »

Доброго времени суток, прежде чем приступить к предложению немного вступления, с вашего позволения :)

Не давно расширяя codeigniter с адаптацией под YII (текущий проект должен быть переписан под YII, но пока работа идёт на CI), сделал разделение на виджеты.
Метод запускающий виджет является "Шаблонным методом" и как правило в нём можно применить принцип проектирования "Не вызывайте нас - мы вас сами вызовем".

В каждом более-менее среднем проекте существует масса динамичных бизнес правил, которые регламентируют показ той или иной повторяющейся части страницы/функциональности, то есть виджета.
Соответственно выше принцип можно применить и здесь в виде, так называемых "перехватчиков", в которых возможны регламентации бизнес/логическими правилами для отображения виджета.
Вот "шаблонный метод" виджета (YII2):

Код: Выделить всё

/**
         * Creates a widget instance and runs it.
         * The widget rendering result is returned by this method.
         * @param array $config name-value pairs that will be used to initialize the object properties
         * @return string the rendering result of the widget.
         */
        public static function widget($config = [])
        {
                ob_start();
                ob_implicit_flush(false);
                /** @var Widget $widget */
                $config['class'] = get_called_class();
                $widget = Yii::createObject($config);
                $widget->run();
                return ob_get_clean();
        }
Предложение ввести "перехватчик" для динамического определения субклассами отображения виджета на уровне ядра или задания правила "клиентом":

Код: Выделить всё

class Widget extends Component implements ViewContextInterface
{
    /*
    *  Флаг позволяет определить правило отображения клиентом
    */
    public $isShow = null;

/**
         * Creates a widget instance and runs it.
         * The widget rendering result is returned by this method.
         * @param array $config name-value pairs that will be used to initialize the object properties
         * @return string the rendering result of the widget.
         */
        public static function widget($config = [])
        {
                // По иерархии приоритетности правила определения "клиентом" выше самого виджета
                if ($this->isShow === true || ($this->isShow === null && $this->isShow() === true)) {
                    ob_start();
                    ob_implicit_flush(false);
                    /** @var Widget $widget */
                    $config['class'] = get_called_class();
                    $widget = Yii::createObject($config);
                    $widget->run();
                    return ob_get_clean();
                }
                else {
                    return '';
               }
        }

     /*
      * Перехватчик позволяет задать правило отбражения виджетом
      *  @return bool
      */
     public function isShow(){ return true; }
Такая структура в моём проекте текущем хорошо себя оправдала в гибкости.
Так как виджет и шаблон являются представлениями тем самым не нарушаем, если правила отображения вносим на этом уровне. Сами определения правил можно просто делегировать другим классам (бизнес-логики).

Прошу не судить строго, я из своего опыта :)
Спасибо за отклики.

Извиняюсь если не в ту ветку, может это коснётся всех версий?
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Предложение по расширению функциональности классов видже

Сообщение maleks »

Внутри public static function widget не будет никакого $this
psiloger
Сообщения: 2
Зарегистрирован: 2014.01.18, 12:34

Re: Предложение по расширению функциональности классов видже

Сообщение psiloger »

Не важно, это можно поправить, сам смысл расширения функциональности виджета.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Предложение по расширению функциональности классов видже

Сообщение maleks »

psiloger писал(а):Не важно, это можно поправить,
поправьте
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Предложение по расширению функциональности классов видже

Сообщение Ekstazi »

Эм, если я правильно понял, то вы переизобрели CWidgetFactory
Ответить