Page 5 of 7

Re: How to add additional fields to a customer

Posted: 12 Apr 2018, 09:38
by mohal_04
aimeos wrote:No, it's the same as for the managers: You have to extend from the standard class and create e.g.

./ext/myextendsion/admin/jqadm/src/Admin/JQAdm/Product/Price/Mystandard.php

which contains:

Code: Select all

class MyStandard extends Standard
{
    protected function fromArray( \Aimeos\MShop\Product\Item\Iface $item, array $data )
    {
        // your modified code
    }
}
and configure your new class using:

Code: Select all

admin/jqadm/product/price/name = Mystandard
e.g. for Laravel in config/shop.php:

Code: Select all

'admin' => [
    'jqadm' => [
        'product' => [
            'price' => [
                'name' => 'Mystandard'
            ]
        ]
    ]
]
Hi,

Thanks Sir!!! Your help is too much appreciated. I have resolved the issue with your help. I wonder why I didn't have to overwrite fromArray() method from Standard class when I was adding custom field in Basic tab.

Thanks!

--
Umer

Re: How to add additional fields to a customer

Posted: 12 Apr 2018, 11:27
by aimeos
Because it uses fromArray() of the item without any special handling. We will try to use that in the subpanel classes too if possible in the next version.

Re: How to add additional fields to a customer

Posted: 12 Apr 2018, 11:38
by mohal_04
aimeos wrote:Because it uses fromArray() of the item without any special handling. We will try to use that in the subpanel classes too if possible in the next version.
OK thanks for all the help!!! :) :) :) :) :)

Re: How to add additional fields to a customer

Posted: 22 Jul 2019, 12:51
by MikaelNazarenko
Hello everybody!
I am extending customer. Seems everything is clear. But can anybody, please, tell me if I can find somewhere the example of

Code: Select all

./ext/myextension/lib/custom/config/mshop.php
exactly for the Customer ? I think it must exists somewhere in Aimeos core. Because there is complex query for search and other. I would like to take a look at original and then extend it.



My config file looks like:

Code: Select all

<?php

return [
    'customer' => [
        'manager' => [
            'name' => 'Customer',
            'standard' => [

                'delete' => array(
                    'ansi' => '
					DELETE FROM "users"
					WHERE :cond
				',
                ),
                'insert' => array(
                    'ansi' => '
					INSERT INTO "users" (
						"siteid", "name", "email", "company", "vatid", "salutation", "title",
						"firstname", "lastname", "address1", "address2", "address3",
						"postal", "city", "state", "countryid", "langid", "telephone",
						"telefax", "website", "longitude", "latitude",
						"birthday", "status", "vdate", "password",
						"updated_at", "editor", "created_at"
					) VALUES (
						?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
					)
				',
                ),
                'update' => array(
                    'ansi' => '
					UPDATE "users"
					SET "siteid" = ?, "name" = ?, "email" = ?, "company" = ?, "vatid" = ?,
						"salutation" = ?, "title" = ?, "firstname" = ?, "lastname" = ?,
						"address1" = ?, "address2" = ?, "address3" = ?, "postal" = ?,
						"city" = ?, "state" = ?, "countryid" = ?, "langid" = ?,
						"telephone" = ?, "telefax" = ?, "website" = ?,
						"longitude" = ?, "latitude" = ?, "birthday" = ?,
						"status" = ?, "vdate" = ?, "password" = ?, "updated_at" = ?, "editor" = ?
					WHERE "id" = ?
				',
                ),
                'search' => array(
                    'ansi' => '
					SELECT lvu."id" AS "customer.id", lvu."siteid" AS "customer.siteid",
						lvu."name" AS "customer.label", lvu."email" AS "customer.code",
						lvu."company" AS "customer.company", lvu."vatid" AS "customer.vatid",
						lvu."salutation" AS "customer.salutation", lvu."title" AS "customer.title",
						lvu."firstname" AS "customer.firstname", lvu."lastname" AS "customer.lastname",
						lvu."address1" AS "customer.address1", lvu."address2" AS "customer.address2",
						lvu."address3" AS "customer.address3", lvu."postal" AS "customer.postal",
						lvu."city" AS "customer.city", lvu."state" AS "customer.state",
						lvu."countryid" AS "customer.countryid", lvu."langid" AS "customer.languageid",
						lvu."telephone" AS "customer.telephone",lvu."telefax" AS "customer.telefax",
						lvu."email" AS "customer.email", lvu."website" AS "customer.website",
						lvu."longitude" AS "customer.longitude", lvu."latitude" AS "customer.latitude",
						lvu."birthday" AS "customer.birthday", lvu."status" AS "customer.status",
						lvu."vdate" AS "customer.dateverified", lvu."password" AS "customer.password",
						lvu."created_at" AS "customer.ctime", lvu."updated_at" AS "customer.mtime",
						lvu."editor" AS "customer.editor"
					FROM "users" AS lvu
					:joins
					WHERE :cond
					GROUP BY lvu."id", lvu."siteid", lvu."name", lvu."company", lvu."vatid",
						lvu."salutation", lvu."title", lvu."firstname", lvu."lastname",
						lvu."address1", lvu."address2", lvu."address3", lvu."postal",
						lvu."city", lvu."state", lvu."countryid", lvu."langid",
						lvu."telephone", lvu."telefax", lvu."email", lvu."website",
						lvu."longitude", lvu."latitude", lvu."birthday", lvu."status",
						lvu."vdate", lvu."password", lvu."created_at", lvu."updated_at",
						lvu."editor"
					/*-orderby*/ ORDER BY :order /*orderby-*/
					LIMIT :size OFFSET :start
				',
                ),
                'count' => array(
                    'ansi' => '
					SELECT COUNT(*) AS "count"
					FROM (
						SELECT DISTINCT lvu."id"
						FROM "users" AS lvu
						:joins
						WHERE :cond
						LIMIT 10000 OFFSET 0
					) AS list
				',
                ),
                'newid' => array(
                    'db2' => 'SELECT IDENTITY_VAL_LOCAL()',
                    'mysql' => 'SELECT LAST_INSERT_ID()',
                    'oracle' => 'SELECT users.CURRVAL FROM DUAL',
                    'pgsql' => 'SELECT lastval()',
                    'sqlite' => 'SELECT last_insert_rowid()',
                    'sqlsrv' => 'SELECT SCOPE_IDENTITY()',
                    'sqlanywhere' => 'SELECT @@IDENTITY',
                ),
            ],
        ],
    ],
];
But then I am not able to log in into admin panel.( Something wrong (

Thank you !

Re: How to add additional fields to a customer

Posted: 22 Jul 2019, 13:00
by aimeos
Please have a look here for the core customer config file:
https://github.com/aimeos/aimeos-core/b ... stomer.php

For Laravel it's here:
https://github.com/aimeos/ai-laravel/bl ... stomer.php

Re: How to add additional fields to a customer

Posted: 22 Jul 2019, 13:04
by MikaelNazarenko
Thank you, buddy!

But as I understand exactly for customer I only need this:

Code: Select all

'laravel' => array(
            'delete' => array(
                'ansi' => '
					DELETE FROM "users"
					WHERE :cond
				',
            ),
            'insert' => array(
                'ansi' => '
					INSERT INTO "users" (
						"siteid", "name", "email", "company", "vatid", "salutation", "title",
						"firstname", "lastname", "address1", "address2", "address3",
						"postal", "city", "state", "countryid", "langid", "telephone",
						"telefax", "website", "longitude", "latitude",
						"birthday", "status", "vdate", "password",
						"updated_at", "editor", "created_at"
					) VALUES (
						?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
					)
				',
            ),
            'update' => array(
                'ansi' => '
					UPDATE "users"
					SET "siteid" = ?, "name" = ?, "email" = ?, "company" = ?, "vatid" = ?,
						"salutation" = ?, "title" = ?, "firstname" = ?, "lastname" = ?,
						"address1" = ?, "address2" = ?, "address3" = ?, "postal" = ?,
						"city" = ?, "state" = ?, "countryid" = ?, "langid" = ?,
						"telephone" = ?, "telefax" = ?, "website" = ?,
						"longitude" = ?, "latitude" = ?, "birthday" = ?,
						"status" = ?, "vdate" = ?, "password" = ?, "updated_at" = ?, "editor" = ?
					WHERE "id" = ?
				',
            ),
            'search' => array(
                'ansi' => '
					SELECT lvu."id" AS "customer.id", lvu."siteid" AS "customer.siteid",
						lvu."name" AS "customer.label", lvu."email" AS "customer.code",
						lvu."company" AS "customer.company", lvu."vatid" AS "customer.vatid",
						lvu."salutation" AS "customer.salutation", lvu."title" AS "customer.title",
						lvu."firstname" AS "customer.firstname", lvu."lastname" AS "customer.lastname",
						lvu."address1" AS "customer.address1", lvu."address2" AS "customer.address2",
						lvu."address3" AS "customer.address3", lvu."postal" AS "customer.postal",
						lvu."city" AS "customer.city", lvu."state" AS "customer.state",
						lvu."countryid" AS "customer.countryid", lvu."langid" AS "customer.languageid",
						lvu."telephone" AS "customer.telephone",lvu."telefax" AS "customer.telefax",
						lvu."email" AS "customer.email", lvu."website" AS "customer.website",
						lvu."longitude" AS "customer.longitude", lvu."latitude" AS "customer.latitude",
						lvu."birthday" AS "customer.birthday", lvu."status" AS "customer.status",
						lvu."vdate" AS "customer.dateverified", lvu."password" AS "customer.password",
						lvu."created_at" AS "customer.ctime", lvu."updated_at" AS "customer.mtime",
						lvu."editor" AS "customer.editor"
					FROM "users" AS lvu
					:joins
					WHERE :cond
					GROUP BY lvu."id", lvu."siteid", lvu."name", lvu."company", lvu."vatid",
						lvu."salutation", lvu."title", lvu."firstname", lvu."lastname",
						lvu."address1", lvu."address2", lvu."address3", lvu."postal",
						lvu."city", lvu."state", lvu."countryid", lvu."langid",
						lvu."telephone", lvu."telefax", lvu."email", lvu."website",
						lvu."longitude", lvu."latitude", lvu."birthday", lvu."status",
						lvu."vdate", lvu."password", lvu."created_at", lvu."updated_at",
						lvu."editor"
					/*-orderby*/ ORDER BY :order /*orderby-*/
					LIMIT :size OFFSET :start
				',
            ),
            'count' => array(
                'ansi' => '
					SELECT COUNT(*) AS "count"
					FROM (
						SELECT DISTINCT lvu."id"
						FROM "users" AS lvu
						:joins
						WHERE :cond
						LIMIT 10000 OFFSET 0
					) AS list
				',
            ),
            'newid' => array(
                'db2' => 'SELECT IDENTITY_VAL_LOCAL()',
                'mysql' => 'SELECT LAST_INSERT_ID()',
                'oracle' => 'SELECT users.CURRVAL FROM DUAL',
                'pgsql' => 'SELECT lastval()',
                'sqlite' => 'SELECT last_insert_rowid()',
                'sqlsrv' => 'SELECT SCOPE_IDENTITY()',
                'sqlanywhere' => 'SELECT @@IDENTITY',
            ),
        ),
'address', 'lists' and other I may skip ? Will they loaded from default ?

Re: How to add additional fields to a customer

Posted: 22 Jul 2019, 13:06
by aimeos
yes

Re: How to add additional fields to a customer

Posted: 22 Jul 2019, 14:47
by MikaelNazarenko
My environment is the following:
Laravel Framework 5.8.26
aimeos-laravel 2019.04
PHP Version 7.2.19-1+ubuntu18.04.1+deb.sury.org+1

The topic is named as 'How to add additional fields to a customer' but here is no explained exactly about customer ((

Thank for guy who explained for Product but it doesn't help me completely (
Maybe somebody may explain me where I am wrong ? Regarding aimeos version 2019.04. Because now I can't access the admin panel, I get '403 This action is unauthorized.' and seems it takes a lot of time to find the problem ((( :(

My files:

/var/www/labor/ext/labor/lib/custom/setup/default/schema/customer.php

Code: Select all

<?php
/**
 * @license LGPLv3, http://opensource.org/licenses/LGPL-3.0
 * @copyright Aimeos (aimeos.org), 2016-2018-2018
 */
return array(
    'table' => array(
        'mshop_customer' => function ( \Doctrine\DBAL\Schema\Schema $schema ) {
            $table = $schema->getTable( 'mshop_customer' );
            $table->addColumn( 'name1', 'string', array( 'length' => 255 ) );
            return $schema;
        },
    ),
);
/var/www/labor/ext/labor/config/mshop.php

Code: Select all

<?php

return array(
    'customer' => array(
        'manager' => array(
            'name' => 'Customer',
            'standard' => [
                'delete' => array(
                    'ansi' => '
					DELETE FROM "users"
					WHERE :cond
				',
                ),
                'insert' => array(
                    'ansi' => '
					INSERT INTO "users" (
						"siteid", "name", "email", "company", "vatid", "salutation", "title",
						"firstname", "lastname", "address1", "address2", "address3",
						"postal", "city", "state", "countryid", "langid", "telephone",
						"telefax", "website", "longitude", "latitude",
						"birthday", "status", "vdate", "password",
						"updated_at", "editor", "created_at"
					) VALUES (
						?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
					)
				',
                ),
                'update' => array(
                    'ansi' => '
					UPDATE "users"
					SET "siteid" = ?, "name" = ?, "email" = ?, "company" = ?, "vatid" = ?,
						"salutation" = ?, "title" = ?, "firstname" = ?, "lastname" = ?,
						"address1" = ?, "address2" = ?, "address3" = ?, "postal" = ?,
						"city" = ?, "state" = ?, "countryid" = ?, "langid" = ?,
						"telephone" = ?, "telefax" = ?, "website" = ?,
						"longitude" = ?, "latitude" = ?, "birthday" = ?,
						"status" = ?, "vdate" = ?, "password" = ?, "updated_at" = ?, "editor" = ?
					WHERE "id" = ?
				',
                ),
                'search' => array(
                    'ansi' => '
					SELECT lvu."id" AS "customer.id", lvu."siteid" AS "customer.siteid",
						lvu."name" AS "customer.label", lvu."email" AS "customer.code",
						lvu."company" AS "customer.company", lvu."vatid" AS "customer.vatid",
						lvu."salutation" AS "customer.salutation", lvu."title" AS "customer.title",
						lvu."firstname" AS "customer.firstname", lvu."lastname" AS "customer.lastname",
						lvu."address1" AS "customer.address1", lvu."address2" AS "customer.address2",
						lvu."address3" AS "customer.address3", lvu."postal" AS "customer.postal",
						lvu."city" AS "customer.city", lvu."state" AS "customer.state",
						lvu."countryid" AS "customer.countryid", lvu."langid" AS "customer.languageid",
						lvu."telephone" AS "customer.telephone",lvu."telefax" AS "customer.telefax",
						lvu."email" AS "customer.email", lvu."website" AS "customer.website",
						lvu."longitude" AS "customer.longitude", lvu."latitude" AS "customer.latitude",
						lvu."birthday" AS "customer.birthday", lvu."status" AS "customer.status",
						lvu."vdate" AS "customer.dateverified", lvu."password" AS "customer.password",
						lvu."created_at" AS "customer.ctime", lvu."updated_at" AS "customer.mtime",
						lvu."editor" AS "customer.editor", lvu."name1" AS "customer.name1"
					FROM "users" AS lvu
					:joins
					WHERE :cond
					GROUP BY lvu."id", lvu."siteid", lvu."name", lvu."company", lvu."vatid",
						lvu."salutation", lvu."title", lvu."firstname", lvu."lastname",
						lvu."address1", lvu."address2", lvu."address3", lvu."postal",
						lvu."city", lvu."state", lvu."countryid", lvu."langid",
						lvu."telephone", lvu."telefax", lvu."email", lvu."website",
						lvu."longitude", lvu."latitude", lvu."birthday", lvu."status",
						lvu."vdate", lvu."password", lvu."created_at", lvu."updated_at",
						lvu."editor"
					/*-orderby*/ ORDER BY :order /*orderby-*/
					LIMIT :size OFFSET :start
				',
                ),
                'count' => array(
                    'ansi' => '
					SELECT COUNT(*) AS "count"
					FROM (
						SELECT DISTINCT lvu."id"
						FROM "users" AS lvu
						:joins
						WHERE :cond
						LIMIT 10000 OFFSET 0
					) AS list
				',
                ),
                'newid' => array(
                    'db2' => 'SELECT IDENTITY_VAL_LOCAL()',
                    'mysql' => 'SELECT LAST_INSERT_ID()',
                    'oracle' => 'SELECT users.CURRVAL FROM DUAL',
                    'pgsql' => 'SELECT lastval()',
                    'sqlite' => 'SELECT last_insert_rowid()',
                    'sqlsrv' => 'SELECT SCOPE_IDENTITY()',
                    'sqlanywhere' => 'SELECT @@IDENTITY',
                ),
            ]
        ),
    ),
);
/var/www/labor/ext/labor/lib/custom/src/MShop/Customer/Manager/Customer.php

Code: Select all

<?php

namespace Aimeos\MShop\Customer\Manager;

class Customer extends Standard
{
    private $salt;

    private $searchConfig = array(
        'customer.name1'=> array(
            'code'=>'customer.name1',
            'internalcode'=>'mpro."name1"',
            'label'=>'Name 1',
            'type'=> 'string', // integer, float, etc.
            'internaltype'=> \Aimeos\MW\DB\Statement\Base::PARAM_STR, // _INT, _FLOAT, etc.
        ),
    );


    public function __construct(\Aimeos\MShop\Context\Item\Iface $context)
    {
        parent::__construct($context);

        /** mshop/customer/manager/salt
         * Password salt for all customer passwords of the installation
         *
         * The default password salt is used if no user-specific salt can be
         * stored in the database along with the user data. It's highly recommended
         * to set the salt to a random string of at least eight chars using
         * characters, digits and special characters
         *
         * @param string Installation wide password salt
         * @since 2014.03
         * @category Developer
         * @category User
         * @see mshop/customer/manager/password/name
         * @sse mshop/customer/manager/password/options
         */
        $this->salt = $context->getConfig()->get( 'mshop/customer/manager/salt', 'mshop' );
    }

    public function saveItem( \Aimeos\MShop\Common\Item\Iface $item, $fetch = true )
    {
        die;
        // a modified copy of the code from the parent class
        // extended by a bind() call and updated bind positions (first parameter)
    }


    /**
     * @param bool $withsub
     * @return \Aimeos\MW\Criteria\Attribute\Iface
     * @throws \Aimeos\MW\Common\Exception
     */
    public function getSearchAttributes( $withsub = true )
    {
        $list = parent::getSearchAttributes( $withsub );
        foreach( $this->searchConfig as $key => $fields ) {
            $list[$key] = new \Aimeos\MW\Criteria\Attribute\Standard( $fields );
        }
        return $list;
    }

    /**
     * @param array $values
     * @param array $listItems
     * @param array $refItems
     * @param array $addrItems
     * @param array $propItems
     * @return \Aimeos\MShop\Customer\Item\Customer|\Aimeos\MShop\Customer\Item\Iface
     * @throws \Aimeos\MShop\Exception
     */
    protected function createItemBase(array $values = [], array $listItems = [], array $refItems = [], array $addrItems = [], array $propItems = [])
    {
        $helper = $this->getPasswordHelper();
        $address = new \Aimeos\MShop\Common\Item\Address\Simple( 'customer.', $values );

        return new \Aimeos\MShop\Customer\Item\Customer(
            $address, $values, $listItems, $refItems, $addrItems, $propItems, $helper, $this->salt
        );

    }
}
/var/www/labor/ext/labor/lib/custom/src/MShop/Customer/Item/Customer.php

Code: Select all

<?php

namespace Aimeos\MShop\Customer\Item;

class Customer extends Standard
{
    protected $name1;


    public function __construct(\Aimeos\MShop\Common\Item\Address\Iface $address, array $values = [], $listItems = [], $refItems = [], $addrItems = [], $propItems = [],
                                ?\Aimeos\MShop\Common\Helper\Password\Iface $helper = null, ?string $salt = null)
    {
        parent::__construct($address, $values, $listItems, $refItems, $addrItems, $propItems, $helper, $salt);
    }

    public function fromArray( array &$list, $private = false )
    {
        $unknown = [];
        $list = parent::fromArray( $list );

//        foreach( $list as $key => $value )
//        {
//            switch( $key )
//            {
//                case 'myid': $this->setMyId( $value ); break;
//                default: $unknown[$key] = $value;
//            }
//        }

        return $list;

//        return $unknown;
    }

    public function toArray( $private = false )
    {
        $list = parent::toArray( $private );

        return $list;

        if( $private === true ) {
            $list['myid'] = $this->getMyId();
        }

        return $list;
    }
}
I think problem in this file /var/www/labor/vendor/aimeos/aimeos-laravel/src/Aimeos/Shop/Controller/AdminController.php

Code: Select all

		if( Auth::check() === false
			|| $request->user()->can( 'admin', [AdminController::class, ['admin', 'editor']] ) === false
		) {
			return redirect()->guest( 'login' );
		}
But I am really logged in ( in front-end part it works. Please help me (

Also createItemBase method is not called

I noticed, the following condition is triggered:

Code: Select all

$request->user()->can( 'admin', [AdminController::class, ['admin', 'editor']] ) === false
So user has not permissions for some reason ( Maybe groups data were not fetched..

Re: How to add additional fields to a customer

Posted: 22 Jul 2019, 20:44
by aimeos
Authentication checks in Laravel are done in that class and it uses the customer/group manager to get the data:
https://github.com/aimeos/aimeos-larave ... upport.php

You posted code contains some bugs but I haven't seen a real blocker but maybe there's a PHP error that prevents your class from working. Did you check your error log if something goes wrong?

Re: How to add additional fields to a customer

Posted: 22 Jul 2019, 20:54
by MikaelNazarenko
Yes sure there are bugs, but behavior is strange.. (( I checked all logs, I have configured PHP to log all warnings and everything, no any errors anywhere..( I have tried different variants but the same behavior, if I try to visit /admin - it redirects me to /home.. ( if I delete this file /var/www/labor/ext/labor/config/mshop.php of course it works(( I am crying ((