/** * turn a array property into a translatable property * * @param Schema $property simple string property * @param string[] $languages available languages * * @return Schema */ public function makeArrayTranslatable(Schema $property, $languages) { $property->setType('array'); $property->setItems($this->makeTranslatable(new Schema(), $languages)); return $property; }
/** * return the schema for a given route * * @param string $modelName name of mode to generate schema for * @param object $model model to generate schema for * * @return Schema */ public function getModelSchema($modelName, $model) { // build up schema data $schema = new Schema(); $schema->setTitle(ucfirst($modelName)); $schema->setDescription($model->getDescription()); $schema->setType('object'); // grab schema info from model $repo = $model->getRepository(); $meta = $repo->getClassMetadata(); // look for translatables in document class $entityName = $repo->getClassName(); $translatableFields = array(); if (class_exists($entityName)) { $documentClass = new $entityName(); if ($documentClass instanceof TranslatableDocumentInterface) { $translatableFields = array_merge($documentClass->getTranslatableFields(), $documentClass->getPreTranslatedFields()); } } $languages = array_map(function ($language) { return $language->getId(); }, $this->languageRepository->findAll()); foreach ($meta->getFieldNames() as $field) { // don't describe deletedDate in schema.. if ($field == 'deletedDate') { continue; } $property = new Schema(); $property->setTitle($model->getTitleOfField($field)); $property->setDescription($model->getDescriptionOfField($field)); $property->setType($meta->getTypeOfField($field)); if ($meta->getTypeOfField($field) === 'many') { $propertyModel = $model->manyPropertyModelForTarget($meta->getAssociationTargetClass($field)); $property->setItems(self::getModelSchema($field, $propertyModel)); $property->setType('array'); } if ($meta->getTypeOfField($field) === 'one') { $propertyModel = $model->manyPropertyModelForTarget($meta->getAssociationTargetClass($field)); $property = self::getModelSchema($field, $propertyModel); } if (in_array($field, $translatableFields)) { $property = self::makeTranslatable($property, $languages); } if ($meta->getTypeOfField($field) === 'extref' && substr($field, 0, 1) !== '$') { $field = '$' . $field; } $schema->addProperty($field, $property); } if ($meta->isEmbeddedDocument && !in_array('id', $model->getRequiredFields())) { $schema->removeProperty('id'); } $requiredFields = $model->getRequiredFields(); foreach ($requiredFields as $index => $requiredField) { if ($requiredField === 'ref') { $requiredFields[$index] = '$' . $requiredFields[$index]; } } $schema->setRequired($requiredFields); return $schema; }