/**
  * Returns parsed field value.
  *
  * @param \eZ\Publish\API\Repository\Values\Content\Content $content
  * @param string $field
  * @param string $language
  *
  * @return array
  */
 public function getFieldValue(Content $content, $field, $language)
 {
     $fieldObj = $content->getField($field, $language);
     $contentType = $this->contentTypeService->loadContentType($content->contentInfo->contentTypeId);
     $imageFieldIdentifier = $this->getImageFieldIdentifier($content->id, $language);
     $relatedContentId = $this->getRelation($content, $fieldObj->fieldDefIdentifier, $language);
     $mapping = $this->relationMapper->getMapping($contentType->identifier, $field);
     try {
         if ($relatedContentId && $mapping) {
             $relatedContent = $this->contentService->loadContent($relatedContentId);
             if ($relatedContent && $relatedContent->versionInfo->contentInfo->published) {
                 $relatedContentType = $this->contentTypeService->loadContentType($relatedContent->contentInfo->contentTypeId);
                 if ($relatedContentType->identifier != $mapping['content']) {
                     throw new InvalidRelationException(sprintf("Invalid relation: field '%s:%s' (object: %s, field: %s) has improper relation to object '%s' (object: %s) but '%s:%s' expected.", $contentType->identifier, $field, $content->id, $fieldObj->id, $relatedContentType->identifier, $relatedContentId, $mapping['content'], $mapping['field']));
                 }
                 $relatedField = $content->getField($mapping['field'], $language);
                 $value = $relatedField ? $this->getParsedFieldValue($relatedField, $relatedContent, $language, $imageFieldIdentifier) : '';
             } else {
                 $value = '';
             }
         } else {
             $value = $fieldObj ? $this->getParsedFieldValue($fieldObj, $content, $language, $imageFieldIdentifier) : '';
         }
     } catch (InvalidRelationException $exception) {
         $this->logger->warning($exception->getMessage());
         $value = '';
     }
     return array('key' => $field, 'value' => $value);
 }
Example #2
0
 /**
  * This method returns the field for a given field definition identifier and language
  *
  * If not set the initialLanguage of the content version is used.
  *
  * @param string $fieldDefIdentifier
  * @param string|null $languageCode
  *
  * @return \eZ\Publish\API\Repository\Values\Content\Field|null A {@link Field} or null if nothing is found
  */
 public function getField($fieldDefIdentifier, $languageCode = null)
 {
     return $this->content->getField($fieldDefIdentifier, $languageCode);
 }
 /**
  * Returns Field object in the appropriate language for a given content.
  * By default, this method will return the field in current language if translation is present. If not, main language will be used.
  * If $forcedLanguage is provided, will return the field in this language, if translation is present.
  *
  * @param \eZ\Publish\API\Repository\Values\Content\Content $content
  * @param string $fieldDefIdentifier Field definition identifier.
  * @param string $forcedLanguage Locale we want the field translation in (e.g. "fre-FR"). Null by default (takes current locale)
  *
  * @return \eZ\Publish\API\Repository\Values\Content\Field|null
  */
 public function getTranslatedField(Content $content, $fieldDefIdentifier, $forcedLanguage = null)
 {
     if ($forcedLanguage !== null) {
         $languages = array($forcedLanguage);
     } else {
         $languages = $this->configResolver->getParameter('languages');
     }
     // Always add null as last entry so that we can use it pass it as languageCode $content->getField(),
     // forcing to use the main language if all others fail.
     $languages[] = null;
     // Loop over prioritized languages to get the appropriate translated field.
     foreach ($languages as $lang) {
         $field = $content->getField($fieldDefIdentifier, $lang);
         if ($field instanceof Field) {
             return $field;
         }
     }
 }
 /**
  * Returns Field object in the appropriate language for a given content.
  * By default, this method will return the field in current language if translation is present. If not, main language will be used.
  * If $forcedLanguage is provided, will return the field in this language, if translation is present.
  *
  * @param \eZ\Publish\API\Repository\Values\Content\Content $content
  * @param string $fieldDefIdentifier Field definition identifier.
  * @param string $forcedLanguage Locale we want the field translation in (e.g. "fre-FR"). Null by default (takes current locale)
  *
  * @return \eZ\Publish\API\Repository\Values\Content\Field|null
  */
 public function getTranslatedField(Content $content, $fieldDefIdentifier, $forcedLanguage = null)
 {
     // Loop over prioritized languages to get the appropriate translated field.
     foreach ($this->getLanguages($forcedLanguage) as $lang) {
         $field = $content->getField($fieldDefIdentifier, $lang);
         if ($field instanceof Field) {
             return $field;
         }
     }
 }