2016-11-20 1 views
0

Ich habe DCE für benutzerdefinierte Inhaltselemente installiert.Einzelne Datei in benutzerdefiniertem Inhaltselement mit DCE

Ich möchte einen ersten div-Tag bedingt gesetzt einschließlich des Dateinamens. Dies sollte es tun, aber es nicht - warum?

<f:if condition="{f:count(subject: {dce:fal(field:'bgImage', contentObject:contentObject)})}==1"> 
     <f:then> 

     <f:for each="{dce:fal(field:'image', contentObject:contentObject)}" as="fileReference" iteration="iterator"> 
      <f:if condition="{iterator.isFirst}"> 
       <div class="element slide vertical-center picture{f:if(condition: '{field.isWhite} == 1', then: ' white')}" img-fill="{f:uri.image(src:'{fileReference.uid}',treatIdAsReference:'1')}" selectable> 
      </f:if> 
     </f:for> 

    </f:then> 
    <f:else> 

     <div class="element slide vertical-center{f:if(condition: '{field.isWhite} == 1', then: ' white')}" selectable> 

    </f:else> 
    </f:if> 

Was ich brauche:

I definiert eine FAL Eigenschaft in DCE und wenn eine Datei festgelegt wird, sollte die 'div'

<div class="element slide vertical-center picture" img-fill="FILEPATH" selectable> 

sein, wenn nicht sollte es sein

<div class="element slide vertical-center" selectable> 

Ich habe keine bessere Lösung als diese Struktur gefunden:

<f:for each="{dce:fal(field:'image', contentObject:contentObject)}" as="fileReference" iteration="iterator"> 
    <f:if condition="{iterator.isFirst}"> 
     <!-- render image by fileReference --> 
    </f:if> 
</f:for> 

Ich fand schon die Inline-Notation

{f:if(condition:'{filepath} != EMTPY',then:' picture')} 

Aber wie kann ich überprüfen, für LEER in Flüssigkeit?

{f:if(condition:'{filepath}',then:' picture')} 

Als ich richtig Urs in den Kommentaren verstand.

Was vermisse ich?

+0

Natürlich gibt es einen Weg, es zu tun. Haben Sie von der magischen Funktion f: debug und deren Möglichkeiten gehört, Ihnen zu zeigen, auf welche Variablen Sie in Ihrem Objekt Zugriff haben, außer auf uid, wenn sich Ihre Installation im Debug-Modus befindet? –

+0

Natürlich, wie gesagt - ich habe das Filereferenz-Objekt gefunden. Und nun ja, da sind die gewünschten Eigenschaften, aber wie bekommt man sie in diese Umgebung? Inside 'f: for {... ganze Ansicht mit Dateireferenz erstellen ...}'? Nein, was, wenn kein Bild hochgeladen wurde? Zuerst 'f: for {... variable = filereference der ersten Datei ...}' dann Variable? Nein, f: Alias ​​nur für Strings und innerhalb von f: Alias-Umgebung. Also, was würdest du tun? –

+0

Ein paar Tipps: AFAIK, '{f: if (Bedingung: '{Dateipfad', dann: 'Bild')}' bedeutet bereits "wenn nicht leer". Wenn Sie auf das erste Element eines Arrays zugreifen wollen, ist '{files.0}' oft ausreichend.Und nicht zuletzt: DCE ist eine coole Lösung, aber wenn Sie nicht damit zufrieden sind, schauen Sie sich auch ext: mask an (es ist was ich benutze). – Urs

Antwort

0

Ich fand eine "Lösung" auf meinem eigenen:

<f:for each="{dce:fal(field:'bgImage', contentObject:contentObject)}" as="fileReference" iteration="iterator"> 

    <f:if condition="{iterator.isFirst}"> 

     <div class="element slide vertical-center picture{f:if(condition: '{field.isWhite} == 1', then: ' white')}" img-fill-src="/fileadmin{fileReference.originalFile.identifier}"> 

    </f:if> 

    </f:for> 

    <f:if condition="<f:count>{dce:fal(field:'bgImage', contentObject:contentObject)}</f:count> < 1"> 

    <div class="element slide vertical-center{f:if(condition: '{field.isWhite} == 1', then: ' white')}"> 

    </f:if> 

Was für ein Durcheinander. Vergleichen Sie an ein PHP-Ansatz:

<? if (count($image_references) == 1): ?> 

    <div class="element slide vertical-center picture" img-fill-src="/fileadmin<? echo $file_references[0].originalFile.identifier; ?>"> 

<? else: ?> 

    <div class="element slide vertical-center"> 

<? endif; ?> 

</div> 

Und mit dieser Flüssigkeit Zeug Sie extreme Overhead erzeugen, weil schließlich Sie einen Parser müssen, dass das Fluid Zeug analysiert. Dieser Parser ist wieder in PHP geschrieben und muss durchgängig zum Frontend ausgeführt werden. Das bedeutet, dass alles zwischengespeichert werden muss. Aber Caching ist nicht gut. Der Code ist einfacher. Wenn Sie flüssig lernen, können Sie es anderswo anderswo nicht anwenden.

Was für eine schlechte Idee ist dieses "Fluid" -System!

+1

Dies ist nicht der richtige Ort für eine Diskussion über die Fluid Templating Engine. – Urs

0

So könnten Sie so etwas wie dies versuchen (ich vermute):

<div class="..." img-fill="<f:if condition="{dce:fal(field:'image', contentObject:contentObject)}"> 
     <f:image image="{dce:fal(field:'image', contentObject:contentObject).0}" /> 
    </f:if> 
    </f:for>"> 
... further content ... 
</div> 
+0

Vielen Dank , aber das funktioniert nicht und konnte nicht: '{dce: fal (field:' image ', contentObject: contentObject)}' ist das Array von fileReferences. Ergo: 'files', wie du es hier benutzt hast, werden kein Array sein von fileReferences mehr, aber eine fileReference selbst. –

+0

Ah ja, richtig, tut mir leid! Ich habe den Code falsch gelesen. Ich habe die Antwort bearbeitet; das habe ich gemeint, obwohl ich nicht sicher bin, ob die Syntax um .0 richtig ist. Aber 'dce: fal ....' sieht so aus, als wäre es ein Array, also greife einfach auf den ersten Punkt zu: – Urs

+0

Leider nicht: ' {dce: fal (field: 'bgI mage ', contentObject: contentObject) .0} 'gibt eine Zeichenfolge zurück (was natürlich bedeutet, dass der fluid-parser den Ausdruck nicht auflösen kann). ' {dce: fal (Feld: 'bgImage', contentObject: contentObject)}' gibt immer noch das fileReference-Array zurück. –

0

versuchen so etwas wie dieses, es Arbeit für mich.

<f:for each="{dce:fal(field:'fal', contentObject:contentObject)}" as="fileReference" iteration="iterator"> 
    <div class="element slide vertical-center {f:if(condition:'{fileReference.uid}',then:' picture')}"> 
      <f:image src="{fileReference.uid}" alt="" treatIdAsReference="1" /> 
    </div> 
</f:for> 
+0

Leider nicht. Es würde mindestens einmal durchlaufen, wenn vom Benutzer kein Bild erstellt wurde. aber danke. Ich habe es gelöst. –

Verwandte Themen