1. html - smarty - トラブルシュート - Trying to get property 'value' of non-object

 
1.1 概要
1.2 調査
1.3 テンプレートの記述を編集する
1.4 php の設定を変更する

1.1 概要

 別の項に書いておりますが・・・。  ウェブサーバのエラーログに

[Fri Jun 22 12:35:31.825883 2018] [:error] [pid 20932] [client IPアドレス:33929] PHP Notice:  Trying to get property of non-object in /パス/templates_c/036df7086735b429605275fc2a07315ec228d0ee_0.file.index.tpl.php on line 61
[Fri Jun 22 12:35:43.739401 2018] [:error] [pid 20837] [client IPアドレス:33330] PHP Notice:  Undefined index: google01 in /パス/templates_c/719becc43fa95d1a85cfa5a90f7185839d71af09_0.file.index.tpl.php on line 119
 たなものが出力されております。

1.2 調査

 「Chapter 18. ヒント & 裏ワザ」に記載がありました。  かいつまんで言うと、テンプレートに

{*value}
 という記述があって  .pnp 側で

		$smarty->assign('value', 値);
 という実行文がない場合に value というオブジェクトに与える値がありませんよというメッセージが出力されるのです。  参考サイトに対策も書いてあります。

1.3 テンプレートの記述を編集する

 テンプレートで空白文字の扱いを記述します。  これには2つの方法があって

{if $value eq ''}
    
{else}
   {$value}
{/if}
 と書くか

{$value|default:''}
 と書くかの方法があります。  おそらくは前者の方法をとるひとはごく少数派ではないかと思われます。  その上、前者は結局、冒頭に掲載しているログが出力されます。

1.4 php の設定を変更する

 E_NOTICE を出力しないようにするのですが、これは3つ方法があって

/usr/local/etc/php.ini
 の

error_reporting =
 の記述を変更する方法があります。  元々これは、明記していなければ E_NOTICE は出力されません。  PHP 7.2 のデフォルトは

; error_reporting
;   Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
;   Development Value: E_ALL
;   Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
 とのことで、わたしが E_ALL と設定しているために出力されています。  php.ini を変更するとすべての php のモジュールが影響を受けてしまいますが、もうひとつの方法として

int error_reporting ([ int $level ] )
 の関数を使用する方法があります。  この関数を使用したら、以降、そのモジュールの実行中はこの関数で指定したレベルでエラーログが処理されます。  詳細は「PHP マニュアル - 関数リファレンス - PHP の振る舞いの変更 - エラー処理 - エラー処理関数」をご参照ください。  もうひとつ、smarty に

$error_reporting
 という変数があって、これに値を設定すれば error_reporting の関数をコールするのと同じ効果が得られるそうです。