Administration gibt String anstatt Number (int) ans Backend - Fehler bei Preisportal-Konfiguration

Hallo,

in der Version 6.6.3.1 kann ich momentan keine Änderungen an einem Preisportal mehr in der Admin-Oberfläche speichern, da folgender Fehler in der GUI angezeigt wird:

1x "Dieser Wert sollte vom Typ int sein."

Im Payload des PATCH-Requests an api/sales-channel findet sich unter productExports[0].interval ein Zahlenwert allerdings als String formatiert. In unserer bisher laufenden Version 6.5.x wird hier eine JavaScript-Number an das Backend geschickt und es gibt keinen Fehler.

Gruß

Julius

Es passiert übrigens auch, wenn ich einen neuen Preisportal-Verkaufskanal anlegen möchte:

Da das Frontend im Vergleich zur alten Version Änderungen aufweist, gehe ich davon aus, dass es auch neu gebuildet wurde.

Kann sonst keiner diesen Fehler nachvollziehen?

Gruß

Weil es evtl. die selbe Ursache hat (unvollständiger build im Frontend):

Ist die Buttonfarbe hier richtig (die schwarze Schrift sieht unpassend aus, ich hätte weiß erwartet)?

Ist im Warenkorb vor dem Checkout.

Gruß

Moin,
ja ist ärgerlich, man kann das Generierungsintervall im Backend nicht einstellen, weil der Wert int sein soll, aber einen String zurück gibt.

Mein Workaround:

import requests
import json

# Define the necessary variables
client_id = 'XX'
client_secret = 'YYYYYYYYYYYYYYYY'
shopware_domain = 'DOMAIN.de'
desired_file_name = 'idealox.csv'  # File name to search for

# Get the access token
auth_url = f'{shopware_domain}/api/oauth/token'
auth_payload = {
    'client_id': client_id,
    'client_secret': client_secret,
    'grant_type': 'client_credentials'
}

response = requests.post(auth_url, data=auth_payload)
response_data = response.json()
access_token = response_data['access_token']

# Headers for requests
headers = {
    'Authorization': f'Bearer {access_token}',
    'Content-Type': 'application/json'
}

# Retrieve the list of product exports
product_exports_url = f'{shopware_domain}/api/product-export'
response = requests.get(product_exports_url, headers=headers)

if response.status_code == 200:
    product_exports = response.json()['data']
    # Find the product export with the desired file name
    for export in product_exports:
        if export['attributes']['fileName'] == desired_file_name:
            product_export_id = export['id']
            print(f'For fileName "{desired_file_name}" found product export ID: {product_export_id}')
            break
    else:
        print(f'No product export found with fileName: {desired_file_name}')
        exit()
else:
    print("Failed to retrieve product exports.")
    print(response.status_code, response.text)
    exit()

# Retrieve the current product export settings for the found product_export_id
product_export_url = f'{shopware_domain}/api/product-export/{product_export_id}'
response = requests.get(product_export_url, headers=headers)

if response.status_code == 200:
    product_export_data = response.json()['data']
    current_interval = product_export_data['attributes']['interval']
    print("Current interval:", current_interval)
else:
    print("Failed to retrieve product export details.")
    print(response.status_code, response.text)
    exit()

# Update the interval value in the product export settings
update_payload = {
    "writeProductExport": {
        "entity": "product_export",
        "action": "upsert",
        "payload": [
            {
                "id": product_export_id,
                "interval": 0  # Set the interval to 0
            }
        ]
    }
}

# Send the updated settings back to the API using /api/_action/sync
sync_url = f'{shopware_domain}/api/_action/sync'
response = requests.post(sync_url, headers=headers, data=json.dumps(update_payload))

# Check the response
if response.status_code in (200, 204):
    print("Product export interval updated successfully.")
else:
    print("Failed to update product export interval.")
    print("Response status code:", response.status_code)
    print("Response text:", response.text)
    print("Response headers:", response.headers)

# Confirm the update by retrieving the product export details again
response = requests.get(product_export_url, headers=headers)

if response.status_code == 200:
    updated_product_export_data = response.json()['data']
    updated_interval = updated_product_export_data['attributes']['interval']
    print(f'Updated interval: {updated_interval}')
else:
    print("Failed to retrieve updated product export details.")
    print(response.status_code, response.text)

Das Script setzt das „interval“ auf 0 (Live).
Man muss den Dateinamen für die Suche eingeben.

Viele Grüße

Mirko

Schon mal gut zu wissen, dass es so anscheinend offiziell deployed wurde, da warten wir dann wohl auf Nachbesserung seitens Shopware, da unsere Preisportal-Seiten momentan wohl so bleiben können.

Trotzdem danke für den Workaround, ich hoffe, der Bug ist irgednwo im Issuetracker hinterlegt.

Gruß

Ein deutlich einfacherer Workaround:

Im Browser (hier: Chrome) Netzwerktab öffnen und nach Fetch/XHR filtern.
Request zum Ändern/Anlegen des Sales-Channel im Browser schicken (gibt dann einen Fehler).

Den gescheiterten (rot markierten) Request finden, rechts klicken und „Copy“ → „Copy as fetch“ auswählen.

Auf der selben Seite in der Console den Code eingeben und an der Stelle mit der „interval“-Variable die Daten zu einer Number ändern und mit Enter bestätigen.

Funktioniert (kann man in der Db nachsehen, wo man den Wert bei einer einfachen Änderung wohl auch direkt updaten kann, allerdings ist das nicht ganz sauber).

Gruß

Hallo.

Ich versuche auch, einen Produktvergleich für einen Export an Google anzulegen. (Shopware 6.6.4.0.) Beim Generierungsintervall, das ja ein Drop-Down ohne Freitext-Angabe ist, bekomme ich immer die Meldung „Dieser Wert sollte vom Typ int sein.“

Wenn ich dem Hinweis von @jstr folge, dann bekomme ich als Ausgabe für die „Requested Payload“ für das Intervall „1 Tag“:

[
    {
        "id": "019082[...]b9b27a",
        "generateByCronjob": true,
        "interval": "86400"
    }
]

Für „Live“ als Intervall wird „0“ ausgegeben, bei 2 Minuten entsprechend „120“. Es kann also nicht daran liegen, dass 86400 ein zu großer Integer ist.

Welches Feld in der Datenbank müsste ich denn anpassen und warum ist das keine gute Idee? (Updates, die das überschreiben?)

Moin Moin,

habt ihr diesen Fehler bereits an Shopware gemeldet?

Viele Grüße
Achim

Hallo,

bei mir hat sich das Problem durch ein Update auf 6.6.4.1 behoben.

Dieses Thema wurde automatisch 30 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.