Skip to content

Commit

Permalink
Simplified account favorite
Browse files Browse the repository at this point in the history
  • Loading branch information
aimeos committed Jan 28, 2022
1 parent 1ddbc50 commit 29da274
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 398 deletions.
298 changes: 6 additions & 292 deletions client/html/src/Client/Html/Account/Favorite/Standard.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,255 +22,6 @@ class Standard
extends \Aimeos\Client\Html\Common\Client\Factory\Base
implements \Aimeos\Client\Html\Common\Client\Factory\Iface
{
/** client/html/account/favorite/subparts
* List of HTML sub-clients rendered within the account favorite 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 2014.03
* @category Developer
*/
private $subPartPath = 'client/html/account/favorite/subparts';
private $subPartNames = [];
private $view;


/**
* Returns the HTML code for insertion into the body.
*
* @param string $uid Unique identifier for the output if the content is placed more than once on the same page
* @return string HTML code
*/
public function body( string $uid = '' ) : string
{
$context = $this->context();
$view = $this->view();

try
{
$view = $this->view = $this->view ?? $this->object()->data( $view );

$html = '';
foreach( $this->getSubClients() as $subclient ) {
$html .= $subclient->setView( $view )->body( $uid );
}
$view->favoriteBody = $html;
}
catch( \Aimeos\Client\Html\Exception $e )
{
$error = array( $context->translate( 'client', $e->getMessage() ) );
$view->favoriteErrorList = array_merge( $view->get( 'favoriteErrorList', [] ), $error );
}
catch( \Aimeos\Controller\Frontend\Exception $e )
{
$error = array( $context->translate( 'controller/frontend', $e->getMessage() ) );
$view->favoriteErrorList = array_merge( $view->get( 'favoriteErrorList', [] ), $error );
}
catch( \Aimeos\MShop\Exception $e )
{
$error = array( $context->translate( 'mshop', $e->getMessage() ) );
$view->favoriteErrorList = array_merge( $view->get( 'favoriteErrorList', [] ), $error );
}
catch( \Exception $e )
{
$error = array( $context->translate( 'client', 'A non-recoverable error occured' ) );
$view->favoriteErrorList = array_merge( $view->get( 'favoriteErrorList', [] ), $error );
$this->logException( $e );
}

/** client/html/account/favorite/template-body
* Relative path to the HTML body template of the account favorite client.
*
* The template file contains the HTML code and processing instructions
* to generate the result shown in the body of the frontend. The
* configuration string is the path to the template file relative
* to the templates directory (usually in client/html/templates).
*
* You can overwrite the template file configuration in extensions and
* provide alternative templates. These alternative templates should be
* named like the default one but suffixed by
* an unique name. You may use the name of your project for this. If
* you've implemented an alternative client class as well, it
* should be suffixed by the name of the new class.
*
* @param string Relative path to the template creating code for the HTML page body
* @since 2014.03
* @category Developer
* @see client/html/account/favorite/template-header
*/
$tplconf = 'client/html/account/favorite/template-body';
$default = 'account/favorite/body';

return $view->render( $view->config( $tplconf, $default ) );
}


/**
* Returns the HTML string for insertion into the header.
*
* @param string $uid Unique identifier for the output if the content is placed more than once on the same page
* @return string|null String including HTML tags for the header on error
*/
public function header( string $uid = '' ) : ?string
{
$view = $this->view();

try
{
$view = $this->view = $this->view ?? $this->object()->data( $view );

$html = '';
foreach( $this->getSubClients() as $subclient ) {
$html .= $subclient->setView( $view )->header( $uid );
}
$view->favoriteHeader = $html;

/** client/html/account/favorite/template-header
* Relative path to the HTML header template of the account favorite client.
*
* The template file contains the HTML code and processing instructions
* to generate the HTML code that is inserted into the HTML page header
* of the rendered page in the frontend. The configuration string is the
* path to the template file relative to the templates directory (usually
* in client/html/templates).
*
* You can overwrite the template file configuration in extensions and
* provide alternative templates. These alternative templates should be
* named like the default one but suffixed by
* an unique name. You may use the name of your project for this. If
* you've implemented an alternative client class as well, it
* should be suffixed by the name of the new class.
*
* @param string Relative path to the template creating code for the HTML page head
* @since 2014.03
* @category Developer
* @see client/html/account/favorite/template-body
*/
$tplconf = 'client/html/account/favorite/template-header';
$default = 'account/favorite/header';

return $view->render( $view->config( $tplconf, $default ) );
}
catch( \Exception $e )
{
$this->logException( $e );
}

return null;
}


/**
* 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( string $type, string $name = null ) : \Aimeos\Client\Html\Iface
{
/** client/html/account/favorite/decorators/excludes
* Excludes decorators added by the "common" option from the account favorite 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/account/favorite/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 2014.05
* @category Developer
* @see client/html/common/decorators/default
* @see client/html/account/favorite/decorators/global
* @see client/html/account/favorite/decorators/local
*/

/** client/html/account/favorite/decorators/global
* Adds a list of globally available decorators only to the account favorite 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/account/favorite/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 2014.05
* @category Developer
* @see client/html/common/decorators/default
* @see client/html/account/favorite/decorators/excludes
* @see client/html/account/favorite/decorators/local
*/

/** client/html/account/favorite/decorators/local
* Adds a list of local decorators only to the account favorite 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\Account\Decorator\*") around the html client.
*
* client/html/account/favorite/decorators/local = array( 'decorator2' )
*
* This would add the decorator named "decorator2" defined by
* "\Aimeos\Client\Html\Account\Decorator\Decorator2" only to the html client.
*
* @param array List of decorator names
* @since 2014.05
* @category Developer
* @see client/html/common/decorators/default
* @see client/html/account/favorite/decorators/excludes
* @see client/html/account/favorite/decorators/global
*/
return $this->createSubClient( 'account/favorite/' . $type, $name );
}


/**
* Processes the input, e.g. store given values.
*
Expand All @@ -283,41 +34,15 @@ public function init()
$context = $this->context();
$ids = (array) $view->param( 'fav_id', [] );

try
if( $context->user() !== null && !empty( $ids ) && $view->request()->getMethod() === 'POST' )
{
if( $context->user() !== null && !empty( $ids ) && $view->request()->getMethod() === 'POST' )
switch( $view->param( 'fav_action' ) )
{
switch( $view->param( 'fav_action' ) )
{
case 'add':
$this->addFavorites( $ids ); break;
case 'delete':
$this->deleteFavorites( $ids ); break;
}
case 'add':
$this->addFavorites( $ids ); break;
case 'delete':
$this->deleteFavorites( $ids ); break;
}

parent::init();
}
catch( \Aimeos\MShop\Exception $e )
{
$error = array( $context->translate( 'mshop', $e->getMessage() ) );
$view->favoriteErrorList = array_merge( $view->get( 'favoriteErrorList', [] ), $error );
}
catch( \Aimeos\Controller\Frontend\Exception $e )
{
$error = array( $context->translate( 'controller/frontend', $e->getMessage() ) );
$view->favoriteErrorList = array_merge( $view->get( 'favoriteErrorList', [] ), $error );
}
catch( \Aimeos\Client\Html\Exception $e )
{
$error = array( $context->translate( 'client', $e->getMessage() ) );
$view->favoriteErrorList = array_merge( $view->get( 'favoriteErrorList', [] ), $error );
}
catch( \Exception $e )
{
$error = array( $context->translate( 'client', 'A non-recoverable error occured' ) );
$view->favoriteErrorList = array_merge( $view->get( 'favoriteErrorList', [] ), $error );
$this->logException( $e );
}
}

Expand Down Expand Up @@ -386,17 +111,6 @@ protected function deleteFavorites( array $ids )
}


/**
* Returns the list of sub-client names configured for the client.
*
* @return array List of HTML client names
*/
protected function getSubClientNames() : array
{
return $this->context()->config()->get( $this->subPartPath, $this->subPartNames );
}


/**
* Returns the sanitized page from the parameters for the product list.
*
Expand Down
9 changes: 0 additions & 9 deletions client/html/templates/account/favorite/body.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,6 @@
?>
<section class="aimeos account-favorite" data-jsonurl="<?= $enc->attr( $this->link( 'client/jsonapi/url' ) ) ?>">

<?php if( ( $errors = $this->get( 'favoriteErrorList', [] ) ) !== [] ) : ?>
<ul class="error-list">
<?php foreach( $errors as $error ) : ?>
<li class="error-item"><?= $enc->html( $error ) ?></li>
<?php endforeach ?>
</ul>
<?php endif ?>


<?php if( !$this->get( 'favoriteItems', map() )->isEmpty() ) : ?>

<h1 class="header"><?= $this->translate( 'client', 'Favorite products' ) ?></h1>
Expand Down
2 changes: 0 additions & 2 deletions client/html/templates/account/favorite/header.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,3 @@
?>
<link class="account-favorite" rel="stylesheet" href="<?= $enc->attr( $this->content( $this->get( 'contextSite', 'default' ) . '/account-favorite.css', 'fs-theme', true ) ) ?>">
<script defer class="account-favorite" src="<?= $enc->attr( $this->content( $this->get( 'contextSite', 'default' ) . '/account-favorite.js', 'fs-theme', true ) ) ?>"></script>

<?= $this->get( 'favoriteHeader' ) ?>
Loading

0 comments on commit 29da274

Please sign in to comment.