Пример #1
0
 /**
  * Builds the View based on $parameters.
  *
  * @param array $parameters
  *
  * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentException If the tag cannot be loaded
  *
  * @return \eZ\Publish\Core\MVC\Symfony\View\View An implementation of the View interface
  */
 public function buildView(array $parameters)
 {
     $view = new TagView();
     if (!empty($parameters['viewType'])) {
         $view->setViewType($parameters['viewType']);
     }
     if (isset($parameters['tagId'])) {
         $view->setTag($this->tagsService->loadTag($parameters['tagId']));
     } elseif (isset($parameters['tag']) && $parameters['tag'] instanceof Tag) {
         $view->setTag($parameters['tag']);
     } else {
         throw new InvalidArgumentException('Tag', 'No tag could be loaded from parameters');
     }
     $this->viewConfigurator->configure($view);
     // Deprecated controller actions are replaced with their new equivalent, viewAction
     if (!$view->getControllerReference() instanceof ControllerReference) {
         if ($parameters['_controller'] === 'eztags.controller.tag_view:viewTag') {
             $view->setControllerReference(new ControllerReference('eztags.controller.tag_view:viewAction'));
         }
         // We want to have a default template for full tag view
         if ($view->getViewType() === 'full' && $view->getTemplateIdentifier() === null) {
             $view->setTemplateIdentifier($this->configResolver->getParameter('tag_view.template', 'eztags'));
         }
     }
     $this->viewParametersInjector->injectViewParameters($view, $parameters);
     return $view;
 }
Пример #2
0
 /**
  * Returns tag keyword for provided tag ID or tag object.
  *
  * @param mixed|\Netgen\TagsBundle\API\Repository\Values\Tags\Tag $tag
  *
  * @return string
  */
 public function getTagKeyword($tag)
 {
     if (!$tag instanceof Tag) {
         try {
             $tag = $this->tagsService->loadTag($tag);
         } catch (NotFoundException $e) {
             return '';
         }
     }
     return $this->translationHelper->getTranslatedByMethod($tag, 'getKeyword');
 }
Пример #3
0
 /**
  * Generates the URL from $tag and $parameters.
  * Entries in $parameters will be added in the query string.
  *
  * @param \Netgen\TagsBundle\API\Repository\Values\Tags\Tag $tag
  * @param array $parameters
  *
  * @return string
  */
 public function doGenerate($tag, array $parameters)
 {
     if (isset($parameters['siteaccess'])) {
         // We generate for a different siteaccess, so potentially in a different language.
         $languages = $this->configResolver->getParameter('languages', null, $parameters['siteaccess']);
         unset($parameters['siteaccess']);
     } else {
         $languages = $this->configResolver->getParameter('languages');
     }
     $tagUrl = '';
     $isInternal = false;
     $originalTagId = $tagId = $tag->id;
     try {
         do {
             $tag = $this->tagsService->loadTag($tagId, $languages);
             $tagKeyword = null;
             foreach ($languages as $language) {
                 $tagKeyword = $tag->getKeyword($language);
                 if (!empty($tagKeyword)) {
                     break;
                 }
             }
             if (empty($tagKeyword)) {
                 if ($tag->alwaysAvailable) {
                     $tagKeyword = $tag->getKeyword();
                 }
                 if (empty($tagKeyword)) {
                     throw new LogicException("Unknown error when generating URL for tag ID #{$originalTagId}");
                 }
             }
             $tagUrl = '/' . $tagKeyword . $tagUrl;
             $tagId = $tag->parentTagId;
         } while ($tagId > 0);
     } catch (NotFoundException $e) {
         $isInternal = true;
         $tagUrl = $this->defaultRouter->generate(self::INTERNAL_TAG_ROUTE, array('tagId' => $originalTagId));
     } catch (LogicException $e) {
         if ($this->logger !== null) {
             $this->logger->warning($e->getMessage());
         }
         $isInternal = true;
         $tagUrl = $this->defaultRouter->generate(self::INTERNAL_TAG_ROUTE, array('tagId' => $originalTagId));
     }
     $queryString = '';
     if (!empty($parameters)) {
         $queryString = '?' . http_build_query($parameters, '', '&');
     }
     return (!$isInternal ? $this->getPathPrefix() : '') . '/' . trim($tagUrl, '/') . $queryString;
 }
Пример #4
0
 /**
  * @covers \Netgen\TagsBundle\Core\Repository\TagsService::deleteTag
  * @depends testLoadTag
  * @depends testLoadTagSynonyms
  * @depends testLoadTagChildren
  */
 public function testDeleteTag()
 {
     $tag = $this->tagsService->loadTag(16);
     $tagSynonyms = $this->tagsService->loadTagSynonyms($tag);
     $tagChildren = $this->tagsService->loadTagChildren($tag);
     $this->tagsService->deleteTag($tag);
     try {
         $this->tagsService->loadTag($tag->id);
         $this->fail('Tag not deleted');
     } catch (NotFoundException $e) {
         // Do nothing
     }
     foreach ($tagSynonyms as $synonym) {
         try {
             $this->tagsService->loadTag($synonym->id);
             $this->fail('Synonym not deleted');
         } catch (NotFoundException $e) {
             // Do nothing
         }
     }
     foreach ($tagChildren as $child) {
         try {
             $this->tagsService->loadTag($child->id);
             $this->fail('Child not deleted');
         } catch (NotFoundException $e) {
             // Do nothing
         }
     }
 }
Пример #5
0
 /**
  * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct.
  *
  * @param mixed $fieldSettings
  *
  * @return \eZ\Publish\SPI\FieldType\ValidationError[]
  */
 public function validateFieldSettings($fieldSettings)
 {
     $validationErrors = array();
     if (!is_array($fieldSettings)) {
         $validationErrors[] = new ValidationError('Field settings must be in form of an array');
         return $validationErrors;
     }
     foreach ($fieldSettings as $name => $value) {
         if (!isset($this->settingsSchema[$name])) {
             $validationErrors[] = new ValidationError("Setting '%setting%' is unknown", null, array('setting' => $name));
             continue;
         }
         switch ($name) {
             case 'subTreeLimit':
                 if (!is_integer($value)) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be of integer type", null, array('setting' => $name));
                 }
                 if ($value < 0) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be equal or larger than 0", null, array('setting' => $name));
                 }
                 if ($value > 0) {
                     try {
                         $this->tagsService->loadTag($value);
                     } catch (NotFoundException $e) {
                         $validationErrors[] = new ValidationError("Setting '%setting%' value must be an existing tag ID", null, array('setting' => $name));
                     }
                 }
                 break;
             case 'hideRootTag':
                 if (!is_bool($value)) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be of boolean type", null, array('setting' => $name));
                 }
                 break;
             case 'maxTags':
                 if (!is_integer($value)) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be of integer type", null, array('setting' => $name));
                 }
                 if ($value < 0) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be equal or larger than 0", null, array('setting' => $name));
                 }
                 break;
             case 'editView':
                 if (!is_string($value)) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be of string type", null, array('setting' => $name));
                 }
                 $editViewExists = false;
                 foreach ($this->availableEditViews as $editView) {
                     if ($editView['identifier'] === $value) {
                         $editViewExists = true;
                         break;
                     }
                 }
                 if (!$editViewExists) {
                     $validationErrors[] = new ValidationError("Edit view '%editView%' does not exist", null, array('editView' => $value));
                 }
                 break;
         }
     }
     return $validationErrors;
 }
Пример #6
0
 /**
  * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct.
  *
  * @param mixed $fieldSettings
  *
  * @return \eZ\Publish\SPI\FieldType\ValidationError[]
  */
 public function validateFieldSettings($fieldSettings)
 {
     $validationErrors = array();
     if (!is_array($fieldSettings)) {
         $validationErrors[] = new ValidationError('Field settings must be in form of an array');
         return $validationErrors;
     }
     foreach ($fieldSettings as $name => $value) {
         if (!isset($this->settingsSchema[$name])) {
             $validationErrors[] = new ValidationError("Setting '%setting%' is unknown", null, array('setting' => $name));
             continue;
         }
         switch ($name) {
             case 'subTreeLimit':
                 if (!is_integer($value)) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be of integer type", null, array('setting' => $name));
                 }
                 if ($value < 0) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be equal or larger than 0", null, array('setting' => $name));
                 }
                 if ($value > 0) {
                     try {
                         $this->tagsService->loadTag($value);
                     } catch (NotFoundException $e) {
                         $validationErrors[] = new ValidationError("Setting '%setting%' value must be an existing tag ID", null, array('setting' => $name));
                     }
                 }
                 break;
             case 'showDropDown':
                 if (!is_bool($value)) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be of boolean type", null, array('setting' => $name));
                 }
                 break;
             case 'hideRootTag':
                 if (!is_bool($value)) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be of boolean type", null, array('setting' => $name));
                 }
                 break;
             case 'maxTags':
                 if (!is_integer($value)) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be of integer type", null, array('setting' => $name));
                 }
                 if ($value < 0) {
                     $validationErrors[] = new ValidationError("Setting '%setting%' value must be equal or larger than 0", null, array('setting' => $name));
                 }
                 break;
         }
     }
     return $validationErrors;
 }
Пример #7
0
 /**
  * Generates a URL for a tag, from the given parameters.
  *
  * It is possible to directly pass a Tag object as the route name, as the ChainRouter allows it through ChainedRouterInterface
  *
  * If $name is a route name, the "tag" key in $parameters must be set to a valid Netgen\TagsBundle\API\Repository\Values\Tags\Tag object.
  * "tagId" can also be provided.
  *
  * If the generator is not able to generate the URL, it must throw the RouteNotFoundException as documented below.
  *
  * @param string|\Netgen\TagsBundle\API\Repository\Values\Tags\Tag $name The name of the route or a Tag instance
  * @param mixed $parameters An array of parameters
  * @param bool $absolute Whether to generate an absolute URL
  *
  * @throws \LogicException
  * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException
  * @throws \InvalidArgumentException
  *
  * @return string The generated URL
  */
 public function generate($name, $parameters = array(), $absolute = false)
 {
     // Direct access to Tag
     if ($name instanceof Tag) {
         return $this->generator->generate($name, $parameters, $absolute);
     }
     // Normal route name
     if ($name === self::TAG_URL_ROUTE_NAME) {
         if (isset($parameters['tag']) || isset($parameters['tagId'])) {
             // Check if tag is a valid Tag object
             if (isset($parameters['tag']) && !$parameters['tag'] instanceof Tag) {
                 throw new LogicException("When generating a Tag route, 'tag' parameter must be a valid Netgen\\TagsBundle\\API\\Repository\\Values\\Tags\\Tag.");
             }
             $tag = isset($parameters['tag']) ? $parameters['tag'] : $this->tagsService->loadTag($parameters['tagId']);
             unset($parameters['tag'], $parameters['tagId'], $parameters['viewType'], $parameters['layout']);
             return $this->generator->generate($tag, $parameters, $absolute);
         }
         throw new InvalidArgumentException("When generating a Tag route, either 'tag' or 'tagId' must be provided.");
     }
     throw new RouteNotFoundException('Could not match route');
 }
Пример #8
0
 /**
  * Action for rendering a tag view.
  *
  * @param mixed $tagId
  * @param \Symfony\Component\HttpFoundation\Request $request
  *
  * @return \Symfony\Component\HttpFoundation\Response
  */
 public function viewTag($tagId, Request $request)
 {
     $tag = $this->tagsService->loadTag($tagId);
     return $this->renderTag($tag, $request);
 }
Пример #9
0
 /**
  * Loads a tag object from its $tagId.
  *
  * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user is not allowed to read tags
  * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified tag is not found
  *
  * @param mixed $tagId
  * @param array|null $languages A language filter for keywords. If not given all languages are returned.
  * @param bool $useAlwaysAvailable Add main language to $languages if true (default) and if tag is always available
  *
  * @return \Netgen\TagsBundle\API\Repository\Values\Tags\Tag
  */
 public function loadTag($tagId, array $languages = null, $useAlwaysAvailable = true)
 {
     return $this->service->loadTag($tagId, $languages, $useAlwaysAvailable);
 }
Пример #10
0
 /**
  * Deletes a tag.
  *
  * @param string $tagPath
  *
  * @return \eZ\Publish\Core\REST\Server\Values\NoContent
  */
 public function deleteTag($tagPath)
 {
     $tag = $this->tagsService->loadTag($this->extractTagIdFromPath($tagPath));
     $this->tagsService->deleteTag($tag);
     return new BaseValues\NoContent();
 }