/** * Get available relation choices * @param $relation_name * @return mixed */ public static function getSelectChoices(ActiveRecord $model, $relation_name) { $class = $model->className(); if (!isset(self::$relationsChoices[$class][$relation_name])) { self::$relationsChoices[$class][$relation_name] = []; $relation = $model->getRelation($relation_name, false); if ($relation) { self::$relationsChoices[$class][$relation_name] = ModelHelper::getSelectChoices(new $relation->modelClass()); } } return self::$relationsChoices[$class][$relation_name]; }
protected static function editableRelationConfig(ActiveRecord $model, $relation_name) { /* @var ActiveRecord|YcmModelUtilTrait $model */ $relation = $model->getRelation($relation_name); /* @var Module $module */ $module = \Yii::$app->getModule('ycm-utils'); /* @var ActiveRecord|YcmModelUtilTrait $relationModel */ $relationModel = \Yii::createObject($relation->modelClass); $modelChoices = ModelHelper::getSelectChoices($relationModel); /** * @todo #1 implement fill ajax loading with ajax mapping * @fixme #2 Relation is multiple, after live edit fix JS error `Cannot read property '[object Array]' of null` */ return ['attribute' => $relation->multiple ? $relation_name . $model->method_postfix_relation_ids : reset($relation->link), 'label' => ucfirst($relation_name), 'filter' => $modelChoices, 'value' => $relation->multiple ? function ($m) use($relation_name, $modelChoices, $model) { return implode(', ', array_map(function ($relation_id) use($modelChoices) { return $modelChoices[$relation_id]; }, array_values((array) $m->{$relation_name . $model->method_postfix_relation_ids}))); } : null, 'editableOptions' => ['inputType' => Editable::INPUT_SELECT2, 'size' => 'lg', 'options' => ['options' => ['multiple' => $relation->multiple], 'data' => $modelChoices, 'pluginOptions' => count($modelChoices) > $model->ajax_enable_threshold ? ['minimumInputLength' => 3, 'ajax' => ['url' => Url::to(['/ycm/model/choices', 'name' => $module->ycm->getModelName($relationModel)]), 'dataType' => 'json', 'processResults' => new JsExpression('function (results) { return results; }')]] : null], 'displayValueConfig' => !$relation->multiple ? $modelChoices : null]]; }
public static function enumerate(ActiveRecord $model, $attribute, $options = []) { $choices = ModelHelper::getEnumChoices($model, $attribute); $config = [$attribute, 'widget', 'widgetClass' => Select2::className(), 'data' => $choices, 'options' => ['placeholder' => 'Select...']]; return ArrayHelper::merge($config, $options); }
function __toString() { /* @var ActiveRecord|static $this */ return ModelHelper::getLabelColumnValue($this); }