forked from aimeos/ai-client-html
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added catalog supplier as single component
- Loading branch information
Showing
5 changed files
with
344 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
<?php | ||
|
||
/** | ||
* @license LGPLv3, http://opensource.org/licenses/LGPL-3.0 | ||
* @copyright Aimeos (aimeos.org), 2018 | ||
* @package Client | ||
* @subpackage Html | ||
*/ | ||
|
||
|
||
namespace Aimeos\Client\Html\Catalog\Supplier; | ||
|
||
|
||
/** | ||
* Factory for supplier part in catalog for HTML clients. | ||
* | ||
* @package Client | ||
* @subpackage Html | ||
*/ | ||
class Factory | ||
extends \Aimeos\Client\Html\Common\Factory\Base | ||
implements \Aimeos\Client\Html\Common\Factory\Iface | ||
{ | ||
/** | ||
* Creates a supplier client object. | ||
* | ||
* @param \Aimeos\MShop\Context\Item\Iface $context Shop context instance with necessary objects | ||
* @param string|null $name Client name (default: "Standard") | ||
* @return \Aimeos\Client\Html\Iface Supplier part implementing \Aimeos\Client\Html\Iface | ||
* @throws \Aimeos\Client\Html\Exception If requested client implementation couldn't be found or initialisation fails | ||
*/ | ||
public static function create( \Aimeos\MShop\Context\Item\Iface $context, $name = null ) | ||
{ | ||
/** client/html/catalog/supplier/name | ||
* Class name of the used catalog supplier client implementation | ||
* | ||
* Each default HTML client can be replace by an alternative imlementation. | ||
* To use this implementation, you have to set the last part of the class | ||
* name as configuration value so the client factory knows which class it | ||
* has to instantiate. | ||
* | ||
* For example, if the name of the default class is | ||
* | ||
* \Aimeos\Client\Html\Catalog\Supplier\Standard | ||
* | ||
* and you want to replace it with your own version named | ||
* | ||
* \Aimeos\Client\Html\Catalog\Supplier\Mysupplier | ||
* | ||
* then you have to set the this configuration option: | ||
* | ||
* client/html/catalog/supplier/name = Mysupplier | ||
* | ||
* The value is the last part of your own class name and it's case sensitive, | ||
* so take care that the configuration value is exactly named like the last | ||
* part of the class name. | ||
* | ||
* The allowed characters of the class name are A-Z, a-z and 0-9. No other | ||
* characters are possible! You should always start the last part of the class | ||
* name with an upper case character and continue only with lower case characters | ||
* or numbers. Avoid chamel case names like "MySupplier"! | ||
* | ||
* @param string Last part of the class name | ||
* @since 2018.04 | ||
* @category Developer | ||
*/ | ||
if( $name === null ) { | ||
$name = $context->getConfig()->get( 'client/html/catalog/supplier/name', 'Standard' ); | ||
} | ||
|
||
if( ctype_alnum( $name ) === false ) | ||
{ | ||
$classname = is_string( $name ) ? '\\Aimeos\\Client\\Html\\Catalog\\Supplier\\' . $name : '<not a string>'; | ||
throw new \Aimeos\Client\Html\Exception( sprintf( 'Invalid characters in class name "%1$s"', $classname ) ); | ||
} | ||
|
||
$iface = '\\Aimeos\\Client\\Html\\Iface'; | ||
$classname = '\\Aimeos\\Client\\Html\\Catalog\\Supplier\\' . $name; | ||
|
||
$client = self::createClient( $context, $classname, $iface ); | ||
$client = self::addClientDecorators( $context, $client, 'catalog/supplier' ); | ||
|
||
return $client->setObject( $client ); | ||
} | ||
} |
157 changes: 157 additions & 0 deletions
157
client/html/src/Client/Html/Catalog/Supplier/Standard.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,157 @@ | ||
<?php | ||
|
||
/** | ||
* @license LGPLv3, http://opensource.org/licenses/LGPL-3.0 | ||
* @copyright Aimeos (aimeos.org), 2018 | ||
* @package Client | ||
* @subpackage Html | ||
*/ | ||
|
||
|
||
namespace Aimeos\Client\Html\Catalog\Supplier; | ||
|
||
|
||
/** | ||
* Default implementation of catalog supplier HTML client | ||
* | ||
* @package Client | ||
* @subpackage Html | ||
*/ | ||
class Standard | ||
extends \Aimeos\Client\Html\Catalog\Filter\Standard | ||
implements \Aimeos\Client\Html\Common\Client\Factory\Iface | ||
{ | ||
/** client/html/catalog/supplier/standard/subparts | ||
* List of HTML sub-clients rendered within the catalog supplier section | ||
* | ||
* The output of the frontend is composed of the code generated by the HTML | ||
* clients. Each HTML client can consist of serveral (or none) sub-clients | ||
* that are responsible for rendering certain sub-parts of the output. The | ||
* sub-clients can contain HTML clients themselves and therefore a | ||
* hierarchical tree of HTML clients is composed. Each HTML client creates | ||
* the output that is placed inside the container of its parent. | ||
* | ||
* At first, always the HTML code generated by the parent is printed, then | ||
* the HTML code of its sub-clients. The order of the HTML sub-clients | ||
* determines the order of the output of these sub-clients inside the parent | ||
* container. If the configured list of clients is | ||
* | ||
* array( "subclient1", "subclient2" ) | ||
* | ||
* you can easily change the order of the output by reordering the subparts: | ||
* | ||
* client/html/<clients>/subparts = array( "subclient1", "subclient2" ) | ||
* | ||
* You can also remove one or more parts if they shouldn't be rendered: | ||
* | ||
* client/html/<clients>/subparts = array( "subclient1" ) | ||
* | ||
* As the clients only generates structural HTML, the layout defined via CSS | ||
* should support adding, removing or reordering content by a fluid like | ||
* design. | ||
* | ||
* @param array List of sub-client names | ||
* @since 2018.04 | ||
* @category Developer | ||
*/ | ||
private $subPartPath = 'client/html/catalog/supplier/standard/subparts'; | ||
private $subPartNames = ['supplier']; | ||
|
||
|
||
/** | ||
* Returns the sub-client given by its name. | ||
* | ||
* @param string $type Name of the client type | ||
* @param string|null $name Name of the sub-client (Default if null) | ||
* @return \Aimeos\Client\Html\Iface Sub-client object | ||
*/ | ||
public function getSubClient( $type, $name = null ) | ||
{ | ||
/** client/html/catalog/supplier/decorators/excludes | ||
* Excludes decorators added by the "common" option from the catalog filter supplier html client | ||
* | ||
* Decorators extend the functionality of a class by adding new aspects | ||
* (e.g. log what is currently done), executing the methods of the underlying | ||
* class only in certain conditions (e.g. only for logged in users) or | ||
* modify what is returned to the caller. | ||
* | ||
* This option allows you to remove a decorator added via | ||
* "client/html/common/decorators/default" before they are wrapped | ||
* around the html client. | ||
* | ||
* client/html/catalog/supplier/decorators/excludes = array( 'decorator1' ) | ||
* | ||
* This would remove the decorator named "decorator1" from the list of | ||
* common decorators ("\Aimeos\Client\Html\Common\Decorator\*") added via | ||
* "client/html/common/decorators/default" to the html client. | ||
* | ||
* @param array List of decorator names | ||
* @since 2018.04 | ||
* @category Developer | ||
* @see client/html/common/decorators/default | ||
* @see client/html/catalog/supplier/decorators/global | ||
* @see client/html/catalog/supplier/decorators/local | ||
*/ | ||
|
||
/** client/html/catalog/supplier/decorators/global | ||
* Adds a list of globally available decorators only to the catalog filter supplier html client | ||
* | ||
* Decorators extend the functionality of a class by adding new aspects | ||
* (e.g. log what is currently done), executing the methods of the underlying | ||
* class only in certain conditions (e.g. only for logged in users) or | ||
* modify what is returned to the caller. | ||
* | ||
* This option allows you to wrap global decorators | ||
* ("\Aimeos\Client\Html\Common\Decorator\*") around the html client. | ||
* | ||
* client/html/catalog/supplier/decorators/global = array( 'decorator1' ) | ||
* | ||
* This would add the decorator named "decorator1" defined by | ||
* "\Aimeos\Client\Html\Common\Decorator\Decorator1" only to the html client. | ||
* | ||
* @param array List of decorator names | ||
* @since 2018.04 | ||
* @category Developer | ||
* @see client/html/common/decorators/default | ||
* @see client/html/catalog/supplier/decorators/excludes | ||
* @see client/html/catalog/supplier/decorators/local | ||
*/ | ||
|
||
/** client/html/catalog/supplier/decorators/local | ||
* Adds a list of local decorators only to the catalog filter supplier html client | ||
* | ||
* Decorators extend the functionality of a class by adding new aspects | ||
* (e.g. log what is currently done), executing the methods of the underlying | ||
* class only in certain conditions (e.g. only for logged in users) or | ||
* modify what is returned to the caller. | ||
* | ||
* This option allows you to wrap local decorators | ||
* ("\Aimeos\Client\Html\Catalog\Decorator\*") around the html client. | ||
* | ||
* client/html/catalog/supplier/decorators/local = array( 'decorator2' ) | ||
* | ||
* This would add the decorator named "decorator2" defined by | ||
* "\Aimeos\Client\Html\Catalog\Decorator\Decorator2" only to the html client. | ||
* | ||
* @param array List of decorator names | ||
* @since 2018.04 | ||
* @category Developer | ||
* @see client/html/common/decorators/default | ||
* @see client/html/catalog/supplier/decorators/excludes | ||
* @see client/html/catalog/supplier/decorators/global | ||
*/ | ||
|
||
return parent::getSubClient( $type, $name ); | ||
} | ||
|
||
|
||
/** | ||
* Returns the names of the subpart clients | ||
* | ||
* @return array List of client names | ||
*/ | ||
protected function getSubClientNames() | ||
{ | ||
return $this->getContext()->getConfig()->get( $this->subPartPath, $this->subPartNames ); | ||
} | ||
} |
56 changes: 56 additions & 0 deletions
56
client/html/tests/Client/Html/Catalog/Supplier/FactoryTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
<?php | ||
|
||
/** | ||
* @license LGPLv3, http://opensource.org/licenses/LGPL-3.0 | ||
* @copyright Aimeos (aimeos.org), 2018 | ||
*/ | ||
|
||
|
||
namespace Aimeos\Client\Html\Catalog\Supplier; | ||
|
||
|
||
class FactoryTest extends \PHPUnit\Framework\TestCase | ||
{ | ||
private $context; | ||
|
||
|
||
protected function setUp() | ||
{ | ||
$this->context = \TestHelperHtml::getContext(); | ||
} | ||
|
||
|
||
protected function tearDown() | ||
{ | ||
unset( $this->context ); | ||
} | ||
|
||
|
||
public function testCreateClient() | ||
{ | ||
$client = \Aimeos\Client\Html\Catalog\Supplier\Factory::create( $this->context ); | ||
$this->assertInstanceOf( '\\Aimeos\\Client\\Html\\Iface', $client ); | ||
} | ||
|
||
|
||
public function testCreateClientName() | ||
{ | ||
$client = \Aimeos\Client\Html\Catalog\Supplier\Factory::create( $this->context, 'Standard' ); | ||
$this->assertInstanceOf( '\\Aimeos\\Client\\Html\\Iface', $client ); | ||
} | ||
|
||
|
||
public function testCreateClientNameInvalid() | ||
{ | ||
$this->setExpectedException( '\\Aimeos\\Client\\Html\\Exception' ); | ||
\Aimeos\Client\Html\Catalog\Supplier\Factory::create( $this->context, '$$$' ); | ||
} | ||
|
||
|
||
public function testCreateClientNameNotFound() | ||
{ | ||
$this->setExpectedException( '\\Aimeos\\Client\\Html\\Exception' ); | ||
\Aimeos\Client\Html\Catalog\Supplier\Factory::create( $this->context, 'notfound' ); | ||
} | ||
|
||
} |
45 changes: 45 additions & 0 deletions
45
client/html/tests/Client/Html/Catalog/Supplier/StandardTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
<?php | ||
|
||
/** | ||
* @license LGPLv3, http://opensource.org/licenses/LGPL-3.0 | ||
* @copyright Aimeos (aimeos.org), 2018 | ||
*/ | ||
|
||
|
||
namespace Aimeos\Client\Html\Catalog\Supplier; | ||
|
||
|
||
class StandardTest extends \PHPUnit\Framework\TestCase | ||
{ | ||
private $object; | ||
|
||
|
||
protected function setUp() | ||
{ | ||
$this->object = new \Aimeos\Client\Html\Catalog\Supplier\Standard( \TestHelperHtml::getContext() ); | ||
$this->object->setView( \TestHelperHtml::getView() ); | ||
} | ||
|
||
|
||
protected function tearDown() | ||
{ | ||
unset( $this->object ); | ||
} | ||
|
||
|
||
public function testGetBody() | ||
{ | ||
$this->object->setView( $this->object->addData( $this->object->getView() ) ); | ||
$output = $this->object->getBody(); | ||
|
||
$this->assertContains( '<section class="aimeos catalog-filter"', $output ); | ||
$this->assertContains( '<section class="catalog-filter-supplier">', $output ); | ||
} | ||
|
||
|
||
public function testGetSubClient() | ||
{ | ||
$client = $this->object->getSubClient( 'supplier', 'Standard' ); | ||
$this->assertInstanceOf( '\\Aimeos\\Client\\HTML\\Iface', $client ); | ||
} | ||
} |