Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php namespace common\components;
- use Yii;
- use yii\base\Model;
- use yii\base\Behavior;
- use yii\db\ActiveRecord;
- use yii\helpers\Json;
- use yii\helpers\VarDumper;
- use yii\helpers\ArrayHelper;
- use common\models\MetaForm;
- class MetaBehavior extends Behavior {
- public $attribute;
- private $_metaTags;
- /**
- * @inheritdoc
- */
- public function events() {
- return [
- ActiveRecord::EVENT_BEFORE_VALIDATE => 'onBeforeValidate',
- ActiveRecord::EVENT_BEFORE_INSERT => 'onBeforeSave',
- ActiveRecord::EVENT_BEFORE_UPDATE => 'onBeforeSave',
- ];
- }
- /**
- * Геттер. Используется для получения моделей всех мета-тэгов. Дополнительно
- * генерируется еще одна модель для добавления нового мета-тэга.
- *
- * @return array
- */
- public function getMetaTags() {
- if ( $this->_metaTags === null ) {
- foreach ( $this->getDecodedMeta() as $name => $content) {
- $this->_metaTags[] = new MetaForm(['name' => $name, 'content' => $content]);
- }
- // Это для того, чтобы в форме была всегда еще одна строка для добавления атрибута
- // TODO: доработать кнопки в форме, чтобы динамически создавать поля в форме
- $this->_metaTags[] = new MetaForm();
- }
- return (array) $this->_metaTags;
- }
- /**
- * Геттер. Возвращает массив декодированных из JSON атрибутов.
- * @return array
- */
- public function getDecodedMeta() {
- $data = $this->owner->{$this->attribute};
- // ...
- return (array) Json::decode($data);
- }
- /**
- * Событие, вызываемое перед влидацией данных.
- * @param \yii\base\ModelEvent $event
- * @return boolean
- */
- public function onBeforeValidate($event) {
- $request = Yii::$app->getRequest();
- // Массив моделей
- $models = $this->owner->metaTags;
- // (boolean)
- return Model::loadMultiple($models, $request->post()) && Model::validateMultiple($models);
- }
- /**
- * Событие, вызываемое перед сохранением данных в базе данных (INSERT/UPDATE).
- * @param \yii\base\ModelEvent $event
- * @return boolean
- */
- public function onBeforeSave($event) {
- $models = $this->owner->metaTags;
- $attributes = ArrayHelper::map($models, 'name', 'content');
- // Устанавливаем значение для атрибута в виде закодированного json-массива
- $this->owner->{$this->attribute} = Json::encode($attributes);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement