hbeehbee MemberComments: 710 Received thanks: 81 Member since: June 2011

hallo, ich möchte gern bestimten Backendbenutzern bzw. einer Benutzergruppe nur bestimmte Kunden in der Kundenliste zeigen. 

Sowohl Backendbenutzer als auch Kunden bekommen ein Freitextfeld. Es dürfen dann nur die Kunden angeziegt werden die den gleichen Wert im Freitextfeld haben.

User.freitextfeld_A == Kunde.freitextfeld_A

Das ist mit den normalen Berechtigungen nicht möglich oder? Hat hier jemand sowas schon mal umgesetzt bzw. gibt es ein Plugin dafür?

ich denke am Einfachsten ist es vielleicht wenn man das über ein lightweight-plugin umsetzt. kann ich hier auf die freitextfelder des aktuellen Users zugreifen?

vielen Dank.

Answers

  • derwunnerderwunner MemberComments: 311 Received thanks: 68 Member since: January 2017

    Hallo,

    naja, Du könntest neue Privilegien anlegen, in denen hinterlegst Du dann, welche Kunden geshen werden dürfen. Also quasi pro Backend-Benutzergruppe ein Privileg indem Du jeweils die sichtbaren Kunden definierst.

    Und dann musst Du halt noch dafür sorgen, dass das in der Kundenansicht auch so der Fall ist. Also musst wohl im Ajax Call von der Backend Kundenansicht-Anfrage das zurückgelieferte Ergebnis einschränken. Das selbe müsste übrigends auch mit Freitextfeldern gehen. Selbes Prinzip: Auf das Event von der Ajax-Call Action abonnieren und dann das zurückgelieferte Ergebnis manipulieren.

     

     

    MFG

     

    derwunner

  • hbeehbee MemberComments: 710 Received thanks: 81 Member since: June 2011

     ... Auf das Event von der Ajax-Call Action abonnieren und dann das zurückgelieferte Ergebnis manipulieren.

     

    so hatte ich mir das auch vorgestellt. jeder Backend-Benutzer einer bestimten Gruppe bekommt ein Freitextfeld. Das selbe Freitextfeld bekommen dann die Shopkunden. Der Backend-Benutzer darf den Kunden dann nur sehen, wenn die beiden Freitextfelder übereinstimmen.  Hast du zufällig das richtige Event parat?

  • hbeehbee MemberComments: 710 Received thanks: 81 Member since: June 2011

    ok, ich habe mir hierzu jetzt einen Subscriber registriet und manipuliere dort den QueryBuilder. Das funktoniert soweit gut.

    Wir komme ich jetzt aber an den Backend-User innerhalb meines Subscribers?

    Shopware()->Container()->get('Auth')->getIdentity() funktioniert nicht.

    Danke.

  • derwunnerderwunner MemberComments: 311 Received thanks: 68 Member since: January 2017

    ok, ich habe mir hierzu jetzt einen Subscriber registriet und manipuliere dort den QueryBuilder. Das funktoniert soweit gut.

    Wir komme ich jetzt aber an den Backend-User innerhalb meines Subscribers?

    Shopware()->Container()->get('Auth')->getIdentity() funktioniert nicht.

    Danke.

    So auf diese Art und Weise gar nicht, weil das ein Doctrine Event ist. Du brauchst ein Frontend-Dispatch Event dafür. Also nimm am besten wie bereits erwähnt die Ajax Action dafür, die die Listing Daten für die Kundenauflistung zurück gibt. Parat habe ich die nicht, die lässt sich aber leicht finden: Browser Debugger auf, zum Netzwerk-Tab wechseln, Filter auf XHR stellen. Kurz bevor du auf Kunden -> Kunden klickst im Backend leerst Du nochmal den Netzwerk Tab (clear Button oben links irgendwo meistens). Und dann sollte es einer der ersten XHR Anfragen sein. Die die am logischsten nach Auflisting klingt ist es dann.

  • hbeehbee MemberComments: 710 Received thanks: 81 Member since: June 2011

    ich kann jetzt über Shopware()->Auth()->getIdentity(); innherhalb von Enlight_Controller_Action_PreDispatch_Backend_Customer darauf zugreifen. Das funktioniert.

    Wenn ich die Daten vom AjaxCall manipuliere, fehlt mir das paging. Wenn ich also mehr als 20 Einträge habe, da dann aber 10 rausfiltere, kann ich nicht mehr blättern.

    Ich habe mich jetzt auf Shopware\Models\Customer\Repository::getListQueryBuilder::after registriert und manipuliere hier den QueryBuilder.

    Alles gut soweit.

     

  • derwunnerderwunner MemberComments: 311 Received thanks: 68 Member since: January 2017

    ich kann jetzt über Shopware()->Auth()->getIdentity(); innherhalb von Enlight_Controller_Action_PreDispatch_Backend_Customer darauf zugreifen. Das funktioniert.

    Wenn ich die Daten vom AjaxCall manipuliere, fehlt mir das paging. Wenn ich also mehr als 20 Einträge habe, da dann aber 10 rausfiltere, kann ich nicht mehr blättern.

    Ich habe mich jetzt auf Shopware\Models\Customer\Repository::getListQueryBuilder::after registriert und manipuliere hier den QueryBuilder.

    Alles gut soweit.

     

    Ok, ein paar Anmerkungen noch:

    1. Benutze doch bitte den Container und hole dir das Auth Objekt als Service. Die alten Plugin Zeiten sind so allmälich vorbei und wer weiß, wie lange die alte Plugin Struktur noch unterstützt wird.

    2. Um das Problem mit dem Paging zu lösen: Meinst Du, es reicht schon, sich auf das Doctrine Event zu abonnieren? Müsstest du nicht eventuell auch das ExtJS Model überschreiben?

  • hbeehbee MemberComments: 710 Received thanks: 81 Member since: June 2011

    1. Benutze doch bitte den Container und hole dir das Auth Objekt als Service. Die alten Plugin Zeiten sind so allmälich vorbei und wer weiß, wie lange die alte Plugin Struktur noch unterstützt wird.

    2. Um das Problem mit dem Paging zu lösen: Meinst Du, es reicht schon, sich auf das Doctrine Event zu abonnieren? Müsstest du nicht eventuell auch das ExtJS Model überschreiben?

    zu 1. das hatte ich Anfangs auch so. Hat aus irgendwelchen Gründen nicht funktioniert.  jetzt geht's – vielleicht hatte ich auch einen tippfehler...

    zu 2. ich habe mich jetzt zusätzlich auf Shopware\Models\Customer\Repository::getBackendListCountedBuilder::after registriert und manupuliere hier ebenfalls den QueryBuilder. Damit habe ich auch die korrekte Seitenanzahl und das Paging funktioniert korrekt. Ich Denke es ist nciht nötig das ExtJs zu überschreiben da ich ja schon das Sql entsprechend bearbeitet habe.

    Vielen Dank.

     

  • cyncodecyncode MemberComments: 8 Received thanks: 2 Member since: November 2019

    Hallo hbee,

    ich weiß, das Thema ist schon älter. Bist Du damals zum Ziel gekommen? Wir haben jetzt hier dieselbe Anforderung.

  • hbeehbee MemberComments: 710 Received thanks: 81 Member since: June 2011

    Hallo hbee,

    ich weiß, das Thema ist schon älter. Bist Du damals zum Ziel gekommen? Wir haben jetzt hier dieselbe Anforderung.

    Ich erinnere mich nicht mehr genau aber wenn ich mir den Thread so durchlese scheint das am Ende geklappt zu haben. Ich könnte mal am Wochenede schauen ob ich den Code dazu noch finde aber ob das in einer aktuellen Shopware noch funktioniert wage ich zu bezweifeln ;-/ 

  • cyncodecyncode MemberComments: 8 Received thanks: 2 Member since: November 2019

    .. wenn es nicht zu viele Umstände macht, wäre das großartig!
    Wenn's nicht mehr läuft, dann ist das eben so. Vielleicht kann ich es modifizieren (würden es Dir dann modifiziert natürlich zur Verfügung stellen). Ansonsten muss ich mir anders helfen ;)

  • hbeehbee MemberComments: 710 Received thanks: 81 Member since: June 2011

    Hier mal mein Subscriber. vielleicht hilf dir das ja.

    <?php
    namespace AbdMyCustomerAd\Subscriber;
    
    use Enlight_Hook_HookArgs;
    use Enlight\Event\SubscriberInterface;
    use Symfony\Component\DependencyInjection\ContainerInterface;
    use Shopware\Components\Theme\LessDefinition;
    
    /**
     * Class Customer
     *
     * @package AbdMyCustomerAd\Subscriber
     */
    class Customer implements SubscriberInterface
    {
    
        /**
         * @var ContainerInterface
         */
        private $container;
    
        /**
         * @var
         */
        private $vkgrp;
        /**
         * @var
         */
        private $roleId;
        /**
         * @var
         */
        private $username;
    
    
        /**
         * @param ContainerInterface $container
         */
        public function __construct(ContainerInterface $container)
        {
            $this->container = $container;
    
        }
    
        /**
         * @return array
         */
        public static function getSubscribedEvents()
        {
            return [
                'Enlight_Controller_Action_PreDispatch_Backend_Customer' => 'onPreDispatchCustomer',
                'Shopware\Models\Customer\Repository::getListQueryBuilder::after' => 'afterGetCustomerList',
                'Shopware\Models\Customer\Repository::getBackendListCountedBuilder::after' => 'afterGetBackendListCountedBuilder',
                'Shopware_Controllers_Backend_Customer::performOrderAction::after' => 'performOrder',
            ];
        }
    
        /**
         * @param \Enlight_Event_EventArgs $args
         *
         * @return bool
         */
        public function onPreDispatchCustomer(\Enlight_Event_EventArgs $args)
        {
            $identity = $this->container->get('Auth')->getIdentity();
            $this->roleId   = $identity->roleID;
            $this->username = $identity->username;
            $this->vkgrp    = $this->getAuthAttr('my_customer_vkgrp',$identity->id);
            return true;
        }
    
        /**
         * @param Enlight_Hook_HookArgs $args
         */
        public function performOrder(\Enlight_Hook_HookArgs $args){
    
            Shopware()->Session()->MyCustomerAd['AdminUsername'] = $this->username;
    
        }
    
    
        /**
         * @param \Enlight_Hook_HookArgs $arguments
         */
        public function afterGetCustomerList(\Enlight_Hook_HookArgs $arguments)
        {
            if($this->roleId == 4){
                //original builder
                $builder = $arguments->getReturn();
                $builder->leftjoin('customer.attribute','customerAttr');
                if(empty($this->vkgrp) || $this->vkgrp == ""){
                    $builder->andWhere('customerAttr.my_customerVkgrp = ?99 OR customerAttr.my_customerVkgrp IS NULL');
                }else{
                    $builder->andWhere('customerAttr.my_customerVkgrp = ?99');
    
                }
                $builder->setParameter(99, $this->vkgrp);
    
                $arguments->setReturn($builder);
            }
        }
    
        /**
         * @param \Enlight_Hook_HookArgs $arguments
         */
        public function afterGetBackendListCountedBuilder(\Enlight_Hook_HookArgs $arguments)
        {
            if($this->roleId == 4){
                //original builder
                $builder = $arguments->getReturn();
                $builder->leftjoin('customer.attribute','customerAttr');
                if(empty($this->vkgrp) || $this->vkgrp == ""){
                    $builder->andWhere('customerAttr.my_customerVkgrp = ?99 OR customerAttr.my_customerVkgrp IS NULL');
                }else{
                    $builder->andWhere('customerAttr.my_customerVkgrp = ?99');
    
                }
                $builder->setParameter(99, $this->vkgrp);
    
                $arguments->setReturn($builder);
            }
        }
    
    
        /**
         * @param $attr_name
         * @param $userID
         *
         * @return mixed
         */
        private function getAuthAttr($attr_name,$userID){
    
            $attr = Shopware()->Db()->fetchOne('SELECT '.$attr_name.' FROM s_core_auth_attributes WHERE authID = ?', array($userID));
    
            return $attr;
    
        }
    
    }

     

    Thanked by 1cyncode
  • cyncodecyncode MemberComments: 8 Received thanks: 2 Member since: November 2019

    Vielen Dank!!!
    Ich schaue mal, dass ich zurecht komme...

Sign In or Register to comment.