CWidgetFactory
| Пакет | system.web |
|---|---|
| Наследование | class CWidgetFactory » CApplicationComponent » CComponent |
| Реализует | IApplicationComponent, IWidgetFactory |
| С версии | 1.1 |
| Исходный код | framework/web/CWidgetFactory.php |
CWidgetFactory используется в качестве компонента приложения по умолчанию "widgetFactory".
При вызове CBaseController::createWidget, CBaseController::widget или CBaseController::beginWidget, если компонент "widgetFactory" установлен, он будет использован для создания запрошенного виджета. Для установки компонента "widgetFactory" необходимо следующее конфигурирование приложения:
return array(
'components'=>array(
'widgetFactory'=>array(
'class'=>'CWidgetFactory',
),
),
)
CWidgetFactory реализует функцию "skin", которая позволяет создать и инициализировать новый виджет с набором предопределённых значений свойств (называемых skin).
Когда CWidgetFactory используется для создания нового виджета, он сначала создаёт экземпляр виджета. Затем он проверяет, доступен ли skin для этого виджета в соответствии с именем класса виджета и свойством виджета CWidget::skin. Если skin найден, он будет объединён с начальными свойствами, переданными через createWidget. Затем объединённые начальные свойства будут использованы для инициализации вновь созданного экземпляра виджета.
Как уже упоминалось, skin — это набор начальных значений свойств для виджета. Поэтому он представлен как ассоциативный массив пар имя-значение. Skins хранятся в скриптах PHP, как и другие конфигурации. Каждый скрипт файла хранит skins для определённого типа виджета и называется именем класса виджета (например, CLinkPager.php). Каждый тип виджета может иметь один или несколько skins, идентифицируемых именем skin, заданным свойством CWidget::skin. Если свойство CWidget::skin не задано для данного виджета, будет использован default skin. Ниже показаны возможные skins для виджета CLinkPager:
return array(
'default'=>array(
'nextPageLabel'=>'>>',
'prevPageLabel'=>'<<',
),
'short'=>array(
'header'=>'',
'maxButtonCount'=>5,
),
);
В данном примере два skins. Первый — default skin, индексируемый строкой "default". Обратите внимание, что CWidget::skin по умолчанию равен "default". Поэтому это skin, который будет применён, если свойство CWidget::skin не указано явно. Второй skin называется "short" и будет использован только тогда, когда мы установим CWidget::skin в "short". По умолчанию CWidgetFactory ищет skin виджета в каталоге "skins" текущей папки представлений приложения CWebApplication::viewPath (например, protected/views/skins). Если используется тема, он будет искать skin в каталоге "skins" папки представлений темы CTheme::viewPath (а также в указанном выше каталоге skin). Если указанный skin не найден, виджет по-прежнему будет создан без ошибок.
Свойства публичного доступа
| Свойство | Тип | Описание | Определено в |
|---|---|---|---|
| behaviors | массив | Поведения, которые должны быть присоединены к данному компоненту. | CApplicationComponent |
| enableSkin | логическое | Включить ли механизм skinning для виджетов. | CWidgetFactory |
| isInitialized | логическое | Проверяет, был ли инициализирован компонент приложения. | CApplicationComponent |
| skinPath | строка | Директория, содержащая все файлы skin. | CWidgetFactory |
| skinnableWidgets | массив | Список имён классов виджетов, которые можно skin. | CWidgetFactory |
| widgets | массив | Начальные значения свойств виджета. | CWidgetFactory |
Методы публичного доступа
| Метод | Описание | Определено в |
|---|---|---|
| __call() | Вызывает метод, который не является методом класса. | CComponent |
| __get() | Возвращает значение свойства, список обработчиков событий или поведение на основе его имени. | CComponent |
| __isset() | Проверяет, является ли значение свойства null. | CComponent |
| __set() | Устанавливает значение свойства компонента. | CComponent |
| __unset() | Устанавливает свойство компонента в null. | CComponent |
| asa() | Возвращает объект поведения с заданным именем. | CComponent |
| attachBehavior() | Присоединяет поведение к компоненту. | CComponent |
| attachBehaviors() | Присоединяет список поведений к компоненту. | CComponent |
| attachEventHandler() | Присоединяет обработчик событий к событию. | CComponent |
| canGetProperty() | Определяет, можно ли прочитать свойство. | CComponent |
| canSetProperty() | Определяет, можно ли установить свойство. | CComponent |
| createWidget() | Создаёт новый виджет на основе заданного имени класса и начальных свойств. | CWidgetFactory |
| detachBehavior() | Отсоединяет поведение от компонента. | CComponent |
| detachBehaviors() | Отсоединяет все поведения от компонента. | CComponent |
| detachEventHandler() | Отсоединяет существующий обработчик событий. | CComponent |
| disableBehavior() | Отключает присоединённое поведение. | CComponent |
| disableBehaviors() | Отключает все присоединённые поведения компонента. | CComponent |
| enableBehavior() | Включает присоединённое поведение. | CComponent |
| enableBehaviors() | Включает все присоединённые к компоненту поведения. | CComponent |
| evaluateExpression() | Вычисляет PHP выражение или обратный вызов в контексте этого компонента. | CComponent |
| getEventHandlers() | Возвращает список присоединённых обработчиков событий для события. | CComponent |
| getIsInitialized() | Проверяет, был ли инициализирован компонент приложения. | CApplicationComponent |
| hasEvent() | Определяет, определено ли событие. | CComponent |
| hasEventHandler() | Проверяет, есть ли у события присоединённые обработчики. | CComponent |
| hasProperty() | Определяет, определено ли свойство. | CComponent |
| init() | Инициализирует компонент приложения. | CWidgetFactory |
| raiseEvent() | Вызывает событие. | CComponent |
Методы защищённого доступа
| Метод | Описание | Определено в |
|---|---|---|
| getSkin() | Возвращает skin для указанного класса виджета и имени skin. | CWidgetFactory |
Подробное описание свойств
enableSkin свойство (доступно начиная с v1.1.3)
public boolean $enableSkin;
включить ли оформление виджетов. По умолчанию значение false.
См. также
skinPath свойство
public string $skinPath;
директория, содержащая все файлы оформления. По умолчанию null, что означает использование директории "skins" в CWebApplication::viewPath текущего приложения.
skinnableWidgets свойство (доступно начиная с v1.1.3)
public array $skinnableWidgets;
список имен классов виджетов, которые можно оформить. Поскольку оформление виджетов влияет на производительность, вы можете указать это свойство, чтобы ограничить оформление только определёнными виджетами. Виджеты, которые не находятся в этом списке, не будут оформляться. По умолчанию значение null, что означает, что все виджеты можно оформлять.
widgets свойство (доступно начиная с v1.1.3)
public array $widgets;
начальные значения свойств виджетов. Каждая пара ключ-значение массива представляет начальные значения свойств для одного класса виджетов, при этом ключом массива является имя класса виджета, а значением массива — массив начальных значений свойств. Например,
array(
'CLinkPager'=>array(
'maxButtonCount'=>5,
'cssFile'=>false,
),
'CJuiDatePicker'=>array(
'language'=>'ru',
),
)
Обратите внимание, что начальные значения, указанные здесь, могут быть переопределены значениями, заданными в вызовах CBaseController::createWidget. Они также могут быть переопределены оформлением виджетов, если enableSkin имеет значение true.
Подробное описание методов
createWidget() метод
public CWidget createWidget(CBaseController $owner, string $className, array $properties=array ( )) | ||
| $owner | CBaseController | владелец нового виджета |
| $className | string | имя класса виджета. Это также может быть псевдоним пути (например, system.web.widgets.COutputCache) |
| $properties | array | начальные значения свойств виджета (имя=>значение). |
| {return} | CWidget | новый созданный виджет, свойства которого были инициализированы заданными значениями. |
public function createWidget($owner,$className,$properties=array())
{
$className=Yii::import($className,true);
$widget=new $className($owner);
if(isset($this->widgets[$className]))
$properties=$properties===array() ? $this->widgets[$className] : CMap::mergeArray($this->widgets[$className],$properties);
if($this->enableSkin)
{
if($this->skinnableWidgets===null || in_array($className,$this->skinnableWidgets))
{
$skinName=isset($properties['skin']) ? $properties['skin'] : 'default';
if($skinName!==false && ($skin=$this->getSkin($className,$skinName))!==array())
$properties=$properties===array() ? $skin : CMap::mergeArray($skin,$properties);
}
}
foreach($properties as $name=>$value)
$widget->$name=$value;
return $widget;
}
Создаёт новый виджет на основе заданного имени класса и начальных свойств.
getSkin() метод
protected array getSkin(string $className, string $skinName) | ||
| $className | string | имя класса виджета |
| $skinName | string | имя оформления виджета |
| {return} | array | оформление (имя=>значение) для виджета |
protected function getSkin($className,$skinName)
{
if(!isset($this->_skins[$className][$skinName]))
{
$skinFile=$this->skinPath.DIRECTORY_SEPARATOR.$className.'.php';
if(is_file($skinFile))
$this->_skins[$className]=require($skinFile);
else
$this->_skins[$className]=array();
if(($theme=Yii::app()->getTheme())!==null)
{
$skinFile=$theme->getSkinPath().DIRECTORY_SEPARATOR.$className.'.php';
if(is_file($skinFile))
{
$skins=require($skinFile);
foreach($skins as $name=>$skin)
$this->_skins[$className][$name]=$skin;
}
}
if(!isset($this->_skins[$className][$skinName]))
$this->_skins[$className][$skinName]=array();
}
return $this->_skins[$className][$skinName];
}
Возвращает оформление для указанного класса виджета и имени оформления.
init() метод
public void init() |
public function init()
{
parent::init();
if($this->enableSkin && $this->skinPath===null)
$this->skinPath=Yii::app()->getViewPath().DIRECTORY_SEPARATOR.'skins';
}
Инициализирует компонент приложения. Этот метод переопределяет реализацию родительского класса, разрешая путь к оформлению.
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CWidgetFactory