2014-01-07 12 views
10

Ich versuche Admin-Benutzern zu ermöglichen, E-Mail-Vorlagen zu bearbeiten. Diese Vorlagen sind in der DB als gespeichert. So sind die Variablen in sie gesetzt sind als {{ purchase.number }} und es gibt Schleifen wieTwig-Vorlagen in CKeditor bearbeiten

{% if cart['shipping'] %} 
     {% for line in cart['shipping'] %} 
      <tr> 
       <td colspan="7">Shipping ({{ line['text'] }})</td> 
       <td>US${{ line['money'] }}</td> 
      </tr> 
     {% endfor %} 
    {% endif %} 

Im Folgenden finden Sie eine der Vorlagen, wo ich dieses Problem reproduzieren:

 <html> 
    <body> 
     <h3>Order #{{ purchase.number }} was cancelled</h3> 
     <p>Order content:</p> 
     <table> 
      <tr> 
       <th>Line</th> 
       <th>Item #</th> 
       <th>Product Name</th> 
       <th>Shipping</th> 
       <th>UOM</th> 
       <th>Unit Price</th> 
       <th>Quantity</th> 
       <th>Subtotal</th> 
      </tr> 
      {% for line in cart['cart'] %} 
       <tr> 
        <td>{{ line['LineNo'] }}</td> 
        <td>{{ line['ItemNo'] }}</td> 
        <td>{{ line['ProductName'] }}</td> 
        <td>{{ line['Shipping'] }}</td> 
        <td>{{ line['UOM'] }}</td> 
        <td>US${{ line['UnitPrice'] }}</td> 
        <td>{{ line['Quantity'] }}</td> 
        <td>US${{ line['Subtotal'] }}</td> 
       </tr> 
      {% endfor %} 
      {% if cart['shipping'] %} 
       {% for line in cart['shipping'] %} 
        <tr> 
         <td colspan="7">Shipping ({{ line['text'] }})</td> 
         <td>US${{ line['money'] }}</td> 
        </tr> 
       {% endfor %} 
      {% endif %} 
      <tr> 
       <td colspan="7"><b>Order Item Total:</b></td> 
       <td>US${{ cart['total'] }}</td> 
      </tr> 
     </table> 
    </body> 
</html> 

Wenn ich öffnen Sie einfach eine Seite mit CKEditor TextArea- mit dieser Vorlage drin, ich keine auf die Vorlage ändert und klicken sie einfach auf „Source“ und hier ist, wie die oben erwähnten Vorlage nach dem Klick aussieht:

<h3>Order #{{ purchase.number }} was cancelled</h3> 

<p>Order content:</p> 
{% for line in cart[&#39;cart&#39;] %} {% endfor %} {% if cart[&#39;shipping&#39;] %} {% for line in cart[&#39;shipping&#39;] %} {% endfor %} {% endif %} 

<table> 
    <tbody> 
     <tr> 
      <th>Line</th> 
      <th>Item #</th> 
      <th>Product Name</th> 
      <th>Shipping</th> 
      <th>UOM</th> 
      <th>Unit Price</th> 
      <th>Quantity</th> 
      <th>Subtotal</th> 
     </tr> 
     <tr> 
      <td>{{ line[&#39;LineNo&#39;] }}</td> 
      <td>{{ line[&#39;ItemNo&#39;] }}</td> 
      <td>{{ line[&#39;ProductName&#39;] }}</td> 
      <td>{{ line[&#39;Shipping&#39;] }}</td> 
      <td>{{ line[&#39;UOM&#39;] }}</td> 
      <td>US${{ line[&#39;UnitPrice&#39;] }}</td> 
      <td>{{ line[&#39;Quantity&#39;] }}</td> 
      <td>US${{ line[&#39;Subtotal&#39;] }}</td> 
     </tr> 
     <tr> 
      <td colspan="7">Shipping ({{ line[&#39;text&#39;] }})</td> 
      <td>US${{ line[&#39;money&#39;] }}</td> 
     </tr> 
     <tr> 
      <td colspan="7"><b>Order Item Total:</b></td> 
      <td>US${{ cart[&#39;total&#39;] }}</td> 
     </tr> 
    </tbody> 
</table> 
Hinweis

, dass nicht nur einzelne Kursänderungen zu HTML-Code, aber die Hauptsache ist, dass Schleifen bewegt werden, so sie verwendet werden:

 {% if cart['shipping'] %} 
      {% for line in cart['shipping'] %} 
       <tr> 

aber werden:

{% for line in cart[&#39;cart&#39;] %} {% endfor %} {% if cart[&#39;shipping&#39;] %} {% for line in cart[&#39;shipping&#39;] %} {% endfor %} {% endif %} 

Warum CKEditor ändere die Quelle, wenn diese Entitäten NICHT html sind und ich mache keine Änderungen, ich konzentriere mich nicht einmal auf das Feld.

ich versucht, diese CKEditor Config Optionen:

CKEDITOR.config.enterMode = CKEDITOR.ENTER_BR; 
CKEDITOR.config.entities = false; 

CKEDITOR.config.forcePasteAsPlainText = false; // default so content won't be manipulated on load 
CKEDITOR.config.basicEntities = true; 
CKEDITOR.config.entities = true; 
CKEDITOR.config.entities_latin = false; 
CKEDITOR.config.entities_greek = false; 
CKEDITOR.config.entities_processNumerical = false; 
CKEDITOR.config.fillEmptyBlocks = function (element) { 
    return true; // DON'T DO ANYTHING!!!!! 
}; 

Aber ich dies noch erleben. Kann jemand über die Option config oder eine andere Problemumgehung beraten, außer WYSIWYG nicht zu verwenden. Ich habe versucht, Benutzer zu überzeugen, HTML/Zweig zu bearbeiten, aber die wollen nur WYSIWYG. Dank

Antwort

5

Eine mögliche Abhilfe für mich war die Twig Blöcke config.protectedSource hinzuzufügen:

CKEDITOR.config.protectedSource.push(/\{%\s.+\s%\}/g); 

Sie im WYSIWYG-Editor ignoriert werden, wird aber immer noch in der Quelltextansicht sichtbar sein.

Zusätzlich können Sie das Plugin Show protected installieren und es gibt noch einen sichtbaren Hinweis.

0

ähnliche Frage CKEditor is escaping html elements

Kurze Frage, die oben eine Liste von Konfigurationsoptionen haben Sie ein zu einer Zeit versucht? Beide haben

CKEDITOR.config.entities = false; 
CKEDITOR.config.entities = true; 

setzt Entitäten auf True, was nicht das ist, was Sie wollen, wie es HTML-Entitäten in der Ausgabe erzwingt.

2

Arbeitscode lautet:

CKEDITOR.config.protectedSource.push(/\{\{\s.+\s\}\}/g); 
CKEDITOR.config.protectedSource.push(/\{%\s.+\s%\}/g); 

beacose wir zulassen, dass brauchen {{und {% Tags für Zweig

0

By the way, die anderen Antworten sind in Ordnung, aber wenn Sie mehr als einen Zweig Block in der gleiche Satz, nicht.

Also dieses Regex Ich empfehle auf jeden Fall verwenden Sie stattdessen das auch mit mehreren Zweig Blöcke funktioniert:

CKEDITOR.config.protectedSource.push(/\{\{[\s\S]*?\}\}/g); 
CKEDITOR.config.protectedSource.push(/\{\%[\s\S]*?%\}/g); 
1

diesem Grund habe ich Stack-Überlauf lieben - egal, was Sie fragen wollen, jemand ist es wahrscheinlich schon gefragt! In diesem Fall waren die Antworten nah, aber für mich war es nicht gut, sie als geschützte Quelle hinzuzufügen - ich wollte die Zweigvorlagen in der Zeichenfolge erstellen, da wir sie für E-Mail-Vorlagen in unserem CRM verwenden. Also, was ich getan habe, war CKEditor zu lassen, um seine Sache zu tun und dann zu handhaben, bevor die Vorlage gespeichert wurde (in unserem Fall in die DB, aber es könnte auch zu Datei sein).

Die Funktion, die ich hinzugefügt habe, ist unten eingefügt - fühlen Sie sich frei, & Missbrauch zu verwenden, wie Sie wünschen.

Dies ist von unserem benutzerdefinierten Symfony Controller onBeforePersist ein Haken, der aufgerufen wird, bevor die Entität persistiert ... Hoffentlich ist alles selbsterklärend aus dem Code.

Hinweis kann die Regex ein wenig schmuddelig, aber scheint zu funktionieren, ich bin kein Experte Regex, so wenden Sie sich bitte einen prägnanten Ausdruck vorschlagen fühlen Sie sich frei.

/** 
* Before we persist the data, we need to clean up any twig tags in there as the editor encodes html entities... 
* 
* @param Request $request 
* @param $form 
* @param EmailTemplates $entity 
*/ 
public function onBeforePersist(Request $request, $form, $entity) 
{ 
    $template = $entity->getView(); 

    $re = '/\{(\{|%)([^{}]|(?R))*(\}|%)\}/'; 
    preg_match_all($re, $template, $matches, PREG_SET_ORDER, 0); 

    // We only want the first element of each match - I don't like closures as a rule on readability grounds, but this is small enough to be ok. 
    array_walk($matches,function(&$value) { 
     if (array($value)) { 
      $value = $value[0]; 
     } 
    }); 

    // Now do a replace on them 
    foreach ($matches as $match) { 
     $decoded = html_entity_decode($match,ENT_QUOTES); 
     if ($match != $decoded) { 
      // Only replace if we have actually changed the string 
      $template = str_replace($match, $decoded, $template); 
     } 
    } 

    // Update the View... 
    $entity->setView($template); 
}