2016-06-17 4 views
0

Wenn Composite C1 die Struktur der Websites und Seiten in der Content-Perspektive anzeigt, wird die Seitentiteleigenschaft als Knotenbeschriftung verwendet. Dies ist nicht immer angenehm, besonders wenn die Seiten in verschiedene Kulturen übersetzt werden, so dass Sie diese Titel nicht einmal lesen können und schnell die gesuchte Seite finden. Die Idee ist, das UrlTitle als Bezeichnung zu verwenden, also würde jeder Baumknoten einen Teil der Seiten-URL darstellen. Siehe die folgende Lösung.Composite C1: So erstellen Sie die Seitenstruktur zum Anzeigen von UrlTitle anstelle von Titel (Solution)

+0

Wenn Sie Seiten übersetzen, sollte die URL ebenfalls lokalisiert werden - URLs müssen auch in dieser Sprache für Menschen lesbar sein. –

+0

@ PauliØsterø, ich nehme an, du weißt, wovon du sprichst. Welche Erfahrung haben Sie bei der Lokalisierung von Websites? In welche Sprachen haben Sie URLs übersetzt? – JustAndrei

+0

@ PauliØsterø, Ich habe etwas Erfahrung mit Französisch, Deutsch, Italienisch, Spanisch und auch mit Türkisch, Russisch und Arabisch. Ich nehme an, Sie verstehen, dass es schwierig ist, URLs mit Lesbarkeit für Russisch und Arabisch zu erstellen, da ihre Abcs nicht auf Latein basieren. Aber auch die europäischen Sprachen wie Französisch, Deutsch und Spanisch haben ihre eigenen Zeichen, die es im ASCII nicht gibt: ç, ß, ñ usw. Also, wie stellen Sie sicher, dass URLs lesbar sind? – JustAndrei

Antwort

0

Ich wollte die Assemblys nicht neu kompilieren, also ist mein Hack hässlich, betrifft aber nur Javascript und aspx.

  1. bearbeiten /Composite/scripts/compressed/top.js.

    finden dort SystemTreeNodeBinding.prototype.onBindingAttach=function(){ und injizieren Sie den folgenden Code am Anfang dieser Funktion:

    if(window.treeNodeProcessor)window.treeNodeProcessor(this.node); 
    

    Jetzt können Sie den Baumknoten ändern, bevor es angezeigt wird; Sie müssen nur Ihre globale Funktion treeNodeProcessor erstellen.

  2. Bearbeiten /Composite/top.aspx (top.aspx.cs ist ebenfalls betroffen, also speichern Sie sie zusammen).

    Am Ende des head Element Ihre javascript:

    <script type="text/javascript"> 
        function byKey(key) { 
         return function(p) { 
          return p.Key == key; 
         } 
        } 
    
        window.treeNodeTitles = { 
    <% WriteTreeNodeTitles(); %> 
         "": "" 
        }; 
    
        window.treeNodeProcessor = function(node) { 
         if(node._data.PropertyBag) { 
          var uri = node._data.PropertyBag.find(byKey('Uri')).Value; 
          node._data.Label = window.treeNodeTitles[uri] || node._data.Label; 
         } 
        } 
    
    </script> 
    

    Leider gibt es keine UrlTitle im node Objekt treeNodeProcessor geben. Jedoch hat jede Seite nodePropertyBag, die einen Wert wie ~/Seite (a9d30645-02f7-4412-bd4e-6f3a02782481) unter Schlüssel Uri speichert. Also müssen Sie das UrlTitle selbst abfragen, was in der Methode WriteTreeNodeTitles (siehe unten) gemacht wird.

  3. Bearbeiten /Composite/top.aspx.cs.

    hinzufügen neue Methode:

    protected void WriteTreeNodeTitles() 
    { 
        using (var conn = new DataConnection()) 
        { 
         foreach(string line in conn.Get<IPage>().Select(p => "   \"~/page(" + p.Id.ToString().ToLower() + ")\": \"" + p.UrlTitle + "\",\r\n")) 
         { 
          Response.Write(line); 
         } 
        } 
    } 
    

    Sie haben einige usings hinzufügen, natürlich:

    using System.Linq; 
    using Composite.Data; 
    using Composite.Data.Types; 
    

So, jetzt Ihr top.aspx die Abbildung der Seite enthält guid-like URLs zu UrlTitles und die Funktion treeNodeProcessor, die diese Zuordnung zum Ändern Ihrer Seitenstruktur verwendet.

+0

Sehr hässlich. Wenn Sie Änderungen am Produkt vornehmen möchten, sollten Sie das Repository forken und die Änderungen auf eine dokumentierte Art und Weise beibehalten, die bei Upgrades erhalten bleiben. –

+0

Es ist nur eine Frage von (meiner) Zeit. Die Art und Weise, wie Sie beschrieben haben, ist offensichtlich die richtige, während meine nicht ist; Meins dauert jedoch 15 Minuten, während Dein Zeit braucht, die ich mir im Moment nicht leisten kann. – JustAndrei

Verwandte Themen