Artikel und Kategorie anlegen programmatisch

Hi liebe SW-Community :slight_smile:

ich versuche gerade herauszufinden, wie man einen Artikel in einer Kategorie anlegt. Ich dachte das geht irgenndwie mit dem Objekt

$sArticles = Shopware()->Modules()->Articles();

Auch eine Kategorie möchte ich irgendwie anlegen und ich vermute, das geht irgendwie mit

$sCaterories = Shopware()->Modules()->Categories();

Ich finde allerdings nicht heraus, wie man soetwas macht. Ich habe anscheinend auch noch ein generelles Problem, da ich nicht wirklich weiß, wie man da herangeht, wenn man sowas rausfinden will. Ich wäre euch sehr verbunden, wenn Ihr einen Tipp für mich habt.

Vielen Dank

Hallo,

Artikel und Kategorien legt man entweder über das Shopware Backend oder über die Rest-API von Shopware an: https://developers.shopware.com/developers-guide/rest-api/examples/article/#step-1-create-a-new-product . Alternativ auch über das entsprechende Model, beispielsweise: https://forum.shopware.com/discussion/34326/einen-neuen-artikel-aus-frontend-controller-erstellen .

Grüße

Sebastian

Hallo Sebastian,

vielen Dank für den Input :slight_smile:

ich habe zuerst versucht, die API zu nutzen. Mein Problem fängt allerdings bereits an, wenn ich versuch das hier zu nutzen (die parameter natürlich durch meine ersetzt):

$client = new ApiClient(
    //URL of shopware REST server
    'http://www.ihredomain.de/api',
    //Username
    'myUsername',
    //User's API-Key
    'myAPIKey'
);

ApiClient scheint es nicht zu geben :confused: ich glaube, das ist der bessere ansatz, aber wie verwendet man das richtig?

Ich habe dann die andere Methode versucht:

$article = new \Shopware\Models\Article\Article();
$article->fromArray(array(
    'name' => 'Foo',
));
$article->setDetails(array(
    'ordernumber' => 'XXX',
));
Shopware()->Models()->persist($article);
Shopware()->Models()->flush();

Dies führt zu einem neuen Artikel in der Tabelle s_articles, allerdings gib es keinen korrespondierenden Eintrag in s_articles_details, von dem ich vermute, dass er notwendig ist. Der Artikel hat sonst keine ordernumber und ich  schätze, die ist essentiell um weiter damit arbeiten zu können.

Der API Client ist eine Beispiel Klasse die du aus den Docs übernehmen kannst, die solltest du auch nur verwenden, wenn du die API extern verwenden willst.

Im Plugin Code solltest du Shopware\Components\Api\Manager::getResource(„Article“) benutzen. Hier kriegst du direkt die Artikel Resource und kannst dort create, update, delete etc machen wie mit den API Client. Die Parameter sind hier auch die selben

1 „Gefällt mir“

Hi, ich habe es so verstanden, dass ich ein Objekt brauche. Das habe ich so versucht, allerdings endet das in einem Error 500:

public static function getSubscribedEvents()
{
    return [
        'Enlight_Controller_Action_PreDispatch_Frontend_Checkout' => 'onAddToCart',
    ]
}

public function onAddToCart(\Enlight_Controller_ActionEventArgs $args)
{
    //Sobald diese nächte Zeile verwendet wird, kommt der Error:
    $sArticle = Shopware\Components\Api\Manager::getResource("Article");
}

Was mache ich hier falsch?

Hallo @MrFrox‍,

ich verstehe nicht genau was du proierst zu machen hier, aber ich gebe dir die nächste Hinweiße :

1- das Probleme beim Ihre Code ist das Manager class du muss es andert zu ‘\Shopware\Components\Api\Manager’ mit backslach am Anfang.

2- ob du möchtest nur der Artikel zu ein Kategorie hinzfügen oder entferen dann schaue mal das Code hier :

Hinzufügen :

https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Controllers/Backend/Category.php#L825

entferen : 

https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Controllers/Backend/Category.php#L786

VG,

Tel.: +49 755 - 183 990 00 | Web: http://enbit.de/

Hi @ahmadsaad‍,

ich möchte wärend des Install des Plugins eine neue Kategorie anlegen. Dann möchte ich im Moment in dem ein Produkt in den Warenkorb gelegt wird, dies verhindern, ein neues Produkt anlegen, diesem neuen Produkt die neu angelegte Kategorie zuweisen und das neue Produkt dann in den Warenkorb legen. Was ich gerade nicht weiß: Wie legt man neue Kategorien und neue Podukte an? Was du verlinkt hast, sieht eher aus, als könne man damit nur ein vorhandenes Produkt in eine vorhandene Kategorie legen, aber auch hier weiß ich nicht so genau, wie man das im Endeffekt macht. Ich werde jetzt rumprobieren aber würde ich natürlich über Hilfestellungen sehr freuen.

Vielen Dank und viele Grüße :slight_smile:

 

 

Ich habe es jetzt hinbekommen, dass ein Artikel angelegt wird. Der Code sieht so aus:

    private function createArticle($name,$ordernumber,$price){
        $artExist = Shopware()->Db()->fetchOne('Select count(id) from s_articles_details WHERE ordernumber="'.$ordernumber.'"');
        if(!$artExist){
            $params = array(
                'name' => $name,
                'taxId' => 1,
                'supplierId' => 1,
                'description' => '',
                'descriptionLong' => '',
                'active' => 1,
                'metaTitle' => '',
                'keywords' => '',
                'filterGroupId' => 1,
                'mainDetail' => array(
                    'number' => $ordernumber,
                    'supplierNumber' => '',
                    'additionalText' => '',
                    'stockmin' => 0,
                    'stockMin' => 0,
                    'inStock' => 100,
                    'weight' => 0,
                    'ean' => '',
                    'unitId' => 9,
                    'purchaseUnit' => 1,
                    'referenceUnit' => 1,
                    'packUnit' => '',
                    'shippingTime' => '',
                    'prices' => array(
                        array(
                            'customerGroupKey' => 'EK',
                            'from' => 1,
                            'to' => 'beliebig',
                            'price' => $price,
                            'pseudoPrice' => 0,
                            'basePrice' => 0,
                            'percent' => 0,
                        ),
                    ),
                ),
                'categories' => array(
                    array(
                        'id' => 7
                    ),
                ),
            );
            $sArticle = \Shopware\Components\Api\Manager::getResource("Article");
            $sArticle->create($params);
// Diese folgende Zeile, siehe Beschreibung unten:
            Shopware()->Db()->update('s_articles_details', array('active' => 1),array('ordernumber IN(?)'=>array($ordernumber)));
        }
    }

Leider funktioniert es noch nicht ganz. Im Bereich „Kasse“ kommt dann die Meldung, wennd er neue Artikel im Warenkorb ist.

Der Artikel wird auch ordnungsgemäß im Backend angezeigt. Öffnet man ihn dort und klickt auf Speichern, ist das Problem weg und alles funktioniert. Natürlich möchte ich das nicht machen müssen. Ich habe herausgefunden, dass „active“ in der Datenbank  in der Tabelle s_articles_details den Wert 0 hat, obwohl ich im oben angegeben code active explizit auf 1 setze. Öffnet man den Artikel im Backend, wird dieser sowohl in der Übersicht als auch in der Detailansicht als Aktiv dargestellt (der grüne Haken ist da). Nach dem erneuten Speichern ist der Wert allerdings erst in der Tabelle s_articles_details auf 1 gesetzt. Woran liegt das?

Ich kann durch Verwendung der letzten Zeile Code diesen Effekt verhindern, aber das ist doch wirklich seltsam, oder?

Du kannst einfach :

‘active’ => 1

Beim deine mainDetail  Array

VG,

Tel.: +49 755 - 183 990 00 | Web: http://enbit.de/

1 „Gefällt mir“

Hm, klar *facepalm* …Danke!

Es war wohl gestern einfach schon zu spät.

Ich habe nun doch noch weiterhin ein separates Problem mit der Anlage einer Kategorie in der install funktion des Plugins. Ich mache das  nach meiner Erkenntnis aus diesem Thread nun so:

public function install(InstallContext $context)
{
    $description = 'Test Category';
    $catExist = Shopware()->Db()->fetchOne('Select count(id) from s_categories WHERE description="'.$description.'"');
    if(!$catExist) {
        $params = array(
            'parentId' => 3,
            'name' => $description,
            'active' => 1,
        );
        $sCategory = \Shopware\Components\Api\Manager::getResource("Category");
        $sCategory->create($params);
        dump(1);
    }else{
        dump(2);
    }
}

Leider erscheint dann nach dem Klick auf den Install-Button im Pluginmanager im Backend an der seite die Meldung:

… also: 

Error

Entity has to be managed or scheduled for removal for single computation Shopware\Models\Plugin\Plugin@0000000060076502000000001c88bb3c

Was mache ich nun falsch?

Hallo,

Ich weiß nicht genau wo das Fehler liegt. 

Aber bitte das full log (Fehler info) eintragen,dann vielleicht kann ich dir helfen 

VG,

Tel.: +49 755 - 183 990 00 | Web: http://enbit.de/

Auch im Fehlerlog-File steht nicht mehr drin, als ich bereits geschrieben habe:

Entity has to be managed or scheduled for removal for single computation Shopware\Models\Plugin\Plugin@000000003448d64c00000000402d9f1d

Wo finde ich denn mehr Infos also diese?

Ich brauche bei dem Artikel eigentlich auch noch ein Bild. Ich habe jetzt versucht einfach eins mit der mediaId 8 zu verwenden, Das ist das erste bild des ersten Artikels bei mir

    private function createArticle($name,$ordernumber,$price){
        $artExist = Shopware()->Db()->fetchOne('Select count(id) from s_articles_details WHERE ordernumber="'.$ordernumber.'"');
        if(!$artExist){
            $params = array(
                'name' => $name,
                'taxId' => 1,
                'supplierId' => 1,
                'description' => '',
                'descriptionLong' => '',
                'active' => 1,
                'metaTitle' => '',
                'keywords' => '',
                'filterGroupId' => 1,
                'mainDetail' => array(
                    'number' => $ordernumber,
                    'active' => 1,
                    'supplierNumber' => '',
                    'additionalText' => '',
                    'stockmin' => 0,
                    'stockMin' => 0,
                    'inStock' => 100,
                    'weight' => 0,
                    'ean' => '',
                    'unitId' => 9,
                    'purchaseUnit' => 1,
                    'referenceUnit' => 1,
                    'packUnit' => '',
                    'shippingTime' => '',
                    'prices' => array(
                        array(
                            'customerGroupKey' => 'EK',
                            'from' => 1,
                            'to' => 'beliebig',
                            'price' => $price,
                            'pseudoPrice' => 0,
                            'basePrice' => 0,
                            'percent' => 0,
                        ),
                    ),
                ),
                'categories' => array(
                    array(
                        'id' => 10000000,
                    ),
                ),
                'images' => array(
                    array(
                        'mediaId' => 8,
                        'position' => 1,
                    ),
                ),
            );
            $sArticle = \Shopware\Components\Api\Manager::getResource("Article");
            $sArticle->create($params);
        }
    }

 

Das führt dazu, dass das Produkt im Backend ein bild anzeigt, im Frontend allerdings nicht. Wo ist hier das Problem?

 

Aber mal ehrlich, ist das denn intuitiv? Ich hab keine Ahnung, wie man herausfindet, wie die Dinge in Shopware funktionieren außer mit ewigem herumprobieren. Die einzige Referenz zu diesem Thema hier, die ich bisher kenne, ist hier und das ist nur das Result eines API-Calls:

https://developers.shopware.com/developers-guide/rest-api/examples/article/#result:

Ich habe festgestellt, dass so angelegte Artikel generell keine Bilder im Frontend darstellen können. Egal ob ich das Bild zuweise wie oben beschrieben oder ob ich es im Adminbereich einstelle. Im Moment habe ich keine Idee, warum das so ist. Ich sehe auch in der Datenbank keinen Unterschied eines so angelegten Artikels zu einem, der im Adminbereicht händisch angelegt wurde.

Hallo @MrFrox‍,

ihre Code mit bilder ist richtig, gibt keine Probleme dort.

und wenn Sie haben die gleiche Probleme wenn Sie ein bild beim Backend einstellen, dann gibt andere Probleme hier.

die Frage, ob Sie haben jetzt ein neue Artikel beim Backend erstellen und ein bild beim Backend eintragen , werde das Bild beim Frontend gezeigt??

könnten Sie einmal diese probieren und gib mir Bescheid.

VG,

Tel.: +49 755 - 183 990 00 | Web: http://enbit.de/

@MrFrox schrieb:

Auch im Fehlerlog-File steht nicht mehr drin, als ich bereits geschrieben habe:

Entity has to be managed or scheduled for removal for single computation Shopware\Models\Plugin\Plugin@000000003448d64c00000000402d9f1d

Wo finde ich denn mehr Infos also diese?

beim diese Probleme wie ich sehe das Probleme ist mit category create Funktion.

beim diese Funktion ruft ein ‚ModelManager flush‘ methode, dann Sie haben diese Fehler weil das Plugin Entity noch nicht ‚persist‘ .

was ist die richtige Lösung hier, ich weiß nicht genau. sie braucht mehr Zeit zu finden.

aber das Probleme liegt dort, wenn Sie finden die Lösung nicht, dann Sie können mir gern kontaktieren.

VG,

Tel.: +49 755 - 183 990 00 | Web: http://enbit.de/

Ich habe das Problem gefunden. Es liegt bei der Katerorie, der der Artikel angehört. Es muss eine Kategorie sein, die nicht als Parent root hat, sondern die Kauptkategorie des Subshops, also beispielsweise die Kategorie Deutsch (in der Standardkonfiguration von Shopware). In meinem Fall war die verwendete Kategorie einfach parallel zu deutsch und nicht in deutsch. sobald das so ist, ist der Aritkle auch nicht mehr gültig und kann nicht richtig dargestellt werden. Das habe ich jetzt geändert und alles funktioniert super. Korrekt wird die Kategorie also so angelegt:

    private function createCategory($description){
        $catExist = Shopware()->Db()->fetchOne('Select count(id) from s_categories WHERE id=10000000');
        if(!$catExist) {
            Shopware()->Db()->insert('s_categories', array(
                'id' => 10000000,
                'parent' => 3,
                'description' => $description,
                'active' => 1,
                'hidetop' => 1,
            ));
        }
    }

Zwischenzeitlich hatte ich eben falscher Weise 

 'parent' =\> 1,

drin.

Ich muss noch einmal verändern, wie mein Artikel angelegt wird, denn ich brauche nun auch noch einen Wert in einem Boolean Attribut. Ich mache das so:

$params = array(
    'name' => $name,
    'taxId' => 1,
    'description' => '',
    'descriptionLong' => '',
    'active' => 1,
    'metaTitle' => '',
    'keywords' => '',
    'mainDetail' => array(
        'number' => $ordernumber,
        'active' => 1,
        'supplierNumber' => '',
        'additionalText' => '',
        'stockmin' => 0,
        'stockMin' => 0,
        'inStock' => 100,
        'weight' => 0,
        'ean' => '',
        'unitId' => 9,
        'purchaseUnit' => 1,
        'referenceUnit' => 1,
        'packUnit' => '',
        'shippingTime' => '',
        'prices' => array(
            array(
                'customerGroupKey' => 'EK',
                'from' => 1,
                'to' => 'beliebig',
                'price' => $price,
                'pseudoPrice' => 0,
                'basePrice' => 0,
                'percent' => 0,
            ),
        ),
        'attribute' => array(
            'attr1' => 'SomeText',
            'my_value' => true,
        ),
    ),
);
$sArticle = \Shopware\Components\Api\Manager::getResource("Article");
$sArticle->create($params);

Unter ‚attribute‘ setze ich den Wert für ‚attr1‘ und ‚my_value‘. Schaue ich mir den Artikel später in der Datenbank oder im Backend an, ist der Wert in ‚attr1‘ gespreichert als ‚SomeText‘, der Wert in ‚my_value‘ ist allerings 0 in der Datenbank und der Haken im Backend ist nicht gesetzt. Ich habe es statt mit true auch mit 1 und ‚1‘ versucht. Was mache ich falsch?

So lege ich das Feld im Plugin install an:

public function install(InstallContext $context)
{
    $service = $this->container->get('shopware_attribute.crud_service');
    $service->update('s_articles_attributes', 'my_value', 'boolean', [
        'label' => 'Test',
        'displayInBackend' => true,
    ]);
}

 

Hi,

in den Models (& in der API) sind die Attributte CamelCase.

Es sollte also myValue lauten:

‘attribute’ => array( ‘attr1’ => ‘SomeText’, ‘myValue’ => true, ),

Gruß Heiner

1 „Gefällt mir“