, , ,

Инвентаризация: DEV: Model Fields

Описание атрибутов модели делаем в одной функции:

    /** @var string как называется один экземпляр модели (для страницы Create -> Новый объект) */
    public static $title='Объект';
 
    /** @var string как называется список моделей (для страницы Index) */
    public static $titles='Объекты';
 
    /** @var string надпись на кнопке создания нового объекта в списке */
    public static $addButtonText='Добавить';
 
    /** @var null|string подсказка для кнопки создания нового объекта */
    public static $addButtonHint=null;
 
    /** @var string Префикс для страницы Create (Новый $title) */
    public static $newItemPrefix='Новый';
 
    public $parentAttr='parentService'; //имя атрибута в котором у нас объект-предок (родительское помещение/сервис/отдел и т.д.) - нужен для рекурсивных функций обхода дерева
    public function attributeData() {
        return [
            ['model_id'] => [
                //позже транслируется в attributeLabels, используется в отображении атрибута в формах
                'label'=>'Модель ПК',  
                //позже транслируется в attributeHints, используется для пояснения атрибута в формах
                'hint'=>'Модель системного блока / ноутбука. ' 
                       .'Если нужная модель отсутствует в списке, то нужно сначала завести в ее в соотв. категории оборудования',  
                //позже транслируется в attributeIndexLabels, используется в отображении атрибута в списках
                'indexLabel'=>'Модель ПК',  
                //позже транслируется в attributeIndexHints, используется для пояснения атрибута в списках
                'indexHint'=>'Модели можно перечислить варианты через верт. черту "|"',  
                //тип Input этого аттрибута в форме редактирования
                //  - boolean - да / нет (чекбокс)
                //  - toggle - это как boolean, но только для 0 и 1 есть свои названия, напр сервис/услуга
                //  - radios - это как toggle, только значений может быть больше 2
                //  - list - это как radios, только значений прям много и оформляется в виде dropdown
                //  - ntext - textarea (простой текст без форматирования с конвертацией nl -> <br> при рендере)
                //  - text - текст с форматированием (какой формат прописывается в параметрах)
                //  - date - дата
                //  - datetime - дата/время
                //  - ips - список IP
                //  - macs - список MAC
                //  - urls - список URL 
                //  - link - одиночная ссылка
                //  - string - обычный текст (по умолчанию)
                'fieldType' => 'text',
                //чем заполнить селектор в форме, если значение не введено
                'placeholder' => 'Модель ПК не выбрана',  
                //поле наследуемое (если не задано в этом объекте, то значение берется из родителя)
                'is_inheritable'=>true,
                //поле является ссылкой на объекты с обратной ссылкой на этот. 
                //при наличии объектов в этом поле, считаем что себя удалять нельзя, 
                //иначе в объектах ссылающихся на нас будут битые ссылки
                //(если не объявлять явно, определяется из $linkSchema)
                'is_reverseLink'=false,
                //при вызове функции absorb это поле нужно поглощать из переданного объекта
                // - false - нет (по умолчанию для полей - "не обратных ссылок"
                // - 'ifEmpty' - если локальное значение отсутствует, то принимать с абсорбируемого объекта
                // - true - да (по умолчанию для полей, являющихся обратными ссылками)
                'absorb'=>true,
                //что нужно заджойнить при отображении этого атрибута в списке (для жадной загрузки + поиск)
                'join'=>['techModel','techType']
            ],
            'model'=>['alias'=>'model_id'], //значения параметров атрибута брать из model_id
        ]
    }
 
    /**
     * @return array[] Ссылками на объекты каких классов являются атрибуты
     * $linksSchema=[
     * 		'services_ids'=>[
     * 			Service::class,		//на какой класс ссылаемся
     * 			'acls_ids',		//если там есть обратная ссылка, то в каком аттрибуте
     *                  'updater' => ['class' => ManyToManySmartUpdater::class,], //Если запись в many-2-many таблицу делается кастомным способом
     *                                          //Передается в behaviors()
     *                                          //https://github.com/voskobovich/yii2-linker-behavior?tab=readme-ov-file#custom-junction-table-values
     * 			'loader'=>'servicesList',//как загрузчик этого объекта называется, если он не формируется автоматически из названия ссылки
     * 			'deleteable'=>true,     //можно ли удалять объект с такими ссылками (если ссылки удаляются в beforeDelete)
     * 		],
     * ];
     */
    public $linksSchema=[
        'depends_ids' =>                [Services::class,'dependants_ids'],
        'comps_ids' =>                  [Comps::class,'services_ids'],
        'techs_ids' =>                  [Techs::class,'services_ids'],
        'maintenance_reqs_ids'=>        [MaintenanceReqs::class,'services_ids'],
        'maintenance_jobs_ids'=>        [MaintenanceJobs::class,'services_ids'],
        'support_ids' =>                [Users::class,'support_services_ids','loader'=>'support'],
        'infrastructure_support_ids' => [Users::class,'infrastructure_support_services_ids','loader'=>'infrastructureSupport'],
        'contracts_ids' =>              [Contracts::class,'services_ids'],
        'acls_ids' =>                   [Acls::class,'services_id'],
 
        'responsible_id' =>             [Users::class,'services_ids'],
        'infrastructure_user_id' =>     [Users::class,'infrastructure_services_ids','loader'=>'infrastructureResponsible'],
        'providing_schedule_id' =>      [Schedules::class,'providing_services_ids'],
        'support_schedule_id' =>        [Schedules::class,'support_services_ids'],
        'segment_id' =>	                [Segments::class,'services_ids'],
        'parent_id' =>                  [Services::class,'children_ids','loader'=>'parentService'],
        'partners_id' =>                [Partners::class,'services_ids'],
        'places_id' =>                  [Places::class,'services_ids'],
        'currency_id' =>                Currency::class,
    ];
 
    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
    	$labels=[];
    	foreach ($this->attributeData() as $key=>$data)
    		if (isset($data['label']))
    			$labels[$key]=$data['label'];
        return $labels;
    }
 
	/**
	 * @inheritdoc
	 */
	public function attributeHints()
	{
		$hints=[];
		foreach ($this->attributeData() as $key=>$data)
			if (isset($data['hint']))
				$hints[$key]=$data['hint'];
		return $hints;
	}