Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 11. Mai 2019 13:18

philfr
probiert CMS/ms aus
Registriert: 08. Mai 2019
Beiträge: 28

[GELÖST] Cache ausschalten

Hallo,

ich würde gerne auf meinem Entwicklungssystem smarty und cache ganz ausschalten, ist das möglich?

Hintergrund ist die Fehlersuche.
Habe das Formbuilder-Modul installiert und bekomme da für jeden radio-Button eine Fehlermeldung:

Notice: Undefined property: stdClass::$op in C:\xampp\htdocs\cmsms_2_2_10\tmp\templates_c\FormBuilder^b0659d02ad1b203aa3e41d342af5160056429a53_0.module_db_tpl.FormBuilder;fb_4.php on line 137

Die Problemzeile im Cache lautet:

[== php ==]
$_prefixVariable1=$_smarty_tpl->tpl_vars['entry']->value->input[(isset($_smarty_tpl->tpl_vars['__smarty_section_numloop']->value['index']) ? $_smarty_tpl->tpl_vars['__smarty_section_numloop']->value['index'] : null)]->op;

Gruß Frank

Offline

#2 11. Mai 2019 16:16

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.256

Re: [GELÖST] Cache ausschalten

Wenn Du weißt, um welches Formbuilder-Template es sich handelt, würde ich erstmal dort nachschauen, ob man den Fehler nicht evtl. abfangen kann.

Ansonsten würde ich stattdessen lieber einfach die Ausgabe von Fehlermeldungen deaktivieren.
Das kannst Du in einer .htaccess-Datei machen:

php_flag display_errors off 
#optional:
php_value error_reporting 0 

Denn Smarty abschalten kannst Du vergessen.
Ohne Smarty läuft bei CMSms nichts.

Und den Cache komplett deaktivieren, kann ich auch nicht wirklich empfehlen.
Du könntest dort, wo Du den Formbuilder aufrufst zumindest nur den FormBuilder vom Cache ausschließen:

Wenn der FormBuilder aber wiederum in einem Inhaltsblock steht, kann es sein, dass Du im Seitentemplate den ganzen Inhaltsblock vom Cache ausnehmen musst:

Am besten ... testen.
Hatte noch nie wirklich Bedarf für den "nocache" Parameter.

Schlimmstenfalls muss die ganze Seite vom Zwischenspeicher ausgeschlossen werden.
Das kann man beim Bearbeiten einer Seite im Tab "Optionen" einstellen.

Offline

#3 12. Mai 2019 09:40

philfr
probiert CMS/ms aus
Registriert: 08. Mai 2019
Beiträge: 28

Re: [GELÖST] Cache ausschalten

nocache hat nichts gebracht, auch die ganze Seite vom Zwischenspeicher auszuschließen nicht.

Ich habe im Formbuilder einfach ein neues Formular angelegt. Das hat automatisch folgende Formularvorlage bekommen, die ich nicht geändert habe:

{* DEFAULT FORM LAYOUT / pure CSS *}
{literal}
<script type="text/javascript">
function fbht(htid)
	{
		var fbhtc=document.getElementById(htid);
		if (fbhtc)
			{
			if (fbhtc.style.display == 'none')
				{
				fbhtc.style.display = 'inline';
				}
			else
				{
				fbhtc.style.display = 'none';
				}
			}
}
</script>
{/literal}
{$fb_form_header}
{if $fb_form_done == 1}
	{* This first section is for displaying submission errors *}
	{if isset($fb_submission_error) && $fb_submission_error}
		<div class="error_message">{$fb_submission_error}</div>
		{if isset($fb_show_submission_errors) && $fb_show_submission_errors}
			<div class="error">
			<ul>
			{foreach from=$fb_submission_error_list item=thisErr}
				<li>{$thisErr}</li>
			{/foreach}
			</ul>
		</div>
		{/if}
	{/if}
{else}
	{* this section is for displaying the form *}
	{* we start with validation errors *}
	{if isset($fb_form_has_validation_errors) && $fb_form_has_validation_errors}
		<div class="error_message">
		<ul>
		{foreach from=$fb_form_validation_errors item=thisErr}
			<li>{$thisErr}</li>
		{/foreach}
		</ul>
		</div>
	{/if}
	{if isset($captcha_error) && $captcha_error}
		<div class="error_message">{$captcha_error}</div>
	{/if}

	{* and now the form itself *}
	{$fb_form_start}
	<div>{$fb_hidden}</div>
	<div{if $css_class != ''} class="{$css_class}"{/if}>
	{if $total_pages gt 1}<span>{$title_page_x_of_y}</span>{/if}
	{foreach from=$fields item=entry}
		{if $entry->display == 1}
			{strip}
			{if $entry->needs_div == 1}
				<div
				{if $entry->required == 1 || $entry->css_class != '' || $entry->valid == 0} class="
					{if $entry->required == 1}required{/if}
					{if $entry->css_class != ''} {$entry->css_class}{/if}
					{if $entry->valid == 0} fb_invalid{/if}
					"
				{/if}
				>
			{/if}
			{if $entry->hide_name == 0}
				<label{if $entry->multiple_parts != 1} for="{$entry->input_id}"{/if}>{$entry->name}
				{if $entry->required_symbol != ''}
					{$entry->required_symbol}
				{/if}
				</label>
			{/if}
			{if $entry->multiple_parts == 1}
				{section name=numloop loop=$entry->input}
					{if $entry->label_parts == 1}
						<div>{$entry->input[numloop]->input}&nbsp;{$entry->input[numloop]->name}</div>
					{else}
						{$entry->input[numloop]->input}
					{/if}
					{if isset($entry->input[numloop]->op) && $entry->input[numloop]->op}{$entry->input[numloop]->op}{/if}
				{/section}
			{else}
				{if $entry->smarty_eval == '1'}{eval var=$entry->input}{else}{$entry->input}{/if}
			{/if}
			{if $entry->helptext != ''}&nbsp;<a href="javascript:fbht('{$entry->field_helptext_id}')"><img src="modules/FormBuilder/images/info-small.gif" alt="Help" /></a>
					<span id="{$entry->field_helptext_id}" style="display:none" class="fbr_helptext">{$entry->helptext}</span>{/if}
			{if $entry->valid == 0} &lt;--- {$entry->error}{/if}
			{if $entry->needs_div == 1}
				</div>
			{/if}
			{/strip}
		{/if}
	{/foreach}
	{if isset($has_captcha) && $has_captcha == 1}
		<div class="captcha">{$graphic_captcha}{$title_captcha}<br />{$input_captcha}</div>
	{/if}
	<div class="submit">{$prev}{$submit}</div>
	</div>
	{$fb_form_end}
{/if}
{$fb_form_footer}

Weiter oben habe ich ja schon mal die angemeckerte Zeile in der gecachten Datei zitiert, hier noch mal:

$_prefixVariable1=$_smarty_tpl->tpl_vars['entry']->value->input[(isset($_smarty_tpl->tpl_vars['__smarty_section_numloop']->value['index']) ? $_smarty_tpl->tpl_vars['__smarty_section_numloop']->value['index'] : null)]->op;

Man kann das auch lesbarer schreiben:

[== php ==]
$i = $_smarty_tpl->tpl_vars['__smarty_section_numloop']->value['index'];  
if ((isset($i)) {
     $_prefixVariable1 = $_smarty_tpl->tpl_vars['entry']->value->input[$i]->op;
} else {
     $_prefixVariable1 = $_smarty_tpl->tpl_vars['entry']->value->input[null]->op; 
}

Wahrscheinlich gibt es dann ...input[null]->op nicht.
Dieser Konstrukt kommt aber an mehreren Stellen in der gecachten Datei vor.

Offline

#4 12. Mai 2019 19:56

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.256

Re: [GELÖST] Cache ausschalten

Dieser Konstrukt kommt aber an mehreren Stellen in der gecachten Datei vor.

Das kommt aus dem Template:

{if isset($entry->input[numloop]->op) && $entry->input[numloop]->op}{$entry->input[numloop]->op}{/if}

Meine Idee war, genau an dieser Stelle zu prüfen, ob dieses "->op" existiert, bevor man es ausgibt.
Wird aber laut Template eigentlich schon gemacht.

Diese Zeile ergibt meiner Meinung nach überhaupt keinen Sinn:

$_prefixVariable1 = $_smarty_tpl->tpl_vars['entry']->value->input[null]->op;

... ->input[null]->op;
Überhaupt, das ganze "else" ergibt keinen Sinn.

Das Ding ist, dieser Code den Du da im Cache siehst, ist die "Übersetzung" des Smarty-Templates nach PHP. D.h. wenn da ein Fehler drin ist, liegt die Ursache eigentlich meist im Template. Den Cache abschalten bringt nichts, weil diese TMP-Datei so oder so erstellt werden muss, um das Template überhaupt irgendwie verarbeiten zu können.

Offline

#5 13. Mai 2019 06:24

philfr
probiert CMS/ms aus
Registriert: 08. Mai 2019
Beiträge: 28

Re: [GELÖST] Cache ausschalten

Für mich sieht es so aus, als würde smarty da Unfug machen.
In der Vorlage gibt es kein else aber smarty baut eins ein.
Habe das Problem jetzt so gelöst, dass ich die Zeile in der Vorlage rauskommentiert habe.

Jetzt muss ich nur noch rausbekommen, wie ich das "gelöst" in den Betreff bekomme.

Beitrag geändert von philfr (13. Mai 2019 06:26)

Offline

#6 13. Mai 2019 10:40

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.256

Re: [GELÖST] Cache ausschalten

Interessantes Problem.
Habe das gerade mal ausprobiert.
Das passiert nur im "Sample Form".
Undzwar nur bei den "Kontrollkästchengruppen" (also mehrere Checkboxes) oder bei den "erweiterten Checboxen" (weiß noch nicht, was genau das ist - sieht aus wie ne stinknormale Checkbox).
Scheint ein Fehler im Modul zu sein.
Muss ich bei Gelegenheit mal den Code anschauen.

(In Deinem ersten Beitrag ist ein Button mit dem Du das Thema als "Gelöst" markieren kannst)

Offline

#7 13. Mai 2019 17:37

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.256

Re: [GELÖST] Cache ausschalten

Ist tatsächlich ein Fehler in Smarty.
Irgendwo beim {section} Plugin.
Da wird sich einer Funktion bedient, die einen Teil des Codes ausgeben soll, der dann wiederum als Array-Index in einem anderen Code verwendet wird. Dumm nur, wenn die Funktion "null" zurückgibt (z.B. weil das Element nicht existiert). "Null" als Index ist logischerweise völliger Quatsch.
Man kann das umgehen, indem man in seinem Template etwas mehr nach der Existenz von Variablen fragt als im Beispieltemplate.
Im Original steht dort:

{if isset($entry->input[numloop]->op) && $entry->input[numloop]->op}{$entry->input[numloop]->op}{/if}

Das müsste man so ändern:

	{if isset($entry->input[numloop])}
		{$___tmp=$entry->input[numloop]}
		{if isset($___tmp->op) && $___tmp->op}
			{$___tmp->op}
		{/if}
	{/if}

Eine andere Möglichkeit wäre, gänzlich auf dieses {section} zu verzichten und stattdessen lieber {foreach} zu verwenden:

{foreach from=$entry->input item=entry_input}
	{if $entry->label_parts == 1}
		<div>{$entry_input->input}&nbsp;{$entry_input->name}</div>
	{else}
		{$entry_input->input}
	{/if}
	{if isset($entry_input->op)}{$entry_input->op}{/if}
{/foreach}

Offline

#8 14. Mai 2019 06:59

philfr
probiert CMS/ms aus
Registriert: 08. Mai 2019
Beiträge: 28

Re: [GELÖST] Cache ausschalten

Bin zwar smarty-Neuling, aber ich glaub es geht auch kürzer:

{$entry->input[numloop]->op|default:''}

Offline

#9 14. Mai 2019 07:54

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.256

Re: [GELÖST] Cache ausschalten

Das war zu einfach  big_smile  big_smile  big_smile
Ich hätte jetzt gedacht, dass das den gleichen Effekt hätte wie {if isset(...)}
Denn bevor der default-Wert verwendet wird, muss ja geprüft werden, ob die Variable existiert.
Aber scheinbar läuft das bei Smarty intern irgendwie anders.

Offline