Ejemplo n.º 1
0
 /**
  * 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;
 }
Ejemplo n.º 2
0
 /**
  * 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;
 }