/** * Queries for has relation fields without a link model and sets the result to the provided result * @param array $result Model query result * @param integer $recursiveDepth Recursive depth for the queries * @param string $fieldName Name of the has field * @param zibo\library\orm\definition\field\HasField $field Definition of the field * @return array Model query result with the has fields */ private function queryHasWithoutLinkModel(array $result, ModelMeta $meta, $recursiveDepth, $fieldName, HasField $field) { $locale = $this->getLocale(); $model = $meta->getRelationModel($fieldName); $foreignKey = $meta->getRelationForeignKey($fieldName)->getName(); $isHasOne = $field instanceof HasOneField; $indexOn = null; if (!$isHasOne) { $indexOn = $field->getIndexOn(); } foreach ($result as $index => $data) { $query = $model->createQuery($recursiveDepth, $locale, $this->willIncludeUnlocalizedData); $query->removeFields('{' . $foreignKey . '}'); $query->addCondition('{' . $foreignKey . '} = %1%', $data->id); if ($isHasOne) { $result[$index]->{$fieldName} = $this->queryHasOneWithoutLinkModel($query, $foreignKey, $data); } else { $result[$index]->{$fieldName} = $this->queryHasManyWithoutLinkModel($query, $meta, $fieldName, $foreignKey, $data, $indexOn); } } return $result; }
/** * Creates a form field for the provided model relation field * @param zibo\library\html\form\field\FieldFactory $fieldFactory Instance of the field factory * @param zibo\library\orm\model\ModelMeta $meta Meta of the model of the relation field * @param zibo\library\orm\definition\field\RelationField $field Definition of the relation field * @param mixed $value Value for the form field * @return zibo\library\html\form\field\Field */ protected function createFormFieldFromRelationField(FieldFactory $fieldFactory, ModelMeta $meta, RelationField $field, $value) { $relationModel = $meta->getRelationModel($field->getName()); $list = $relationModel->getDataList(); if (!is_array($value) && is_object($value)) { $value = $value->id; } $formField = $fieldFactory->createField(FieldFactory::TYPE_LIST, $field->getName(), $value); $formField->setOptions($list); if ($field instanceof HasManyField) { $formField->setIsMultiple(true); $formField->setShowSelectedOptionsFirst(true); } else { $formField->addEmpty('---', ''); } return $formField; }