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.
		
		
		
		
		
			
		
			
				
					
					
						
							46 lines
						
					
					
						
							1.3 KiB
						
					
					
				
			
		
		
	
	
							46 lines
						
					
					
						
							1.3 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace core\behaviors; | 
						|
 | 
						|
use core\entities\Meta; | 
						|
use yii\base\Behavior; | 
						|
use yii\base\Event; | 
						|
use yii\db\ActiveRecord; | 
						|
use yii\helpers\ArrayHelper; | 
						|
use yii\helpers\Json; | 
						|
 | 
						|
class MetaBehavior extends Behavior | 
						|
{ | 
						|
    public $attribute = 'meta'; | 
						|
    public $jsonAttribute = 'meta_json'; | 
						|
 | 
						|
    public function events(): array | 
						|
    { | 
						|
        return [ | 
						|
            ActiveRecord::EVENT_AFTER_FIND => 'onAfterFind', | 
						|
            ActiveRecord::EVENT_BEFORE_INSERT => 'onBeforeSave', | 
						|
            ActiveRecord::EVENT_BEFORE_UPDATE => 'onBeforeSave', | 
						|
        ]; | 
						|
    } | 
						|
 | 
						|
    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, | 
						|
        ])); | 
						|
    } | 
						|
} |