REST API Zugriff auf Kategorien beschränken

Hallo zusammen,

beim hinzufügen von Kategorien über die REST API, würde ich gerne den Zugriff auf diese nur bestimmten Kundengruppen gewähren.
In der Dokumentation steht beim HTTP-GET von Kategorien das Attribut „customerGroups“ mit bei und es wird auch übertragen, wenn man es aufruf. Beim HTTP-PUT/POST wird es leider nicht mit aufgeführt.

Ich habe es trotzdem mal probiert:

$newCategory = array(
            "id" => 1337,
            "active" => 1,
            "name" => "Name",
            "parentId" => 3,
            "metaTitle" => "Title",
            "metaKeywords" => "Keywords",
            "metaDescription" => "Description",
            "cmsText" => "Testtext",
            "cmsHeadline" => "Testheadling",
            "media" => array(),
            "position" => "1",
            "template" => "",
            "customerGroups" => array(
                array("id" => 1)
            )
);

ApiClient::GetClient()->post("categories", $newCategory);

Kriege dabei aber folgenden Fehler im appache error.log:

{„success“:false,„message“:„Errormesage: Expected value of type \„Doctrine\\Common\\Collections\\Collection|array\“ for association field \„Shopware\\Models\\Category\\Category#$customerGroups\“, got \„array\“ instead.“}

Weiß jemand hier weiter, oder andere Möglichkeiten, wie dies mit der REST API machbar ist?
Alternativ könnte man die Werte direkt in der Datenbank per SQL zu setzen. Da aber nicht sichergestellt ist, dass die Datenbankstrukur über Updates hinweg gleich bleibt, möchte ich das am liebsten vermeiden.
Vielen Dank im Voraus!

Beste Grüße,
Lukas

Hallo Lukas,

deine Angabe von

 

„customerGroups“ => array(
array(„id“ => 1)
)

entspricht nicht dem Typ, den das Category Model hier erwartet.

Das Model verlangt hier ein Array an CustomerGroup Entities.

Shopware ermittelt diese Entities anhand der Post Daten leider nur im Categories Backend Controller.

Wenn Du die Kundengruppen Einschränkung auch via API setzen willst, reicht hier ein kleines Plugin,

welches sich auf den PreDispatch des Category API Controllers registriert und folgenden Handler ausführt:

 

getSubject()->Request()->getPost();
        foreach ($data['customerGroups'] as $customerGroupData) {
            if (!empty($customerGroupData['id'])) {
                $model = Shopware()->Models()->find('Shopware\Models\Customer\Group', $customerGroupData['id']);
                $customerGroups[] = $model;
            }
        }
        $data['customerGroups']=$customerGroups;
        $args->getSubject()->Request()->setPost($data);
    }