Где взять компоненты
Большое количество компонентов можно найти на официальном сайте. К примеру, компонент для выбора дат "DatePicker". Чтобы воспользоваться этим компонентом, необходимо в файл нужного представления поставить следующий код:use yii\jui\DatePicker;
echo DatePicker::widget([
'language' => 'ru',
'name' => 'country',
'clientOptions' => [
'dateFormat' => 'yy-mm-dd',
],
]);
Результат будет таким:
Как создаются компоненты
Обычно классы компонентов наследуются от yii\base\Component. При этом другим классам доступны свойства, события и поведения от компонентов.Если необходимо написать простейший компонент без большого количества событий и представлений, то необходимо наследовать класс yii\base\BaseObject, а не от yii\base\Component. Это даст преимущество по скорости выполнения кода. При этом следует придерживаться следующих правил:
- При переопределении конструктора необходимо добавлять последним аргументом параметр $config, передавая его в конструктор предка. В конце переопределённого конструктора всегда необходимо вызывать конструктор предка.
- Если переопределять метод yii\base\BaseObject::init(), то нужно вызывать родительскую реализацию этого метода в начале метода init().
<?php
namespace yii\components;
use yii\base\BaseObject;
class MyClass extends BaseObject{
public $prop1;
public $prop2;
public function __construct($param1, $param2, $config = []){
// код инициализации до передачи конфигурации
parent::__construct($config);
}
public function init(){
parent::init();
// код инициализации после передачи конфигурации
}
}
При создании объектов класса yii\base\BaseObject и вызове его методов происходят следующие действия:
- Предварительная инициализация в конструкторе, где задаются значения свойств по умолчанию.
- Конфигурация объекта с помощью $config, при которой могут быть перезаписаны значения свойств по умолчанию, установленные ранее в конструкторе.
- Конфигурация после инициализации в методе init(). Этот метод можно переопределить, чтобы делать дополнительную обработку свойств.
- Вызов методов объекта.
// при создании объекта класса
$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// альтернативный способ
$component = \Yii::createObject([
'class' => MyClass::class,
'prop1' => 3,
'prop2' => 4,
], [1, 2]);