• ベストアンサー

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
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
  • oka5130
  • ベストアンサー率66% (35/53)
回答No.1

Smartyでは、PHPのように $i = 0 のような書き方はできません。 変数に値を入れたいのであれば、{assign var=i value=$i+1}のようになります。 foreachの場合は、iterationがあるので、インクリメントをする必要は無く、 <table> <tr> {foreach item=item_list from=$item_list name=item_loop} <td>{$item_list.hoge|escape}</td> {if $smarty.foreach.item_loop.iteration % 5 ep 0} {* 5つ目の値なら行を閉じて次の行を始める *} </tr><tr> {/if} {/foreach} </table> のような書き方で動きます。 ただし、これではテーブルの構造をちゃんと作れない(最後の行を</tr>で閉じることができない)ので、少し変更する必要があると思います。 その辺を気になさらないのであれば、以下は無視してくださって結構です。 <table> <tr> {foreach item=item_list from=$item_list name=item_loop} <td>{$item_list.hoge|escape}</td> {if $smarty.foreach.item_loop.iteration % 5 ep 0} {* その行で5つ目のデータなら</tr>を入れる *} </tr> {if not $smarty.foreach.item_loop.last} {* それが最後のデータじゃなかったら次の行を始める *} <tr> {/if} {/if} {if $smarty.foreach.item_loop.last and $smarty.foreach.item_loop.total % 5 neq 0} {* 最後のデータで、その行の5つ目じゃない(</tr>が入っていない)場合は</tr>を入れてあげる *} {* ここに<td></td>を必要な数だけ入れた方がいいですが、なくてもそんなにおかしくはないです *} </tr> {/if} {/foreach} </table>

参考URL:
http://sky.freespace.jp/smarty/SmartyManual_2-6-3J_html/language.function.foreach.html

関連するQ&A

  • 【PHP】smartyとPHPの記述違いとメリット

    smartyというのが、デザインとプログラムを分けれるというので 使ってみたのですが、 //--------------------smarty--------------------- <table border=1> <tr> <th>{$table.title}</th> </tr> {foreach item=result from=$data_list} <tr> <td>{$result[0]}</td> </tr> {/foreach} </table> と、smarty用の記述をHTML内にいろいろ書かなければならず //------------------php---------------------- <table border=1> <tr> <th><?=$table[title] ?></th> </tr> <?php foreach($data_list as $key => $value){ ?> <tr> <td><?= $value ?></td> </tr> <?php } ?> </table> とHTML内にPHPをいろいろ書くのと  あまり大差無い気がして どういう点がよいのがイマイチ分かりません。 smartyは 使う メリットは どういうものがあるのでしょうか。

    • ベストアンサー
    • PHP
  • smartyのforeachの使い方?

    smartyについて教えてください。 mysqlのデータを繰り返し表示させたいのですが Warning: htmlspecialchars() expects parameter 1 to be string, array given in パス modifier.escape.php on line 26 とエラーが出てしまい動作しません。 foreachの使い方がおかしいのかと思いマニュアルをみてみたのですが わかりませんでした。 どうすれば繰り返し表示できるようになるでしょうか? ---php--- $i = 0; $list = array(); while ($col = mysql_fetch_array($res, MYSQL_ASSOC)) { $list[$i]['id'] = $col[id]; $list[$i]['title'] = $col[title]; $list[$i]['main'] = $col[main]; $i++; } $smarty->assign('list', $list); ---tpl--- {foreach item=list from=$list} <tr> <td>{$list.id}</td> <td>{$list.title}</td> <td>{$list.main}</td> <td><a href="hoge.php?id={$list.id}">a</a></td> <td><a href="hoges.php?id={$list.id}">a</a></td> </tr> {/foreach}

    • ベストアンサー
    • 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
  • smartでのtable表示について

    ちょっとベタな書き方ですが下記のように、画像と名前のセットを表示して行く時に、 最後、余ったセルに{html_table}などを使って自動的に埋めて行く事は、出来ますでしょうか、 <table width="650" border="0" cellspacing="0" cellpadding="0"> {foreach from=$data item=data key=key name="loop"} {if $smarty.foreach.loop.iteration %5 ==1}<tr>{/if} <td> <table width="125" border="0" cellspacing="0" cellpadding="1"> <tr> <td><a href="{$data.id}.php"><img src="img/{$data.staff_file}" width="125" height="175" border="0"></a> </td></tr> <tr> <td>{$data.name} </td> </td></tr> </table> </td> {if $smarty.foreach.loop.iteration % 5 ==0}</tr>{/if} {/foreach} {if $smarty.foreach.loop.total % 5 ==4}<td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==3}<td> </td><td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==2}<td> </td><td> </td><td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==1}<td> </td><td> </td><td> </td><td> </td>{/if} </table>

    • ベストアンサー
    • PHP
  • PHP(smarty)での切り捨て計算について

    PHP(smarty)での消費税端数計算で、切り捨て計算方法について教えて下さい。 プログラムをある会社に依頼し、納品を頂いたのですが、PHPのsmartyを使用したテンプレートファイルで表示デザインなどの変更ができるとのことで、にわかプログラマの私が修正を加えようとしているのですが、消費税の切り捨て処理を行いたいのですが、エラーが出てしまいます。計算としては17750円を単に*0.05するとの消費税は887.5円となるので、それを887円となるように切り捨てたいのです。floorを使い、下記プログラムの {$customer_margin_all*0.05} の部分をfloor.({$customer_margin_all*0.05})などとしてみましたが、ブラウザで表示してみるとsmartyのエラーが表示されてしまいます。 私の根本的な勘違いなのか、どのようなことで切り捨て計算ができないのかわからずに困っています。 お分かりの方、お知恵をお借りできますでしょうか? 上代-マージン=請求額 20000円-2250円=17750円 請求額小計: 17750円 消費税: 887.5円 合計: 18637.5円 <table border="0" bgcolor="#cccccc" cellspacing="1" cellpadding=5> <tr> <td><b>上代</b></td> <td><b>マージン</b></td> <td><b>請求額</b></td> </tr> {foreach from=$arr_list item="item"} <tr> <td>{$item.joudai}円</td> <td>{$item.customer_margin}円</td> <td>{$item.joudai-$item.customer_margin}円</td> </tr> {assign var='customer_margin_all' value=$customer_margin_all+$item.joudai-$item.customer_margin} {/foreach} <tr> <td COLSPAN="2">小計</td> <td >{$customer_margin_all}円</td> </tr> <tr> <td COLSPAN="2">消費税</td> <td >{$customer_margin_all*0.05}円</td> </tr> <tr> <td COLSPAN="2">合計</td> <td >{$customer_margin_all*1.05}円</td> </tr> </table>

    • ベストアンサー
    • 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 列行数制御方法

    こんにちは、 下記文章があるのですが、今の状態だと データ分だけ行数が増えていくので、これを 3列表示したら改行して、次の行で表示としたいのですが、 どのようなロジックで行えばよいのでしょうか? <table class="outer"> <{foreach item="value" from=$values}> <tr> <td> <input type="checkbox" name="checked[]" value="<{$value.id}>" <{$value.checked}> > <{$value.title}> </td> </tr> <{/foreach}> </table>

    • ベストアンサー
    • PHP
  • PHP PEARのPagerをSmartyで使う

    初めまして、PEARのPagerを勉強していたのですが、Smartyで実装したいと思い試行錯誤していたらうまく表示されなくて困っています。 【PHP】 //PEARの読み込み、Smartyクラスの読み込み、MySQLクラスの読み込みは省略 //上記は正常に動作しています。 // テーブルの行数を数えます $sql = "SELECT COUNT(*) AS cnt FROM table_name;"; //レコード開始位置指定 $start = 0; //最大レコード数を指定 $limit = 10; // データを取り出すSQLを実行します。 $sql = "select * from table_name ORDER BY no DESC LIMIT $start, $limit"; $result = mysql_query($sql); while($rows = mysql_fetch_array($result)){ $res_data[]=array("title"=>$row['title'],"name"=>$row["name"],"no"=>$row["no"]); } //Pagerのパラメータを指定 $params = array( "itemData" => $res_data, "totalItems" => $limit, "perPage" => 6, "delta" =>5, "mode" =>"Jumping" ); //パラメータの連想配列を受け取る $pager =& Pager::factory($params); // ページデータの割り当て処理 foreach($pager->getPageData() as $item){ $res_data_page[] = $item; } //戻る/次/最初/最後のリンクとページリンクを返す $link = $pager -> getLinks(); //現在のページ番号を返す $currentPageID = $pager -> getCurrentPageID(); // テンプレート用に変数を設定 $smarty->assign('data', $res_data_page); $smarty->assign('pageNavi', $link['all']); $smarty->assign('currentPage', $currentPageID); ■tpl <table border="1"> <tr> <th>名前</th> <th>NO</th> <th>タイトル</th> </tr> {foreach from=$data item=i} <tr> <td>{$i.name}</td> <td>{$i.no}</td> <td>{$i.title}</td> </tr> {/foreach} </table> <p>{$pageNavi}</p> <p>{$currentPage}ページを表示</p> 参考URL http://meerweb.blog7.fc2.com/blog-entry-101.html データベースへの接続は出来ていて、ページャー機能は動いています。 取得しているデータ数もあっているのですが、全部1行目のデータだけ表示されます。 どなたか原因が分かる方いらっしゃいましたら、是非ともご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • foreachの2重ループ

    PHPのSmartyで2重ループがうまくできません。 表をforeachで作成したいです。 縦、横のセル数は変数で可変にしたいため、$oneと$twoにはそれぞれ毎回違う値が入る予定です。 <table border="1"> {foreach from=$one item="one"} <tr> {foreach from=$two item="two"} <td> {$two} </td> {/foreach} </tr> {/foreach} </table> 上記のプログラムだと、内側のループが1回しか回りません。 foreachの2重ループの仕方が間違っているのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう