Freitextfeld Media

Hi,

ich möchte im Frontend ein zusätzliches Bild ausgeben, dazu habe ich ein Freitextfeld vom Type Media angelegt. Jedoch wird mir über die Variable 

$sArticle.attr5

nur die ID des Bildes ausgegeben, gibt es eine Möglichkeit die Source von diesem Bild zu erhalten?

Einfach die Smarty-Debug-Konsole im Template aufrufen und die entsprechende Variable raussuchen. Wird sich hier sicher um ein Array handeln.

Aufruf erfolgt durch

{debug}

direkt im Template.

Das hab ich bereits gemacht, so wie es aussieht wird im Frontend nur die ID ausgegeben. Um den Pfad zu bekommen wird man wohl ein Plugin ähnlich wie dieses GitHub - Kevinschmid86/KSchmidSupplierImage einsetzen müssen.

erstell dir einfach ein smarty modifier mit folgendem Inhalt

deinTemplate_private\smarty\modifier.mediaurl.php

Models()->getRepository('Shopware\Models\Media\Media')->findOneBy(['id' => $id]);
        if ($media) {
            $path = $media->getPath();

            $mediaUrl = Shopware()->Container()->get('shopware_media.media_service')->getUrl($path);

            return $mediaUrl;
        }
    }

}

Aufruf im Template dann mit

{$sArticle.attr5|mediaurl}

 

8 Likes

Bei mir funktioniert der Modifier nur bedingt.

Habe in der Freitextfeld-Verwaltung folgendes Attribut konfiguriert.

attr11
Spaltentyp: Merhfachauswahl
Entity: Media - Shopware\Models\Media\Media

Im Backend sowie im Frontend werden die Werte jedoch wie folgt ausgegeben: 

|107|8|

Somit habe ich zwei Probleme:

a) die „|“ müssen weg
b) bei mehreren Bildern scheitere ich an der Ausgabe der Einzelbilder im frontend

themes/Frontend/mytheme/frontend/detail/index.tpl

{* Product attribute 11 *}
{block name='frontend_detail_data_attributes_attr11'}
  {if $sArticle.attr11}
    
      
    
   {/if}
{/block}

 

Bist Du hier weiter gekommen? Habe ein ähnliches Problem bei der Ausgabe von Media Pfaden in emails. Das Media Freitextfeld lässt sich so gar nicht sinnvoll nutzen, wozu Shopware sich das ausgedacht hat!?

 

Juhu endlich weis ich mal was! Giving back… und sooo…

 

nutze den Smarty modifier „explode“ damit wandelst du den String anhand der „|“ trennzeichen in ein array um:

{assign var=„arraybilderid“ value=";"|explode:$string}

foreach schleifen durch das array und du hast sie einzeln.

 

tada.

 

1 Like

Super. Jedoch weiß ich jetzt nicht wie und wo ich deinen Code jetzt einbauen muss  Undecided

@Smaug schrieb:

Juhu endlich weis ich mal was! Giving back… und sooo…

 

nutze den Smarty modifier „explode“ damit wandelst du den String anhand der „|“ trennzeichen in ein array um:

{assign var=„arraybilderid“ value=";"|explode:$string}

foreach schleifen durch das array und du hast sie einzeln.

 

tada.

 

Aber wie baue ich deine Anweisung in meine modifier.mediaurl.php ein

 

<?php
function smarty\_modifier\_mediaurl($value, $format = array()) {     if (is\_numeric($value)) {         $id = (int)$value;         $media = Shopware()-\>Models()-\>getRepository('Shopware\Models\Media\Media')-\>findOneBy(['id' =\> $id]);         if ($media) {             $path = $media-\>getPath();             $mediaUrl = Shopware()-\>Container()-\>get('shopware\_media.media\_service')-\>getUrl($path);             return $mediaUrl;         }     } }  

Nochmal zusammen gefasst inkl. Behebung der Array-Problematik bzw. der |1|2|3| strings.

Template 

{* Product attribute 11 *}

{block name='frontend_detail_data_attributes_attr11'} 
    {if $sArticle.attr11}

        {assign var="mediaUrls" value=$sArticle.attr11|mediaurl}

        {foreach from=$mediaUrls item=$mediaUrl}
            
        {/foreach}

    {/if}
{/block}

modifier.mediaurl.php

Models()->getRepository('Shopware\Models\Media\Media')->findOneBy(['id' => $id]);
        if ($media) {
            $path = $media->getPath();
            $mediaUrl = Shopware()->Container()->get('shopware_media.media_service')->getUrl($path);
            return $mediaUrl;
        }
    }
    return null;
}

 

1 Like

 

@Dwza schrieb:

Nochmal zusammen gefasst inkl. Behebung der Array-Problematik bzw. der |1|2|3| strings.

Template 

{* Product attribute 11 *}

{block name=‚frontend_detail_data_attributes_attr11‘}
{if $sArticle.attr11}

{assign var=„mediaUrls“ value=$sArticle.attr11|mediaurl}

{foreach from=$mediaUrls item=$mediaUrl}

{/foreach}

{/if}
{/block}

modifier.mediaurl.php

Models()->getRepository(‚Shopware\Models\Media\Media‘)->findOneBy([‚id‘ => $id]);
if ($media) {
$path = $media->getPath();
$mediaUrl = Shopware()->Container()->get(‚shopware_media.media_service‘)->getUrl($path);
return $mediaUrl;
}
}
return null;
}

 

Der Code ist wunderbar, vielen Dank dafür!
irgendwo scheint da aber noch ein Fehler drin zu sein.
ausgegeben wir nur ohne URL.

der Code von medienagenturmadco hingegen funktioniert einwandfrei bei Einzelbildern.

Falls es noch jemanden interessiert, hier die korrigierten Varianten für das Bilderausgabe Problem:

Template Ausgabe:

 {\* Product attribute 11 \*} {block name='frontend\_detail\_data\_attributes\_attr11'} {if $sArticle.attr11} {assign var="mediaUrls" value=$sArticle.attr11|mediaurl} {foreach from=$mediaUrls item=mediaUrl} ![]({$mediaUrl}) {/foreach} {/if} {/block} 

Hier war der Fehler, das in der foreach Anweisung die item Angabe falsch war, es muss lauten:

item=mediaUrl

anstatt

item=$mediaUrl

 

Bei dem modifier habe ich die Aufrufe für die

 getMediaUrlById()

Funktion angepasst, damit lief das dann bei mir problemlos:

 

<?php function smarty_modifier_mediaurl($value, $format = array())
  {
  $mediaUrls = [];
  $seperator = "|";
  $str = trim($value, $seperator);
  if(is_numeric($str)) {
    $url = getMediaUrlById($str);
    if($url !== null)
    {
      $mediaUrls[] = $url;
    }
  }else if(strpos($str, $seperator)) {
    $ids = explode($seperator, $str);
    foreach($ids as $id){
      $url = getMediaUrlById($id);
      if($url !== null) {
        $mediaUrls[] = $url;
      }
    }
  }
  return $mediaUrls;
}

function getMediaUrlById($value) {
  if (is_numeric($value)) {
    $id = (int)$value;
    $media = Shopware()->Models()-\>getRepository('Shopware\Models\Media\Media')-\>findOneBy(['id' =\> $id]); if ($media) { $path = $media-\>getPath(); return Shopware()-\>Container()-\>get('shopware\_media.media\_service')-\>getUrl($path); } } return null; } 

 

 

4 Likes

@SieGeL schrieb:

 

GROSSARTIG!!! Danke!!!  Smile

Und wie bekommt man jetzt noch das src-set zu den Thumbnails statt einfach den Links zur Original-Datei?