SHARE
TWEET

Untitled

a guest Aug 10th, 2015 234 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php namespace common\components;
  2.  
  3. use Yii;
  4. use yii\base\Model;
  5. use yii\base\Behavior;
  6. use yii\db\ActiveRecord;
  7.  
  8. use yii\helpers\Json;
  9. use yii\helpers\VarDumper;
  10. use yii\helpers\ArrayHelper;
  11.  
  12. use common\models\MetaForm;
  13.  
  14. class MetaBehavior extends Behavior {
  15.  
  16.   public  $attribute;
  17.   private $_metaTags;
  18.  
  19.   /**
  20.    * @inheritdoc
  21.    */
  22.   public function events() {
  23.     return [
  24.       ActiveRecord::EVENT_BEFORE_VALIDATE => 'onBeforeValidate',
  25.       ActiveRecord::EVENT_BEFORE_INSERT   => 'onBeforeSave',
  26.       ActiveRecord::EVENT_BEFORE_UPDATE   => 'onBeforeSave',
  27.     ];
  28.   }
  29.  
  30.   /**
  31.    * Геттер. Используется для получения моделей всех мета-тэгов. Дополнительно
  32.    * генерируется еще одна модель для добавления нового мета-тэга.
  33.    *
  34.    * @return  array
  35.    */
  36.   public function getMetaTags() {
  37.     if ( $this->_metaTags === null ) {
  38.       foreach ( $this->getDecodedMeta() as $name => $content) {
  39.         $this->_metaTags[] = new MetaForm(['name' => $name, 'content' => $content]);
  40.       }
  41.       // Это для того, чтобы в форме была всегда еще одна строка для добавления атрибута
  42.       // TODO: доработать кнопки в форме, чтобы динамически создавать поля в форме
  43.       $this->_metaTags[] = new MetaForm();
  44.     }
  45.     return (array) $this->_metaTags;
  46.   }
  47.  
  48.   /**
  49.    * Геттер. Возвращает массив декодированных из JSON атрибутов.
  50.    * @return  array
  51.    */
  52.   public function getDecodedMeta() {
  53.     $data = $this->owner->{$this->attribute};
  54.     // ...
  55.     return (array) Json::decode($data);
  56.   }
  57.  
  58.   /**
  59.    * Событие, вызываемое перед влидацией данных.
  60.    * @param   \yii\base\ModelEvent  $event
  61.    * @return  boolean
  62.    */
  63.   public function onBeforeValidate($event) {
  64.     $request = Yii::$app->getRequest();
  65.     // Массив моделей
  66.     $models  = $this->owner->metaTags;
  67.     // (boolean)
  68.     return Model::loadMultiple($models, $request->post()) && Model::validateMultiple($models);
  69.   }
  70.  
  71.   /**
  72.    * Событие, вызываемое перед сохранением данных в базе данных (INSERT/UPDATE).
  73.    * @param   \yii\base\ModelEvent  $event
  74.    * @return  boolean
  75.    */
  76.   public function onBeforeSave($event) {
  77.     $models     = $this->owner->metaTags;
  78.     $attributes = ArrayHelper::map($models, 'name', 'content');
  79.     // Устанавливаем значение для атрибута в виде закодированного json-массива
  80.     $this->owner->{$this->attribute} = Json::encode($attributes);
  81.   }
  82.  
  83. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top