Завършеноръководство (v2) Widgets - Украинска общност Yii Framework

Уиджетите са градивни елементи за многократна употреба, използвани в изгледи за създаване на сложни и персонализирани елементи на потребителския интерфейс в обектно-ориентиран подход. Например приспособлението за избор на дата ви позволява да генерирате интерактивен интерфейс за избиране на дати, предоставяйки лесен начин за потребителите на приложението да въвеждат този тип данни. Всичко, което е необходимо за свързване на джаджата, е да добавите следния код към изгледа:

Yii идва с голям брой уиджети, например: активен формуляр, меню, уиджети на jQuery UI, уиджети на Twitter Bootstrap. Следното ще въведе основна информация за джаджи. За информация относно използването на конкретен модул вижте документацията за съответния клас.

Използване на Widgets #

Widgets се използват главно в изгледи. За да използвате уиджет в изглед, просто извикайте метода yii\base\Widget::widget(). Методът приема масив от настройки за инициализиране на уиджета и връща резултата от изобразяването му. Например, следният код добавя приспособление за избор на дата, конфигурирано да използва български език като интерфейсен език на приспособлението и да съхранява входа в атрибута from_date на $model.

Някои уиджети може да имат вътрешно съдържание, което трябва да бъде поставено между извикванията на методите yii\base\Widget::begin() и yii\base\Widget::end(). Например, за генериране на формуляр за влизане, следният кодов фрагмент използва изпълнимия модул yii\widgets\ActiveForm. Тази джаджа ще генерира начални и крайни тагове на местата, където се извикват съответно методите begin() и end(). В този случай съдържанието, разположено между извикванията на посочените методи, ще бъде показано без никакви промени.

Обърнете внимание, че за разлика от метода yii\base\Widget::widget(), който връща резултата от рендирането, методът yii\base\Widget::begin() връща екземпляр на модула, който може да се използва по-късно за формиране на вътрешното му съдържание.

Задаване на глобални настройки по подразбиране #

Глобалните настройки по подразбиране за конкретен тип джаджа могат да бъдат зададени чрез DI контейнера:

Създаване на джаджи #

За да създадете уиджет, трябва да наследите класа yii\base\Widget и да замените методите yii\base\Widget::init() и/или yii\base\Widget::run(). Обикновено методът init() трябва да съдържа код, който нормализира свойствата на уиджета, а методът run() трябва да съдържа код, който връща резултата от изобразяването на уиджета. Резултатът от рендирането може да бъде изведен директно с конструкцията "echo" или върнат като низ от метода run().

В следващия пример приспособлението HelloWidget HTML-кодира и показва съдържанието, присвоено на свойството съобщение. Ако посоченото свойство не е зададено, изпълнимият модул ще покаже низа „Hello World“ като стойност по подразбиране.

За да използвате тази джаджа, просто добавете следния код към изгледа:

По-долу е даден вариант на приспособлението HelloWidget, което приема съдържание, обвито в извиквания към методите begin() и end(), кодира го в HTML и го изобразява.

Както можете да видите, изходното буфериране на PHP е активирано в метода init(), така че всички изходи между извикванията init() и run() могат да бъдат уловени, обработени и върнати на run().

Информация: Извикването на метода yii\base\Widget::begin() ще създаде нов екземпляр на уиджета, а методът init() ще бъде извикан веднага след изпълнението на останалата част от кода в конструктора на уиджета. Прикогато се извика методът yii\base\Widget::end(), методът run() ще бъде извикан и върнатата му стойност ще бъде отпечатана от метода end().

Следният кодов фрагмент съдържа пример за използване на модифицирана версия на HelloWidget:

В някои случаи може да се наложи джаджа да изобрази голям блок от съдържание. Докато това съдържание може да бъде вградено директно в метода run(), по-ефективно е да го поставите в изглед и да извикате метода yii\base\Widget::render(), за да го изобразите. Например,

По подразбиране файловете за изглед на притурка трябва да са в директорията WidgetPath/views, където WidgetPath е директорията, съдържаща файла с клас на приспособлението. По този начин, в горния пример, файлът за изглед @app/components/views/hello.php ще бъде използван за уиджета, като файлът на класа на уиджета се намира в @app/components. За да промените директорията, която съдържа изгледните файлове за изпълнимия модул, заменете метода yii\base\Widget::getViewPath().

Най-добри практики #

Уиджетите са обектно-ориентиран подход за повторно използване на кода на потребителския интерфейс.

Когато създавате джаджи, трябва да се придържате към основните принципи на концепцията MVC. Като цяло основната логика трябва да се намира в класа на джаджи, като разделя кода, отговорен за маркирането, в изгледи.

В случай, че джаджата не съдържа логика, а съдържа само кода, отговорен за показване на маркирането, тя се различава малко от презентацията. Всъщност единствената разлика е, че джаджата е отделен и лесно разпространяваем клас, докато изгледът е обикновен PHP скрипт, подходящ за използване само в конкретно приложение.