Notice: Undefined property: stdClass:: ...

Have a question or a suggestion about a 3rd party addon module or plugin?
Let us know here.
Locked
hoshy

Notice: Undefined property: stdClass:: ...

Post by hoshy »

You might come across this issue now and then.
For example in the FormBuilder module:

Code: Select all

Notice: Undefined property: stdClass::$op in ... tmp\templates_c\...
The first solution that comes to the most peoples mind is to check the exsitence of that mentioned property in the template before accessing it.
The funny part is that this issue is caused because you ARE checking for the existance of that property.
The problem is within Smarty
To be more precise it's the {section} plugin.
{section} - similar to {foreach} - does someting more than just to loop over a given structure. And by that is uses parts of {foreach}. The result of these parts are used as index in a more complex array-like structure. {section} does not validate that result. And if "null" is returned by the {foreach} compiler part this will result in an invalid index.
Example of FormBuilder:

Code: Select all

$_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;
This code might result in

Code: Select all

... $some_array[null]->op;
which obviously is wrong.

The solution is either to modify your templates to check more often for the existence of properties or completely avoid {section} and use {foreach} instead.

Again the example of FormBuilder. In the original template for inputs that consist of multiple parts (e.g. a group of checkboxes) this is used :

Code: Select all

{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}
Solution #1 - check more often for the existence of properties.
Replace this line right before {/section}:

Code: Select all

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

Code: Select all

{if isset($entry->input[numloop])}
	{$___tmp=$entry->input[numloop]}
	{if isset($___tmp->op) && $___tmp->op}
		{$___tmp->op}
	{/if}
{/if}
Solution #2 - {foreach}:

Code: Select all

{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}
Cheers.
Locked

Return to “Modules/Add-Ons”