Alle Textbausteine für eine Sprache exportieren

Hallo,

wenn ich im Administrator, unter Einstellungen/Textbausteine, ein Textbaustein-Set auswähle (z.B. BASE de-DE) werden mir alle Textbausteine gesammelt angezeigt. Dazu gehören alle Textbausteine der Basisdatei und auch alle Textbausteine, die durch Plugins oder Themes hinzugekommen sind.

Ich suche eine Möglichkeit, wie ich diese Liste exportieren kann. Da das Backend keine Exportmöglichkeit bietet, hatte ich an ein REST-API Script gedacht.

Im meinem Fall kommen die deutschen Snippets über: /api/snippet-set/11f9550e97f14cfa8e2102acc83eb172/snippets

Das sind aber irgendwie nur wenige (scheinbar die angepassten) Textbausteine. Gibt es eine Möglichkeit alle Textbausteine, so wie im Backend, über die API abzufragen?

Viele Grüße, Frank

Hi, auf die schnelle kann ich dir das geben:
POST: http://localhost/api/_action/snippet-set

Damit kriegst du schonmal alle snippets. Evtl. kannst du ja in deinem Script dann noch nach der SetId filtern, dann solltest du alles haben.

Grüße

Hallo @MrAle,

danke für Deine Antwort. Allerdings stehe ich gerade erstmal etwas auf dem Schlauch. Ich habe ein PHP-Script, welches den API-Zugriff auf den Shop ermöglicht:

<?php declare(strict_types=1);

@ini_set('max_execution_time', '600');

require_once '../vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Shopware\Core\Framework\Uuid\Uuid;

const SHOP_URL = 'https://meine-shop-adresse.de';

class RestService
{
    /**
     * @var Client
     */
    private $restClient;

    /**
     * @var string
     */
    private $accessToken;

    /**
     * @var string
     */
    private $refreshToken;

    /**
     * @var \DateTimeInterface
     */
    private $expiresAt;

    public function __construct()
    {
        $this->restClient = new GuzzleHttp\Client([
            'base_uri' => SHOP_URL,
            'timeout' => 2.0,
            'headers' => ['Content-Type' => 'application/json'],
            'verify' => false,
        ]);
    }

    private function getAdminAccess(): void
    {
       
        $clientId = "xxx";
        $clientSecret = "yyy";

        $body = json_encode([
            'client_id' => $clientId,
            'client_secret' => $clientSecret,
            'grant_type' => 'client_credentials'
        ]);

        $request = new Request(
            'POST',
            SHOP_URL . '/api/oauth/token',
            ['Content-Type' => 'application/json'],
            $body
        );

        $response = $this->restClient->send($request);

        $body = json_decode($response->getBody()->getContents(), true);

        $this->setAccessData($body);
    }

    private function setAccessData(array $body): void
    {
        $this->accessToken = $body['access_token'];
        $this->expiresAt = $this->calculateExpiryTime((int) $body['expires_in']);
    }

    private function calculateExpiryTime(int $expiresIn): \DateTimeInterface
    {
        $expiryTimestamp = (new \DateTime())->getTimestamp() + $expiresIn;

        return (new \DateTimeImmutable())->setTimestamp($expiryTimestamp);
    }

    private function createShopwareApiRequest(string $method, string $uri, ?string $body = null): RequestInterface
    {
        return new Request(
            $method,
            SHOP_URL . '/api/' . $uri,
            [
                'Authorization' => 'Bearer ' . $this->accessToken,
                'Accept' => '*/*'
            ],
            $body
        );
    }

    private function send(RequestInterface $request, string $uri)
    {
        if ($this->expiresAt <= (new \DateTime())) {
            $this->refreshAuthToken();

            $body = $request->getBody()->getContents();
            $request = $this->createShopwareApiRequest($request->getMethod(), $uri, $body);
        }
        
        return $this->restClient->send($request);
    }

    private function refreshAuthToken(): void
    {
        $body = \json_encode([
            'client_id' => 'administration',
            'grant_type' => 'refresh_token',
            'refresh_token' => $this->refreshToken
        ]);

        $request = new Request(
            'POST',
            SHOP_URL . '/api/oauth/token',
            ['Content-Type' => 'application/json'],
            $body
        );

        $response = $this->restClient->send($request);
        $body = json_decode($response->getBody()->getContents(), true);

        $this->setAccessData($body);
    }

    public function request(string $method, string $uri, ?array $body = null): ResponseInterface
    {
        if ($this->accessToken === null || $this->refreshToken === null || $this->expiresAt === null) {
            $this->getAdminAccess();
        }

        $bodyEncoded = json_encode($body);
        $request = $this->createShopwareApiRequest($method, $uri, $bodyEncoded);

        return $this->send($request, $uri);
    }
}

$shopwareApi = new RestService();

$result = $shopwareApi->request('GET', 'snippet-set');
$json = json_decode((string) $result->getBody(), true);

echo "<pre>";
print_r($json);
echo "</pre>";

Wie muss ich da umbauen, damit „_action“ funktioniert? Wenn ich die Route auf meinem Shop probiere, kommt eine Fehlermeldung: „/api/_action/snippet-setresulted in a405 Method Not Allowed“

Viele Grüße, Frank

… okay. Es muss ein POST sein. Nun klappt es.

Vielen Dank!

Wie kann man einen Filter innerhalb von POST: http://localhost/api/_action/snippet-set setzen?

Da bin ich leider auch nicht weiter gekommen. Aber du könntest ja in deinem PHP auf die Variable setId filtern.

Grüße

Hallo,

bei der Abfrage kommen immer nur die ersten 25 Elemente. Wie kann man alle Elemente bekommen?

Viele Grüße, Frank

Bei der Abfrage kann man im obersten Bereich des JSON ein „limit“ mitgeben. Da kannst du die Anzahl der Ergebnissätze vorgeben.

1 „Gefällt mir“

Hallo,

danke. Das mit dem „limit“ hatte ich auch schon herausgefunden und erfolgreich eingesetzt.

Was ich grundsätzlich noch nicht verstehe: wenn ich über /api/_action/snippet-set gehe, bekomme ich tatsächlich alle snippets zurückgeliefert. Wenn ich über /api/snippet-set gehe, bekomme ich sämtliche Snippet-Sets zurückgeliefert. Was ist der Unterschied zwischen /api/ und /api/_action/ ?

Viele Grüße, Frank