Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung - XPages => Thema gestartet von: eknori am 14.09.10 - 13:48:17

Titel: Xpages - Text innerhalb eines Repeat Control in Einzelwerte zerlegen
Beitrag von: eknori am 14.09.10 - 13:48:17
Ich habe ein RepeatControl, das mir Werte aus einem Dokument darstellt.

Unter anderem wird auch der Inhalt des Items tags dargestellt

Tags: tag1, tag2, tag3

Code
               <xp:panel
                            style="font-size:7pt;color:rgb(128,128,128);margin-bottom:5.0px">
                            <xp:text escape="true" id="tagLabel" value="Tags: " />
                            <xp:text escape="true" id="tagList" value="#{RowData.tags}" />
                        </xp:panel>

Wie zerlege ich den String aus #{RowData.tags} in seine Einzelwerte.

Ziel ist es, die Einzelwerte mit einem Link zu versehen. Klickt man diesen an werden alle Einträge mit diesem Tag dargestellt.
Ich verzettel mich hier gerade mit mehreren verschachtelten repeat controls. Muss irgendwie einfacher gehen.  ( split in Javascript evtl ?)

Titel: Re: Xpages - Text innerhalb eines Repeat Control in Einzelwerte zerlegen
Beitrag von: atbits am 14.09.10 - 14:07:52
Hallo Ulrich, versuche mal etwas in der Art.
Ist nur Sample-Code (ungetestet)

Code
	<xp:repeat id="repeatTagCloud" var="tagArray"
		value="#{javascript:applicationScope.get(compositeData.id).getRepeatValue();}">
		<xp:panel style="font-size:7pt;color:rgb(128,128,128);margin-bottom:5.0px">
			<xp:text escape="true" id="tagLabel" value="Tags: " />
			<xp:text escape="true" id="tagList">
				<xp:this.value><![CDATA[#{javascript:@Explode(RowData.tags, ",");}]]></xp:this.value>
			</xp:text>
		</xp:panel>
	</xp:repeat>

nochmal erweitert:

Code
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
	<xp:repeat id="repeatTagCloud" var="tagArray"
		value="#{javascript:applicationScope.get(compositeData.id).getRepeatValue();}">
		<xp:panel style="font-size:7pt;color:rgb(128,128,128);margin-bottom:5.0px">
			<xp:text escape="true" id="tagLabel" value="Tags: " />
			<xp:text escape="true" id="tagList">
				<xp:this.value><![CDATA[#{javascript:var arr = @Explode(RowData.tags, ",");
var ret = "";
for(counter = 0; counter < arr.length; counter++) {
	ret += "<a href='" + dbname + "/myTagView/" + arr[counter] + "'>" + arr[counter] + "</a>";
}

return ret;}]]></xp:this.value>
			</xp:text>
		</xp:panel>
	</xp:repeat>
</xp:view>


Grüße David
Titel: Re: Xpages - Text innerhalb eines Repeat Control in Einzelwerte zerlegen
Beitrag von: eknori am 14.09.10 - 14:28:58
hmm, gibt mir irgendwie nichts zurück. Na mal sehen, aber so macht es schon Sinn
Titel: Re: Xpages - Text innerhalb eines Repeat Control in Einzelwerte zerlegen
Beitrag von: atbits am 14.09.10 - 14:36:07
Hast Du mein 2. Beispiel auch versucht?
Titel: Re: Xpages - Text innerhalb eines Repeat Control in Einzelwerte zerlegen
Beitrag von: atbits am 14.09.10 - 14:38:23
Ist "," überhaupt das richtige Trennzeichen?
Titel: Re: Xpages - Text innerhalb eines Repeat Control in Einzelwerte zerlegen
Beitrag von: atbits am 14.09.10 - 14:55:07
Hallo Ulrich,

also nochmals ein wenig konkreter, so läuft es in einer Testsite bei mir:

Code
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
	<xp:repeat id="repeatTagCloud" var="tagVar"
		value="#{javascript: @Explode('lala,lulu,lolo');}">
		<xp:panel style="font-size:7pt;color:rgb(128,128,128);margin-bottom:5.0px">
			<xp:text escape="false" id="tagList">
				<xp:this.value><![CDATA[#{javascript:
var dbname = @DbName()[1];
var ret = "<a href='/" + dbname + "/myTagView/" + tagVar + "'>" + tagVar + "</a>&nbsp;";

return ret;}]]></xp:this.value>
			</xp:text>
		</xp:panel>
	</xp:repeat>
</xp:view>


Statt dem value="#{javascript: @Explode('lala,lulu,lolo');}"
würdest Du natürlich z.B. ein JS-Function aufrufen, die Dir ein Array von relevanten Tags liefert also z.B.:
value="#{javascript: getAllMyTags();}"

Hoffe das hilft weiter.
Grüße David
Titel: Re: Xpages - Text innerhalb eines Repeat Control in Einzelwerte zerlegen
Beitrag von: eknori am 14.09.10 - 15:00:29
yep, so bekomme ich das hin. Danke
Titel: Re: Xpages - Text innerhalb eines Repeat Control in Einzelwerte zerlegen
Beitrag von: JulianBuss am 14.09.10 - 20:28:44
Wenn ich das richtig erinnere, ist @Explode übrigens nur eine Abkürzung für die .split() Methode eines Strings.
Demnach müsstet so eine Stück JavaScript auch gehen:
Code
var s = "eins,zwei,drei";
var l = s.split(",")

Ansonsten find ich auch nix schlechtes an verschachtelten Repeat-Controls, dann könntest Du im inneren Repeat-Control das Link Control nutzen statt HTML selbst zusammenzubauen.
Titel: Re: Xpages - Text innerhalb eines Repeat Control in Einzelwerte zerlegen
Beitrag von: eknori am 15.09.10 - 10:51:33
Danke für die Tipps. Ist im Grunde ganz einfach. Das Problem, das ich hatte: Ich wusste nicht, wie ich an die Daten aus dem "tags" Item im Dokument komme.

Bei David Leedy habe ich dann den ausschlaggebenden Tipp bekommen. http://xpagesblog.com/xpages-blog/2010/3/30/displaying-a-multi-value-field-with-a-repeat-control.html (http://xpagesblog.com/xpages-blog/2010/3/30/displaying-a-multi-value-field-with-a-repeat-control.html)

der Code sieht jetzt bei mir so aus. Das repeat sitzt in einem weiteren repeat, welches RowData liefert.
Jetzt holt man sich mit
Zitat
RowData.getDocument().getItemValue("tags");
die Werte aus dem Item "tags" und übergibt diese Werte an ein weiteres repeat Control

Zitat
                        <xp:panel
                            style="font-size:7pt;color:rgb(128,128,128);margin-bottom:5.0px">
                            <xp:repeat id="repeatTags" rows="250" var="taglist">
                                <xp:this.value><![CDATA[#{javascript:RowData.getDocument().getItemValue("tags");}]]></xp:this.value>
                                <xp:link escape="true" id="tagLink">
                                    <xp:this.text><![CDATA[#{javascript:taglist + " "}]]></xp:this.text>
                                    <xp:eventHandler event="onclick"
                                        submit="true" refreshMode="complete">
                                        <xp:this.action>
                                            <xp:openPage>
                                                <xp:this.name><![CDATA[#{javascript:"/tags.xsp?tag=" + taglist}]]></xp:this.name>
                                            </xp:openPage>
                                        </xp:this.action>
                                    </xp:eventHandler>
                                </xp:link>
                            </xp:repeat>
                        </xp:panel>

Das LinkControl erledigt den Rest. Im OnClick Event baut man sich die URL samt Parametern zusammen.