Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 26. Januar 2012 20:32

mike-r
arbeitet mit CMS/ms
Registriert: 21. Dezember 2010
Beiträge: 898
Webseite

[GELÖST] Gallery: Probs mit if !empty($image->titlename.value)

Ich hätte mal wieder gern ein kleines Problem.

{if !empty($image->titlename.value)}{$image->titlename}{/if}

Wirkt sich nur auf Dateinamen mit einer Null am Anfang aus.

Also bei leerem Titel:
0023.jpg -> Dateiname wird nicht angezeigt
6234.jpg -> Dateiname wird angezeigt
Hallo.jpg -> Dateiname wird angezeigt

Brett vorm Kopf? Bug? Wie kann ich alternativ verhindern, dass bei leerem Titel der dateiname ausgegeben wird?

Edit: Argh!

{if !empty($image->title.value)}{$image->titlename}{/if}

tut was es soll.

Frage noch dazu: was macht mein erster Code, bzw. wo ist da mein Denkfehler?

Beitrag geändert von mike-r (26. Januar 2012 20:34)


Unablässige Tools für's Webdevelopement/ Fehlerfindung: CSS Validierungsservice, Bildschirmlineal, Firebug, Tidy, Deutsche CSS-Referenz

Offline

#2 26. Januar 2012 21:15

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: [GELÖST] Gallery: Probs mit if !empty($image->titlename.value)

{$image->titlename} ist kein Array sondern ein String (Zeichenkette). D.h. {$image->titlename.value} dürfte eigentlich garnicht funktionieren, weil man so nur auf Elemente eines Arrays zugreift. Aber bei schwach typisierte Sprachen wie PHP kommt man oft zu äußerst seltsamen Ergebnissen wink Abgesehen davon enthält {$image->titlename} entweder den Titel oder den Dateinamen. D.h. es ist nie leer.

Interessanterweise kann man bei PHP mit dem gleichen Syntax, mit dem man auf Elemente eines indizierten Arrays zugreift, auch auf die einzelnen Zeichen eines Strings zugreifen. Im PHP Handbuch steht sinngemäß drin, dass man sich einen String auch einfach als ein indiziertes Array mit einzelnen Zeichen vorstellen kann:

$var = 'FOO!';
echo $var[0]; # -> F
echo $var[1]; # -> O
echo $var[2]; # -> O
echo $var[3]; # -> !

{$image->titlename.value} bedeutet also im Prinzip (um beim obigen Beispiel zu bleiben)

Eigentlich müsste PHP hier eine Fehlermeldung ausgeben, da der Index 'value' nicht existiert. Scheinbar wird aber bei Smarty oder auch direkt in PHP eine Typenkonvertierung des Index vorgenommen, wenn man den Array-Syntax auf einen String anwendet. D.h. 'value' wird hier in eine Zahl umgewandelt. Das numerische Äquivalent eines Strings der keine Ziffern enthält, ist bei PHP immer Null. D.h. {$image->titlename.value} führt am Ende zu

Was wiederum dem ersten Zeichen des Titels/Dateinamens entsprechen würde.

Du prüfst also nur, ob das erste Zeichen von {$image->titlename} leer ist - was eigentlich auch nie vorkommen dürfte. Bei der PHP-Funktion empty() gilt aber eine Variable mit dem Wert Null ebenfalls als leer. Daher werden bei Deinem ersten Code nur solche Fälle als leer angesehen, deren Titel/Dateiname zufälligerweise mit einer Null beginnen.

empty() ist in solchen Fällen, in denen man prüfen will, ob eine Variable überhaupt irgendetwas enthält, die falsche Wahl. Sicherer wäre es in diesem Fall so zu vergleichen:

{if $image->title.value != ''}...{/if}

weil

{if !empty($image->title.value)}...{/if}

keine Titel anzeigen würde, die einfach nur die Ziffer 0 beinhalten.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#3 26. Januar 2012 21:37

mike-r
arbeitet mit CMS/ms
Registriert: 21. Dezember 2010
Beiträge: 898
Webseite

Re: [GELÖST] Gallery: Probs mit if !empty($image->titlename.value)

Ein Titel mit 0 (Problem hab ich testweise verifiziert und kann ich bestätigen) am Anfang wird mir sicher nicht unterkommen, hab jetzt trotzdem auf die "sichere" Variante umgestellt.
Danke für die ausführliche Erklärung!


Unablässige Tools für's Webdevelopement/ Fehlerfindung: CSS Validierungsservice, Bildschirmlineal, Firebug, Tidy, Deutsche CSS-Referenz

Offline