Alt-Text von Bildern statt Bildname ausgeben/anzeigen lassen

Hallo zusammen,

in Shopware 6 wurde ja, wenn man auf der Produkt-Detailseite über das Foto fährt, nicht einfach die Bildbezeichnung sondern der Titel des Bildes angezeigt - also Bildname war z.B. sowas wie „A4215-Honig“ und der Titel (bzw. jetzt in SW6 Alt-Text) wäre sowas wie „Honig von Waldbienen im Glas“.

SW5 zeigte an, wenn man mit der Maus über das Bild fährt „Honig von Waldbienen im Glas“ - SW6 zeigt es jetzt an „A4215-Honig“. Bei der Migration wird der Titel „Honig von Waldbienen im Glas“ im Alt-Text des Bildes gespeichert.

Wie bekomme ich es hin, was SW6 den Alt-Text anzeigt und nicht den Titel/Namen des Bildes ausgibt?

Shopware zeigt den Namen des Bildes an, wenn das title-Feld in der Datenbank leer ist.
Ich habe mir daher nach der Migration der Bilder direkt in der Datenbank den Inhalt der alt-Felder in die title-Felder kopiert (Tabelle: media_translation).

Das direkte Bearbeiten dieser Tabelle ist auch in anderen Fällen der Bearbeitung der alt- und title-Felder der schnellste Weg.

Vorheriges Backup nicht vergessen!

Danke für deine Antwort! Ich hab mir mal die Datenbank-Tabelle media_translation bei mir angesehen.

Bei mir steht im Title-Feld immer der Bildername drin (also sowas wie „A4215-Honig“) - in den Alt-Feldern steht die von mir vorgesehene Bildbezeichnung drin (also sowas wie „Honig von Waldbienen im Glas“).

Wie kann das sein? Beide Felder sind bei mir belegt, nur bei einigen Uralt-Bildern sind die Alt-Felder leer. Ist das generell ein Fehler vom Migrations-Plugin?

Und wie könnte man hier vorgehen? Kopiere ich den Inhalt der Alt-Felder ins Title-Feld, sind ja die Bildbezeichnungen mit Artikelnummer verschwunden? Oder müsste ich zuerst das Title-Feld in costum_flieds kopieren (die sind bei mir bei den Bildern leer).

Gäbe es irgendwie eine Möglichkeit, das in einer Twig-Datei umzudrehen, das der Alt-Tag zuerst gezeigt wird, wenn dieser vorhanden ist? Lt. diesem Beitrag Alt Tags und Image Title via Javascript sollen die Medien ja in der /views/storefront/element/cms-element-image-gallery.html.twig ihre Bezeichnung finden? Ich sehe allerdings leider nicht wo.

Mir scheint das ein Fehler des Migrationsplugins zu sein. Zumindest verstehe ich den Sinn der so ausgeführten Migration nicht.
Ich kann keinen Rat zu den sinnvollen Inhalten machen, die in den Feldern stehen sollten. Ich persönlich haben in beiden Felder fast immer dasselbe stehen.
Der Title wird ja bei Mouseover angezeigt, da scheint mir der Bildname wenig geeignet. Der steht ja noch an anderer Stelle in der Datenbank (Tabelle media).

Man kann allerdings den Inhalt des Alt-Feldes in der Datenbank auch zum Inhalt des title-Feldes addieren oder sonst etwas machen was in sql möglich ist (und das ist schon eine ganze Menge).
Zum Üben kann man sich die Tabelle auch leicht temporär unter einem anderen Namen kopieren und speichern

Ich wurde fündig! In Zeile 156 der storefront/element/cms-element-image-gallery.html.twig findet sich folgendes:

title: (image.translated.title ?: fallbackImageTitle)} %}

Wenn ich das in title: (image.translated.alt ?: fallbackImageTitle)} %} ändere, wird der Alt-Text angezeigt!

Ich habe das wie folgt umgesetzt:

{% sw_extends '@Storefront/storefront/element/cms-element-image-gallery.html.twig' %}
{% block element_image_gallery_inner_item %}
                                                                <div class="gallery-slider-item-container">
                                                                    <div class="gallery-slider-item is-{{ displayMode }} js-magnifier-container"
                                                                        {% if minHeight and (displayMode == "cover" or displayMode == "contain") %} style="min-height: {{ minHeight }}"{% endif %}
                                                                        {% if (displayMode == "standard" and image.isSpatialObject()) %} style="min-height: 240px"{% endif %}>
                                                                        {% set attributes = {
                                                                            class: 'img-fluid gallery-slider-image',
                                                                            title: (image.translated.alt ?: fallbackImageTitle)
                                                                        } %}

                                                                        {# @experimental stableVersion:v6.7.0 feature:SPATIAL_BASES #}
                                                                        {% block element_image_gallery_inner_item_spatial %}
                                                                            {% if image.isSpatialObject() %}
                                                                                <span class="badge bg-secondary m-3 position-absolute top-0 end-0 d-md-none">3D</span>
                                                                                <div class="spatial-canvas-spinner position-absolute top-50 start-50 bg-white flex justify-content-center align-items-center" style="--bs-bg-opacity: .8;">
                                                                                    <div class="spinner-border" role="status">
                                                                                        <span class="visually-hidden">Loading...</span>
                                                                                    </div>
                                                                                </div>
                                                                                <div class="gallery-slider-spatial-canvas-wrapper position-absolute start-0 end-0 top-0 bottom-0">
                                                                                    <canvas
                                                                                        data-spatial-gallery-slider-viewer
                                                                                        data-spatial-model-url="{{ image.url }}"
                                                                                        data-product-slider-position="{{ loop.index0 }}"
                                                                                    ></canvas>
                                                                                    <span
                                                                                        class="spatial-canvas-note spatial-slider-movement-note position-absolute start-50 text-center badge mx-0 py-1 px-3 translate-middle-x"
                                                                                        data-spatial-movement-note
                                                                                        data-spatial-movement-note-touch-text="{{ 'component.cms.imageGallery.touchMove'|trans|striptags }}"
                                                                                    >
                                                                                        {{ 'component.cms.imageGallery.clickMove'|trans|striptags }}
                                                                                    </span>
                                                                                    {% if image.config.spatial.arReady %}
                                                                                        <div class="ar-button button"
                                                                                             data-spatial-ar-viewer
                                                                                             data-spatial-ar-viewer-options='{ "spatialArId": "{{ image.id }}" }'
                                                                                             data-spatial-model-url="{{ image.url }}">
                                                                                            {% sw_icon 'augmented' style {
                                                                                                'size': 'fluid'
                                                                                            } %}
                                                                                        </div>
                                                                                        {% sw_include '@Storefront/storefront/utilities/ar-overlay.html.twig' %}
                                                                                    {% endif %}
                                                                                </div>

                                                                                {# @experimental stableVersion:v6.7.0 feature:SPATIAL_BASES #}
                                                                                {% block element_image_gallery_qr_code_modal %}
                                                                                    {% sw_include '@Storefront/storefront/utilities/qr-code-modal.html.twig'
                                                                                        with {
                                                                                            "qrCodeOptions": {
                                                                                                "params": {
                                                                                                    "autostartAr": image.id
                                                                                                }
                                                                                            }
                                                                                        }
                                                                                    %}
                                                                                {% endblock %}
                                                                            {% elseif image.getMediaType().getName() === 'VIDEO' %}
                                                                                {% set attributes = attributes|merge({ controls: true }) %}

                                                                                {% if isProduct %}
                                                                                    {% set attributes = attributes|merge({ itemprop: 'video' }) %}
                                                                                {% endif %}

                                                                                {% sw_include '@Storefront/storefront/utilities/video.html.twig' with {
                                                                                    media: image,
                                                                                    attributes: attributes
                                                                                } %}
                                                                            {% else %}
                                                                                {% set attributes = attributes|merge({
                                                                                    class: attributes.class ~ ' magnifier-image js-magnifier-image',
                                                                                    alt: (image.translated.alt ?: fallbackImageTitle),
                                                                                    'data-full-image': image.url
                                                                                }) %}

                                                                                {% if displayMode == 'cover' or displayMode == 'contain' %}
                                                                                    {% set attributes = attributes|merge({ 'data-object-fit': displayMode }) %}
                                                                                {% endif %}

                                                                                {% if isProduct %}
                                                                                    {% set attributes = attributes|merge({ itemprop: 'image' }) %}
                                                                                {% endif %}

                                                                                {% if loop.first %}
                                                                                    {% set attributes = attributes|merge({ fetchpriority: 'high' }) %}
                                                                                {% endif %}

                                                                                {% sw_thumbnails 'gallery-slider-image-thumbnails' with {
                                                                                    media: image,
                                                                                    attributes: attributes
                                                                                } %}
                                                                            {% endif %}
                                                                        {% endblock %}
                                                                    </div>
                                                                </div>
                                                            {% endblock %}

An alle Profis, die mehr Ahnung von sowas haben als ich - kann man das noch irgendwie besser mit weniger Code ableiten/umsetzen? Muss ich schon ab {% block element_image_gallery_inner_item %} ableiten, oder gäbe es einen sinnvolleren Block?

Ich erweitere das nochmal:

In die cms-element-image-gallery.html.twig kommt:

{% sw_extends '@Storefront/storefront/element/cms-element-image-gallery.html.twig' %}
{% block element_image_gallery_inner_item %}
                                                                <div class="gallery-slider-item-container">
                                                                    <div class="gallery-slider-item is-{{ displayMode }} js-magnifier-container"
                                                                        {% if minHeight and (displayMode == "cover" or displayMode == "contain") %} style="min-height: {{ minHeight }}"{% endif %}
                                                                        {% if (displayMode == "standard" and image.isSpatialObject()) %} style="min-height: 240px"{% endif %}>
                                                                        {% set attributes = {
                                                                            class: 'img-fluid gallery-slider-image',
                                                                            title: (image.translated.alt ?: fallbackImageTitle)
                                                                        } %}

                                                                        {# @experimental stableVersion:v6.7.0 feature:SPATIAL_BASES #}
                                                                        {% block element_image_gallery_inner_item_spatial %}
                                                                            {% if image.isSpatialObject() %}
                                                                                <span class="badge bg-secondary m-3 position-absolute top-0 end-0 d-md-none">3D</span>
                                                                                <div class="spatial-canvas-spinner position-absolute top-50 start-50 bg-white flex justify-content-center align-items-center" style="--bs-bg-opacity: .8;">
                                                                                    <div class="spinner-border" role="status">
                                                                                        <span class="visually-hidden">Loading...</span>
                                                                                    </div>
                                                                                </div>
                                                                                <div class="gallery-slider-spatial-canvas-wrapper position-absolute start-0 end-0 top-0 bottom-0">
                                                                                    <canvas
                                                                                        data-spatial-gallery-slider-viewer
                                                                                        data-spatial-model-url="{{ image.url }}"
                                                                                        data-product-slider-position="{{ loop.index0 }}"
                                                                                    ></canvas>
                                                                                    <span
                                                                                        class="spatial-canvas-note spatial-slider-movement-note position-absolute start-50 text-center badge mx-0 py-1 px-3 translate-middle-x"
                                                                                        data-spatial-movement-note
                                                                                        data-spatial-movement-note-touch-text="{{ 'component.cms.imageGallery.touchMove'|trans|striptags }}"
                                                                                    >
                                                                                        {{ 'component.cms.imageGallery.clickMove'|trans|striptags }}
                                                                                    </span>
                                                                                    {% if image.config.spatial.arReady %}
                                                                                        <div class="ar-button button"
                                                                                             data-spatial-ar-viewer
                                                                                             data-spatial-ar-viewer-options='{ "spatialArId": "{{ image.id }}" }'
                                                                                             data-spatial-model-url="{{ image.url }}">
                                                                                            {% sw_icon 'augmented' style {
                                                                                                'size': 'fluid'
                                                                                            } %}
                                                                                        </div>
                                                                                        {% sw_include '@Storefront/storefront/utilities/ar-overlay.html.twig' %}
                                                                                    {% endif %}
                                                                                </div>

                                                                                {# @experimental stableVersion:v6.7.0 feature:SPATIAL_BASES #}
                                                                                {% block element_image_gallery_qr_code_modal %}
                                                                                    {% sw_include '@Storefront/storefront/utilities/qr-code-modal.html.twig'
                                                                                        with {
                                                                                            "qrCodeOptions": {
                                                                                                "params": {
                                                                                                    "autostartAr": image.id
                                                                                                }
                                                                                            }
                                                                                        }
                                                                                    %}
                                                                                {% endblock %}
                                                                            {% elseif image.getMediaType().getName() === 'VIDEO' %}
                                                                                {% set attributes = attributes|merge({ controls: true }) %}

                                                                                {% if isProduct %}
                                                                                    {% set attributes = attributes|merge({ itemprop: 'video' }) %}
                                                                                {% endif %}

                                                                                {% sw_include '@Storefront/storefront/utilities/video.html.twig' with {
                                                                                    media: image,
                                                                                    attributes: attributes
                                                                                } %}
                                                                            {% else %}
                                                                                {% set attributes = attributes|merge({
                                                                                    class: attributes.class ~ ' magnifier-image js-magnifier-image',
                                                                                    alt: (image.translated.alt ?: fallbackImageTitle),
                                                                                    'data-full-image': image.url
                                                                                }) %}

                                                                                {% if displayMode == 'cover' or displayMode == 'contain' %}
                                                                                    {% set attributes = attributes|merge({ 'data-object-fit': displayMode }) %}
                                                                                {% endif %}

                                                                                {% if isProduct %}
                                                                                    {% set attributes = attributes|merge({ itemprop: 'image' }) %}
                                                                                {% endif %}

                                                                                {% if loop.first %}
                                                                                    {% set attributes = attributes|merge({ fetchpriority: 'high' }) %}
                                                                                {% endif %}

                                                                                {% sw_thumbnails 'gallery-slider-image-thumbnails' with {
                                                                                    media: image,
                                                                                    attributes: attributes
                                                                                } %}
                                                                            {% endif %}
                                                                        {% endblock %}
                                                                    </div>
                                                                </div>
                                                            {% endblock %}

{% block element_image_gallery_inner_zoom_modal_slider_item %}
                                                                                    <div class="gallery-slider-item">
                                                                                        {% block element_image_gallery_inner_zoom_modal_slider_item_zoom_container %}
                                                                                            <div class="image-zoom-container"
                                                                                                 {% if image.getMediaType().getName() !== 'VIDEO' %}data-image-zoom="true"{% endif %}>
                                                                                                {% set attributes = {
                                                                                                    class: 'gallery-slider-image',
                                                                                                    title: (image.translated.alt ?: fallbackImageTitle)
                                                                                                } %}

                                                                                                {% block element_image_gallery_inner_zoom_modal_slider_item_image %}
                                                                                                    {# @experimental stableVersion:v6.7.0 feature:SPATIAL_BASES #}
                                                                                                    {% block element_image_gallery_inner_zoom_modal_slider_item_image_spatial %}
                                                                                                        {% if image.isSpatialObject() %}
                                                                                                            {% sw_thumbnails 'gallery-slider-image-thumbnails' with {
                                                                                                                media: image,
                                                                                                                attributes: {
                                                                                                                    'class': 'd-none gallery-slider-image js-image-zoom-element js-load-img',
                                                                                                                    'alt': (image.translated.alt ?: fallbackImageTitle),
                                                                                                                    'title': (image.translated.title ?: fallbackImageTitle)
                                                                                                                },
                                                                                                                load: false,
                                                                                                                loadOriginalImage: true,
                                                                                                                autoColumnSizes: false
                                                                                                            } %}
                                                                                                        {% elseif image.getMediaType().getName() === 'VIDEO' %}
                                                                                                            {% set attributes = attributes|merge({ controls: true }) %}

                                                                                                            {% sw_include '@Storefront/storefront/utilities/video.html.twig' with {
                                                                                                                media: image,
                                                                                                                attributes: attributes
                                                                                                            } %}
                                                                                                        {% else %}
                                                                                                            {% set attributes = attributes|merge({
                                                                                                                class: attributes.class ~ ' js-image-zoom-element js-load-img',
                                                                                                                alt: (image.translated.alt ?: fallbackImageTitle)
                                                                                                            }) %}

                                                                                                            {% sw_thumbnails 'gallery-slider-image-thumbnails' with {
                                                                                                                media: image,
                                                                                                                attributes: attributes,
                                                                                                                load: false,
                                                                                                                loadOriginalImage: true,
                                                                                                                autoColumnSizes: false
                                                                                                            } %}
                                                                                                        {% endif %}
                                                                                                    {% endblock %}
                                                                                                {% endblock %}
                                                                                            </div>
                                                                                            {# @experimental stableVersion:v6.7.0 feature:SPATIAL_BASES #}
                                                                                            {% block element_image_gallery_inner_zoom_modal_slider_item_zoom_container_spatial %}
                                                                                                {% if image.isSpatialObject() %}
                                                                                                    <div class="spatial-canvas-spinner position-absolute top-50 start-50 translate-middle bg-white flex justify-content-center align-items-center" style="--bs-bg-opacity: .8;">
                                                                                                        <div class="spinner-border" role="status">
                                                                                                            <span class="visually-hidden">Loading...</span>
                                                                                                        </div>
                                                                                                    </div>
                                                                                                    <div class="gallery-slider-spatial-canvas-wrapper position-absolute start-0 end-0 top-0 bottom-0">
                                                                                                        <canvas
                                                                                                                data-spatial-zoom-gallery-slider-viewer
                                                                                                                data-spatial-model-url="{{ image.url }}"
                                                                                                                data-zoom-product-slider-position="{{ loop.index0 }}"
                                                                                                        ></canvas>
                                                                                                        <span
                                                                                                                class="spatial-canvas-note spatial-slider-movement-note position-absolute start-50 text-center badge mx-0 py-1 px-3 translate-middle-x"
                                                                                                                data-spatial-movement-note
                                                                                                                data-spatial-movement-note-touch-text="{{ 'component.cms.imageGallery.touchMove'|trans|striptags }}"
                                                                                                        >
                                                                                                        {{ 'component.cms.imageGallery.clickMove'|trans|striptags }}
                                                                                                    </span>
                                                                                                        {% if image.config.spatial.arReady %}
                                                                                                            <div class="ar-button button mb-2"
                                                                                                                 data-spatial-ar-viewer
                                                                                                                 data-spatial-ar-viewer-options='{ "spatialArId": "{{ image.id }}" }'
                                                                                                                 data-spatial-model-url="{{ image.url }}">
                                                                                                                {% sw_icon 'augmented' style {
                                                                                                                    'size': 'fluid'
                                                                                                                } %}
                                                                                                            </div>
                                                                                                            {% sw_include '@Storefront/storefront/utilities/ar-overlay.html.twig' %}
                                                                                                        {% endif %}
                                                                                                    </div>
                                                                                                {% endif %}
                                                                                            {% endblock %}
                                                                                        {% endblock %}
                                                                                    </div>
                                                                                {% endblock %}

Mit dem Code ab {% block element_image_gallery_inner_zoom_modal_slider_item %} wird der Alt-Text auch angezeigt, wenn der Kunde aufs Bild klickt und dieses groß angezeigt wird.

Dann noch in die product/card/box-standard.html.twig (sofern ihr diese einsetzt):

{% block component_product_box_image_link %}
                                <a href="{{ seoUrl('frontend.detail.page', { productId: id }) }}"
                                   title="{{ name }}"
                                   class="product-image-link is-{{ displayMode }}">
                                    {% block component_product_box_image_link_inner %}
                                        {% if cover.url and cover.isSpatialObject() == false %}
                                            {% set attributes = {
                                                class: 'product-image is-' ~ displayMode,
                                                title: (cover.translated.alt ?: name)
                                            } %}

                                            {% if cover.getMediaType().getName() === 'VIDEO' %}
                                                {% if config('core.listing.autoplayVideoInListing') %}
                                                    {% set attributes = attributes|merge({
                                                        autoplay: true,
                                                        loop: true
                                                    }) %}
                                                {% endif %}

                                                {% block component_product_box_video %}
                                                    {% sw_include '@Storefront/storefront/utilities/video.html.twig' with {
                                                        media: cover,
                                                        attributes: attributes
                                                    } %}
                                                {% endblock %}
                                            {% else %}
                                                {% set attributes = attributes|merge({
                                                    alt: (cover.translated.alt ?: name),
                                                    loading: 'lazy'
                                                }) %}

                                                {% if displayMode == 'cover' or displayMode == 'contain' %}
                                                    {% set attributes = attributes|merge({ 'data-object-fit': displayMode }) %}
                                                {% endif %}

                                                {% block component_product_box_image_thumbnail %}
                                                    {% sw_thumbnails 'product-image-thumbnails' with {
                                                        media: cover,
                                                        sizes: sizes,
                                                        attributes: attributes
                                                    } %}
                                                {% endblock %}
                                            {% endif %}
                                        {% else %}
                                            {% block component_product_box_image_placeholder %}
                                                <div class="product-image-placeholder">
                                                    {% sw_icon 'placeholder' style {
                                                        size: 'fluid'
                                                    } %}
                                                </div>
                                            {% endblock %}
                                        {% endif %}
                                    {% endblock %}
                                </a>
                            {% endblock %}

Das zeigt den Alt-Text bei Mouseover über Bilder von Produktempfehlungen/ähnliche Produkte und im Produkt-Listing. Hier würde nämlich auch normal der Bildername angezeigt.

Das passt so für mich, da ich vor Datenbankänderungen doch respekt habe und das so vermeiden kann.

Verbesserungsvorschläge und Ideen gerne willkommen.

Ich halte es für besser die Felder „korrekt“ zu nutzen, statt den Shop um den „Fehler“ herum zu bauen.

Also Title & Alt in die Custom Fields und dann gedreht zurück:

UPDATE
	media_translation
SET
	`custom_fields` = JSON_SET(COALESCE(`custom_fields`, '{}'), "$.alt", `alt`)
WHERE
	alt IS NOT NULL;

UPDATE
	media_translation
SET
	`custom_fields` = JSON_SET(COALESCE(`custom_fields`, '{}'), "$.title", `title`)
WHERE
	title IS NOT NULL;

UPDATE
	media_translation
SET
	alt = JSON_VALUE (custom_fields,
		"$.title");

UPDATE
	media_translation
SET
	title = JSON_VALUE (custom_fields,
		"$.alt");

**Optional:**
UPDATE
	media_translation
SET
	`custom_fields` = NULL;

Ich hab gerade mal ein neues Bild hochgeladen im Shop und das „Titel“ und „Alt-Text“ Feld sind dabei ja leer. Ich hatte das Missverständnis, dass das Titel-Feld immer den Bildnamen enthält, das ist aber wohl nur durch das Migrations-Tool so gesetzt. Schade, das dieses nicht das, was im Alt-Feld steht, in das Titel-Feld migriert…

Von daher hast du und @drakon vollkommen recht, der weg über die Datenbank wird der richtige sein.

Es müsste doch dann genügen, den Inhalt der Spalte „Alt“ in den von „Title“ zu kopieren und den Inhalt darin zu überschreiben? Ich brauche meinen Bildernamen mit Artikelnummer ja nur 1x, und der ist ja auch immer im „Name“ feld. Wie müsste der Befehl aussehen, wenn ich nur den Inhalt von „Alt“ in „Title“ kopieren und so dieses Feld überschreiben lasse?

UPDATE
	media_translation
SET
	title = alt;

Dabei wird „alt“ in „title“ gespeichert.
Ich hatte den etwas längeren Weg vorgeschlagen um evtl. Fehler auch rückgängig machen zu können.

Richtig, kannst die Bilder auch über die API hochladen inkl. Title bzw. Alt

Einen „richtigen“ und „falschen“ Weg gibt’s ja nicht… funktioniert ja so und so. :wink:

Das war auch absolut sinnvoll mit dem längeren Weg um Fehler rückgängig zu machen, danke dir!

Ich hatte mir zum Test heute eine Kopie der Datenbank angelegt (bin mit SQL nicht wirklich versiert oder bisher in Berührung gekommen…) und es vorhin probiert - es hat geklappt, ich habe es dann an der eigentlichen Datenbank durchgeführt, passt auch alles. Meine Änderungen am Template habe ich wieder rückgängig gemacht, brauche ich so ja nicht.

(Dabei ist mir aufgefallen, dass es Bilder ohne Alt-Text gibt, welche ganz sicher in SW5 einen hatten. Warum das Migrations-Tool die ab und zu wohl weglässt?)

Grundsätzlich gut, aber hier postet keiner etwas, dass deinen Shop zerstört. Könnte man sich hier nie wieder blicken lassen. :wink:

Das Tool ist so und so nicht die Wucht… :wink:
Vielleicht zu lang, oder irgendwelche Sonderzeichen… könnte man auch noch nachträglich „manuell“ machen sofern die Dateinamen oder irgendwas übereinstimmt.

:laughing: So meinte ich das aber gar nicht, da vertraue ich dir (und auch den anderen hier) natürlich - die Kopie der Datenbank hab ich für mich angelegt, damit ich als Laie vorher mal mit den SQL-Befehlen üben und schauen kann wo man das eingibt und wie/wo/was passiert.

Die fehlenden Bild-Titel /Alt-Text arbeite ich händisch nach, das sind nicht so extrem viele und es wird ja immer die Bildbezeichnung trotzdem angezeigt.

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