htmlに挿入するforeach構文で同じ変数からなるリストを2箇所で表示する方法について教えてください。


下記のような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}

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2010/06/22 21:50:13
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:doropon No.3

回答回数94ベストアンサー獲得回数16

ポイント150pt

こんばんわ。

え、でませんでしたか。

限りなく書かれているものと近づけてみました。

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をすっ飛ばしていますが、こっちのほうがわかりやすいアクセスの仕方かもしれませんね。

どうでしょう。うごきませんかね。

id:kazoo9

とても詳しいご説明を有難うございます。

まだ実現できていないのですが、恐らく私の理解の範囲外で、何かしらの阻害要因があるのではと思います。

また、環境についても詳しく説明できる知識を持ち合わせておらず、該当する箇所のソースのみを記述するしかできないため、時間は掛かるかもしれませんが、ご説明いただいた内容はもちろん、環境等についてもキチンと勉強して、再度チャレンジしたいと思います。

お手間を取らせてしまいましたが、とても感謝しています。

有難うございました。

2010/06/21 16:52:50

その他の回答2件)

id:hanako393 No.1

回答回数1142ベストアンサー獲得回数87

ポイント10pt

{$xxx_navi.url}" title="{$xxx_navi.title}">{$xxx_navi.title}

正しくは、

{$xxx.url}" title="{$xxx.title}">{$xxx.title}

id:kazoo9

アドバイス有難うございました。

「_navi」を外すと、データを読み込んでくれないようで、HTMLに求める記述がなくなってしまいました。

ご指摘いただいた内容を適切に反映できていないだけかもしれませんが、難しいですね。

2010/06/19 18:54:47
id:doropon No.2

回答回数94ベストアンサー獲得回数16

ポイント50pt

たぶん、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}
<||  
id:kazoo9

アドバイスを有難うございます。

ただ、「key=key」をそのままつけたのですが、表示に変わりがありませんでした。

プログラムは素人のため、大変申し訳ありませんが、

記述するkey=●●●(パラメータ?)に決まりごとがあるのでしょうか?

2010/06/19 19:01:11
id:doropon No.3

回答回数94ベストアンサー獲得回数16ここでベストアンサー

ポイント150pt

こんばんわ。

え、でませんでしたか。

限りなく書かれているものと近づけてみました。

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をすっ飛ばしていますが、こっちのほうがわかりやすいアクセスの仕方かもしれませんね。

どうでしょう。うごきませんかね。

id:kazoo9

とても詳しいご説明を有難うございます。

まだ実現できていないのですが、恐らく私の理解の範囲外で、何かしらの阻害要因があるのではと思います。

また、環境についても詳しく説明できる知識を持ち合わせておらず、該当する箇所のソースのみを記述するしかできないため、時間は掛かるかもしれませんが、ご説明いただいた内容はもちろん、環境等についてもキチンと勉強して、再度チャレンジしたいと思います。

お手間を取らせてしまいましたが、とても感謝しています。

有難うございました。

2010/06/21 16:52:50
  • id:koriki-kozou
    koriki-kozou 2010/06/18 22:08:07
    >後に記述されたforeach構文の箇所では、呼び出したいデータと異なるものが出てきます。

    データベースのほうもだけど、何をどうやったのかを自分なりに詳しく説明しないと、おおよその部分しか回答できない
    Smartyだと想像するけれど、絶対にSmartyだとも言い切れないから、使っている環境についても書いておかないと正確な回答は得られないし、ソースの一部だけでは問題点はいくつも想像できるため回答欄くらいでは説明しきれない。もっと詳しく書いて
    http://www.smarty.net/manual/ja/language.function.foreach.php
  • id:rouge_2008
    特に何もしなくても通常は同じデータが表示されます。
    表示したい箇所(前と後)には、どちらにも質問記載の記述と同じものを記述してあるのですか?
    同じなのでしたら、前の記述から後の記述までの間に変数の書き換えが行われていないか確認してみてはいかがでしょうか?
    変数$xxxを、2箇所の出力前と後の部分でvar_dump等で表示して、中身を確認してみてください。
  • id:kazoo9
    アドバイスを有難うございます。
    質問としては、Smartyについてです。

    症状を詳しく記述しますと、
    同一ページに全く同じ構文を記述すると、ウェブページで最初の部分は正しく表示されるのですが、2箇所目の表示がおかしくなります。

    例)
    1箇所目)  サービス  料金  会社概要  お問い合わせ
    2箇所目)  2  1  1  2  1  1  2  ?  1  s  2  2 h

    といったような状況です。


    お手間を取らせて申し訳ありませんが、宜しくお願いいたします。

  • id:rouge_2008
    次の点について確認させてください。

    1. 変数$xxxはどのような方法で定義したのでしょうか?
    http://www.smarty.net/manual/ja/language.variables.php

    2. 1箇所目のすぐ後に続けて記述した場合は同じように表示されますか?

    3. テンプレートに別のテンプレートファイルを読み込んでいますか?
    ※ヘッダー用、メニュー用、メインコンテンツ用、サイドメニュー用、フッター用など・・・

    4. テンプレートを部位ごとに分けている場合、1箇所目と2箇所目はそれぞれどの部分に該当しますか?

    5. テンプレートを部位ごとに分けている場合、各テンプレートをどの順番で読み込んでいますか?
  • id:koriki-kozou
    koriki-kozou 2010/06/19 21:58:16
    回答1はSmartyの基本すら理解してないヤツがポイント欲しさに回答してるだけ、回答拒否にチェックを入れておくといいよ
    (嘘を書いても質問者にはわからないからね。汚い手だよ)

    rouge_2008 さんからもコメントあるように、
    ・1箇所目と2箇所目の間に書いてある部分に原因あり
    が一番考えられることだけど、他にも
    ・2箇所目の記述ミス
    ・1箇所目とは違うページに書いている
    など、原因となりそうなことはいろいろありすぎて困るくらい。
    症状だけじゃなくてコードを投げて
  • id:doropon
    Smartyと想像している自分が違うかもしれないですが、
    Smartyだったとして、
    $smarty->assign("xxx",$xxx);
    なんてのがどっかにあるはずですが、
    assign
    だけしかあってないかもしれません。
    そこの$xxxが割り当てるべき変数です。
    これをassignの前の行でvar_dumpしたものがあるといいですね。

    で、
    "xxx"としている部分の文字列。これがtplファイルの中の
    foreachのfromと同じ名前か?
    違うと出ないです。


    勉強しようと思っている人には大いに応援します。
    自分の技術レベルも高くないので難しいことは教えられませんが。

    コード全部を丸投げにすると、全部頼ってしまっている感じになっちゃうのと、
    出しちゃいけない情報が混ざっているのが怖い。ってのもありますけどね。
    いろいろ隠すのに書きかえると必要なところが抜けちゃったり。

    まあ、お役にたてれば。と思いますので、ソースがあれば答えを全部教えてしまうこともできるので、
    勉強との兼ね合いでお伝えいただければと。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません