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