* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 */ namespace PrestaShop\Module\LinkList\Presenter; use Meta; use PrestaShop\Module\LinkList\Filter\LinkFilter; use PrestaShop\Module\LinkList\Model\LinkBlock; use Tools; /** * Class LinkBlockPresenter. */ class LinkBlockPresenter { private $link; private $language; private $linkFilter; /** * LinkBlockPresenter constructor. * * @param \Link $link * @param \Language $language */ public function __construct(\Link $link, \Language $language, LinkFilter $linkFilter = null) { $this->link = $link; $this->language = $language; $this->linkFilter = $linkFilter ?? new LinkFilter(); } /** * @param LinkBlock $cmsBlock * * @return array * * @throws \PrestaShopDatabaseException * @throws \PrestaShopException */ public function present(LinkBlock $cmsBlock) { return [ 'id' => (int) $cmsBlock->id, 'title' => $cmsBlock->name[(int) $this->language->id], 'hook' => (new \Hook((int) $cmsBlock->id_hook))->name, 'position' => $cmsBlock->position, 'links' => $this->makeLinks($cmsBlock->content, $cmsBlock->custom_content), ]; } /** * Check the url if is an external link. * * @param string $url * * @return bool */ public function isExternalLink($url) { $baseLink = preg_replace('#^(http)s?://#', '', $this->link->getBaseLink()); $url = Tools::strtolower($url); if (preg_match('#^(http)s?://#', $url) && !preg_match('#^(http)s?://' . preg_quote(rtrim($baseLink, '/'), '/') . '#', $url)) { return true; } return false; } /** * @param array $content * @param array $custom_content * * @return array */ private function makeLinks($content, $custom_content) { $cmsLinks = $productLinks = $staticsLinks = $customLinks = $categoryLinks = []; if (isset($content['cms'])) { $cmsLinks = $this->makeCmsLinks($content['cms']); } if (isset($content['product'])) { $productLinks = $this->makeProductLinks($content['product']); } if (isset($content['static'])) { $staticsLinks = $this->makeStaticLinks($content['static']); } if (isset($content['category'])) { $categoryLinks = $this->makeCategoryLinks($content['category']); } $customLinks = $this->makeCustomLinks($custom_content); return array_merge( $cmsLinks, $productLinks, $staticsLinks, $customLinks, $categoryLinks ); } /** * @param array $cmsIds * * @return array * * @throws \PrestaShopDatabaseException * @throws \PrestaShopException */ private function makeCmsLinks($cmsIds) { $cmsLinks = []; foreach ($cmsIds as $cmsId) { $cms = new \CMS((int) $cmsId); if (null !== $cms->id && $cms->active) { $cmsLinks[] = [ 'id' => 'link-cms-page-' . $cms->id, 'class' => 'cms-page-link', 'title' => $cms->meta_title[(int) $this->language->id], 'description' => $cms->meta_description[(int) $this->language->id], 'url' => $this->link->getCMSLink($cms), ]; } } return $cmsLinks; } /** * @param array $productIds * * @return array */ private function makeProductLinks($productIds) { $productLinks = []; foreach ($productIds as $productId) { if (false === $productId || $this->isLinkDisabled($productId)) { continue; } $meta = \Meta::getMetaByPage($productId, (int) $this->language->id); $productLinks[] = [ 'id' => 'link-product-page-' . $productId, 'class' => 'cms-page-link', 'title' => $meta['title'], 'description' => $meta['description'], 'url' => $this->link->getPageLink($productId, true), ]; } return $productLinks; } /** * @param array $staticIds * * @return array */ private function makeStaticLinks($staticIds) { $staticLinks = []; foreach ($staticIds as $staticId) { if (false === $staticId || $this->isLinkDisabled($staticId)) { continue; } $meta = \Meta::getMetaByPage($staticId, (int) $this->language->id); $staticLinks[] = [ 'id' => 'link-static-page-' . $staticId, 'class' => 'cms-page-link', 'title' => $meta['title'], 'description' => $meta['description'], 'url' => $this->link->getPageLink($staticId, true), ]; } return $staticLinks; } /** * @param array $customContent * * @return array */ private function makeCustomLinks($customContent) { $customLinks = []; if (!isset($customContent[$this->language->id])) { return $customLinks; } $customLinks = $customContent[$this->language->id]; $self = $this; $customLinks = array_map(function ($el) use ($self) { return [ 'id' => 'link-custom-page-' . Tools::str2url($el['title']), 'class' => 'custom-page-link', 'title' => $el['title'], 'description' => '', 'url' => $el['url'], 'target' => $self->isExternalLink($el['url']) ? '_blank' : '', ]; }, array_filter($customLinks)); return $customLinks; } /** * @param array $categoryIds * * @return array */ private function makeCategoryLinks($categoryIds) { $categoryLinks = []; foreach ($categoryIds as $categoryId) { if (false === $categoryId) { continue; } $meta = Meta::getCategoryMetas($categoryId, (int) $this->language->id, '', null); $categoryLinks[] = [ 'id' => 'link-category-' . $categoryId, 'class' => 'category-link', 'title' => $meta['name'], 'description' => strip_tags($meta['description']), 'url' => $this->link->getCategoryLink((int) $categoryId), ]; } return $categoryLinks; } private function isLinkDisabled(string $routeId): bool { return !$this->linkFilter->isRouteEnabled($routeId); } }