/** * 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; }
/** * 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'); }
/** * 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; }
/** * @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 } } }
/** * 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; }
/** * 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; }
/** * 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'); }
/** * 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); }
/** * 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); }
/** * 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(); }