Attributbilder

man spart sich das html_entity_decode mit einem aufruf von $oAttribute->oxarttribute__oxvalue->getRawValue()

Hi zusammen,

vielen Dank für Eure Hinweise.

Die Variante mit true liefert immer noch den Attributwert im Klartext.

Verwende ich

$oJson=json_decode($oAttribute->oxattribute__oxvalue->getRawValue());

wird eine leere Seite ausgegeben.

Nachtrag: die Seite bleibt doch nicht weiß, aber


[{"image":"path/to/image.jpg","value":"normale Beschreibung (value ist default)"}, {"image":"path/to/image.jpg","value":"normale Beschreibung (value ist default)"}]

wird immer noch im Klartext ausgegeben.

Im Template steht übrigens zur Zeit folgendes:


              <td id="test_attrValue_[{$smarty.foreach.attribute.iteration}]">
              [{if $oAttr->json}]
              <img href="[{$oAttr->json->image}]" alt="[{$oAttr->json->value}]">
              [{else}][{ $oAttr->value }][{/if}]</td>

Vielen Dank und beste Grüße vom Chris

So, habs nun hinbekommen:

Das muss ins Modul:


<?php

class json4details extends json4details_parent{
    /**
    * change json-informations to stdObject for details template
    * sets (if exist) field with vector=value as std-oxid otherwise, the first value of json object
    * @author markus.bauer
    * @param void
    * @return array attributes
    */
    public function getAttributes(){
        if ( $this->_aAttributes === null ) {
            // all attributes this article has
            $aArtAttributes = $this->getProduct()->getAttributes();
            //making a new array for backward compatibility
            $this->_aAttributes = array();
            if ( count( $aArtAttributes ) ) {
                foreach ( $aArtAttributes as $sKey => $oAttribute ) {
                    $this->_aAttributes[$sKey] = new stdClass();
                    $this->_aAttributes[$sKey]->title = $oAttribute->oxattribute__oxtitle->value;
                    $oJson=json_decode($oAttribute->oxattribute__oxvalue->getRawValue());
                    
                    if(is_array($oJson)&&!$this->isAdmin()){
                        if(isset($oJson->value)){//setDefault
                            $this->_aAttributes[$sKey]->value=$oJson->value;
                        }else{
                            $this->_aAttributes[$sKey]->value=current($oJson);
                        }
                        $this->_aAttributes[$sKey]->json=$oJson;
                    }else{//oxid default
                        $this->_aAttributes[$sKey]->value = $oAttribute->oxattribute__oxvalue->value;
                    }
                }
            }
        }
        return $this->_aAttributes;
    }
} 

Und folgendes ins Template:


                  <td id="test_attrValue_[{$smarty.foreach.attribute.iteration}]">
                  [{if $oAttr->json}]
                    [{foreach from=$oAttr->json item=key}]
                      <img href="[{$oViewConf->getImageUrl()}]special/[{$key->image}]" alt="[{$key->value}]">
                    [{/foreach}]                  
                  [{else}][{ $oAttr->value }][{/if}]</td>

Vielen Dank für Eure Hilfe nochmals an dieser Stelle und nochn schönen Abend :slight_smile:

Chris

Hi zusammen,

wie lautet denn der Aufruf im Administrationsbereich für den Artikelvergleich?
Bei der Detailansich ist es ja details->json4details, nun brauche ich das Äquivalent
für den Artikelvergleich.

Vielen Dank und beste Grüße vom Chris

könnt ihr die Lösung nochmal zusammenfassend posten, also ich muss das modul registrieren, dann einen teil in das azure template schieben und den anderen ins backend + ein Modul, das die Funktionalität bereitstellt.

so etwas würde ich mir für die nächste 4.5.x ce Version wünschen…damit verschiedene Farben als 16x16 Icon unter oder am unteren Ende (neben Preis…auch wenn da nur 4 bis 5 icons passen) des Vater-Artikel Bild erscheint.

Hallo,

Eure beschriebene Lösung klingt sehr ansprechend und ich habe mich auch in der Implementierung versucht, jedoch scheitert es an zwei Stellen.

Zunächst einmal habe ich folgendes gemacht (vielleicht auch interessant für mobilemojo, da sich bisher niemand darauf gemeldet hat).

Modul: modules/json4details.php hochgeladen und im Admin registriert "details => json4details

Inhalt der json4details.php


<?
class json4details extends json4details_parent{
    /**
    * change json-informations to stdObject for details template
    * sets (if exist) field with vector=value as std-oxid otherwise, the first value of json object
    * @author markus.bauer
    * @param void
    * @return array attributes
    */
    public function getAttributes(){
        if ( $this->_aAttributes === null ) {
            // all attributes this article has
            $aArtAttributes = $this->getProduct()->getAttributes();
            //making a new array for backward compatibility
            $this->_aAttributes = array();
            if ( count( $aArtAttributes ) ) {
                foreach ( $aArtAttributes as $sKey => $oAttribute ) {
                    $this->_aAttributes[$sKey] = new stdClass();
                    $this->_aAttributes[$sKey]->title = $oAttribute->oxattribute__oxtitle->value;
                    $oJson=json_decode($oAttribute->oxattribute__oxvalue->getRawValue());
                    if(is_array($oJson)&&!$this->isAdmin()){
                        if(isset($oJson->value)){//setDefault
                            $this->_aAttributes[$sKey]->value=$oJson->value;
                        }else{
                            $this->_aAttributes[$sKey]->value=current($oJson);
                        }
                        $this->_aAttributes[$sKey]->json=$oJson;
                    }else{//oxid default
                        $this->_aAttributes[$sKey]->value = $oAttribute->oxattribute__oxvalue->value;
                    }
                }
            }
        }
        return $this->_aAttributes;
    }
}

Danach hab ich im Admin ein Attribut, z.B. Qualität angelegt und anschließend einem Artikel zugewiesen. Als Wert wurde hier folgendes eingetragen:

{“image”:“icon/quality/quality1.jpg”,“value”:“Qualitätslogo”}

Hieraus wird beim Abspeichern im Admin anschließend folgendes:

{“image”:“icon/quality/quality1.jpg”,“value”:“Qualitätslogo”}

Das scheint mir ein Fehler zu sein oder ist das so korrekt? War das bei Dir auch so coarsy?

Das Template, welches hier zu Beginn (bevor Oxid 4.5) bearbeitet werden musste hieß “details.tpl”, ab Version 4.5 (meines Wissen) muss nun das Template “page/details/inc/attributes.tpl” angepasst werden.


<table class="attributes">
    [{foreach from=$oView->getAttributes() item=oAttr name=attribute}]
    <tr>
        <th id="attrTitle_[{$smarty.foreach.attribute.iteration}]"><strong>[{$oAttr->title}]</strong></th>
        <td id="attrValue_[{$smarty.foreach.attribute.iteration}]">
			[{if $oAttr->json}]
				[{foreach from=$oAttr->json item=key}]
					<img href="[{$oViewConf->getImageUrl()}][{$key->image}]" alt="[{$key->value}]">
				[{/foreach}]
			[{else}]
				[{$oAttr->value}]
			[{/if}]
		</td>
    </tr>
    [{/foreach}]
</table>

Die Ausgabe auf der Produktdetailseite im Tab Spezifikation sieht dann jedoch so aus:

Qualität {“image”:“icon/quality/quality1.jpg”,“value”:“Qualitätslogo”}

d.h. hier wird in der Schleife die Else-Abfrage ausgeführt. Weiß jemand Rat warum dies so ist?

Bin für jedes Feedback dankbar!

Grüße,

Marcel

Hier zur Ergänzung, JSON braucht man an dieser Stelle wirklich nicht, es genügt, die Bilder direkt als HTML einzutragen, im Frontend muss das allerdings dann so erweitert werden:


[{$oAttr->value|html_entity_decode}] 

[QUOTE=coarsy;71908]Hier zur Ergänzung, JSON braucht man an dieser Stelle wirklich nicht, es genügt, die Bilder direkt als HTML einzutragen, im Frontend muss das allerdings dann so erweitert werden:


[{$oAttr->value|html_entity_decode}] 

[/QUOTE]

Hi Coarsy,

wo muss ich den Code für´s Frontend einfügen?

Ich müsste für´n Kumpel Für bestimmte Artikel ein Bild als Attribut einfügen, welches den Zustand der Ware darstellt. Dies soll nicht mit den Varianten geschehen.

Hallo Jeannie,

für so einfache Sachen brauchts eigentlich kein Modul oder die Eingabe eines Bildes als Attributwert. Du kannst auf die Eingaben ja auch erst im Template reagieren.

Der Zustand eines Produktes ist nunmal z.B. “Top” und nicht “bilder/top.jpg”. Du gibts also den echten Wert beim Attribut an und im Template sorgst Du für die Ausgabe.

[{if $oAttr->value == 'Top'}]
    <img src="bilder/top.jpg" alt="Zustand Top">
[{/if}] 

adios, Stefan

[QUOTE=stefan2;95539]Hallo Jeannie,

für so einfache Sachen brauchts eigentlich kein Modul oder die Eingabe eines Bildes als Attributwert. Du kannst auf die Eingaben ja auch erst im Template reagieren.

Der Zustand eines Produktes ist nunmal z.B. “Top” und nicht “bilder/top.jpg”. Du gibts also den echten Wert beim Attribut an und im Template sorgst Du für die Ausgabe.

[{if $oAttr->value == 'Top'}]
    <img src="bilder/top.jpg" alt="Zustand Top">
[{/if}] 

adios, Stefan[/QUOTE]

Hi Stefan,

lieben dank für die Antwort, aber wo im Template muss ich den Code eingeben?
Auch hat er 4 verschiedene Zustands"Klassen" mit 4 verschiedene Bildchen, der Groschen ist noch nicht gefallen, kannst du weiter helfen?

Hi Jeannie,

Das wird natürlich dort eingebaut wo die Attribute erscheinen sollen. Im Azure gibt es dafür das Template /page/details/inc/attributes.tpl

<table class="attributes">
    [{foreach from=$oView->getAttributes() item=oAttr name=attribute}]
    <tr>
        <th id="attrTitle_[{$smarty.foreach.attribute.iteration}]"><strong>[{$oAttr->title}]</strong></th>
        <td id="attrValue_[{$smarty.foreach.attribute.iteration}]">[{$oAttr->value}]</td>
    </tr>
    [{/foreach}]
</table>

Hier könntest Du das Stück in der Form ändern

<table class="attributes">
    [{foreach from=$oView->getAttributes() item=oAttr name=attribute}]
    <tr>
        <th id="attrTitle_[{$smarty.foreach.attribute.iteration}]"><strong>[{$oAttr->title}]</strong></th>
        <td id="attrValue_[{$smarty.foreach.attribute.iteration}]">
[{if $oAttr->value == 'Top'}]
    <img src="bilder/top.jpg" alt="Zustand Top">
[{elseif $oAttr->value == 'Mies'}]
    <img src="bilder/mies.jpg" alt="Mies">
[{elseif $oAttr->value == 'total Mies'}]
    <img src="bilder/ganz_mies.jpg" alt="Total mies">
[{elseif $oAttr->value == 'super  Top'}]
    <img src="bilder/ganz_mies.jpg" alt="Super Top">
[{else}]
    [{$oAttr->value}]
[{/if}] 

</td>
    </tr>
    [{/foreach}]
</table>

hdh, Stefan

[QUOTE=stefan2;95542]Hi Jeannie,

Das wird natürlich dort eingebaut wo die Attribute erscheinen sollen. Im Azure gibt es dafür das Template /page/details/inc/attributes.tpl

<table class="attributes">
    [{foreach from=$oView->getAttributes() item=oAttr name=attribute}]
    <tr>
        <th id="attrTitle_[{$smarty.foreach.attribute.iteration}]"><strong>[{$oAttr->title}]</strong></th>
        <td id="attrValue_[{$smarty.foreach.attribute.iteration}]">[{$oAttr->value}]</td>
    </tr>
    [{/foreach}]
</table>

Hier könntest Du das Stück in der Form ändern

<table class="attributes">
    [{foreach from=$oView->getAttributes() item=oAttr name=attribute}]
    <tr>
        <th id="attrTitle_[{$smarty.foreach.attribute.iteration}]"><strong>[{$oAttr->title}]</strong></th>
        <td id="attrValue_[{$smarty.foreach.attribute.iteration}]">
[{if $oAttr->value == 'Top'}]
    <img src="bilder/top.jpg" alt="Zustand Top">
[{elseif $oAttr->value == 'Mies'}]
    <img src="bilder/mies.jpg" alt="Mies">
[{elseif $oAttr->value == 'total Mies'}]
    <img src="bilder/ganz_mies.jpg" alt="Total mies">
[{elseif $oAttr->value == 'super  Top'}]
    <img src="bilder/ganz_mies.jpg" alt="Super Top">
[{else}]
[{$oAttr->value}]
[{/if}] 

</td>
    </tr>
    [{/foreach}]
</table>

hdh, Stefan[/QUOTE]

Ok, cool, nun hat es klick gemacht, teste ich gleich …
nochmals vielen Dank für deine Zeit

Bitte. Dann mal viel Erfolg

hm… hat das Basic diese Datei nicht?

Nee, da steht der Teil direkt im details.tpl such einfach mal nach “attributes” in der Datei.

da ist das direkt in der details.tpl eingebaut

[{ if $oView->getAttributes() }]
<strong id="test_specsHeader" class="boxhead">[{ oxmultilang ident="DETAILS_SPECIFICATION" }]</strong>
<div class="box">
    <table width="100%" class="attributes">
      <colgroup><col width="50%" span="2"></colgroup>
      [{foreach from=$oView->getAttributes() item=oAttr name=attribute}]
          <tr [{if $smarty.foreach.attribute.last}]class="last"[{/if}]>
            <td id="test_attrTitle_[{$smarty.foreach.attribute.iteration}]"><b>[{ $oAttr->title }]</b></td>
            <td id="test_attrValue_[{$smarty.foreach.attribute.iteration}]">[{ $oAttr->value }]</td>
          </tr>
      [{/foreach}]
    </table>
</div>
[{/if}]

super, hat 1 a funktionniert, ihr seid spitze …vielen Dank

Falls mal jemand wieder dieses Thema suchen sollte…

Ich wollte den Inhalt des Attributs möglichst einfach bearbeitbar machen und habe somit ein cms snippet angelegt. Statt der automatisch generierten ID habe ich dann einen klingenderen Namen vergeben beim snippet.

Im Attributeditor dann einfach den iden-key eingeben [{oxcontent ident=dein_cms_key}] und speichern. Normalerweise würde das jetzt als plain-text im template auftauchen.

Aber auch das ist einfach lösbar. Einfach im template (details/inc/attributes.tpl) folgendes beim value eintragen:

[{eval var=$oAttr->value}]

schon wird in der Ausgabe der Inhalt der Variable evaluiert. Ist ein smarty-tag enthalten wird es geparsed. So können im cms snippet auch einfach Bilder und sonstige html tags gesetzt werden.