You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							52 lines
						
					
					
						
							1.4 KiB
						
					
					
				
			
		
		
	
	
							52 lines
						
					
					
						
							1.4 KiB
						
					
					
				| <?php | |
|  | |
| namespace core\behaviors; | |
|  | |
| use core\entities\Meta; | |
| use Exception; | |
| use yii\base\Behavior; | |
| use yii\base\Event; | |
| use yii\db\ActiveRecord; | |
| use yii\db\BaseActiveRecord; | |
| use yii\helpers\ArrayHelper; | |
| use yii\helpers\Json; | |
|  | |
| class MetaBehavior extends Behavior | |
| { | |
|     public string $attribute = 'meta'; | |
|     public string $jsonAttribute = 'meta_json'; | |
|  | |
|     public function events(): array | |
|     { | |
|         return [ | |
|             BaseActiveRecord::EVENT_AFTER_FIND => 'onAfterFind', | |
|             BaseActiveRecord::EVENT_BEFORE_INSERT => 'onBeforeSave', | |
|             BaseActiveRecord::EVENT_BEFORE_UPDATE => 'onBeforeSave', | |
|         ]; | |
|     } | |
|  | |
|     /** | |
|      * @param Event $event | |
|      * @throws Exception | |
|      */ | |
|     public function onAfterFind(Event $event): void | |
|     { | |
|         $model = $event->sender; | |
|         $meta = Json::decode($model->getAttribute($this->jsonAttribute)); | |
|         $model->{$this->attribute} = new Meta( | |
|             ArrayHelper::getValue($meta, 'title'), | |
|             ArrayHelper::getValue($meta, 'description'), | |
|             ArrayHelper::getValue($meta, 'keywords') | |
|         ); | |
|     } | |
|  | |
|     public function onBeforeSave(Event $event): void | |
|     { | |
|         $model = $event->sender; | |
|         $model->setAttribute('meta_json', Json::encode([ | |
|             'title' => $model->{$this->attribute}->title, | |
|             'description' => $model->{$this->attribute}->description, | |
|             'keywords' => $model->{$this->attribute}->keywords, | |
|         ])); | |
|     } | |
| }
 | |
| 
 |