Die Smarty-Beitragszusammenfassung funktioniert auf einer Site, jedoch nicht auf einer anderen auf demselben Server
Ich habe Stunden darauf gebrannt und fühle mich an einer Wand. Würde mich über ein paar frische Augen freuen, um neue Wege der Erforschung zu beleuchten.
Ich verwende "Beiträge finden", um eine Liste von Beiträgen zu erstellen. Ich wähle dann "Dankesbriefe" und dann die Vorlage, die ich erstellt habe.
In der Vorlage verwende ich einen Smarty-Code, den ich letztes Jahr online gefunden habe und der Beiträge zusammenfasst und eine übersichtliche Tabelle erstellt:
{foreach from=$contributions item=contribution} {assign var="date" value=$contribution.receive_date|date_format:"%d %b %Y"}
<tr>
<td>{$date}</td> <td style="text-align:right;">${$contribution.total_amount|number_format:2:".":","}</td> <td>{$contribution.payment_instrument}{if $contribution.check_number neq""} - #{$contribution.check_number}{/if}</td>
<td>{$contribution.campaign}</td> <td>{$contribution.contribution_source}</td>
</tr>
{/foreach}
<tr>
<th>2020 TOTAL</th>
<th style="text-align:right;">${$contribution_aggregate|number_format:2:".":","}</th>
<th> </th>
<th> </th>
<th> </th>
</tr>
Es funktioniert hervorragend an einer Stelle, an der ein ordentlicher Tisch entsteht:

Auf einer anderen Site auf demselben Server wird jedoch Folgendes angezeigt: "Auf dieser Website ist ein kritischer Fehler aufgetreten. Anweisungen finden Sie im E-Mail-Posteingang Ihres Site-Administrators."
Beim Überprüfen des Apache-Fehlerprotokolls stelle ich einen etwas unspezifischen Fehler fest:
[Wed Dec 23 13:51:44.466136 2020] [php7:error] [pid 31786] [client maskedIP:43002] PHP Fatal error: Smarty error: [in string:<table align="left" border="1" cellpadding="5" cellspacing="0" class="table" style="margin-top:15px;">\r\n\t<tbody>\r\n\t\t<tr>\r\n\t\t\t<th>Date</th>\r\n\t\t\t<th style="text-align:right;">Amount</th>\r\n\t\t\t<th>Method</th>\r\n\t\t\t<th>Campaign</th>\r\n\t\t\t<th>Note</th>\r\n\t\t</tr>\r\n\t\t<!--\r\n {foreach from=$contributions item=contribution} {assign\r\n var="date" value=$contribution.receive_date|date_format:"%d %b\r\n %Y"}\r\n -->\r\n\t\t<tr>\r\n\t\t\t<td>{$date}</td>\r\n\t\t\t<td style="text-align:right;">${$contribution.total_amount|number_format:2:".":","}</td>\r\n\t\t\t<td>{$contribution.payment_instrument}{if $contribution.check_number neq""} - #{$contribution.check_number}{/if}</td>\r\n\t\t\t<td>{$contribution.campaign}</td>\r\n\t\t\t<td>{$contribution.contri in /var/www/masked-url.org/wordpress/wp-content/plugins/civicrm/civicrm/packages/Smarty/Smarty.class.php on line 1100, referer: https://masked-url.org/wp-admin/admin.php?page=CiviCRM&q=civicrm%2Fcontribute%2Fsearch&_qf_PDFLetter_display=true&qfKey=bd001d277ba51fe3447c1acb3c2bed4dceb754c89022040c362d62bb4e04b4b3_9738
Ich habe Entitäten im CKEditor auf beiden Sites deaktiviert:

Ich habe sichergestellt, dass Smarty in Nachrichtenvorlagen aktiviert ist, und das Fehlerprotokoll bestätigt dies, da der Fehler eindeutig mit Smarty zusammenhängt.
Ich habe den Code buchstäblich ausgeschnitten und von einer Site zur anderen eingefügt und ihn in keiner Weise geändert.
Ich kann einen sehr einfachen Test erfolgreich durchführen, indem ich den folgenden Code in eine Vorlage einfüge:
<p>{$smarty.now|date_format}</p> <p>{$smarty.version}</p>
Ich erhalte auf beiden Seiten eine gültige Ausgabe für diesen einfachen Test:

Ich habe auch versucht, anderen Smarty-Code zu schreiben, hatte aber kein Glück, etwas anderes als diesen Grundfall zum Laufen zu bringen. Wahrscheinlich hat das zumindest etwas mit meiner begrenzten Smarty-Erfahrung zu tun. Der erste Code, den ich geteilt habe, funktioniert jedoch auf einer Site hervorragend und schlägt auf der anderen fehl.
Site 1 (funktioniert): WordPress 5.6, PHP 7.3.22, CiviCRM 5.30.0, Smarty 2.6.31 (obwohl dies sehr alt zu sein scheint, so gehe ich davon aus, dass es schon lange die CiviCRM-Version ist)
Site 2 (funktioniert nicht - Fehler oben): WordPress 5.6, PHP 7.3.22, CiviCRM 5.32.2, Smarty 2.6.31
Obwohl sich die CiviCRM-Versionen unterscheiden, würde ich hoffen, dass dies keine Regression ist. Dies ist besonders unwahrscheinlich, da sich die Smarty-Version nicht geändert hat.
In der Hoffnung, dass jemand Licht ins Dunkel bringen oder andere Orte anbieten kann, um nach nützlichen Protokollen zu suchen, die möglicherweise einen Hinweis liefern.
Antworten
Vielen Dank an @demerit für den Vorschlag, wie der vollständige Smarty-Fehler im Protokoll erfasst werden kann. Ich habe festgestellt, dass ich nicht den gesamten Fehler im Apache-Protokoll erhalten habe. Mit konnte CRM_Core_Error::debug_log_message($error_msg);
ich den gesamten Fehler erfassen, der die folgende nützliche Zeile enthielt:
line 17]: [plugin] (secure mode) modifier 'number_format' is not allowed (Smarty_Compiler.class.php, line 1934)
Das Durchsuchen des Webs nach diesem Fehler ergab einen Beitrag vom Januar 2016, der zeigte, dass er number_format
nicht unterstützt wird, aber crmNumberFormat
stattdessen verwendet werden muss .
Durch diesen Ersatz wurde das Problem behoben. Es bleibt ein Rätsel, warum dies number_format
in einer anderen meiner CiviCRM-Installationen funktioniert, wenn es seit mindestens 2016 ein Problem zu sein scheint. Dies ist jedoch ein Problem für einen anderen Tag. Im Moment bin ich froh, das Problem bei dieser Installation behoben zu haben.
Die korrigierte Tabelle lautet wie folgt:
<table align="left" border="1" cellpadding="5" cellspacing="0" class="table" style="margin-top:15px;">
<tbody>
<tr>
<th>Date</th>
<th style="text-align:right;">Amount</th>
<th>Method</th>
<th>Campaign</th>
<th>Note</th>
</tr>
<!--
{foreach from=$contributions item=contribution} {assign
var="date" value=$contribution.receive_date|date_format:"%d %b %Y"} --> <tr> <td>{$date}</td>
<td style="text-align:right;">${$contribution.total_amount|crmNumberFormat:2:".":","}</td>
<td>{$contribution.payment_instrument}{if $contribution.check_number neq""} - #{$contribution.check_number}{/if}</td> <td>{$contribution.campaign}</td>
<td>{$contribution.contribution_source}</td> </tr> <!-- {/foreach} --> <tr> <th>2019 TOTAL</th> <th style="text-align:right;">${$contribution_aggregate|crmNumberFormat:2:".":","}</th>
<th> </th>
<th> </th>
<th> </th>
</tr>
</tbody>
Ich habe in letzter Zeit viel Zeit damit verbracht, das gleiche Problem zu lösen. Für mich war es ein CK-Editor, der im Browser-Cache verbleibt und sich weigert, die aktualisierte Konfiguration aufzunehmen (was in Ihrem Screenshot richtig aussieht).
Probieren Sie einen anderen Browser aus (oder leeren Sie den Browser-Cache) und speichern Sie die richtige Vorlage erneut. Dann testen Sie es. Es sollte funktionieren.