Сегодня хочу показать небольшую особенность, которую нужно учитывать при разработке виджетов для фреймворка Yii.
В большинстве случаев, виджеты состоят из файла самого виджета и файла с представлением.
Например, у нас есть файлы.
protected/components/MyWidget.php
– класс виджета
и
protected/components/views/myWidget.php
– представление.
Класс виджета может выглядеть примерно так.
class MyWidget extends CWidget { public function run() { $this->render('myWidget'); } }
А в представлении можно записать что-то вроде
<h1>Привет!</h1>
В таком варианте все будет прекрасно работать, но пользы от такого виджета немного.
Часто в представлении нужно показать какие-нибудь данные. Они могут быть получены откуда угодно: из модели, из конфигурационной файла, из параметров запроса и т.д.
При этом, передавать их в представление удобнее всего если они сохранены в виде ассоциативного массива, т.к. метод render
принимает во втором параметре именно массив.
Теперь представьте такую ситуацию. Мы создаем виджет, для работы которого нужна группа параметров. При этом, возможно, часть из них нужно будет изменять для настройки виджета под конкретный проект.
Т.е. код выглядит приблизительно так
class MyWidget extends CWidget { public $params = array( 'parameter 1'=>'value 1', 'parameter 2'=>'value 2', 'parameter 3'=>'value 3', ); public function run() { $this->render('myWidget', $this->params); } }
Теперь взгляните на код вставки виджета на страницу.
$this->widget('application.components.MyWidget');
Тут все отлично, но что если мы захотим изменить 'parameter 3
'? Во втором параметре метода widget мы можем передать наши значения.
$this->widget('application.components.MyWidget', array( 'params'=>array( 'parameter 3'=>'new value 3', ); ));
Но такой вызов перезапишет весь массив $params
, т.е. 'parameter 1'
и 'parameter 2'
будут стерты.
Можно, конечно, передать весь массив, но, во-первых, элементов может быть много, а, во-вторых, нет никакого смысла задавать по нескольку раз одни и те же значения.
Лучше решить проблему так.
1) Делаем массив $params приватным.
private $params = array( ... );
2) Добавляем метод setParams в класс виджета (название образуется с из названия атрибута класса, значение которого нужно установить (в данном случае Params
), и приставки set
). Этот метод в первом параметре получит новое значение атрибута. В этом примере – массив с измененным параметром. Нам остается только объединить массивы.
public function setParams($params) { $this->params = array_merge($this->params, $params); }
Этот же прием можно использовать для проверки параметров или их предварительной обработки.
Если есть замечания или вопросы, пишите, постараюсь ответить 😉
Удачи!
Интересно почитать
Предлагаем авоськи оптом из любых органических тканей