In einem ASP.NET CMS habe ich eine Möglichkeit gesucht in einem FCKEditor diverse Platzhalter in Artikel-Tex einzusetzen, die später dann durch aktuelle Inhalte und Werbung ersetzt werden könne.
Am schönsten wäre es natürlich, wenn es auch im Editor bereits angezeigt wird um zu sehen, wie der Text um den potentiellen Inhalt läuft.
Die API des FCKEditors möchte ich nicht anfassen also muß iich mit vorhandenen Mitteln zu Rande kommen.
Trick 1.
Um die Größe und Position im Content zu definieren, nehme ich ein image in vergleichbarer Größe (wie das Bild rechts).
Trick 2.
Ich definiere mir Styles für den FCKEditor und generiere diese mit einem Webform.
Einbinden kann man diese über
fckBody.StylesXmlPath = "/_admin/artikel/stylesXMLPath.aspx?ArtikelID=123"&rdm=123"
G generiert wird dort das folgendeXML:
<?xml version="1.0" encoding="utf-8" ?>
<Styles>
<Style name="1.Hintergrundinformation " element="img">
<Attribute name="class" value="beistellerRechts"/>
<Attribute name="dataid" value="534"/> Die DataID wird dynamisch erzeugt und definiert dei Auswahl
</Style>
<Style name="2.Related Links" element="img"> Styles werden nur bei aktiviertem Image angezeigt
<Attribute name="class" value="beistellerRechts"/>
<Attribute name="dataid" value="535"/>
</Style>
</Styles>
Also nach dem ich das Bild hochgeladen habe und das Image markiert habe, sind die dynamischen Styles verfügbar. Da auch eine cssClass im Style definiert ist, bekommt es auch gleich ein float:left und ein Margin:10px verpasst.
Das coole daran ist, dass dort für jenbden verfügbaren Content eine DataID als Atttribut in den ImageTag speichern kann, durch die ich später gezielt bestimmte Informationen anstelle des Bildes einfügen kann.
Sicher werden jetzt einige sagen, dass man dafür ja tolle Regexps schreiben könnte um das auszutauschen.
Ist mir ber zu unübersicchtlich und ich mache einfach zu wenig damit...
Aber mit Linq ist das ein Kinderspiel
'Damit eleminieren wir alle ungültigen HTML-Entiäten
' Wir sprechen UTF-8 und haben seit vielen Jahren moderne Browser also weg mit den
' und ü diese crashen das Xelement
Dim Body As String = Server.HtmlDecode(ArtikelEntry.Body)
'Ein Xelement draus machen
Dim xEle = XElement.Parse("<root>" & Body & "</root>")
'<img dataid="534" src="/userfiles/image/Beisteller.png" class="beistellerRechts" />
'Mit dem Style im FCKEditor hat der Imagetag über eine Style-Definition
'eine dynamische DataID bekommen.
'Alle ImageTags ermitteln die eine DataID definiert haben.
Dim k = From k1 In xEle...<img> Where k1.@dataid > 0
While k.Count > 0
Dim img = k.First
Dim dataid = img.@dataid 'DataId ermitteln um speziellen HTMLCode zu generieren
'(überspringe ich hier mal)
img.AddBeforeSelf(<b>Neuer HTML-Code z.B. DB-Abfrage usw.</b>)
img.Remove() 'nach dem Remove neu abfragen
'Alle ImageTags ermitteln die eine DataID definiert haben.
k = From k1 In xEle...<img> Where k1.@dataid > 0
End While
'Dummerweise habe ich noch keine Möglichleit _
' beim xElement ein innerXML ermitteln
'Dann halt das gute XMLDocument bemühen um den ersetzten HTML-Code zu bekommen
Dim xDoc As New XmlDocument
xDoc.LoadXml(xEle.ToString)
ArtikelEntry.Body = xDoc.InnerXml
Das wars... Ich liebe Linq