Autor Thema: Xpages - Text innerhalb eines Repeat Control in Einzelwerte zerlegen  (Gelesen 7843 mal)

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
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 ?)

Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline atbits

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 708
  • Geschlecht: Männlich
  • sei Du selbst die Veränderung, die Du Dir wünschst
    • atBits
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
« Letzte Änderung: 14.09.10 - 14:18:12 von atbits »
David Schiffer
================================
atBits GmbH & Co. KG - https://atbits.de
im Einsatz: Lotus Domino 8.5, 9, 10

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
hmm, gibt mir irgendwie nichts zurück. Na mal sehen, aber so macht es schon Sinn
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline atbits

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 708
  • Geschlecht: Männlich
  • sei Du selbst die Veränderung, die Du Dir wünschst
    • atBits
Hast Du mein 2. Beispiel auch versucht?
David Schiffer
================================
atBits GmbH & Co. KG - https://atbits.de
im Einsatz: Lotus Domino 8.5, 9, 10

Offline atbits

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 708
  • Geschlecht: Männlich
  • sei Du selbst die Veränderung, die Du Dir wünschst
    • atBits
Ist "," überhaupt das richtige Trennzeichen?
David Schiffer
================================
atBits GmbH & Co. KG - https://atbits.de
im Einsatz: Lotus Domino 8.5, 9, 10

Offline atbits

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 708
  • Geschlecht: Männlich
  • sei Du selbst die Veränderung, die Du Dir wünschst
    • atBits
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
David Schiffer
================================
atBits GmbH & Co. KG - https://atbits.de
im Einsatz: Lotus Domino 8.5, 9, 10

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
yep, so bekomme ich das hin. Danke
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline JulianBuss

  • Aktives Mitglied
  • ***
  • Beiträge: 132
  • Ich liebe dieses Forum!
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.

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
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

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.

« Letzte Änderung: 15.09.10 - 11:00:11 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz