Neuer Artikel per SQL

Hi,

Ich will eine Schnittstelle zu meiner Warenwirtschaft programmieren und würde deshalb gerne wissen, in welchen Tabellen ich mit SQL einen Eintrag anlegen muss, um einen Artikel im Backend anzuzeigen. Ich will nur minimales erst einmal umsetzen, das heißt ich will nur gerade so viele Einträge in irgendwelchen Tabellen anlegen, dass es funktioniert.

Bisher habe ich diese Tabellen identifiziert, aber der Artikel, den ich angelegt habe, wird noch nicht angezeigt im Backend. Welche Tabellen gibt es noch ?

  • s_articles 
  • s_articles_categories 
  • s_articles_categories_ro
  • s_articles_details
  • s_articles_prices 
  • s_article_configurator_option_relations

Warum nutzt du nicht die API?

Genau, ich würde dir nicht empfehlen direkt über die Datenbank zu gehen. Da musst du auf referenzierende Primär- und Fremdschlüssel achten. Hier die Dokumentation für unsere API:

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

Okay mal angenommen ich würde die API nutzen, gibt es dafür ein Beispiel für jemanden, der eine REST-API noch nie benutzt hat? 

 

<?php

class ApiClient {     const METHOD\_GET = 'GET';     const METHOD\_PUT = 'PUT';     const METHOD\_POST = 'POST';     const METHOD\_DELETE = 'DELETE';     protected $validMethods = [         self::METHOD\_GET,         self::METHOD\_PUT,         self::METHOD\_POST,         self::METHOD\_DELETE,     ];     protected $apiUrl;     protected $cURL;     public function \_\_construct($apiUrl, $username, $apiKey)     {         $this-\>apiUrl = rtrim($apiUrl, '/') . '/';         //Initializes the cURL instance         $this-\>cURL = curl\_init();         curl\_setopt($this-\>cURL, CURLOPT\_RETURNTRANSFER, true);         curl\_setopt($this-\>cURL, CURLOPT\_FOLLOWLOCATION, false);         curl\_setopt($this-\>cURL, CURLOPT\_USERAGENT, 'Shopware ApiClient');         curl\_setopt($this-\>cURL, CURLOPT\_HTTPAUTH, CURLAUTH\_DIGEST);         curl\_setopt($this-\>cURL, CURLOPT\_USERPWD, $username . ':' . $apiKey);         curl\_setopt(             $this-\>cURL,             CURLOPT\_HTTPHEADER,             ['Content-Type: application/json; charset=utf-8']         );     }     public function call($url, $method = self::METHOD\_GET, $data = [], $params = [])     {         if (!in\_array($method, $this-\>validMethods)) {             throw new Exception('Invalid HTTP-Methode: ' . $method);         }         $queryString = '';         if (!empty($params)) {             $queryString = http\_build\_query($params);         }         $url = rtrim($url, '?') . '?';         $url = $this-\>apiUrl . $url . $queryString;         $dataString = json\_encode($data);         curl\_setopt($this-\>cURL, CURLOPT\_URL, $url);         curl\_setopt($this-\>cURL, CURLOPT\_CUSTOMREQUEST, $method);         curl\_setopt($this-\>cURL, CURLOPT\_POSTFIELDS, $dataString);         $result = curl\_exec($this-\>cURL);         $httpCode = curl\_getinfo($this-\>cURL, CURLINFO\_HTTP\_CODE);         return $this-\>prepareResponse($result, $httpCode);     }     public function get($url, $params = [])     {         return $this-\>call($url, self::METHOD\_GET, [], $params);     }     public function post($url, $data = [], $params = [])     {         return $this-\>call($url, self::METHOD\_POST, $data, $params);     }     public function put($url, $data = [], $params = [])     {         return $this-\>call($url, self::METHOD\_PUT, $data, $params);     }     public function delete($url, $params = [])     {         return $this-\>call($url, self::METHOD\_DELETE, [], $params);     }     protected function prepareResponse($result, $httpCode)     {         echo " ## HTTP: $httpCode ";         if (null === $decodedResult = json\_decode($result, true)) {             $jsonErrors = [                 JSON\_ERROR\_NONE =\> 'No error occurred',                 JSON\_ERROR\_DEPTH =\> 'The maximum stack depth has been reached',                 JSON\_ERROR\_CTRL\_CHAR =\> 'Control character issue, maybe wrong encoded',                 JSON\_ERROR\_SYNTAX =\> 'Syntaxerror',             ];             echo ' ## Could not decode json ';             echo 'json\_last\_error: ' . $jsonErrors[json\_last\_error()];             echo ' Raw: ';             echo ' ' . print\_r($result, true) . ' ';             return;         }         if (!isset($decodedResult['success'])) {             echo 'Invalid Response';             return;         }         if (!$decodedResult['success']) {             echo ' ## No Success ';             echo ' ' . $decodedResult['message'] . ' ';             if (array\_key\_exists('errors', $decodedResult) && is\_array($decodedResult['errors'])) {                 echo ' ' . join(' ', $decodedResult['errors']) . ' ';             }             return;         }         echo ' ## Success ';         if (isset($decodedResult['data'])) {             echo ' ' . print\_r($decodedResult['data'], true) . ' ';         }         return $decodedResult;     } } $client = new ApiClient(     //URL of shopware REST server     'http://www.domain.de/api',     //Username     'Administrator',     //User's API-Key     'Passwortxyz' ); ?\>   Ich habe jetzt einfach das aus den Beispielen gezogen, aber es erscheint nichts als weißes Bild. Die Datei, die ich dafür angelegt habe heißt rest\_api.php und liegt in einem von mir erstellten Unterverzeichnis des Shops. Zunächst mal die erste Frage: Was muss ich überhaupt für einen Bentuzer und Passwort verwenden? Einfach den Benutzer meines Shop-Backends? Und da nur weißes Bild erschienen ist, nehme ich mal an, ich habe etwas falsch gemacht oder? Soltle da nicht eigentlich "SUCCESS"  stehen?

Hier ist eine detailierte Anleitung, die alles von Anfang an erklärt:

https://developers.shopware.com/developers-guide/rest-api/

Es geht los ab „Using the REST API in your own application

Viele Grüße

ich habe es jetzt soweit nach Anleitung gemacht, jetzt bekomme ich diese Fehlermeldung:

hierfür hatte ich in der URL das:

$client = new ApiClient(
    //URL of shopware REST server
    ‚http://domain.de/api/‘,
    //Username
    ‚Administrator‘,
    //User’s API-Key
    ‚GXMUCtZWhERWfL1ThhGNeEA7EnaegwgBwTJPBasLXUOwC‘
);

als ich dann https daraus gemacht habe kam das:

 

Ich habe kein SSL Zertifikat für die Domain bisher. Brauche ich bereits eins, damit das funktioniert?

außerdem gibt es im FTP den Ordner api nicht bei mir, hat das etwas zu bedeuten?

Für die API brauch man kein SSL.

Und was habe ich dann für einen Fehler gemacht ? :-D 

Hmmm, ist etwas schwierig wenn sich jemand damit noch nicht so genau befasst hat. Den Inhalt von SW_ApiClient.php zu posten ist jetzt nicht relevant.

Ich benutze die API um z.B. Bilder aus einer Bilderdatenbank in einen Shop zu übertragen. Daher ist mein Beispiel auch wirklich nur ein Beispiel:

/*
hier eine eigene PHP-Datei
*/

include 'SW_ApiClient.php';
$SW = new ApiClient( 'http://domain.de/api', 'name', 'key' );


// $data = Inhalt aus externer Datenbank
// $imgshop = URL zu dem Bildern
// $img = das jeweilige Bild

// Artikeldaten einlesen
$out = PostArticlesMain( $SW, $data );
$StoreID = $out['data']['id'];

// wenn Artikel drin, dann Bild einlesen
if ( $StoreID ) {
  PostImages( $SW, $StoreID, $imgshop );
}


function PostImages( $SW, $StoreID, $img ) {
  $SW->put('articles/'.$StoreID, array(
    'images' => array( array('link' => $img ) )
  ));
}

function PostArticlesMain( $SW, $data ) {

  $NR = 'IFF'.$data['FID'];
  $PREIS = ($data['CID']==10) ? 19.90 : 9.90;

  $new = Array(
    'name' => $data['TIT'],
    'description' => $data['DES'].' - Fotos',
    'descriptionLong' => $data['DES'],
    'taxId' => 1,
    'supplier' => 'IFF',
    'priceGroupId' => 1,
    'active' => 1, 
    'categories' => array( array('id' => $data['CID']) ),
    'keywords' => $data['TAG'],
    'metaTitle' => $data['TIT'],
    'mainDetail' => array( 
      'number' => $NR, 
      'inStock' => 1,
      'minPurchase' => 0,
      'maxPurchase' => 1,
      'supplierNumber' => $data['FIF'],
      'active' => 1,
      'prices' => array( array( 'customerGroupKey' => 'EK', 'price' => $PREIS ) ),
      'attribute' => array( 
        'attr5' => $data['TAG'],  
        ),
    ),

  );

  $out = $SW->post('articles', $new );
  return $out;
}

Auf alle Fälle noch mal die Zugangsdaten prüfen.

Ich hab meinen Fehler gefunden: 

Man muss im Shopware Hauptverzeichnis das Verzeichnis api anlegen und da die php-Dateien einfügen.

Genau sowas steht nämlich nicht in der Anleitung und das als Neuling zu wissen geht eigentlich nicht. Hier eine detailliertere Anleitung:

https://the-cake-shop.de/shopware-rest-api-einbinden/ 

 

Man muss im Shopware Hauptverzeichnis das Verzeichnis api anlegen und da die php-Dateien einfügen.

Verstehe ich jetzt nicht ganz genau. Der Controller API liegt unter engine/Shopware/Controllers/Api und was man noch anlegen muss ist die API Klasse ApiClient als PHP-Datei + seine eigene PHP Datei für den Rest und das kann überall liegen. Vielleicht etwas mißverstanden.

In der Anleitung steht das aber auch drin:

https://developers.shopware.com/developers-guide/rest-api/

 

1 Like