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

7 years ago
<?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,
]));
}
}