Zum Inhalt springen

Duplikate <f:for each… ViewHelper

Erstellt am 2. Oktober 2012 · 10 Antworten · letzte Antwort am 22. Oktober 2012

Tags: Fluid, ViewHelper, Frage

raphdurrer ·

Hallo Zusammen,

Ich bin auf der Suche nach einer Möglichkeit dem «for Viewhelper» beizubringen das er gleiche Titel nur einmal ausspucken soll.

Beipiel:

<f:for each="{relateds}" as="related">
 {title}
</f:for>

Nu habe ich folgendes Problem wenn ein Artikel zwei verwandte Artikel hat und beide zum Beispiel mit «Print» getagt wurden.

Wird natürlich wie oben Beschrieben:

Print
Print

ausgegeben.

Gibt es eine Möglichkeit eine Abfrage «f:if Viewhelper» die sagt wenn der Titel schon vorhanden dann gib ihn nur einmal aus.

Danke vielmal für alle Denk anstösse, Hinweise und alles.

Viele Grüsse
Raphi

Avalarion ·

Moin Rapha,

Schreib deinen eigenen ViewHelper, erbe von dem For - ViewHelper und schau dir an wie der das macht. Und dann speicher dir einfach, was du schon hattest.

Gruß,

Bastian

raphdurrer schrieb

Hallo Zusammen,

Ich bin auf der Suche nach einer Möglichkeit dem «for Viewhelper» beizubringen das er gleiche Titel nur einmal ausspucken soll.

Beipiel:

<f:for each="{relateds}" as="related">
 {title}
</f:for>

Nu habe ich folgendes Problem wenn ein Artikel zwei verwandte Artikel hat und beide zum Beispiel mit «Print» getagt wurden.

Wird natürlich wie oben Beschrieben:

Print
Print

ausgegeben.

Gibt es eine Möglichkeit eine Abfrage «f:if Viewhelper» die sagt wenn der Titel schon vorhanden dann gib ihn nur einmal aus.

Danke vielmal für alle Denk anstösse, Hinweise und alles.

Viele Grüsse
Raphi

raphdurrer ·

Hallo Zusammen,

Danke vielmal für die Hilfe. Sorry für die Späte Antwort ich durfte noch in die Ferien.

Da ich noch nie einen eigenen Viewhelper geschrieben hab wäre es super wenn ich hier einen kurzen Anhaltspunkt bekäme. Link oder sowas wäre Super. :o
Mit der Filterung der Properties verhält es sich gleich. Könnte ich das direkt im Template machen? Wie müsste das ungefähr aussehen.

Danke für euer «auf die Sprünge» helfen!

Grüsse

Avalarion ·

Moin Rapha,

Warum das Rad neu erfinden? Schau dir mal diesen Artikel an, den fand ich ganz gut, als ich meinen ersten geschrieben habe. Wenn Probleme sind hier einfach posten oder mich mal eben anrufen oder in Skype anschreiben.

http://t3seo.de/eigene-fluid-viewhelper-schreiben-i/

Die Filterung, die Alex vorschlug, machst du in deinem Controller mit einem einfachen durch iterieren durch deine Objekte und überprüfst da. Quasi "einfaches" PHP.

Wünsche dir nen schönen Abend,

Bastian

raphdurrer ·

Hi Bastian,

Ich habs doch Tatsächlich fertig gebracht einen ViewHelper zu machen der funktioniert. 😃
Danke für den super Link.

Der Viewhelper funktioniert soweit auch super und nun habe ich versucht via:

return implode('<br>',array_unique(explode(',', $string)));

die Duplikate aus dem String zu entfernen.

Wenn ich im Template unter:

<n:duplicates string="Erscheinungbild, Print, Onlinekommunikation, Onlinekommunikation," />

funktioniert es. Wenn ich jedoch:

<n:reverse string="{tag.title}," />

verwende. Funktioniert es nicht mehr obwohl der String selber identisch aussieht wie wenn ich es fix rein schreibe.

Könnte das damit zusammen hängen das

<f:for each="{related.tags}" as="tag">
<n:reverse string="{tag.title}," />
</f:for>

in einer «for each» schlaufe liegt? Noch eine Idee dazu?
Danke nochmal für das coole Tutorial.

Grüsse, Raphi

raphdurrer ·

Hi Bastian,

Wenn ich im ViewHelper selber einen direkten string

return($string);

ohne das unique_array mache. Bekomme ich folgende Ausgabe auf Seite:

Erscheinungbild, Print, Onlinekommunikation, Onlinekommunikation,

und das wäre ja eigentlich auch super so. Nur funktioniert das unique_array nicht.

Mein viewHelper Code:

public function render($string) {
  return implode('<br>',array_unique(explode(',', $string)));  
}

Template Code:

<f:for each="{newsItem.relatedSorted}" as="related">
	<f:for each="{related.tags}" as="tag">
		<n:noduplicates string="{tag.title}," />
	</f:for>
</f:for>

Danke und Viele Grüsse
raph

Avalarion ·

Holla Muchacho,

<?php
$var = array('1','2','1');
$var2 = array_unique($var);
var_dump($var, $var2);

$string = "Hallo,Thomas,Hallo,Test";
$array1 = explode(',', $string);
$array2 = array_unique($array1);

var_dump($string, $array1, $array2);
echo implode(',', $array2);
echo PHP_EOL;
echo implode('<br>',array_unique(explode(',', $string)));
echo PHP_EOL;

Grade mal in der Konsole ausgeführt, bei mir klappt das. Schreib mal nen paar Testausgaben mit var_dump mit rein!

raphdurrer ·

Hey Bastian,

Danke für den Tip! Jetzt hab ich herausgefunden, dass das gar nicht funktionieren kann! #angry# :o

Meine Eingabe vom Template ist ja die for each schleife:

<f:for each="{newsItem.relatedSorted}" as="related">
	<f:for each="{related.tags}" as="tag">
		<n:noduplicates string="{tag.title}," />
	</f:for>
</f:for>

Da das «relatedSorted» sucht quasi zu jedem Artikel die Tag's von verwandten Artikeln. D.h.

echo ($string)

gibt folgende Ausgabe:

App, App, App, App, Erscheinungsbild, Print, Onlinekommunikation, Onlinekommunikation, Erscheinungsbild, Onlinekommunikation, Onlinekommunikation, …

Alle Tag's zusammen von jeglichem Artikel mit verwandten Artikeln die getagt wurden.

var_dump($string)

gibt dem zu folge:

string(4) "App," string(4) "App," string(4) "App," string(4) "App," string(17) "Erscheinungsbild," string(6) "Print," string(20) "Onlinekommunikation," string(20) "Onlinekommunikation," string(17) "Erscheinungsbild," string(20) "Onlinekommunikation," string(20) "Onlinekommunikation," string(6) "Print," string(17) "Erscheinungsbild," string(6) "Print," …
return $string

wird es ja wieder zurückgegeben und quasi pro Artikel gesplitet:

Artikel 1: App, 
Artikel 2: App, 
Artikel 3: App, App (zwei verwandte Artikel mit App als Tag), 
Artikel 4: Erscheinungsbild, Print, Onlinekommunikation, Onlinekommunikation (Zwei verwandte Artikel mit Onlinekommunikation als Tag)
…

Siehst du das auch, dass es so nicht funktionieren kann? Oder hab ich mich da zu fest verhackt…

Avalarion ·

Das KANN durchaus so funktionieren, allerdings musst du ein globales Array haben, dass du zum Filtern benutzt. Ich gebe zu, dass das nicht ganz trivial ist, grade da das array ja auch wieder zurück gesetzt werden musst, wenn du das nächste mal den ViewHelper verwendest..