Error when set catid-default on fly in controller

How to configure and adapt Aimeos based shops as developer
Forum rules
Always add your Aimeos and PHP version as well as your environment (Linux/Mac/Win)
Spam and unrelated posts will be removed immediately!
vincenzo
Posts: 5
Joined: 16 May 2020, 18:09

Error when set catid-default on fly in controller

Post by vincenzo » 16 May 2020, 18:19

PHP 7.3
Linux
Laravel 7
Aimeos 2020.04.2


Hi,

when I change te default category id (promo) in home page by controller like this

Code: Select all

public function index()
    {
        config()->set( 'shop.client.html.catalog.lists.standard.subparts', ['promo''] );
        config()->set('shop.client.html.catalog.lists.catid-default', 15);


        foreach( config( 'shop.page.home' ) as $name )
        {
            $params['aiheader'][$name] = Shop::get( $name )->getHeader();
            $params['aibody'][$name] = Shop::get( $name )->getBody();
        }

        // do some more stuff
        return \View::make('home', $params);
if I try to click to basket I have this error:

Argument 1 passed to Aimeos\MW\Common\Base::sanitize() must be of the type string, null given, called in /var/www/vendor/aimeos/aimeos-core/lib/mwlib/src/MW/View/Helper/Url/Base.php on line 36

if I delete the two lines of config:

config()->set( 'shop.client.html.catalog.lists.standard.subparts', ['promo''] );
config()->set('shop.client.html.catalog.lists.catid-default', 15);

work fine

Thank you

User avatar
aimeos
Administrator
Posts: 7836
Joined: 01 Jan 1970, 00:00

Re: Error when set catid-default on fly in controller

Post by aimeos » 17 May 2020, 16:21

Do you have a full stack trace of the error?
Professional support and custom implementation are available at Aimeos.com
If you like Aimeos, Image give us a star

vincenzo
Posts: 5
Joined: 16 May 2020, 18:09

Re: Error when set catid-default on fly in controller

Post by vincenzo » 17 May 2020, 16:47

Yes!

Code: Select all

[2020-05-17 15:39:37] local.ERROR: Argument 1 passed to Aimeos\MW\Common\Base::sanitize() must be of the type string, null given, called in /var/www/vendor/aimeos/aimeos-core/lib/mwlib/src/MW/View/Helper/Url/Base.php on line 36 {"exception":"[object] (TypeError(code: 0): Argument 1 passed to Aimeos\\MW\\Common\\Base::sanitize() must be of the t
ype string, null given, called in /var/www/vendor/aimeos/aimeos-core/lib/mwlib/src/MW/View/Helper/Url/Base.php on line 36 at /var/www/vendor/aimeos/aimeos-core/lib/mwlib/src/MW/Common/Base.php:68)
[stacktrace]
#0 /var/www/vendor/aimeos/aimeos-core/lib/mwlib/src/MW/View/Helper/Url/Base.php(36): Aimeos\\MW\\Common\\Base::sanitize(NULL)
#1 /var/www/ext/ai-laravel/lib/custom/src/MW/View/Helper/Url/Laravel5.php(59): Aimeos\\MW\\View\\Helper\\Url\\Base->sanitize(Array)
#2 [internal function]: Aimeos\\MW\\View\\Helper\\Url\\Laravel5->transform('aimeos_shop_lis...', 'catalog', 'list', Array, Array, Array)
#3 /var/www/vendor/aimeos/aimeos-core/lib/mwlib/src/MW/View/Standard.php(88): call_user_func_array(Array, Array)
#4 /var/www/ext/ai-client-html/client/html/src/Client/Html/Basket/Standard/Standard.php(416): Aimeos\\MW\\View\\Standard->__call('url', Array)
#5 /var/www/ext/ai-client-html/client/html/src/Client/Html/Basket/Standard/Standard.php(148): Aimeos\\Client\\Html\\Basket\\Standard\\Standard->addData(Object(Aimeos\\MW\\View\\Standard))
#6 /var/www/vendor/aimeos/aimeos-laravel/src/Aimeos/Shop/Controller/BasketController.php(35): Aimeos\\Client\\Html\\Basket\\Standard\\Standard->getHeader()
#7 [internal function]: Aimeos\\Shop\\Controller\\BasketController->indexAction()
#8 /var/www/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
#9 /var/www/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('indexAction', Array)
#10 /var/www/vendor/laravel/framework/src/Illuminate/Routing/Route.php(239): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(Aimeos\\Shop\\Controller\\BasketController), 'indexAction')
#11 /var/www/vendor/laravel/framework/src/Illuminate/Routing/Route.php(196): Illuminate\\Routing\\Route->runController()
#12 /var/www/vendor/laravel/framework/src/Illuminate/Routing/Router.php(685): Illuminate\\Routing\\Route->run()
#13 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#14 /var/www/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#15 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#16 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(76): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#17 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#18 /var/www/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#19 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#20 /var/www/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#21 /var/www/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(62): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure))
#22 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#23 /var/www/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#24 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#25 /var/www/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#26 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#27 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#28 /var/www/vendor/laravel/framework/src/Illuminate/Routing/Router.php(687): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#29 /var/www/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#30 /var/www/vendor/laravel/framework/src/Illuminate/Routing/Router.php(628): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#31 /var/www/vendor/laravel/framework/src/Illuminate/Routing/Router.php(617): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#32 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(165): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#33 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#34 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#35 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#36 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#37 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#38 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#39 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#40 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(63): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#41 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#42 /var/www/vendor/fruitcake/laravel-cors/src/HandleCors.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#43 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\\Cors\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#44 /var/www/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#45 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#46 /var/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#47 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(140): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#48 /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(109): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#49 /var/www/public/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#50 {main}
if I do a $params "dd" in first line of transform function in ext\ai-laravel\lib\custom\src\MW\View\Helper\Url\Laravel5.php I get this:

Code: Select all

array:2 [▼
  "f_name" => null
  "f_catid" => "15"
]
thanks

User avatar
aimeos
Administrator
Posts: 7836
Joined: 01 Jan 1970, 00:00

Re: Error when set catid-default on fly in controller

Post by aimeos » 17 May 2020, 16:53

Seems like config()->set('...') overwrites the complete configuration of 'client/html/catalog/lists'. Try this instead:

Code: Select all

$config = app( 'aimeos.context' )->get()->getConfig();
$config->set( 'client/html/catalog/lists/standard/subparts', ['promo'] );
$config->set( 'client/html/catalog/lists/catid-default', 15 );
Professional support and custom implementation are available at Aimeos.com
If you like Aimeos, Image give us a star

vincenzo
Posts: 5
Joined: 16 May 2020, 18:09

Re: Error when set catid-default on fly in controller

Post by vincenzo » 17 May 2020, 17:04

I tried with:

Code: Select all

$config = app( 'aimeos.context' )->get()->getConfig();
        $config->set( 'client/html/catalog/lists/standard/subparts', ['promo'] );
        $config->set( 'client/html/catalog/lists/catid-default', 15 );


        foreach( config( 'shop.page.home' ) as $name )
        {
            $params['aiheader'][$name] = Shop::get( $name )->getHeader();
            $params['aibody'][$name] = Shop::get( $name )->getBody();
        }

        // do some more stuff
        return \View::make('home', $params);
but doesn't work...

I have overwrite promo-body-standard.php for implement add basket button:

Code: Select all

<?php

/**
 * @license LGPLv3, http://opensource.org/licenses/LGPL-3.0
 * @copyright Aimeos (aimeos.org), 2016-2020
 */


?>
<?php $this->block()->start( 'catalog/lists/promo' ); ?>

<?php if( !$this->get( 'promoItems', map() )->isEmpty() ) : ?>
	<section class="catalog-list-promo">
		<h2 class="header"><?= $this->translate( 'client', 'Top seller' ); ?></h2>
		<?= $this->partial(
			/** client/html/common/partials/products
			 * Relative path to the products partial template file
			 *
			 * Partials are templates which are reused in other templates and generate
			 * reoccuring blocks filled with data from the assigned values. The products
			 * partial creates an HTML block for a product listing.
			 *
			 * @param string Relative path to the template file
			 * @since 2017.01
			 * @category Developer
			 */
			$this->config( 'client/html/common/partials/products', 'common/partials/products-standard' ),
			[
			    'products' => $this->get( 'promoItems', map() ),
                'basket-add' => $this->config( 'client/html/catalog/lists/basket-add', false )
            ]
		); ?>
	</section>
<?php endif; ?>

<?php $this->block()->stop(); ?>
<?= $this->block()->get( 'catalog/lists/promo' ); ?>

vincenzo
Posts: 5
Joined: 16 May 2020, 18:09

Re: Error when set catid-default on fly in controller

Post by vincenzo » 17 May 2020, 18:21

When I go to basket with catid-default setted on controller the function addData in ext\ai-client-html\client\html\src\Client\Html\Basket\Standard\Standard.php is called:

Code: Select all

public function addData( \Aimeos\MW\View\Iface $view, array &$tags = [], string &$expire = null ) : \Aimeos\MW\View\Iface
	{
		$context = $this->getContext();
		$site = $context->getLocale()->getSiteItem()->getCode();

		if( ( $params = $context->getSession()->get( 'aimeos/catalog/detail/params/last/' . $site ) ) !== null )
		{
			$target = $view->config( 'client/html/catalog/detail/url/target' );
			$controller = $view->config( 'client/html/catalog/detail/url/controller', 'catalog' );
			$action = $view->config( 'client/html/catalog/detail/url/action', 'detail' );
			$config = $view->config( 'client/html/catalog/detail/url/config', [] );
		}
		else
		{
			$params = $context->getSession()->get( 'aimeos/catalog/lists/params/last/' . $site, [] );

			$target = $view->config( 'client/html/catalog/lists/url/target' );
			$controller = $view->config( 'client/html/catalog/lists/url/controller', 'catalog' );
			$action = $view->config( 'client/html/catalog/lists/url/action', 'list' );
			$config = $view->config( 'client/html/catalog/lists/url/config', [] );
		}

		if( empty( $params ) === false ) {
			$view->standardBackUrl = $view->url( $target, $controller, $action, $params, [], $config );
		}

		$basket = \Aimeos\Controller\Frontend::create( $this->getContext(), 'basket' )->get();

		$view->standardBasket = $basket;
		$view->standardTaxRates = $this->getTaxRates( $basket );
		$view->standardNamedTaxes = $this->getNamedTaxes( $basket );
		$view->standardCostsDelivery = $this->getCostsDelivery( $basket );
		$view->standardCostsPayment = $this->getCostsPayment( $basket );

		return parent::addData( $view, $tags, $expire );
	}
and the params setted in session:
$params = $context->getSession()->get( 'aimeos/catalog/lists/params/last/' . $site, [] );

are:

Code: Select all

array:2 [▼
  "f_name" => null
  "f_catid" => "15"
]
then in lib\mwlib\src\MW\View\Helper\Url\Base.php

the function sanitize try to sanitize f_name that is null and get the error

User avatar
aimeos
Administrator
Posts: 7836
Joined: 01 Jan 1970, 00:00

Re: Error when set catid-default on fly in controller

Post by aimeos » 19 May 2020, 07:36

OK, understood the problem now. Can you try

Code: Select all

composer req aimeos/aimeos-core:2020.04.x-dev
Professional support and custom implementation are available at Aimeos.com
If you like Aimeos, Image give us a star

vincenzo
Posts: 5
Joined: 16 May 2020, 18:09

Re: Error when set catid-default on fly in controller

Post by vincenzo » 19 May 2020, 10:23

Ok, now works fine.
Thanks and congratulations

Post Reply