relationName = $this->valueFrom; $this->relationType = $this->model->getRelationType($this->relationName); $this->nameFrom = $this->getConfig('nameFrom', $this->nameFrom); $this->descriptionFrom = $this->getConfig('descriptionFrom', $this->descriptionFrom); $this->emptyOption = $this->getConfig('emptyOption'); /* @todo Remove line if year >= 2015 */ if ($this->getConfig('nameColumn')) $this->nameFrom = $this->getConfig('nameColumn'); /* @todo Remove line if year >= 2015 */ if ($this->getConfig('descriptionColumn')) $this->descriptionFrom = $this->getConfig('descriptionColumn'); if (!$this->model->hasRelation($this->relationName)) throw new SystemException(Lang::get('backend::lang.model.missing_relation', ['class'=>get_class($this->controller), 'relation'=>$this->relationName])); } /** * {@inheritDoc} */ public function render() { $this->prepareVars(); return $this->makePartial('relation'); } /** * Prepares the view data */ public function prepareVars() { $this->vars['field'] = $this->makeRenderFormField(); } /** * Makes the form object used for rendering a simple field type */ protected function makeRenderFormField() { return $this->renderFormField = RelationBase::noConstraints(function() { $field = clone $this->formField; list($model, $attribute) = $this->getModelArrayAttribute($this->relationName); $relatedObj = $model->makeRelation($attribute); $query = $model->{$attribute}()->newQuery(); if (in_array($this->relationType, ['belongsToMany', 'morphToMany', 'morphedByMany'])) { $field->type = 'checkboxlist'; } else if ($this->relationType == 'belongsTo') { $field->type = 'dropdown'; $field->placeholder = $this->emptyOption; } // It is safe to assume that if the model and related model are of // the exact same class, then it cannot be related to itself if ($model->exists && (get_class($model) == get_class($relatedObj))) { $query->where($relatedObj->getKeyName(), '<>', $model->id); } // Even though "no constraints" is applied, belongsToMany constrains the query // by joining its pivot table. Remove all joins from the query. $query->getQuery()->getQuery()->joins = []; if (in_array('October\Rain\Database\Traits\NestedTree', class_uses($relatedObj))) $field->options = $query->listsNested($this->nameFrom, $relatedObj->getKeyName()); else $field->options = $query->lists($this->nameFrom, $relatedObj->getKeyName()); return $field; }); } /** * {@inheritDoc} */ public function getSaveData($value) { if (is_string($value) && !strlen($value)) return null; if (is_array($value) && !count($value)) return null; return $value; } }