Backend Kundenliste beschränken

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.

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

@derwunner schrieb:

 … 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?

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.

@hbee schrieb:

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.

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.

 

@hbee schrieb:

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?

@derwunner schrieb:

  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.

 

Hallo hbee,

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

@cyncode schrieb:

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 ;-/ 

… 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 :wink:

Hier mal mein Subscriber. vielleicht hilf dir das ja.

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;

    }

}

 

1 „Gefällt mir“

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