@@ -13,6 +13,7 @@
use Victoire\Bundle\CoreBundle\Entity\View;
use Victoire\Bundle\CoreBundle\Helper\UrlBuilder;
use Victoire\Bundle\CoreBundle\Helper\ViewCacheHelper;
use Victoire\Bundle\CoreBundle\Helper\ViewReferenceHelper;
use Victoire\Bundle\CoreBundle\Manager\BaseReferenceBuilder;

/**
@@ -25,32 +26,27 @@ class BusinessTemplateReferenceBuilder extends BaseReferenceBuilder implements B
protected $businessEntityPageHelper;

public function __construct(
ViewCacheHelper $viewCacheHelper,
EntityManager $em,
ViewReferenceHelper $viewReferenceHelper,
UrlBuilder $urlBuilder,
VirtualBusinessPageReferenceBuilder $virtualBusinessPageReferenceBuilder,
BusinessEntityHelper $businessEntityHelper,
BusinessPageHelper $businessEntityPageHelper,
BusinessPageBuilder $businessEntityPageBuilder
)
{
parent::__construct($viewCacheHelper, $em, $urlBuilder);
parent::__construct($viewReferenceHelper, $urlBuilder);
$this->virtualBusinessPageReferenceBuilder = $virtualBusinessPageReferenceBuilder;
$this->businessEntityHelper = $businessEntityHelper;
$this->businessEntityPageHelper = $businessEntityPageHelper;
$this->businessEntityPageBuilder = $businessEntityPageBuilder;
}

public function buildReference(BusinessTemplate $view)
public function buildReference(BusinessTemplate $view, $entity = null, $em = null)
{
$viewsReferences = [];
$entities = $this->businessEntityPageHelper->getEntitiesAllowed($view);
$entities = $this->businessEntityPageHelper->getEntitiesAllowed($view, $em);

// for each business entity
foreach ($entities as $entity) {
$currentPattern = clone $view;
$page = $this->businessEntityPageBuilder->generateEntityPageFromPattern($currentPattern, $entity);
$this->businessEntityPageHelper->updatePageParametersByEntity($page, $entity);
$this->businessEntityPageBuilder->updatePageParametersByEntity($page, $entity);

$viewsReferences = array_merge($viewsReferences, $this->virtualBusinessPageReferenceBuilder->buildReference($page));

@@ -16,16 +16,16 @@ class VirtualBusinessPageReferenceBuilder extends BaseReferenceBuilder implement
{
public function buildReference(VirtualBusinessPage $view){

$referenceId = $this->getViewCacheHelper()->getViewReferenceId($view);
$referenceId = $this->viewReferenceHelper->getViewReferenceId($view);
$viewsReference[] = array(
'id' => $referenceId,
'locale' => $view->getLocale(),
'patternId' => $view->getTemplate()->getId(),
'url' => $view->getUrl(),
'name' => $view->getName(),
'entityId' => $view->getBusinessEntity()->getId(),
'entityNamespace' => $this->getEntityManager()->getClassMetadata(get_class($view->getBusinessEntity()))->name,
'viewNamespace' => $this->getEntityManager()->getClassMetadata(get_class($view))->name,
'entityNamespace' => get_class($view->getBusinessEntity()),
'viewNamespace' => get_class($view),
'type' => $view::TYPE,
'view' => $view,
);
@@ -49,8 +49,6 @@ services:
parent: victoire_core.manager.base_view_manager
arguments:
- @victoire_business_page.manager.virtual_business_page_reference_builder
- @victoire_core.helper.business_entity_helper
- @victoire_business_page.business_page_helper
- @victoire_business_page.business_page_builder
tags:
- { name: victoire_core.view_manager, view: Victoire\Bundle\BusinessPageBundle\Entity\BusinessTemplate }
@@ -0,0 +1,43 @@
<?php

namespace Victoire\Bundle\CoreBundle\Builder;

use Victoire\Bundle\BusinessPageBundle\Entity\BusinessPage;
use Victoire\Bundle\BusinessPageBundle\Entity\VirtualBusinessPage;
use Victoire\Bundle\CoreBundle\Entity\View;
use Victoire\Bundle\CoreBundle\Entity\WebViewInterface;
use Victoire\Bundle\CoreBundle\Manager\Chain\ViewReferenceBuilderChain;


/**
* Page helper
* ref: victoire_core.view_reference_builder
*/
class ViewReferenceBuilder
{
protected $viewReferenceBuilderChain;

public function __construct(ViewReferenceBuilderChain $viewReferenceBuilderChain)
{
$this->viewReferenceBuilderChain = $viewReferenceBuilderChain;
}



/**
* compute the viewReference relative to a View + entity
* @param View $view
* @param array|[array] $entity
*
* @return array
*/
public function buildViewReference(View $view, $entity = null, $em = null)
{
$viewManager = $this->viewReferenceBuilderChain->getViewReferenceBuilder($view);
$viewReferences = $viewManager->buildReference($view, $entity, $em);

return $viewReferences;
}


}
@@ -42,7 +42,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
foreach ($links as $link) {
$progress->advance();
if ($link->getLinkType() == 'page' && $page = $link->getPage()) {
$viewReference = $this->getContainer()->get('victoire_core.viewCacheHelper')->getViewReferenceId($page);
$viewReference = $this->getContainer()->get('victoire_core.helper.view_reference_helper')->getViewReferenceId($page);
$link->setViewReference($viewReference);
$link->setLinkType('viewReference');
}
@@ -31,7 +31,7 @@ public function process(ContainerBuilder $container)
throw new InvalidConfigurationException("View class attribute is not defined for " . $id);
}
$definition->addMethodCall(
'addViewManager',
'addViewReferenceBuilder',
array(new Reference($id), $attributes['view'])
);
}
@@ -119,7 +119,7 @@ abstract class View
* @ORM\OneToMany(targetEntity="View", mappedBy="parent")
* @ORM\OrderBy({"lft" = "ASC"})
*/
protected $children;
protected $children = array();

/**
* This relation is dynamicly added by PageSubscriber
@@ -18,6 +18,7 @@
use Victoire\Bundle\BusinessPageBundle\Entity\VirtualBusinessPage;
use Victoire\Bundle\BusinessPageBundle\Helper\BusinessPageHelper;
use Victoire\Bundle\BusinessPageBundle\Transformer\VirtualToBusinessPageTransformer;
use Victoire\Bundle\CoreBundle\Builder\ViewReferenceBuilder;
use Victoire\Bundle\CoreBundle\Cache\Builder\CacheBuilder;
use Victoire\Bundle\CoreBundle\Entity\Route;
use Victoire\Bundle\CoreBundle\Entity\View;
@@ -44,12 +45,15 @@ class ViewReferenceSubscriber implements EventSubscriber
/**
* @param UrlBuilder $urlBuilder
* @param ViewCacheHelper $viewCacheHelper
* @param BusinessPageBuilder $businessPageBuilder
* @param ViewReferenceBuilder $viewReferenceBuilder
*/
public function __construct(UrlBuilder $urlBuilder, ViewCacheHelper $viewCacheHelper, BusinessPageBuilder $businessPageBuilder)
public function __construct(UrlBuilder $urlBuilder, ViewCacheHelper $viewCacheHelper, BusinessPageBuilder $businessPageBuilder, ViewReferenceBuilder $viewReferenceBuilder)
{
$this->urlBuilder = $urlBuilder;
$this->viewCacheHelper = $viewCacheHelper;
$this->businessPageBuilder = $businessPageBuilder;
$this->viewReferenceBuilder = $viewReferenceBuilder;
}
/**
* bind to LoadClassMetadata method
@@ -81,12 +85,10 @@ public function onFlush(OnFlushEventArgs $eventArgs)
|| array_key_exists('staticUrl', $uow->getEntityChangeSet($entity))
|| array_key_exists('parent', $uow->getEntityChangeSet($entity)))
)) {
error_log(get_class($entity) . $entity->getId());
$this->manageViewUrl($entity, $entityManager, $uow);
}
}
}
// @TODO ROUTE HISTORY
}

/**
@@ -110,7 +112,8 @@ public function postPersist(LifecycleEventArgs $eventArgs)
*/
protected function updateCache(View $view, EntityManager $em, UnitOfWork $uow)
{
$viewReferences = $this->viewCacheHelper->update($view);
$viewReferences = $this->viewReferenceBuilder->buildViewReference($view);
$viewReferences = $this->viewCacheHelper->update($viewReferences);


foreach ($viewReferences as $key => $viewReference) {
@@ -14,16 +14,6 @@
*/
class UrlBuilder
{
protected $viewCacheHelper;

/**
* Constructor
* @param Router $router
*/
public function __construct(ViewCacheHelper $viewCacheHelper)
{
$this->viewCacheHelper = $viewCacheHelper;
}



@@ -6,11 +6,8 @@
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\HttpFoundation\RequestStack;
use Victoire\Bundle\BusinessEntityBundle\Entity\BusinessEntity;
use Victoire\Bundle\BusinessPageBundle\Entity\BusinessPage;
use Victoire\Bundle\BusinessPageBundle\Entity\BusinessTemplate;
use Victoire\Bundle\BusinessPageBundle\Entity\VirtualBusinessPage;
use Victoire\Bundle\CoreBundle\Builder\ViewReferenceBuilder;
use Victoire\Bundle\CoreBundle\Entity\View;
use Victoire\Bundle\CoreBundle\Entity\WebViewInterface;

/**
* View cache helper
@@ -19,16 +16,22 @@
class ViewCacheHelper
{
private $xmlFile;
private $container;
private $requestStack;
private $viewReferenceBuilder;
private $viewReferenceHelper;

/**
* @param string $cacheDir
* @param RequestStack $requestStack
* @param ViewReferenceBuilder $viewReferenceBuilder
* @param ViewReferenceHelper $viewReferenceHelper
*/
public function __construct($cacheDir, RequestStack $requestStack)
public function __construct($cacheDir, RequestStack $requestStack, ViewReferenceBuilder $viewReferenceBuilder, ViewReferenceHelper $viewReferenceHelper)
{
$this->xmlFile = $cacheDir.'/victoire/viewsReferences.xml';
$this->requestStack = $requestStack;
$this->viewReferenceBuilder = $viewReferenceBuilder;
$this->viewReferenceHelper = $viewReferenceHelper;
}

/**
@@ -63,63 +66,36 @@ public function readCache()
return new \SimpleXMLElement(file_get_contents($this->xmlFile));
}

/**
* @return array
*/
public function convertXmlCacheToArray($xml)
{

$cachedArray = json_decode(json_encode((array) $xml), TRUE);
$viewsReferences = [];

foreach ($cachedArray['viewReference'] as $cachedViewReference) {
$viewReference['id'] = !empty($cachedViewReference['@attributes']['id']) ? $cachedViewReference['@attributes']['id'] : null ;
$viewReference['locale'] = !empty($cachedViewReference['@attributes']['locale']) ? $cachedViewReference['@attributes']['locale'] : null ;
$viewReference['entityId'] = !empty($cachedViewReference['@attributes']['entityId']) ? $cachedViewReference['@attributes']['entityId'] : null ;
$viewReference['entityNamespace'] = !empty($cachedViewReference['@attributes']['entityNamespace']) ? $cachedViewReference['@attributes']['entityNamespace'] : null ;
$viewReference['url'] = !empty($cachedViewReference['@attributes']['url']) ? $cachedViewReference['@attributes']['url'] : null ;
$viewReference['viewId'] = !empty($cachedViewReference['@attributes']['viewId']) ? $cachedViewReference['@attributes']['viewId'] : null ;
$viewReference['viewNamespace'] = !empty($cachedViewReference['@attributes']['viewNamespace']) ? $cachedViewReference['@attributes']['viewNamespace'] : null ;
$viewReference['patternId'] = !empty($cachedViewReference['@attributes']['patternId']) ? $cachedViewReference['@attributes']['patternId'] : null ;
$viewReference['name'] = !empty($cachedViewReference['@attributes']['name']) ? $cachedViewReference['@attributes']['name'] : null ;

$viewsReferences[] = $viewReference;
}

return $viewsReferences;
}


/**
* update or insert values of given view cache
* The given view can only be a WebView cause it have to got an url
* if you want to update a BusinessTemplate and all its BP|VBP, you have to call updateTemplate method
* @param View $view
* @param BusinessEntity|null $entity
* @param $viewReferences
* @internal param View $view
* @internal param null|BusinessEntity $entity
*
* @return \SimpleXMLElement
*/
public function update(View $view)
public function update($viewReferences)
{

/** @var ViewHelper $viewHelper */
$viewHelper = $this->container->get('victoire_core.view_helper');
$rootNode = $this->readCache();

$viewReferences = $viewHelper->buildViewReference($view);

self::removeViewReference($rootNode, $viewReferences);
foreach ($viewReferences as $_viewReference) {
$this->viewReferenceHelper->removeViewReference($rootNode, $_viewReference);
}
foreach ($viewReferences as $key => $_viewReference) {
$parameters = [
'patternId' => $_viewReference['patternId'],
'entityId' => $_viewReference['entityId'],
'patternId' => !empty($_viewReference['patternId']) ? $_viewReference['patternId'] : null,
'entityId' => !empty($_viewReference['entityId']) ? $_viewReference['entityId'] : null,
'viewNamespace' => 'Victoire\Bundle\BusinessPageBundle\Entity\VirtualBusinessPage',
];

$viewsReferencesToRemove = $this->getAllReferenceByParameters($parameters);
self::removeViewReference($rootNode, ['id' => $_viewReference['id']]);
$this->viewReferenceHelper->removeViewReference($rootNode, ['id' => $_viewReference['id']]);
foreach ($viewsReferencesToRemove as $viewReferenceToRemove) {
self::removeViewReference($rootNode, $viewReferenceToRemove);
$this->viewReferenceHelper->removeViewReference($rootNode, $viewReferenceToRemove);
}
$itemNode = $rootNode->addChild('viewReference');
foreach ($_viewReference as $key => $value) {
@@ -197,54 +173,12 @@ public function removeViewsReferencesByParameters($parameters)

$viewsReferencesToRemove = $this->getAllReferenceByParameters($parameters);
foreach ($viewsReferencesToRemove as $viewReferenceToRemove) {
$this->removeViewReference($rootNode, $viewReferenceToRemove);
$this->viewReferenceHelper->removeViewReference($rootNode, $viewReferenceToRemove);
}
$this->writeFile($rootNode);
}

/**
* @param View $view
* @param $entity
* @return string
*/
public static function getViewReferenceId(View $view, $entity = null)
{
$id = $view->getId();
if ($view instanceof BusinessPage) {
$entity = $view->getBusinessEntity();
if ($view instanceof VirtualBusinessPage) {
$id = $view->getTemplate()->getId();
}
} else if (!$view instanceof WebViewInterface) {
return $view->getId();
}

$refId = sprintf('ref_%s', $id);
if ($entity) {
$refId .= '_'.$entity->getId();
}

return $refId;
}

/**
* @param \SimpleXMLElement $rootNode
* @param array $viewReference
*/
private static function removeViewReference(\SimpleXMLElement $rootNode, array $viewReference)
{
//Clean by searching by id
$regex = sprintf("//viewReference[@id='%s']", $viewReference['id']);

//Clean by searching by url
if (isset($viewReference['url'])) {
$regex .= sprintf("| //viewReference[@url='%s']", $viewReference['url']);
}

foreach ($rootNode->xpath($regex) as $item) {
unset($item[0]);
}
}

/**
* write \SimpleXMLElement in the cache file
@@ -268,10 +202,6 @@ protected function writeFile(\SimpleXMLElement $rootNode)
return $dom->save($this->xmlFile);
}

public function setContainer(Container $container)
{
$this->container = $container;
}

/**
* Does the cache file exists ?
@@ -283,37 +213,4 @@ public function fileExists()
return file_exists($this->xmlFile);
}

/**
*
* @param $viewsReferences
*/
public function cleanVirtualViews(&$viewsReferences)
{
$urls = [];

foreach ($viewsReferences as $key => $viewReference) {
// If viewReference is a persisted page, we want to clean virtual BEPs
if (!empty($viewReference['type']) && $viewReference['type'] == 'business_page') {
$viewsReferences = array_filter($viewsReferences, function ($_viewReference) use ($viewReference) {
$cond = !($_viewReference['viewNamespace'] == 'Victoire\Bundle\BusinessPageBundle\Entity\VirtualBusinessPage'
&& !empty($_viewReference['entityNamespace']) && $_viewReference['entityNamespace'] == $viewReference['entityNamespace']
&& !empty($_viewReference['entityId']) && $_viewReference['entityId'] == $viewReference['entityId']
&& !empty($_viewReference['patternId']) && $_viewReference['patternId'] == $viewReference['patternId']);

return $cond;
});

}
// while viewReference url is found in viewreferences, increment the url slug to be unique
$url = $viewReference['url'];
$i = 1;
while (in_array($url, $urls)) {
$url = $viewReference['url'] . "-" . $i;
$i++;
}
$viewsReferences[$key]['url'] = $url;
$urls[] = $url;
}

}
}
@@ -5,15 +5,11 @@
use Doctrine\Orm\EntityManager;
use Victoire\Bundle\BusinessEntityBundle\Converter\ParameterConverter as BETParameterConverter;
use Victoire\Bundle\BusinessEntityBundle\Helper\BusinessEntityHelper;
use Victoire\Bundle\BusinessPageBundle\Chain\BusinessTemplateChain;
use Victoire\Bundle\BusinessPageBundle\Entity\BusinessTemplate;
use Victoire\Bundle\BusinessPageBundle\Helper\BusinessPageHelper;
use Victoire\Bundle\CoreBundle\Entity\Route;
use Victoire\Bundle\CoreBundle\Builder\ViewReferenceBuilder;
use Victoire\Bundle\CoreBundle\Entity\View;
use Victoire\Bundle\CoreBundle\Entity\WebViewInterface;
use Victoire\Bundle\CoreBundle\Manager\Chain\ViewReferenceBuilderChain;
use Victoire\Bundle\PageBundle\Entity\BasePage;
use Victoire\Widget\LayoutBundle\Entity\WidgetLayout;
use Victoire\Bundle\CoreBundle\Helper\ViewReferenceHelper;

/**
* Page helper
@@ -23,36 +19,31 @@ class ViewHelper
{
protected $parameterConverter;
protected $businessEntityHelper;
protected $BusinessPageHelper;
protected $em;
protected $viewCacheHelper;
protected $BusinessTemplateChain;
protected $viewReferenceBuilder;
protected $viewReferenceHelper;

/**
* Constructor
* @param BETParameterConverter $parameterConverter
* @param BusinessEntityHelper $businessEntityHelper
* @param BusinessPageHelper $BusinessPageHelper
* @param EntityManager $entityManager
* @param ViewCacheHelper $viewCacheHelper
* @param ViewManagerChain $$viewManagerChain
* @param BETParameterConverter $parameterConverter
* @param BusinessEntityHelper $businessEntityHelper
* @param EntityManager $entityManager
* @param ViewReferenceBuilder $viewReferenceBuilder
* @param ViewReferenceHelper $viewReferenceHelper
* @internal param $ViewManagerChain $$viewManagerChain
*/
public function __construct(
BETParameterConverter $parameterConverter,
BusinessEntityHelper $businessEntityHelper,
BusinessPageHelper $BusinessPageHelper,
EntityManager $entityManager,
ViewCacheHelper $viewCacheHelper,
ViewReferenceBuilderChain $viewReferenceBuilderChain,
BusinessTemplateChain $BusinessTemplateChain
ViewReferenceBuilder $viewReferenceBuilder,
ViewReferenceHelper $viewReferenceHelper
) {
$this->parameterConverter = $parameterConverter;
$this->businessEntityHelper = $businessEntityHelper;
$this->BusinessPageHelper = $BusinessPageHelper;
$this->em = $entityManager;
$this->viewCacheHelper = $viewCacheHelper;
$this->viewReferenceBuilderChain = $viewReferenceBuilderChain;
$this->BusinessTemplateChain = $BusinessTemplateChain;
$this->viewReferenceBuilder = $viewReferenceBuilder;
$this->viewReferenceHelper = $viewReferenceHelper;
}

//@todo Make it dynamic please
@@ -75,11 +66,11 @@ public function buildViewsReferences()
$viewsReferences = array();
foreach ($views as $view) {
if (get_class($view) != 'Victoire\Bundle\TemplateBundle\Entity\Template') {
$viewsReferences = array_merge($viewsReferences, $this->buildViewReference($view));
$viewsReferences = array_merge($viewsReferences, $this->viewReferenceBuilder->buildViewReference($view));
}
}

$this->viewCacheHelper->cleanVirtualViews($viewsReferences);
$this->viewReferenceHelper->cleanVirtualViews($viewsReferences);


return $viewsReferences;
@@ -94,25 +85,11 @@ public function getAllViewsReferences()
{

$xml = $this->readCache();
$viewsReferences = $this->viewCacheHelper->convertXmlCacheToArray($xml);
$viewsReferences = $this->viewReferenceHelper->convertXmlCacheToArray($xml);

return $viewsReferences;
}

/**
* compute the viewReference relative to a View + entity
* @param View $view
* @param array|[array] $entity
*
* @return array
*/
public function buildViewReference(View $view, $entity = null)
{
$viewManager = $this->viewReferenceBuilderChain->getViewManager($view);
$viewReferences = $viewManager->buildReference($view, $entity);

return $viewReferences;
}


/**
@@ -241,4 +218,5 @@ protected function cloneBusinessTemplate(BusinessTemplate $view)
$businessProperties = $businessEntity->getBusinessPropertiesByType('seoable');
}


}
@@ -0,0 +1,123 @@
<?php

namespace Victoire\Bundle\CoreBundle\Helper;

use Victoire\Bundle\BusinessPageBundle\Entity\BusinessPage;
use Victoire\Bundle\BusinessPageBundle\Entity\VirtualBusinessPage;
use Victoire\Bundle\CoreBundle\Entity\View;
use Victoire\Bundle\CoreBundle\Entity\WebViewInterface;

/**
* ref: victoire_core.helper.view_reference_helper
* Class ViewReferenceHelper
* @package Victoire\CoreBundle\Helper
*/
class ViewReferenceHelper
{

/**
* @param View $view
* @param $entity
* @return string
*/
public function getViewReferenceId(View $view, $entity = null)
{
$id = $view->getId();
if ($view instanceof BusinessPage) {
$entity = $view->getBusinessEntity();
if ($view instanceof VirtualBusinessPage) {
$id = $view->getTemplate()->getId();
}
} else if (!$view instanceof WebViewInterface) {
return $view->getId();
}

$refId = sprintf('ref_%s', $id);
if ($entity) {
$refId .= '_'.$entity->getId();
}

return $refId;
}


/**
* @param \SimpleXMLElement $rootNode
* @param array $viewReference
*/
public function removeViewReference(\SimpleXMLElement $rootNode, array $viewReference)
{
//Clean by searching by id
$regex = sprintf("//viewReference[@id='%s']", $viewReference['id']);

//Clean by searching by url
if (isset($viewReference['url'])) {
$regex .= sprintf("| //viewReference[@url='%s']", $viewReference['url']);
}

foreach ($rootNode->xpath($regex) as $item) {
unset($item[0]);
}
}

/**
* @return array
*/
public function convertXmlCacheToArray($xml)
{

$cachedArray = json_decode(json_encode((array) $xml), TRUE);
$viewsReferences = [];

foreach ($cachedArray['viewReference'] as $cachedViewReference) {
$viewReference['id'] = !empty($cachedViewReference['@attributes']['id']) ? $cachedViewReference['@attributes']['id'] : null ;
$viewReference['locale'] = !empty($cachedViewReference['@attributes']['locale']) ? $cachedViewReference['@attributes']['locale'] : null ;
$viewReference['entityId'] = !empty($cachedViewReference['@attributes']['entityId']) ? $cachedViewReference['@attributes']['entityId'] : null ;
$viewReference['entityNamespace'] = !empty($cachedViewReference['@attributes']['entityNamespace']) ? $cachedViewReference['@attributes']['entityNamespace'] : null ;
$viewReference['url'] = !empty($cachedViewReference['@attributes']['url']) ? $cachedViewReference['@attributes']['url'] : null ;
$viewReference['viewId'] = !empty($cachedViewReference['@attributes']['viewId']) ? $cachedViewReference['@attributes']['viewId'] : null ;
$viewReference['viewNamespace'] = !empty($cachedViewReference['@attributes']['viewNamespace']) ? $cachedViewReference['@attributes']['viewNamespace'] : null ;
$viewReference['patternId'] = !empty($cachedViewReference['@attributes']['patternId']) ? $cachedViewReference['@attributes']['patternId'] : null ;
$viewReference['name'] = !empty($cachedViewReference['@attributes']['name']) ? $cachedViewReference['@attributes']['name'] : null ;

$viewsReferences[] = $viewReference;
}

return $viewsReferences;
}

/**
*
* @param $viewsReferences
*/
public function cleanVirtualViews(&$viewsReferences)
{
$urls = [];

foreach ($viewsReferences as $key => $viewReference) {
// If viewReference is a persisted page, we want to clean virtual BEPs
if (!empty($viewReference['type']) && $viewReference['type'] == 'business_page') {
$viewsReferences = array_filter($viewsReferences, function ($_viewReference) use ($viewReference) {
$cond = !($_viewReference['viewNamespace'] == 'Victoire\Bundle\BusinessPageBundle\Entity\VirtualBusinessPage'
&& !empty($_viewReference['entityNamespace']) && $_viewReference['entityNamespace'] == $viewReference['entityNamespace']
&& !empty($_viewReference['entityId']) && $_viewReference['entityId'] == $viewReference['entityId']
&& !empty($_viewReference['patternId']) && $_viewReference['patternId'] == $viewReference['patternId']);

return $cond;
});

}
// while viewReference url is found in viewreferences, increment the url slug to be unique
$url = $viewReference['url'];
$i = 1;
while (in_array($url, $urls)) {
$url = $viewReference['url'] . "-" . $i;
$i++;
}
$viewsReferences[$key]['url'] = $url;
$urls[] = $url;
}

}

}
@@ -3,72 +3,30 @@
namespace Victoire\Bundle\CoreBundle\Manager;

use Doctrine\ORM\EntityManager;
use Victoire\Bundle\CoreBundle\Builder\ViewReferenceBuilder;
use Victoire\Bundle\CoreBundle\Entity\View;
use Victoire\Bundle\CoreBundle\Entity\WebViewInterface;
use Victoire\Bundle\CoreBundle\Helper\UrlBuilder;
use Victoire\Bundle\CoreBundle\Helper\ViewCacheHelper;
use Doctrine\ORM\EntityManagerInterface;
use Victoire\Bundle\CoreBundle\Helper\ViewReferenceHelper;


/**
* BaseReferenceBuilder
*/
abstract class BaseReferenceBuilder
{
protected $viewCacheHelper;
protected $em;
protected $viewReferenceHelper;
protected $urlBuilder;

public function __construct(ViewCacheHelper $viewCacheHelper, EntityManager $em, UrlBuilder $urlBuilder) {
$this->viewCacheHelper = $viewCacheHelper;
$this->em = $em;
$this->urlBuilder = $urlBuilder;
}
/**
* @return mixed
*/
public function getUrlBuilder()
{
return $this->urlBuilder;
}

/**
* @param ViewReferenceHelper $viewReferenceHelper
* @param UrlBuilder $urlBuilder
*/
public function setUrlBuilder(UrlBuilder $urlBuilder)
{
public function __construct(ViewReferenceHelper $viewReferenceHelper, UrlBuilder $urlBuilder) {
$this->viewReferenceHelper = $viewReferenceHelper;
$this->urlBuilder = $urlBuilder;
}


public function setViewCacheHelper(
ViewCacheHelper $viewCacheHelper
) {
$this->viewCacheHelper = $viewCacheHelper;

return $this;
}

/**
* @return ViewCacheHelper
*/
protected function getViewCacheHelper()
{
return $this->viewCacheHelper;
}

public function setEntityManager(
EntityManagerInterface $entityManager
) {
$this->em = $entityManager;

return $this;
}

/**
* @return EntityManager
*/
protected function getEntityManager()
{
return $this->em;
}
}
@@ -13,31 +13,31 @@
*/
class ViewReferenceBuilderChain
{
private $viewsManagers;
private $viewsReferenceBuilders;

public function __construct()
{
$this->viewsManagers = array();
$this->viewsReferenceBuilders = array();
}

/**
* add a view Manager
* @param ReferenceBuilderInterface $viewManager
*/
public function addViewManager(BaseReferenceBuilder $viewManager, $view)
public function addViewReferenceBuilder(BaseReferenceBuilder $viewManager, $view)
{
$this->viewsManagers[$view] = $viewManager;
$this->viewsReferenceBuilders[$view] = $viewManager;
}

/**
* @param View $view
* @return ReferenceBuilderInterface
*/
public function getViewManager(View $view)
public function getViewReferenceBuilder(View $view)
{
if(array_key_exists($viewClass = get_class($view), $this->viewsManagers))
if(array_key_exists($viewClass = get_class($view), $this->viewsReferenceBuilders))
{
return $this->viewsManagers[$viewClass];
return $this->viewsReferenceBuilders[$viewClass];
}
throw new ServiceNotFoundException('No view manager found for ' . $viewClass);
}
@@ -12,14 +12,14 @@ class PageReferenceBuilder extends BaseReferenceBuilder implements PageReference
{
public function buildReference(Page $view){
$view->setUrl($this->urlBuilder->buildUrl($view));
$referenceId = $this->viewCacheHelper->getViewReferenceId($view);
$referenceId = $this->viewReferenceHelper->getViewReferenceId($view);
$viewsReference[] = array(
'id' => $referenceId,
'locale' => $view->getLocale(),
'viewId' => $view->getId(),
'url' => $view->getUrl(),
'name' => $view->getName(),
'viewNamespace' => $this->em->getClassMetadata(get_class($view))->name,
'viewNamespace' => get_class($view),
'view' => $view,
);

@@ -98,8 +98,8 @@ services:
arguments:
- "%kernel.cache_dir%"
- "@request_stack"
calls:
- [ setContainer, ["@service_container"] ]
- "@victoire_core.view_reference_builder"
- "@victoire_core.helper.view_reference_helper"

victoire_core.cache_builder:
class: Victoire\Bundle\CoreBundle\Cache\Builder\CacheBuilder
@@ -135,6 +135,7 @@ services:
- "@victoire_core.url_builder"
- "@victoire_core.view_cache_helper"
- "@victoire_business_page.business_page_builder"
- "@victoire_core.view_reference_builder"
tags:
- { name: doctrine.event_subscriber, connection: default }

@@ -193,11 +194,13 @@ services:
arguments:
- "@victoire_business_entity.converter.parameter_converter"
- "@victoire_core.helper.business_entity_helper"
- "@victoire_business_page.business_page_helper"
- "@doctrine.orm.entity_manager"
- "@victoire_core.view_cache_helper"
- "@victoire_core.view_reference_builder"
- "@victoire_core.helper.view_reference_helper"
victoire_core.view_reference_builder:
class: Victoire\Bundle\CoreBundle\Builder\ViewReferenceBuilder
arguments:
- "@victoire_core.chain.view_reference_builder_chain"
- "@victoire_business_page.BusinessTemplate_chain"

victoire_core.current_view:
class: Victoire\Bundle\CoreBundle\Helper\CurrentViewHelper
@@ -219,8 +222,6 @@ services:

victoire_core.url_builder:
class: Victoire\Bundle\CoreBundle\Helper\UrlBuilder
arguments:
- "@victoire_core.view_cache_helper"

# ================== Chain ================== #

@@ -233,12 +234,14 @@ services:
class: Victoire\Bundle\CoreBundle\Manager\BaseReferenceBuilder
abstract: true
arguments:
- @victoire_core.view_cache_helper
- @doctrine.orm.entity_manager
- @victoire_core.helper.view_reference_helper
- @victoire_core.url_builder

victoire_core.manager.page_reference_builder:
class: Victoire\Bundle\CoreBundle\Manager\PageReferenceBuilder
parent: victoire_core.manager.base_view_manager
tags:
- { name: victoire_core.view_manager, view: Victoire\Bundle\PageBundle\Entity\Page }

victoire_core.helper.view_reference_helper:
class: Victoire\Bundle\CoreBundle\Helper\ViewReferenceHelper
@@ -12,7 +12,7 @@
use Victoire\Bundle\BusinessPageBundle\Chain\BusinessTemplateChain;
use Victoire\Bundle\BusinessPageBundle\Entity\BusinessPage;
use Victoire\Bundle\BusinessPageBundle\Entity\BusinessTemplate;
use Victoire\Bundle\BusinessPageBundle\Helper\BusinessPageHelper;
use Victoire\Bundle\CoreBundle\Builder\ViewReferenceBuilder;
use Victoire\Bundle\CoreBundle\Entity\EntityProxy;
use Victoire\Bundle\CoreBundle\Entity\View;
use Victoire\Bundle\CoreBundle\Helper\CurrentViewHelper;
@@ -28,14 +28,14 @@
use Victoire\Bundle\BusinessEntityBundle\Converter\ParameterConverter as BETParameterConverter;
use Victoire\Bundle\BusinessEntityBundle\Helper\BusinessEntityHelper;
use Victoire\Bundle\CoreBundle\Helper\UrlBuilder;
use Victoire\Bundle\CoreBundle\Helper\ViewReferenceHelper;

/**
* Page helper
* ref: victoire_page.page_helper
*/
class PageHelper extends ViewHelper
{
protected $bepHelper = null;
protected $businessPageBuilder;
protected $entityManager; // @doctrine.orm.entity_manager'
protected $currentViewHelper; // @victoire_core.current_view
@@ -48,6 +48,7 @@ class PageHelper extends ViewHelper
protected $widgetMapBuilder; // @victoire_widget_map.builder
protected $viewReferenceBuilderChain; // @victoire_core.chain.view_reference_builder_chain
protected $urlBuilder; // @victoire_core.url_builder
protected $viewCacheHelper;

protected $pageParameters = array(
'name',
@@ -60,7 +61,6 @@ class PageHelper extends ViewHelper
/**
* @param BETParameterConverter $parameterConverter
* @param BusinessEntityHelper $businessEntityHelper
* @param BusinessPageHelper $bepHelper
* @param EntityManager $entityManager
* @param ViewCacheHelper $viewCacheHelper
* @param ViewReferenceBuilderChain $viewReferenceBuilderChain
@@ -78,11 +78,9 @@ class PageHelper extends ViewHelper
public function __construct(
BETParameterConverter $parameterConverter,
BusinessEntityHelper $businessEntityHelper,
BusinessPageHelper $bepHelper,
EntityManager $entityManager,
ViewCacheHelper $viewCacheHelper,
ViewReferenceBuilderChain $viewReferenceBuilderChain,
BusinessTemplateChain $BusinessTemplateChain,
ViewReferenceBuilder $viewReferenceBuilder,
ViewReferenceHelper $viewReferenceHelper,
CurrentViewHelper $currentViewHelper,
EventDispatcherInterface $eventDispatcher,
TemplateMapper $victoireTemplating,
@@ -92,10 +90,10 @@ public function __construct(
AuthorizationChecker $authorization_checker,
WidgetMapBuilder $widgetMapBuilder,
UrlBuilder $urlBuilder,
BusinessPageBuilder $businessPageBuilder
BusinessPageBuilder $businessPageBuilder,
ViewCacheHelper $viewCacheHelper
) {
parent::__construct($parameterConverter, $businessEntityHelper, $bepHelper, $entityManager, $viewCacheHelper, $viewReferenceBuilderChain, $BusinessTemplateChain);
$this->bepHelper = $bepHelper;
parent::__construct($parameterConverter, $businessEntityHelper, $entityManager, $viewReferenceBuilder, $viewReferenceHelper);
$this->businessPageBuilder = $businessPageBuilder;
$this->entityManager = $entityManager;
$this->currentViewHelper = $currentViewHelper;
@@ -29,7 +29,7 @@ services:
- "@victoire_widget_map.builder"
- "@victoire_core.url_builder"
- "@victoire_business_page.business_page_builder"
- "@victoire_business_page.business_page_helper"
- "@victoire_core.view_cache_helper"

victoire_page.matcher.url_matcher:
class: Victoire\Bundle\PageBundle\Matcher\UrlMatcher
@@ -18,16 +18,16 @@ class QueryHelper
protected $businessEntityHelper = null;
protected $currentView;


/**
* Constructor
*
* @param EntityManager $entityManager
* @param BusinessEntityHelper $businessEntityHelper
* @param CurrentViewHelper $currentView
*/
public function __construct(EntityManager $entityManager, BusinessEntityHelper $businessEntityHelper, CurrentViewHelper $currentView)
public function __construct(BusinessEntityHelper $businessEntityHelper, CurrentViewHelper $currentView)
{
$this->entityManager = $entityManager;
$this->businessEntityHelper = $businessEntityHelper;
$this->currentView = $currentView;
}
@@ -42,11 +42,11 @@ public function __construct(EntityManager $entityManager, BusinessEntityHelper $
*
* @throws Exception
*/
public function getQueryBuilder($containerEntity)
public function getQueryBuilder($containerEntity, EntityManager $em = null)
{
//services
$entityManager = $this->entityManager;

if (!$em) {
$em = $this->getEntityManager();
}
if ($containerEntity === null) {
throw new \Exception('The container entity parameter must not be null.');
}
@@ -73,7 +73,7 @@ public function getQueryBuilder($containerEntity)

$businessClass = $businessEntity->getClass();

$itemsQueryBuilder = $entityManager
$itemsQueryBuilder = $em
->createQueryBuilder()
->select('main_item')
->from($businessClass, 'main_item');
@@ -109,11 +109,12 @@ protected function checkObjectHasQueryTrait($containerEntity)
*
* @return QueryBuilder The QB to list of objects
*/
public function buildWithSubQuery($containerEntity, QueryBuilder $itemsQueryBuilder)
public function buildWithSubQuery($containerEntity, QueryBuilder $itemsQueryBuilder, EntityManager $em = null)
{
//services
$entityManager = $this->entityManager;

if (!$em) {
$em = $this->getEntityManager();
}
//test the container entity
if ($containerEntity === null) {
throw new \Exception('The container entity parameter must not be null.');
@@ -128,7 +129,7 @@ public function buildWithSubQuery($containerEntity, QueryBuilder $itemsQueryBuil
$orderBy = json_decode($containerEntity->getOrderBy(), true);
if ($query !== '' && $query !== null) {

$subQuery = $this->entityManager->createQueryBuilder()
$subQuery = $em->createQueryBuilder()
->select('item.id')
->from($itemsQueryBuilder->getRootEntities()[0], 'item');

@@ -156,7 +157,7 @@ public function buildWithSubQuery($containerEntity, QueryBuilder $itemsQueryBuil
if ($currentView() && $currentView() instanceof BusinessPage && null !== $currentEntity = $currentView()->getBusinessEntity()) {

// NEW
$metadatas = $this->entityManager->getClassMetadata(get_class($currentEntity));
$metadatas = $em->getClassMetadata(get_class($currentEntity));
foreach ($metadatas->fieldMappings as $fieldName => $field) {
if (strpos($query, ":".$fieldName) !== false) {
$itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName));
@@ -175,4 +176,20 @@ public function buildWithSubQuery($containerEntity, QueryBuilder $itemsQueryBuil

return $itemsQueryBuilder;
}

/**
* @return EntityManager|null
*/
public function getEntityManager()
{
return $this->entityManager;
}

/**
* @param EntityManager|null $entityManager
*/
public function setEntityManager($entityManager)
{
$this->entityManager = $entityManager;
}
}
@@ -2,6 +2,8 @@ services:
victoire_query.query_helper:
class: Victoire\Bundle\QueryBundle\Helper\QueryHelper
arguments:
- "@doctrine.orm.entity_manager"
# - "@doctrine.orm.entity_manager"
- "@victoire_core.helper.business_entity_helper"
- "@victoire_core.current_view"
calls:
- [setEntityManager, ["@doctrine.orm.entity_manager"]]
@@ -153,7 +153,7 @@ public function editAction(Widget $widget, $viewReference, $mode = Widget::MODE_
$view = $this->getViewByReferenceId($viewReference);
$widgetView = $widget->getView();

$widgetViewReferenceId = $this->get('victoire_core.view_cache_helper')
$widgetViewReferenceId = $this->get('victoire_core.helper.view_reference_helper')
->getViewReferenceId($widgetView);

$widgetView->setReference(['id' => $widgetViewReferenceId]);
@@ -190,7 +190,7 @@ public function stylizeAction(Request $request, Widget $widget, $viewReference)
$view = $this->getViewByReferenceId($viewReference);
$widgetView = $widget->getView();

$widgetViewReferenceId = $this->get('victoire_core.view_cache_helper')
$widgetViewReferenceId = $this->get('victoire_core.helper.view_reference_helper')
->getViewReferenceId($widgetView);

$widgetView->setReference(['id' => $widgetViewReferenceId]);