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 „Gefällt mir“
quebag
31. Januar 2018 um 10:03
5
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!?
Smaug
30. Januar 2019 um 13:00
7
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 „Gefällt mir“
quebag
30. Januar 2019 um 14:20
8
Super. Jedoch weiß ich jetzt nicht wie und wo ich deinen Code jetzt einbauen muss
quebag
4. Juli 2019 um 12:11
9
@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;
}
}
}
Dwza
9. September 2019 um 11:39
10
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 „Gefällt mir“
@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.
SieGeL
26. Januar 2020 um 10:28
12
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 „Gefällt mir“
Und wie bekommt man jetzt noch das src-set zu den Thumbnails statt einfach den Links zur Original-Datei?