smartyでtplファイルでの2次元配列

このQ&Aのポイント
  • smartyを使用してtplファイル内で2次元配列を扱う方法について教えてください
  • foreachを入れ子にして2次元配列をアクセスする方法について教えてください
  • PHPで定義した2次元配列をsmartyのtplファイルで使用する方法について教えてください
回答を見る
  • ベストアンサー

smartyでtplファイルでの2次元配列

お世話になります。 smartyでtplファイル内で2次元配列を書きたいのですがどのようにアクセスしたらいいでしょう? foreachを入れ子にして使いたいのですが なかなかうまくいきません。 *このように使いたいのです PHP側 $txtA_ary[$page][$page_count]//こんな感じに各値が入る $form->addElement('text','txtA',$txtA_ary); tpl側 {foreach key=a_key item=a_item from=$form.txtA.label} {foreach key=b_key item=a_item from=$form.txtA.label.a_key} {$form.txtA.label.$a_key.$b_key} {/foreach} {/foreach}

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

PHPのソース内で foreach()を使うのと全く同じ感覚で書けばいいだけですよ {foreach key=a_key item=a_item from=$form.txtA.label} {foreach key=b_key item=b_item from=$a_item} {$b_item.$a_key.$b_key} {/foreach} {/foreach} 今、手元に環境がないのでテキトーに書いて動作確認してませんけど、だいたいこんな感じだったら動くんじゃないかな? 入れ子内ので親は$form.txtA.labelではなくてa_item になるわけですから、入れ子内で新規に$formをforeachしても意味ないです あと、ソース見る限り、PEARのQuick_form使ってるみたいですけど、とりあえずsmartyのデバッギングコンソールを表示させてみて、$formがどんな形でsmartyにassignされてきているかを確認しながら作業してください

VIPFIRE
質問者

お礼

お返事ありがとうございます。 参考にしまして ただいま目的のページが完成いたしました。 有難うございました。

関連するQ&A

  • smartyのforeachの使い方

    仮に$strが以下のような配列を持っている場合smartyのtpl側で 出力させたいのですがうまくいきません。 Array ( [0] => Array ( [id] => 1 [name] => 名前 [sub_id] => Array ( [0] => 12 [1] => 13 ) [sub_name] => Array ( [0] => あああ [1] => いいい ) [sub_cnt] => Array ( [0] => 5 [1] => 5 ) ) [1] => Array ( [id] => 1 [name] => 名前 ) ) sub_***は配列が存在するものとしないものがあります。 そしてtpl側は {foreach item=items from=$str} <ul id="side{$items.id}"> {foreach item=item from=$items} <li><a href="index.php?id={$item.sub_id}">{$item.sub_name} ({$item.sub_cnt})</a></li> {/foreach} </ul> {/foreach} とforeachを重ねてみたのですがsub_***の値が表示されない 状態です。 複雑な配列なのですがこの場合どうすればうまく表示させれるの でしょうか?

    • ベストアンサー
    • PHP
  • Smartyで添え字が全て文字列の多次元配列

    Smartyで添え字が全て文字列の多次元配列 いつもお世話になっております。 Smartyで添え字が全て文字列の多次元配列を表示したいと考えています。 ■■元データ■■ $menu_list = array( '魚' => array( 'サバ' => 'サバカレー', 'タイ' => 'タイカレー' ), '肉' => array( '豚肉' => 'ポークカレー', '牛肉' => 'ビーフカレー' ), '野菜' => array( 'キャベツ' => 'キャベツカレー', 'きゅうり' => 'きゅうりカレー' ) ); ■■期待する出力■■ <ul> <li>魚 <li>サバ/サバカレー<li> <li>サバ/サバカレー<li> </li> </ul> <ul> <li>肉 <li>豚肉/ポークカレー<li> <li>牛肉/ビーフカレー<li> </li> </ul> <ul> <li>野菜 <li>キャベツ/キャベツカレー<li> <li>きゅうり/きゅうりカレー<li> </li> </ul> 散々悩んだ挙句、Smarty側では当初次のようにしたところ、とりあえずはうまくいっています。 {foreach from=$menu_list key="key" item="item" name="loopName"} {if $smarty.foreach.loopName.iteration <= 3} {if $smarty.foreach.loopName.iteration == 1} <ul> <li>魚 {elseif $smarty.foreach.loopName.iteration == 2} <ul> <li>肉 {elseif $smarty.foreach.loopName.iteration == 3} <ul> <li>野菜 {/if} {foreach from=$menu_list.$key key="key" item="val"} <li>{$key}/{$val}</li> {/foreach} {/if} </li> </ul> {/foreach} 元データの内容は頻繁に変わるため、Smartyのテンプレートに添え字を直で書くのは 避けたいのですが、どうしたら良いのでしょうか。 できるだけPHP側で加工して、テンプレートはループで回すだけにしたいと考えています。 すみませんが、お知恵を貸していただけないでしょうか。 ・・・カレー食べたい。

    • ベストアンサー
    • PHP
  • Smarty 三次元配列を使いたい

    最近Smartyを使い始めた者です。 以下のような多次元配列を、$smarty->assign('data', $data); します。 $data = array( [0] => array( [id] => 23 [comment] => 'aaa' [name] = array( [0] => 'xxx' [1] => 'yyy' )) [1] => array( [id] => 24 [comment] => 'bbb' [name] = array( [0] => 'zzz' )) [2] => array( [id] => 25 [comment] => 'ccc' [name] = array( [0] => 'ttt' [1] => 'uuu' )) ) そして、以下のようなテーブルを表示させたいのです。 |-------------------| | 23  | aaaa | xxxx | |    |     |------| |    |     | yyyy | |-------------------| | 24  | bbbb | zzzz | |-------------------| | 25  | cccc | tttt | |    |     |------| |    |     | uuuu | |-------------------| <td>タグのrowspan属性を使おうと思っています。 {foreach}をつかって、以下のようなものを書きましたが、駄目でした。 {foreach from=$data item=value01 name=kiji} <tr> <td rowspan="{$value01.numgoods}">{$value01.id}</td> <td rowspan="{$value01.numgoods}">{$value01.comment}</td> {foreach from=$value01 item=value02 name=goods} {if $smarty.foreach.goods.first} <td>{$value02.name.0]</td></tr> {else} <tr> <td>{$value.name.1}</td> </tr> {/if} {/foreach} {/foreach} エラー表示は、 syntax error: unrecognized tag: $value02.name.0 です 本当は、$value02.name の.0を三次元での要素数分だけ自動でループしてほしいのですが、その書き方がわかりません。 ネットをあさっても、これと言うサイトを見つけれません。 そもそも、三次元目の要素を取得するsmartyの方法がわかりません。 どなたかご教授の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • smartyで同じテンプレートを使いまわす

    list.tpl {foreach from=$data key=key item=row loop=test} <tr><td>{$row.name}</td>:<td>{$row.kokugo}</td><td>{$row.sansu}</td></tr> {/foreach} ----- index.tpl(一部) <h2>男の子</h2> {include file=list.tpl} <h2>女の子</h2> {include file=list.tpl} ----- index.php(一部) $Smarty -> assign( "data", $boy ); $Smarty -> assign( "data", $girl ); $Smarty -> display( 'index.tpl' ); (実際にこの書き方は間違っていますが…) index.php から index.tpl を display したいのですが、 この中で使うリストを、使いまわしたいと考えています。 こういうやり方はそもそも可能なのでしょうか? たしかに boylist.tpl 、 girllist.tpl とし中の割当変数を $boy 、 $girl に変えればいいのですが、 将来変更が加わった際に両方変えなければなりません。 今回は例なので男女ですが、もっと多くの要素が出て来た時に 厄介なことになるように思います。 何か解決方法はありませんでしょうか?

    • ベストアンサー
    • PHP
  • smarty foreach 半角スペース

    いつもお世話になっています。 phpより連想配列をsmartyにassignし、 smarty側でforeachで出力しているのですが、 要素間に無駄なスペースが混入します。 回避方法はあるのか教えて頂けないでしょうか。 [php] $arr = array('a' => 1, 'b' => 2); [smarty] {foreach from=$arr item=item} {item}: {/foreach} [出力] 1 : 2 ※本来1:2と出力させたい 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • smartyについて

    smartyを勉強中です。 市販本のサンプルアプリは、うまく実行できました。 環境は、windows /php-5 / smarty-2.6.17 サンプルを真似して、少し修正して、実行すると、下記エラーが出ます。 Fatal error: Smarty error: [in fra_disp.tpl line 13]: syntax error: unrecognized tag: frag.rec_ctl (Smarty_Compiler.class.php, line 446) ソースをじっくり見てますが、サンプルと何が違うか分かりません。こんな質問で申し訳ありませんが、何かヒントいただけませんか。 ちなみに、呼び元pgでは、 $o_smarty->assign("frags",$data); $o_smarty->display("fra_disp.tpl"); また、テンプレートでは、 {foreach from=$frags item="frag"} <tr> <td>{frag.rec_ctl}</td> とコーディングしてます。

    • ベストアンサー
    • PHP
  • Smartyの自作プラグインで配列を扱えません

    Smartyで、配列であった場合に、implodeで結合させるプラグインを作りたいのですが、思うように動作しません。 テンプレート内で、次のように記述しています。 {foreach from=$value item=i}  {$i->note|ketugou} {/foreach} ketugouプラグインでは次の通りです。 function smarty_modifier_ketugou($key){ if (is_array($key)) { return implode(', ', $key); } else { return $key; } } 上記の場合、表示されるのは'Array'のみです。 プラグインで配列かどうかを確認せずに実行すると、次のエラーが出ます。 Warning: implode() [function.implode]: Bad arguments. in。。。 テンプレート上では配列であったのが、プラグインに渡すと配列ではなく、stringとなっていて要素数分実行されています。プラグインからのエラーは配列じゃないからなのですが、どう対処すればいいのでしょうか。

    • ベストアンサー
    • PHP
  • PHPとSmartyの関連について

    PHPとSmartyの関連について PHPからSmartyに出力しているのですが中身がNULLになります。 データベースアクセスにはPDOを使用しています。 PHPソース DBアクセス $SQL = "select ITEM_ID from ITEM_TBL limit 0, 3"; $STMT = $GLOBALS["PDO"] -> query($SQL); $ROW = $STMT -> fetchAll(PDO::FETCH_ASSOC); Smartyでアサイン $smarty -> assign("ITEM_LIST", $ROW); Smartyソース <table> {{foreach from=$ITEM_LIST item=LIST}} <tr> <td>{{$LIST.ITEM_ID}}</td> </tr> {{/foreach}} </table> のような感じでページ出力したいのですが、表示をすると中身がNULLでした。 PHP側で var_dump($ROW); を行うと array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } 中身が配列で格納されています。 smarty側で {$ITEM_LIST|@var_dump} を行うと array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } でした。 いろいろとやってみたのですが、わからなくなってしまったので どなたかご教授いただけませんでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • Smartyへの2次元配列引渡しについて

    PHP+Smartyで現在開発をしておりますが MySQLからデータを取得し、それをSmartyに引き渡すと中身がNULLになってしまう現象が発生しています。 これがすべてにおいて発生しているのであれば納得いくのですが ある環境では発生して、またある環境では問題なく処理できるのです。 対処法を探してみましたが、どうしても対処できないので ご教授いただけたらと思います。 サーバから抽出した内容をPHP側でvar_dumpしたものです。 array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } これを $smarty -> assign("LIST", $ROW); でsmartyに出力しました。 Smarty側では以下の内容を実行しました。 {{$LIST|@var_dump}} 結果 array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } でした。 問題ない環境だと array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } ときちんと値を引き継いでいます。 下記は上記の内容を実行した環境です。 動作しなかった環境 ローカル(XAMPP使用) PHP Version 5.2.9 Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9 サーバ: localhost via TCP/IP サーバのバージョン: 5.1.33-community MySQL クライアントのバージョン: 5.0.51a 動作した環境 レンタルサーバー PHP Version 5.2.9 Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 サーバ: Localhost via UNIX socket サーバのバージョン: 5.0.75-community-log MySQL クライアントのバージョン: 5.0.75 サーバー環境によって処理される内容もかわってくるのでしょうか・・・。

    • ベストアンサー
    • PHP
  • Smartyでインクリメント

    Smartyで以下のような処理がしたいのですがうまくいきません・・・(横にセルを5コ並べた後に改行したい) どのように記述したらよいか教えて頂けますでしょうか。 <table> <tr> {$i = 0} {foreach item=item_list from=$item_list} <td>{$item_list.hoge|escape}</td> {$i = $i + 1} {if $i mod 4 eq 0} </tr><tr> {/if} {/foreach} </table>

    • ベストアンサー
    • PHP

専門家に質問してみよう