下記のようなforeach構文で、変数$xxxからなるリストを表示したあと、同じHTML内に、同じ変数$xxxからなるリストを別の場所で表示したいのですが、後に記述されたforeach構文の箇所では、呼び出したいデータと異なるものが出てきます。
原因と解決方法を教えていただけないでしょうか。
------------------------
{if $xxx}
<ul>
{foreach from=$xxx item="xxx_navi"}
<li><a href="{$xxx_navi.url}" title="{$xxx_navi.title}">{$xxx_navi.title}</a></li>
{/foreach}
</ul>
{/if}
こんばんわ。
え、でませんでしたか。
限りなく書かれているものと近づけてみました。
smartyのファイル
<html> <body> {if $xxx} <ul> {foreach from=$xxx key=key item=xxx_navi} <li><a href="{$xxx_navi.url}" title="{$xxx_navi.title}">{$xxx_navi.title}</a></li> {/foreach} </ul> {/if} </body> </html>
で、
phpのファイル
<?php require_once 'Smarty/Smarty.class.php'; $smarty= new Smarty(); $smarty->template_dir = $path.'../smarty/templates/'; $smarty->compile_dir = $path.'../smarty/templates_c/'; $a=array( array('url'=>'url1','title'=>'title1'), array('url'=>'url2','title'=>'title2'), array('url'=>'url3','title'=>'title3') ); $smarty->assign('xxx',$a); $smarty->display('index.tpl'); ?>
で、
ブラウザでの出力結果のソースです。
<html> <body> <ul> <li><a href="url1" title="title1">title1</a></li> <li><a href="url2" title="title2">title2</a></li> <li><a href="url3" title="title3">title3</a></li> </ul> </body> </html>
ハッシュの構造を勘違いしていたらすいません。
keyの名前は別になんでもいいです。
ハッシュの中のハッシュにアクセスするのに、
foreachでハッシュからハッシュを取り出し、
取り出したハッシュの内容を出力
$xxx というハッシュの中でkeyとなる値が数値か文字列かは、
おやりになっていることで違うかと思いますが、
$xxx['0']['url']="url0";
$xxx['0']['title']="title0";
のようなハッシュを処理することになります。
それをforeachでまわすと
keyで設定した名称の変数に 0 が入ります。
itemで設定した名称の変数には その 0 にぶら下がるハッシュが入ります。
要素はurlとtitleのはずです。
foreachの中でkeyを使ってアクセスしてもよいです。
{if $xxx} <ul> {foreach from=$xxx key=key item=xxx_navi} <li><a href="{$xxx.$key.url}" title="{$xxx.$key.title}">{$xxx.$key.title}</a></li> {/foreach} </ul> {/if}
ああ、自分はkeyをすっ飛ばしていますが、こっちのほうがわかりやすいアクセスの仕方かもしれませんね。
どうでしょう。うごきませんかね。
{$xxx_navi.url}" title="{$xxx_navi.title}">{$xxx_navi.title}
正しくは、
{$xxx.url}" title="{$xxx.title}">{$xxx.title}
アドバイス有難うございました。
「_navi」を外すと、データを読み込んでくれないようで、HTMLに求める記述がなくなってしまいました。
ご指摘いただいた内容を適切に反映できていないだけかもしれませんが、難しいですね。
たぶん、smartyですよね。
foreachにkeyを付けると望まれる動作になるはずです。
違ったらごめんなさい。
一応手元では確認しました。
{if $xxx} <ul> {foreach from=$xxx key=key item=xxx_navi} <li><a href="{$xxx_navi.url}" title="{$xxx_navi.title}">{$xxx_navi.title}</a></li> {/foreach} </ul> {/if} <||
アドバイスを有難うございます。
ただ、「key=key」をそのままつけたのですが、表示に変わりがありませんでした。
プログラムは素人のため、大変申し訳ありませんが、
記述するkey=●●●(パラメータ?)に決まりごとがあるのでしょうか?
こんばんわ。
え、でませんでしたか。
限りなく書かれているものと近づけてみました。
smartyのファイル
<html> <body> {if $xxx} <ul> {foreach from=$xxx key=key item=xxx_navi} <li><a href="{$xxx_navi.url}" title="{$xxx_navi.title}">{$xxx_navi.title}</a></li> {/foreach} </ul> {/if} </body> </html>
で、
phpのファイル
<?php require_once 'Smarty/Smarty.class.php'; $smarty= new Smarty(); $smarty->template_dir = $path.'../smarty/templates/'; $smarty->compile_dir = $path.'../smarty/templates_c/'; $a=array( array('url'=>'url1','title'=>'title1'), array('url'=>'url2','title'=>'title2'), array('url'=>'url3','title'=>'title3') ); $smarty->assign('xxx',$a); $smarty->display('index.tpl'); ?>
で、
ブラウザでの出力結果のソースです。
<html> <body> <ul> <li><a href="url1" title="title1">title1</a></li> <li><a href="url2" title="title2">title2</a></li> <li><a href="url3" title="title3">title3</a></li> </ul> </body> </html>
ハッシュの構造を勘違いしていたらすいません。
keyの名前は別になんでもいいです。
ハッシュの中のハッシュにアクセスするのに、
foreachでハッシュからハッシュを取り出し、
取り出したハッシュの内容を出力
$xxx というハッシュの中でkeyとなる値が数値か文字列かは、
おやりになっていることで違うかと思いますが、
$xxx['0']['url']="url0";
$xxx['0']['title']="title0";
のようなハッシュを処理することになります。
それをforeachでまわすと
keyで設定した名称の変数に 0 が入ります。
itemで設定した名称の変数には その 0 にぶら下がるハッシュが入ります。
要素はurlとtitleのはずです。
foreachの中でkeyを使ってアクセスしてもよいです。
{if $xxx} <ul> {foreach from=$xxx key=key item=xxx_navi} <li><a href="{$xxx.$key.url}" title="{$xxx.$key.title}">{$xxx.$key.title}</a></li> {/foreach} </ul> {/if}
ああ、自分はkeyをすっ飛ばしていますが、こっちのほうがわかりやすいアクセスの仕方かもしれませんね。
どうでしょう。うごきませんかね。
とても詳しいご説明を有難うございます。
まだ実現できていないのですが、恐らく私の理解の範囲外で、何かしらの阻害要因があるのではと思います。
また、環境についても詳しく説明できる知識を持ち合わせておらず、該当する箇所のソースのみを記述するしかできないため、時間は掛かるかもしれませんが、ご説明いただいた内容はもちろん、環境等についてもキチンと勉強して、再度チャレンジしたいと思います。
お手間を取らせてしまいましたが、とても感謝しています。
有難うございました。
とても詳しいご説明を有難うございます。
まだ実現できていないのですが、恐らく私の理解の範囲外で、何かしらの阻害要因があるのではと思います。
また、環境についても詳しく説明できる知識を持ち合わせておらず、該当する箇所のソースのみを記述するしかできないため、時間は掛かるかもしれませんが、ご説明いただいた内容はもちろん、環境等についてもキチンと勉強して、再度チャレンジしたいと思います。
お手間を取らせてしまいましたが、とても感謝しています。
有難うございました。