DInlineWidgetsBehavior — Встраиваем виджеты в текст страницы

Выкладываем свои наработки
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

DInlineWidgetsBehavior — Встраиваем виджеты в текст страницы

Сообщение ElisDN »

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

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

'params'=>array(
    'runtimeWidgets'=>array(
        'Share',
        'Comments',
        'Contact',
        'blog.widgets.LastPosts',
    ),
),

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

class Controller extends CController
{
    public function behaviors()
    {
        return array(
            'InlineWidgetsBehavior'=>array(
                'class'=>'application.components.DInlineWidgetsBehavior',
                'location'=>'application.components.widgets',                
                'widgets'=>Yii::app()->params['runtimeWidgets'],
                'startBlock'=> '{{w:',
                'endBlock'=> '}}',
             ),
        );
    }
}

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

$model->text = '
    <h2>Lorem ipsum</h2>

    <h2>Latest posts</h2>
    <p>{{w:LastPosts}}</p>

    <h2>Latest 4 posts</h2>
    <p>{{w:LastPosts|limit=4}}</p>

    <h2>Latest posts (custom template)</h2>
    <p>{{w:LastPosts|limit=5;tpl=small}}</p>

    <h2>Latest posts with caching</h2>    
    <p>{{w:LastPosts|limit=5;tpl=small|cache=300}}</p>

    <p>Dolor...</p>
';
echo $this->decodeWidgets($model->text);
Расширение: http://www.yiiframework.com/extension/i ... -behavior/
Код: https://github.com/ElisDN/inline-widgets-behavior
Описание: http://www.elisdn.ru/blog/13/vstraivaem ... nici-v-yii
Последний раз редактировалось ElisDN 2013.01.02, 17:19, всего редактировалось 4 раза.
Аватара пользователя
Koduc
Сообщения: 140
Зарегистрирован: 2011.02.15, 18:56

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение Koduc »

Я вот всегда, кстати, задавался вопросом: насколько оправдан подход парсинга текста таким вот образом по отношению к билдеру страницы (когда страница состоит из блоков-объектов)? У кого какие мысли на этот счет?
Разработка на Yii: monoray.ru
Открытое бесплатное решение для создания сайтов по аренде/продаже недвижимости: Open Real Estate
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение ElisDN »

Даже не знаю. В своей старой CMS таким же подходом я легко «собирал» не только контент, но и сайдбары. На допустимость этого, наверное, лишь моральные устои влияют.

Сейчас новую систему с таким «конструктором» неопытному клиенту намного удобнее и безопаснее преподносить, чем прописывать статические страницы в файлах и давать из админки прямой доступ к коду (или чем вторую Джумлу программировать). Достаточно дать описание всех доступных виджетов и научить клиента с ними играться. Примерная коллекция может быть такой:

{{youtube|id=qwer12345}}
{{flash|file=/banners/banner1.swf;w=320;h=240}}
{{gallery|folder=vecherinka2012}}
{{submenu|parent=services}}
{{lastnews|category=sport;limit=10}}
{{subpages}}

Такую вставку видео с ютуба (или такую возможность запихнуть любую галерею на абсолютно любую страницу) клиент не забудет.
Но это не значит, что нужно разрешать все виджеты. Достаточно «расшарить» для клиента несколько легковесных виджетов-хэлперов.
Alex.Sh
Сообщения: 80
Зарегистрирован: 2011.08.05, 12:38
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение Alex.Sh »

Искал что-то похожее. Спасибо.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение ElisDN »

Добавил возможность указывать полные пути типа 'blog.widgets.LastPosts'.
Аватара пользователя
AlexG
Сообщения: 35
Зарегистрирован: 2012.07.22, 21:23
Откуда: Украина, Харьков/PФ
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение AlexG »

Хорошая штука, спасибо.
Только включите error_reporting(-1) и посмотрите =)
Ищу миддла.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение ElisDN »

AlexG писал(а):Только включите error_reporting(-1) и посмотрите =)
Исправил. Спасибо.
Аватара пользователя
fad
Сообщения: 72
Зарегистрирован: 2012.02.21, 20:26

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение fad »

Автоматическое добавление 'Widget' в конце имени файла излишне!
Виджеты не обязательно должны заканчиваться этим словом.. Да и взять те же zii.widgets, нигде не встретишь с такими названиями.
PS: у себя пришлось убрать это добавление в конец имени..
Simple Yii CMS — простая CMS на Yii1 (без composer) с веб-инстяллтором и поддержкой разных БД.
Аватара пользователя
fad
Сообщения: 72
Зарегистрирован: 2012.02.21, 20:26

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение fad »

А так же - не вижу использования

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

    /**
     * @var string 'widgets.path' if needle for using Yii::import()
     */
    public $location = ''; 
Тоже - убрать..
Simple Yii CMS — простая CMS на Yii1 (без composer) с веб-инстяллтором и поддержкой разных БД.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение ElisDN »

fad писал(а):А так же - не вижу использования $location
Ну в примере

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

'params'=>array(
    'runtimeWidgets'=>array(
        'Share',
        'Comments',
        'Contact',
        'blog.widgets.LastPosts',
    ),
),
// ...
'location'=>'application.components.widgets', 
  
LastPosts подключится из blog.widgets, а все остальные из заданного расположения по умолчанию application.components.widgets
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение ElisDN »

fad писал(а):Автоматическое добавление 'Widget' в конце имени файла излишне!
Вынес суффикс в опцию 'classSuffix' (по умолчанию пустую).
Аватара пользователя
fad
Сообщения: 72
Зарегистрирован: 2012.02.21, 20:26

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение fad »

А где в коде https://github.com/ElisDN/inline-widget ... havior.php
использование $location? Я не вижу
Simple Yii CMS — простая CMS на Yii1 (без composer) с веб-инстяллтором и поддержкой разных БД.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение ElisDN »

А, Вы в этом смысле. Потерял при переходе к WidgetFactory. Вернул :-)
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение slavcodev »

преимущества перед HtmlPurifier'ом?
Жду Yii 3!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение ElisDN »

mc-bear писал(а):преимущества перед HtmlPurifier'ом?
А что у них общего?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение slavcodev »

Я имел виду 'Filter.Custom' - хотя в итоге получилось бы почти тоже самое, был бы Фильтр вместо Поведения.
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение slavcodev »

Дело в том что я не понял, для чего это расширение нужно?
Это случай когда нужен шаблонизатор, но использовать один из стандартных не хочется или не получается?
Т.е. предполагается создание представлений в админке и хранение в базе?
Жду Yii 3!
Аватара пользователя
fad
Сообщения: 72
Зарегистрирован: 2012.02.21, 20:26

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение fad »

Кстати да, можно ведь использовать в таком виде $text = $p->purify($text);
только вместо purify как раз decodeWIdgets (как в этом расширении) $text = $p->decodeWidgets($text);
ElisDN, понимаешь?

В https://github.com/yiisoft/yii/blob/1.1 ... r.php#L145 как раз есть метод createWidget() (а также beginCache(), endCache())
Simple Yii CMS — простая CMS на Yii1 (без composer) с веб-инстяллтором и поддержкой разных БД.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение ElisDN »

mc-bear писал(а):Дело в том что я не понял, для чего это расширение нужно?
Это случай когда нужен шаблонизатор, но использовать один из стандартных не хочется или не получается?
Т.е. предполагается создание представлений в админке и хранение в базе?
Ну не совсем так категорично.

Нужно, например, вставить рекламу посреди статьи блога, так вы посреди записи пишете слово [*adsense*] и ваш виджет AdsenseWidget разворачивается в этом месте при открытии прямо посреди статьи.
Нужно вывести форму обратной связи где вздумается - пишете прямо в тексте [*contactForm*] и форма появляется. Список разрешённых виджетов указывается в настройках.

А так да, с точки зрения редактора сайта это продвинутые BBCode получаются.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DInlineWidgetsBehavior — Встраиваем виджеты в текст стра

Сообщение ElisDN »

fad писал(а):Кстати да, можно ведь использовать в таком виде $text = $p->purify($text);
Ну да, легко. Поведение просто добавляет метод decodeWidgets в контроллер.

В контроллере:

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

$text = $this->decodeWidgets($text); 
в другом месте:

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

$text = Yii::app()->controller->decodeWidgets($text); 
Ответить