Exemplo n.º 1
0
 /**
  * Returns a field language join condition for the given $languageSettings.
  *
  * @param \eZ\Publish\Core\Persistence\Database\SelectQuery $query
  * @param array $languageSettings
  *
  * @return string
  */
 protected function getFieldCondition(SelectQuery $query, array $languageSettings)
 {
     // 1. Use main language(s) by default
     if (empty($languageSettings['languages'])) {
         return $query->expr->gt($query->expr->bitAnd($this->dbHandler->quoteColumn('initial_language_id', 'ezcontentobject'), $this->dbHandler->quoteColumn('language_id', 'ezcontentobject_attribute')), $query->bindValue(0, null, PDO::PARAM_INT));
     }
     // 2. Otherwise use prioritized languages
     $leftSide = $query->expr->bitAnd($query->expr->sub($this->dbHandler->quoteColumn('language_mask', 'ezcontentobject'), $query->expr->bitAnd($this->dbHandler->quoteColumn('language_mask', 'ezcontentobject'), $this->dbHandler->quoteColumn('language_id', 'ezcontentobject_attribute'))), $query->bindValue(1, null, PDO::PARAM_INT));
     $rightSide = $query->expr->bitAnd($this->dbHandler->quoteColumn('language_id', 'ezcontentobject_attribute'), $query->bindValue(1, null, PDO::PARAM_INT));
     for ($index = count($languageSettings['languages']) - 1, $multiplier = 2; $index >= 0; $index--, $multiplier *= 2) {
         $languageId = $this->languageHandler->loadByLanguageCode($languageSettings['languages'][$index])->id;
         $addToLeftSide = $query->expr->bitAnd($query->expr->sub($this->dbHandler->quoteColumn('language_mask', 'ezcontentobject'), $query->expr->bitAnd($this->dbHandler->quoteColumn('language_mask', 'ezcontentobject'), $this->dbHandler->quoteColumn('language_id', 'ezcontentobject_attribute'))), $languageId);
         $addToRightSide = $query->expr->bitAnd($this->dbHandler->quoteColumn('language_id', 'ezcontentobject_attribute'), $languageId);
         if ($multiplier > $languageId) {
             $factor = $multiplier / $languageId;
             for ($shift = 0; $factor > 1; $factor = $factor / 2, $shift++) {
             }
             $factorTerm = ' << ' . $shift;
             $addToLeftSide .= $factorTerm;
             $addToRightSide .= $factorTerm;
         } elseif ($multiplier < $languageId) {
             $factor = $languageId / $multiplier;
             for ($shift = 0; $factor > 1; $factor = $factor / 2, $shift++) {
             }
             $factorTerm = ' >> ' . $shift;
             $addToLeftSide .= $factorTerm;
             $addToRightSide .= $factorTerm;
         }
         $leftSide = $query->expr->add($leftSide, "({$addToLeftSide})");
         $rightSide = $query->expr->add($rightSide, "({$addToRightSide})");
     }
     return $query->expr->lAnd($query->expr->gt($query->expr->bitAnd($this->dbHandler->quoteColumn('language_mask', 'ezcontentobject'), $this->dbHandler->quoteColumn('language_id', 'ezcontentobject_attribute')), $query->bindValue(0, null, PDO::PARAM_INT)), $query->expr->lt($leftSide, $rightSide));
 }
Exemplo n.º 2
0
 /**
  * Inserts keywords for tag with provided tag ID.
  *
  * @param mixed $tagId
  * @param array $keywords
  * @param string $mainLanguageCode
  * @param bool $alwaysAvailable
  */
 protected function insertTagKeywords($tagId, array $keywords, $mainLanguageCode, $alwaysAvailable)
 {
     foreach ($keywords as $languageCode => $keyword) {
         $query = $this->handler->createInsertQuery();
         $query->insertInto($this->handler->quoteTable('eztags_keyword'))->set($this->handler->quoteColumn('keyword_id'), $query->bindValue($tagId, null, PDO::PARAM_INT))->set($this->handler->quoteColumn('language_id'), $query->bindValue($this->languageHandler->loadByLanguageCode($languageCode)->id + (int) ($languageCode === $mainLanguageCode && $alwaysAvailable), null, PDO::PARAM_INT))->set($this->handler->quoteColumn('keyword'), $query->bindValue($keyword, null, PDO::PARAM_STR))->set($this->handler->quoteColumn('locale'), $query->bindValue($languageCode, null, PDO::PARAM_STR))->set($this->handler->quoteColumn('status'), $query->bindValue(1, null, PDO::PARAM_INT));
         $query->prepare()->execute();
     }
 }
 /**
  * Loads a Language from its language code ($languageCode)
  *
  * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if languageCode argument
  *         is not string
  * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if language could not be found
  *
  * @param string $languageCode
  *
  * @return \eZ\Publish\API\Repository\Values\Content\Language
  */
 public function loadLanguage($languageCode)
 {
     if (!is_string($languageCode) || empty($languageCode)) {
         throw new InvalidArgumentException("languageCode", "language code has an invalid value");
     }
     $language = $this->languageHandler->loadByLanguageCode($languageCode);
     return $this->buildDomainObject($language);
 }
 /**
  * Generates a language mask from the given $languageSettings.
  *
  * @param array $languageSettings
  *
  * @return int
  */
 protected function getLanguageMask(array $languageSettings)
 {
     $mask = 0;
     if ($languageSettings['useAlwaysAvailable']) {
         $mask |= 1;
     }
     foreach ($languageSettings['languages'] as $languageCode) {
         $mask |= $this->languageHandler->loadByLanguageCode($languageCode)->id;
     }
     return $mask;
 }
Exemplo n.º 5
0
 /**
  * Validates given translated list $list, which should be an array of strings with language codes as keys.
  *
  * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
  *
  * @param mixed $list
  * @param string $argumentName
  */
 public function validateTranslatedList($list, $argumentName)
 {
     if (!is_array($list)) {
         throw new InvalidArgumentType($argumentName, 'array', $list);
     }
     foreach ($list as $languageCode => $translation) {
         $this->contentLanguageHandler->loadByLanguageCode($languageCode);
         if (!is_string($translation)) {
             throw new InvalidArgumentType($argumentName . "['{$languageCode}']", 'string', $translation);
         }
     }
 }
Exemplo n.º 6
0
 protected function extractMatchedLanguage($languageMask, $mainLanguageId, $languageSettings)
 {
     foreach ($languageSettings['languages'] as $languageCode) {
         if ($languageMask & $this->languageHandler->loadByLanguageCode($languageCode)->id) {
             return $languageCode;
         }
     }
     if ($languageMask & 1 || empty($languageSettings['languages'])) {
         return $this->languageHandler->load($mainLanguageId)->languageCode;
     }
     return null;
 }
 /**
  * Applies joins to the query, required to fetch sort data
  *
  * @param \eZ\Publish\Core\Persistence\Database\SelectQuery $query
  * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause
  * @param int $number
  *
  * @return void
  */
 public function applyJoin(SelectQuery $query, SortClause $sortClause, $number)
 {
     /** @var \eZ\Publish\API\Repository\Values\Content\Query\SortClause\Target\FieldTarget $fieldTarget */
     $fieldTarget = $sortClause->targetData;
     $table = $this->getSortTableName($number);
     $externalTable = $this->getSortTableName($number, "ezgmaplocation");
     if ($fieldTarget->languageCode === null) {
         $query->innerJoin($query->alias($this->dbHandler->quoteTable("ezcontentobject_attribute"), $this->dbHandler->quoteIdentifier($table)), $query->expr->lAnd($query->expr->eq($this->dbHandler->quoteColumn("contentobject_id", $table), $this->dbHandler->quoteColumn("id", "ezcontentobject")), $query->expr->eq($this->dbHandler->quoteColumn("version", $table), $this->dbHandler->quoteColumn("current_version", "ezcontentobject")), $query->expr->gt($query->expr->bitAnd($query->expr->bitAnd($this->dbHandler->quoteColumn("language_id", $table), ~1), $this->dbHandler->quoteColumn("initial_language_id", "ezcontentobject")), 0)));
     } else {
         $query->innerJoin($query->alias($this->dbHandler->quoteTable("ezcontentobject_attribute"), $this->dbHandler->quoteIdentifier($table)), $query->expr->lAnd($query->expr->eq($this->dbHandler->quoteColumn("contentobject_id", $table), $this->dbHandler->quoteColumn("id", "ezcontentobject")), $query->expr->eq($this->dbHandler->quoteColumn("version", $table), $this->dbHandler->quoteColumn("current_version", "ezcontentobject")), $query->expr->gt($query->expr->bitAnd($query->expr->bitAnd($this->dbHandler->quoteColumn("language_id", $table), ~1), $query->bindValue($this->languageHandler->loadByLanguageCode($fieldTarget->languageCode)->id, null, \PDO::PARAM_INT)), 0)));
     }
     $query->innerJoin($query->alias($this->dbHandler->quoteTable("ezgmaplocation"), $this->dbHandler->quoteIdentifier($externalTable)), $query->expr->lAnd($query->expr->eq($this->dbHandler->quoteColumn("contentobject_version", $externalTable), $this->dbHandler->quoteColumn("version", $table)), $query->expr->eq($this->dbHandler->quoteColumn("contentobject_attribute_id", $externalTable), $this->dbHandler->quoteColumn("id", $table))))->innerJoin($query->alias($this->dbHandler->quoteTable("ezcontentclass_attribute"), $this->dbHandler->quoteIdentifier("cc_attr_{$number}")), $query->expr->lAnd($query->expr->eq($this->dbHandler->quoteColumn("contentclassattribute_id", $table), $this->dbHandler->quoteColumn("id", "cc_attr_{$number}")), $query->expr->eq($this->dbHandler->quoteColumn("identifier", "cc_attr_{$number}"), $query->bindValue($fieldTarget->fieldIdentifier)), $query->expr->eq($this->dbHandler->quoteColumn("version", "cc_attr_{$number}"), $query->bindValue(Type::STATUS_DEFINED, null, \PDO::PARAM_INT))))->innerJoin($query->alias($this->dbHandler->quoteTable("ezcontentclass"), $this->dbHandler->quoteIdentifier("cc_{$number}")), $query->expr->lAnd($query->expr->eq($this->dbHandler->quoteColumn("contentclass_id", "cc_attr_{$number}"), $this->dbHandler->quoteColumn("id", "cc_{$number}")), $query->expr->eq($this->dbHandler->quoteColumn("identifier", "cc_{$number}"), $query->bindValue($fieldTarget->typeIdentifier)), $query->expr->eq($this->dbHandler->quoteColumn("version", "cc_{$number}"), $query->bindValue(Type::STATUS_DEFINED, null, \PDO::PARAM_INT))));
 }
Exemplo n.º 8
0
 /**
  * Applies joins to the query, required to fetch sort data
  *
  * @param \eZ\Publish\Core\Persistence\Database\SelectQuery $query
  * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause
  * @param int $number
  * @param array $fieldMap
  *
  * @return void
  */
 public function applyJoin(SelectQuery $query, SortClause $sortClause, $number, array $fieldMap)
 {
     /** @var \eZ\Publish\API\Repository\Values\Content\Query\SortClause\Target\FieldTarget $fieldTarget */
     $fieldTarget = $sortClause->targetData;
     $fieldDefinitionId = $fieldMap[$fieldTarget->typeIdentifier][$fieldTarget->fieldIdentifier];
     $table = $this->getSortTableName($number);
     if ($fieldTarget->languageCode === null) {
         $languageExpression = $query->expr->gt($query->expr->bitAnd($query->expr->bitAnd($this->dbHandler->quoteColumn("language_id", $table), ~1), $this->dbHandler->quoteColumn("initial_language_id", "ezcontentobject")), 0);
     } else {
         $languageExpression = $query->expr->gt($query->expr->bitAnd($query->expr->bitAnd($this->dbHandler->quoteColumn("language_id", $table), ~1), $query->bindValue($this->languageHandler->loadByLanguageCode($fieldTarget->languageCode)->id, null, \PDO::PARAM_INT)), 0);
     }
     $query->leftJoin($query->alias($this->dbHandler->quoteTable("ezcontentobject_attribute"), $this->dbHandler->quoteIdentifier($table)), $query->expr->lAnd($query->expr->eq($query->bindValue($fieldDefinitionId, null, PDO::PARAM_INT), $this->dbHandler->quoteColumn("contentclassattribute_id", $table)), $query->expr->eq($this->dbHandler->quoteColumn("contentobject_id", $table), $this->dbHandler->quoteColumn("id", "ezcontentobject")), $query->expr->eq($this->dbHandler->quoteColumn("version", $table), $this->dbHandler->quoteColumn("current_version", "ezcontentobject")), $languageExpression));
 }
Exemplo n.º 9
0
 /**
  * Applies joins to the query, required to fetch sort data.
  *
  * @param \eZ\Publish\Core\Persistence\Database\SelectQuery $query
  * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause
  * @param int $number
  */
 public function applyJoin(SelectQuery $query, SortClause $sortClause, $number)
 {
     /** @var \eZ\Publish\API\Repository\Values\Content\Query\SortClause\Target\FieldTarget $fieldTarget */
     $fieldTarget = $sortClause->targetData;
     $fieldMap = $this->contentTypeHandler->getSearchableFieldMap();
     if (!isset($fieldMap[$fieldTarget->typeIdentifier][$fieldTarget->fieldIdentifier]['field_definition_id'])) {
         throw new InvalidArgumentException('$sortClause->targetData', 'No searchable fields found for the given sort clause target ' . "'{$fieldTarget->fieldIdentifier}' on '{$fieldTarget->typeIdentifier}'.");
     }
     $fieldDefinitionId = $fieldMap[$fieldTarget->typeIdentifier][$fieldTarget->fieldIdentifier]['field_definition_id'];
     $table = $this->getSortTableName($number);
     if ($fieldTarget->languageCode === null) {
         $languageExpression = $query->expr->gt($query->expr->bitAnd($query->expr->bitAnd($this->dbHandler->quoteColumn('language_id', $table), ~1), $this->dbHandler->quoteColumn('initial_language_id', 'ezcontentobject')), 0);
     } else {
         $languageExpression = $query->expr->gt($query->expr->bitAnd($query->expr->bitAnd($this->dbHandler->quoteColumn('language_id', $table), ~1), $query->bindValue($this->languageHandler->loadByLanguageCode($fieldTarget->languageCode)->id, null, \PDO::PARAM_INT)), 0);
     }
     $query->leftJoin($query->alias($this->dbHandler->quoteTable('ezcontentobject_attribute'), $this->dbHandler->quoteIdentifier($table)), $query->expr->lAnd($query->expr->eq($query->bindValue($fieldDefinitionId, null, PDO::PARAM_INT), $this->dbHandler->quoteColumn('contentclassattribute_id', $table)), $query->expr->eq($this->dbHandler->quoteColumn('contentobject_id', $table), $this->dbHandler->quoteColumn('id', 'ezcontentobject')), $query->expr->eq($this->dbHandler->quoteColumn('version', $table), $this->dbHandler->quoteColumn('current_version', 'ezcontentobject')), $languageExpression));
 }
Exemplo n.º 10
0
 /**
  * Generates a language mask from the given $languageFilter.
  *
  * @param array $languageFilter
  *
  * @return int
  */
 protected function getLanguageMask(array $languageFilter)
 {
     if (!isset($languageFilter['languages'])) {
         $languageFilter['languages'] = array();
     }
     if (!isset($languageFilter['useAlwaysAvailable'])) {
         $languageFilter['useAlwaysAvailable'] = true;
     }
     $mask = 0;
     if ($languageFilter['useAlwaysAvailable']) {
         $mask |= 1;
     }
     foreach ($languageFilter['languages'] as $languageCode) {
         $mask |= $this->languageHandler->loadByLanguageCode($languageCode)->id;
     }
     return $mask;
 }
 /**
  * Builds ContentType update struct for storage layer.
  *
  * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft
  * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct $contentTypeUpdateStruct
  * @param \eZ\Publish\API\Repository\Values\User\UserReference $user
  *
  * @return \eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct
  */
 public function buildSPIContentTypeUpdateStruct(APIContentTypeDraft $contentTypeDraft, APIContentTypeUpdateStruct $contentTypeUpdateStruct, APIUserReference $user)
 {
     $updateStruct = new SPIContentTypeUpdateStruct();
     $updateStruct->identifier = $contentTypeUpdateStruct->identifier !== null ? $contentTypeUpdateStruct->identifier : $contentTypeDraft->identifier;
     $updateStruct->remoteId = $contentTypeUpdateStruct->remoteId !== null ? $contentTypeUpdateStruct->remoteId : $contentTypeDraft->remoteId;
     $updateStruct->name = $contentTypeUpdateStruct->names !== null ? $contentTypeUpdateStruct->names : $contentTypeDraft->names;
     $updateStruct->description = $contentTypeUpdateStruct->descriptions !== null ? $contentTypeUpdateStruct->descriptions : $contentTypeDraft->descriptions;
     $updateStruct->modified = $contentTypeUpdateStruct->modificationDate !== null ? $contentTypeUpdateStruct->modificationDate->getTimestamp() : time();
     $updateStruct->modifierId = $contentTypeUpdateStruct->modifierId !== null ? $contentTypeUpdateStruct->modifierId : $user->getUserId();
     $updateStruct->urlAliasSchema = $contentTypeUpdateStruct->urlAliasSchema !== null ? $contentTypeUpdateStruct->urlAliasSchema : $contentTypeDraft->urlAliasSchema;
     $updateStruct->nameSchema = $contentTypeUpdateStruct->nameSchema !== null ? $contentTypeUpdateStruct->nameSchema : $contentTypeDraft->nameSchema;
     $updateStruct->isContainer = $contentTypeUpdateStruct->isContainer !== null ? $contentTypeUpdateStruct->isContainer : $contentTypeDraft->isContainer;
     $updateStruct->sortField = $contentTypeUpdateStruct->defaultSortField !== null ? $contentTypeUpdateStruct->defaultSortField : $contentTypeDraft->defaultSortField;
     $updateStruct->sortOrder = $contentTypeUpdateStruct->defaultSortOrder !== null ? (int) $contentTypeUpdateStruct->defaultSortOrder : $contentTypeDraft->defaultSortOrder;
     $updateStruct->defaultAlwaysAvailable = $contentTypeUpdateStruct->defaultAlwaysAvailable !== null ? $contentTypeUpdateStruct->defaultAlwaysAvailable : $contentTypeDraft->defaultAlwaysAvailable;
     $updateStruct->initialLanguageId = $this->contentLanguageHandler->loadByLanguageCode($contentTypeUpdateStruct->mainLanguageCode !== null ? $contentTypeUpdateStruct->mainLanguageCode : $contentTypeDraft->mainLanguageCode)->id;
     return $updateStruct;
 }
Exemplo n.º 12
0
 /**
  * Creates CreateStruct from $content.
  *
  * @param \eZ\Publish\SPI\Persistence\Content $content
  *
  * @return \eZ\Publish\SPI\Persistence\Content\CreateStruct
  */
 public function createCreateStructFromContent(Content $content)
 {
     $struct = new CreateStruct();
     $struct->name = $content->versionInfo->names;
     $struct->typeId = $content->versionInfo->contentInfo->contentTypeId;
     $struct->sectionId = $content->versionInfo->contentInfo->sectionId;
     $struct->ownerId = $content->versionInfo->contentInfo->ownerId;
     $struct->locations = array();
     $struct->alwaysAvailable = $content->versionInfo->contentInfo->alwaysAvailable;
     $struct->remoteId = md5(uniqid(get_class($this), true));
     $struct->initialLanguageId = $this->languageHandler->loadByLanguageCode($content->versionInfo->initialLanguageCode)->id;
     $struct->modified = time();
     foreach ($content->fields as $field) {
         $newField = clone $field;
         $newField->id = null;
         $struct->fields[] = $newField;
     }
     return $struct;
 }
 /**
  * Test delete function throwing LogicException
  *
  * @expectedException \LogicException
  * @covers eZ\Publish\Core\Persistence\InMemory\LanguageHandler::delete
  */
 public function testDeleteThrowsLogicException()
 {
     $language = $this->handler->loadByLanguageCode('eng-GB');
     $this->handler->delete($language->id);
 }