Skip to content

Commit

Permalink
Merge pull request #1 from fond-of/bugfix/product-urls
Browse files Browse the repository at this point in the history
ProductUrlStore
  • Loading branch information
gengjozsef authored Jan 3, 2020
2 parents 6a4dca1 + 09128bc commit dba8a53
Show file tree
Hide file tree
Showing 31 changed files with 327 additions and 94 deletions.
5 changes: 4 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ language: php
php:
- 7.1

env:
COMPOSER_MEMORY_LIMIT=-1

cache:
directories:
- vendor
Expand All @@ -16,4 +19,4 @@ script:
- vendor/bin/codecept run --coverage-xml

after_success:
- vendor/bin/php-coveralls
- vendor/bin/php-coveralls
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"spryker/code-sniffer": "^0.11",
"spryker/development": "^3.6",
"codeception/codeception": "^2.3",
"mikey179/vfsStream": "^1.6",
"mikey179/vfsstream": "^1.6",
"phpro/grumphp": "^0.14",
"sebastian/phpcpd": "^4.0"
},
Expand All @@ -45,4 +45,4 @@
"Generated\\": "tests/Generated/"
}
}
}
}
130 changes: 119 additions & 11 deletions src/FondOfSpryker/Zed/ProductUrlStore/Business/ProductUrlManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,53 @@

namespace FondOfSpryker\Zed\ProductUrlStore\Business;

use FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade\ProductToUrlInterface;
use FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade\StoreToProductStoreUrlBridgeInterface;
use Generated\Shared\Transfer\LocalizedUrlTransfer;
use Generated\Shared\Transfer\ProductAbstractTransfer;
use Generated\Shared\Transfer\ProductUrlTransfer;
use Generated\Shared\Transfer\UrlTransfer;
use Spryker\Zed\Product\Business\Product\Url\ProductUrlGeneratorInterface;
use Spryker\Zed\Product\Business\Product\Url\ProductUrlManager as SprykerProductUrlMananger;
use Spryker\Zed\Product\Dependency\Facade\ProductToLocaleInterface;
use Spryker\Zed\Product\Dependency\Facade\ProductToTouchInterface;
use Spryker\Zed\Product\Persistence\ProductQueryContainerInterface;

class ProductUrlManager extends SprykerProductUrlMananger implements ProductUrlManagerInterface
{
/**
* @var \FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade\StoreToProductStoreUrlBridgeInterface
*/
protected $storeFacade;

/**
* @var \FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade\ProductToUrlInterface
*/
protected $urlFacade;

/**
* ProductUrlManager constructor.
*
* @param \FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade\ProductToUrlInterface $urlFacade
* @param \Spryker\Zed\Product\Dependency\Facade\ProductToTouchInterface $touchFacade
* @param \Spryker\Zed\Product\Dependency\Facade\ProductToLocaleInterface $localeFacade
* @param \Spryker\Zed\Product\Persistence\ProductQueryContainerInterface $productQueryContainer
* @param \Spryker\Zed\Product\Business\Product\Url\ProductUrlGeneratorInterface $urlGenerator
* @param \FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade\StoreToProductStoreUrlBridgeInterface $storeFacade
*/
public function __construct(
ProductToUrlInterface $urlFacade,
ProductToTouchInterface $touchFacade,
ProductToLocaleInterface $localeFacade,
ProductQueryContainerInterface $productQueryContainer,
ProductUrlGeneratorInterface $urlGenerator,
StoreToProductStoreUrlBridgeInterface $storeFacade
) {
parent::__construct($urlFacade, $touchFacade, $localeFacade, $productQueryContainer, $urlGenerator);
$this->storeFacade = $storeFacade;
$this->urlFacade = $urlFacade;
}

/**
* @param \Generated\Shared\Transfer\ProductAbstractTransfer $productAbstractTransfer
*
Expand Down Expand Up @@ -44,23 +85,17 @@ public function createProductUrl(ProductAbstractTransfer $productAbstractTransfe
*/
public function updateProductUrl(ProductAbstractTransfer $productAbstractTransfer)
{
$availableStores = $this->storeFacade->getAllStores();

$this->productQueryContainer->getConnection()->beginTransaction();

$productUrl = $this->urlGenerator->generateProductUrl($productAbstractTransfer);

foreach ($productAbstractTransfer->getStoreRelation()->getIdStores() as $idStore) {
foreach ($productUrl->getUrls() as $localizedUrlTransfer) {
$urlTransfer = $this->getUrlByIdProductAbstractIdStoreAndIdLocale(
$productAbstractTransfer->requireIdProductAbstract()->getIdProductAbstract(),
$idStore,
$localizedUrlTransfer->getLocale()->getIdLocale()
);
$availableStores = $this->filterStores($availableStores, $idStore);

$urlTransfer
->setUrl($localizedUrlTransfer->getUrl())
->setFkLocale($localizedUrlTransfer->getLocale()->getIdLocale())
->setFkStore($idStore)
->setFkResourceProductAbstract($productAbstractTransfer->getIdProductAbstract());
foreach ($productUrl->getUrls() as $localizedUrlTransfer) {
$urlTransfer = $this->createUrlTransfer($productAbstractTransfer, $idStore, $localizedUrlTransfer);

if ($urlTransfer->getIdUrl()) {
$this->urlFacade->updateUrl($urlTransfer);
Expand All @@ -70,6 +105,7 @@ public function updateProductUrl(ProductAbstractTransfer $productAbstractTransfe
}
}

$this->clearOrphanedUrls($productAbstractTransfer, $availableStores, $productUrl);
$this->productQueryContainer->getConnection()->commit();

return $productUrl;
Expand All @@ -94,4 +130,76 @@ protected function getUrlByIdProductAbstractIdStoreAndIdLocale($idProductAbstrac
return $urlTransfer;
}

/**
* @param \Generated\Shared\Transfer\ProductAbstractTransfer $productAbstractTransfer
* @param int $idStore
* @param \Generated\Shared\Transfer\LocalizedUrlTransfer $localizedUrlTransfer
*
* @return \Generated\Shared\Transfer\UrlTransfer
*/
protected function createUrlTransfer(
ProductAbstractTransfer $productAbstractTransfer,
int $idStore,
LocalizedUrlTransfer $localizedUrlTransfer
): UrlTransfer {
$urlTransfer = $this->getUrlByIdProductAbstractIdStoreAndIdLocale(
$productAbstractTransfer->requireIdProductAbstract()->getIdProductAbstract(),
$idStore,
$localizedUrlTransfer->getLocale()->getIdLocale()
);

$urlTransfer
->setUrl($localizedUrlTransfer->getUrl())
->setFkLocale($localizedUrlTransfer->getLocale()->getIdLocale())
->setFkStore($idStore)
->setFkResourceProductAbstract($productAbstractTransfer->getIdProductAbstract());
return $urlTransfer;
}

/**
* @param array $availableStores
* @param int $idStore
*
* @return \Generated\Shared\Transfer\StoreTransfer[]
*/
protected function filterStores(array $availableStores, int $idStore): array
{
foreach ($availableStores as $index => $availableStore) {
if ($availableStore->getIdStore() === $idStore) {
unset($availableStores[$index]);
break;
}
}

return $availableStores;
}

/**
* @param \Generated\Shared\Transfer\ProductAbstractTransfer $productAbstractTransfer
* @param \Generated\Shared\Transfer\StoreTransfer[] $availableStores
* @param \Generated\Shared\Transfer\ProductUrlTransfer $productUrl
*
* @return void
*/
protected function clearOrphanedUrls(
ProductAbstractTransfer $productAbstractTransfer,
array $availableStores,
ProductUrlTransfer $productUrl
): void {
foreach ($availableStores as $availableStore) {
foreach ($productUrl->getUrls() as $localizedUrlTransfer) {
$urlTransfer = $this->createUrlTransfer(
$productAbstractTransfer,
$availableStore->getIdStore(),
$localizedUrlTransfer
);

$urlTransfer = $this->urlFacade->findUrl($urlTransfer);

if ($urlTransfer && $urlTransfer->getIdUrl() && $availableStore->getIdStore() === $urlTransfer->getFkStore()) {
$this->urlFacade->deleteUrl($urlTransfer);
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,4 @@

interface ProductUrlManagerInterface extends SprykerProductUrlManagerInterface
{

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@

namespace FondOfSpryker\Zed\ProductUrlStore\Business;

use FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade\ProductToUrlInterface;
use FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade\StoreToProductStoreUrlBridgeInterface;
use FondOfSpryker\Zed\ProductUrlStore\ProductUrlStoreDependencyProvider;
use Spryker\Zed\Product\Business\ProductBusinessFactory as SprykerProductBusinessFactory;

/**
* @method \Spryker\Zed\Product\ProductConfig getConfig()
* @method \FondOfSpryker\Zed\ProductUrlStore\Persistence\ProductUrlStoreQueryContainer getQueryContainer()
*/
class ProductUrlStoreBusinessFactory extends SprykerProductBusinessFactory
{
Expand All @@ -19,7 +23,24 @@ public function createProductUrlManager(): ProductUrlManagerInterface
$this->getTouchFacade(),
$this->getLocaleFacade(),
$this->getQueryContainer(),
$this->createProductUrlGenerator()
$this->createProductUrlGenerator(),
$this->getStoreFacade()
);
}

/**
* @return \FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade\StoreToProductStoreUrlBridgeInterface
*/
protected function getStoreFacade(): StoreToProductStoreUrlBridgeInterface
{
return $this->getProvidedDependency(ProductUrlStoreDependencyProvider::FACADE_STORE);
}

/**
* @return \FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade\StoreToProductStoreUrlBridgeInterface
*/
protected function getUrlFacade(): ProductToUrlInterface
{
return $this->getProvidedDependency(ProductUrlStoreDependencyProvider::FACADE_URL);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,4 @@ public function createProductAbstractUrl(ProductAbstractTransfer $productAbstrac
* @return \Generated\Shared\Transfer\ProductUrlTransfer
*/
public function updateProductAbstractUrl(ProductAbstractTransfer $productAbstractTransfer): ProductUrlTransfer;

}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade;

use Generated\Shared\Transfer\UrlTransfer;
use Spryker\Zed\Product\Dependency\Facade\ProductToUrlBridge as SprykerProductToUrlBridge;

class ProductToUrlBridge extends SprykerProductToUrlBridge implements ProductToUrlInterface
{
/**
* @param \Generated\Shared\Transfer\UrlTransfer $urlTransfer
*
* @return \Generated\Shared\Transfer\UrlTransfer|null
*/
public function findUrl(UrlTransfer $urlTransfer): ?UrlTransfer
{
return $this->urlFacade->findUrl($urlTransfer);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade;

use Generated\Shared\Transfer\UrlTransfer;
use Spryker\Zed\Product\Dependency\Facade\ProductToUrlInterface as SprykerProductToUrlInterface;

interface ProductToUrlInterface extends SprykerProductToUrlInterface
{
/**
* @param \Generated\Shared\Transfer\UrlTransfer $urlTransfer
*
* @return \Generated\Shared\Transfer\UrlTransfer|null
*/
public function findUrl(UrlTransfer $urlTransfer): ?UrlTransfer;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade;

use Spryker\Zed\Store\Business\StoreFacadeInterface;

class StoreToProductStoreUrlBridge implements StoreToProductStoreUrlBridgeInterface
{
/**
* @var \Spryker\Zed\Store\Business\StoreFacadeInterface
*/
protected $storeFacade;

/**
* StoreToProductStoreUrlBridge constructor.
*
* @param \Spryker\Zed\Store\Business\StoreFacadeInterface $storeFacade
*/
public function __construct(StoreFacadeInterface $storeFacade)
{
$this->storeFacade = $storeFacade;
}

/**
* @return \Generated\Shared\Transfer\StoreTransfer[]
*/
public function getAllStores(): array
{
return $this->storeFacade->getAllStores();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace FondOfSpryker\Zed\ProductUrlStore\Dependency\Facade;

interface StoreToProductStoreUrlBridgeInterface
{
/**
* @return \Generated\Shared\Transfer\StoreTransfer[]
*/
public function getAllStores(): array;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

use Spryker\Zed\Product\Persistence\ProductPersistenceFactory;

/**
* @method \FondOfSpryker\Zed\ProductUrlStore\ProductUrlStoreConfig getConfig()
* @method \FondOfSpryker\Zed\ProductUrlStore\Persistence\ProductUrlStoreQueryContainer getQueryContainer()
*/
class ProductUrlStorePersistenceFactory extends ProductPersistenceFactory
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

namespace FondOfSpryker\Zed\ProductUrlStore\Persistence;

use FondOfSpryker\Zed\ProductUrlStore\Persistence\ProductUrlStoreQueryContainerInterface;
use Spryker\Zed\Product\Persistence\ProductQueryContainer as SprykerProductQueryContainer;

class ProductUrlStoreQueryContainer extends SprykerProductQueryContainer implements ProductUrlStoreQueryContainerInterface
{

/**
* {@inheritdoc}
*
Expand Down
Loading

0 comments on commit dba8a53

Please sign in to comment.