# Alle Textbausteine für eine Sprache exportieren

**URL:** <https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632>\
**Category:** Shopware 6 (German)\
**Created:** [26. Juli 2023 um 07:54 UTC](https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632 "2023-07-26T07:54:48Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Frank\_2812](https://avatars.discourse-cdn.com/v4/letter/f/b19c9b/32.png) [@Frank\_2812](https://forum.shopware.com/u/Frank_2812)\
**Post date:** [26. Juli 2023 um 07:54 UTC](https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632/1 "2023-07-26T07:54:48Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![MrAle](https://avatars.discourse-cdn.com/v4/letter/m/3bc359/32.png) [@MrAle](https://forum.shopware.com/u/MrAle)\
**Post date:** [26. Juli 2023 um 08:25 UTC](https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632/2 "2023-07-26T08:25:18Z")

</div>

Hi, auf die schnelle kann ich dir das geben:  
POST: [http://localhost/api/\_action/snippet-set](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

---

<div class="post-metadata">

**Author:** ![Frank\_2812](https://avatars.discourse-cdn.com/v4/letter/f/b19c9b/32.png) [@Frank\_2812](https://forum.shopware.com/u/Frank_2812)\
**Post date:** [26. Juli 2023 um 08:48 UTC](https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632/3 "2023-07-26T08:48:10Z")

</div>

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:

```auto
<?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-set`resulted in a`405 Method Not Allowed“

Viele Grüße, Frank

---

<div class="post-metadata">

**Author:** ![Frank\_2812](https://avatars.discourse-cdn.com/v4/letter/f/b19c9b/32.png) [@Frank\_2812](https://forum.shopware.com/u/Frank_2812)\
**Post date:** [26. Juli 2023 um 08:58 UTC](https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632/4 "2023-07-26T08:58:04Z")

</div>

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

Vielen Dank!

---

<div class="post-metadata">

**Author:** ![Frank\_2812](https://avatars.discourse-cdn.com/v4/letter/f/b19c9b/32.png) [@Frank\_2812](https://forum.shopware.com/u/Frank_2812)\
**Post date:** [26. Juli 2023 um 09:12 UTC](https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632/5 "2023-07-26T09:12:53Z")

</div>

Wie kann man einen Filter innerhalb von POST: [http://localhost/api/\_action/snippet-set](http://localhost/api/_action/snippet-set) setzen?

---

<div class="post-metadata">

**Author:** ![MrAle](https://avatars.discourse-cdn.com/v4/letter/m/3bc359/32.png) [@MrAle](https://forum.shopware.com/u/MrAle)\
**Post date:** [26. Juli 2023 um 09:17 UTC](https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632/6 "2023-07-26T09:17:37Z")

</div>

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

Grüße

---

<div class="post-metadata">

**Author:** ![Frank\_2812](https://avatars.discourse-cdn.com/v4/letter/f/b19c9b/32.png) [@Frank\_2812](https://forum.shopware.com/u/Frank_2812)\
**Post date:** [26. Juli 2023 um 11:12 UTC](https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632/7 "2023-07-26T11:12:31Z")

</div>

Hallo,

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

Viele Grüße, Frank

---

<div class="post-metadata">

**Author:** ![ThomasChr](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/thomaschr/32/10466_2.png) [@ThomasChr](https://forum.shopware.com/u/ThomasChr)\
**Post date:** [27. Juli 2023 um 06:26 UTC](https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632/8 "2023-07-27T06:26:58Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Frank\_2812](https://avatars.discourse-cdn.com/v4/letter/f/b19c9b/32.png) [@Frank\_2812](https://forum.shopware.com/u/Frank_2812)\
**Post date:** [27. Juli 2023 um 09:29 UTC](https://forum.shopware.com/t/alle-textbausteine-fuer-eine-sprache-exportieren/100632/9 "2023-07-27T09:29:16Z")

</div>

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
