Autocomplete.php 4.33 KB
<?php
namespace common\modules\blog\behaviors;

use common\models\Tools;
use yii\db\ActiveRecord;
use yii\base\Behavior;
use yii\helpers\StringHelper;

/**
 * Класс для автозаполнения полей некими данными или их форматирования
 *
 * Клас предназначен для заполнения полей данными или форматирования данных
 *
 */

class Autocomplete extends Behavior
{
    /**
     * Атрибуты для обработки
     *
     * Атрибуты считываются автоматически с настроек поведения в конкретном обьекте.
     * Имеет вид ассоциативного массива, где ключ - метод автозаполнения, а значение - массив, каждій єлемент
     * которого - свойство обьекта для обработки, может включать массив - первый єлемент которого свойство,
     * а дальнейшие конфигурации.
     *
     * @var array Ассоциативны массив [key(метод заполнения) => [[0 => property(свойство обьекта), ... дополнительные
     * настройки]], ...[]]
     *
     */
    public $attributes;

    /**
     * События
     *
     * События на которые должно срабатывать поведение. Задается ассоциативный массив, в котором ключ - событие
     * связанного обьекта, а значение - метод, который вызывается при этом событии
     *
     * @return array [key(event)  => val(method)]
     *
     */
    public function events()
    {
        return [
            ActiveRecord::EVENT_BEFORE_INSERT => 'autocomplete',
            ActiveRecord::EVENT_BEFORE_UPDATE => 'autocomplete',
        ];
    }

    /**
     * События
     *
     * События на которые должно срабатывать поведение. Задается ассоциативный массив, в котором ключ - событие
     * связанного обьекта, а значение - метод, который вызывается при этом событии
     * Доступные автозаполнения:
     * ['translit' => ['prop1', ... 'prop2']],
     * где prop - свойство подлежащее транслитерации
     * ['repeat' => [[string 'prop1', string 'target1', boolean 'skipFilled', int 'count', boolean 'truncate', string 'suffix'], ...[]],
     *  где prop - свойство для преобразования,
     *      target - свойство с которого взять данные,
     *      count - число для преобразования,
     *      skipFilled - пропустить непустые,
     *      truncate - true - обрезать по словам, false - по символам,
     *      suffix - суффикс, который добавить после обрезки
     *
     * @param mixed $event Yii обьект свойста https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/concept-events.md
     *
     */
    public function autocomplete($event)
    {
        if(!empty($this->attributes['translit'])) {
            foreach($this->attributes['translit'] as $translit) {
                if($this->owner->hasAttribute($translit)) {
                    $this->owner->$translit = Tools::translit($this->owner->$translit);
                }
            }
        }
        if(!empty($this->attributes['repeat'])) {
            foreach($this->attributes['repeat'] as $repeat) {
                if(is_array($repeat) && $this->owner->hasAttribute($repeat[0]) && $this->owner->hasAttribute($repeat[1]) && is_int($repeat[3]) && (empty($this->owner->$repeat[0]) || $repeat[2])) {
                    $suffix =  $repeat[5]?:'';
                    $truncate = $repeat[4]?'truncateWords':'truncate';
                    $this->owner->$repeat[0] = StringHelper::$truncate($this->owner->$repeat[1], $repeat[3], $suffix);
                }
            }
        }
    }
}