Skip to content

Commit

Permalink
Added catalog supplier as single component
Browse files Browse the repository at this point in the history
  • Loading branch information
aimeos committed Nov 11, 2019
1 parent 15d9019 commit 79d36fe
Show file tree
Hide file tree
Showing 5 changed files with 344 additions and 1 deletion.
2 changes: 1 addition & 1 deletion client/html/src/Client/Html/Catalog/Attribute/Standard.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class Standard
* @category Developer
*/
private $subPartPath = 'client/html/catalog/attribute/standard/subparts';
private $subPartNames = ['attribute', 'supplier'];
private $subPartNames = ['attribute'];


/**
Expand Down
85 changes: 85 additions & 0 deletions client/html/src/Client/Html/Catalog/Supplier/Factory.php
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 client/html/src/Client/Html/Catalog/Supplier/Standard.php
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 client/html/tests/Client/Html/Catalog/Supplier/FactoryTest.php
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 client/html/tests/Client/Html/Catalog/Supplier/StandardTest.php
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 );
}
}

0 comments on commit 79d36fe

Please sign in to comment.