🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

Q&A

解決済

1回答

1685閲覧

Smartyテンプレート内での計算

yukiko1025

総合スコア16

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

0グッド

0クリップ

投稿2019/10/29 06:43

Smartyをテンプレートとして使用したPHPでの発注フォームを作っています。

商品群をデータベースから取得し、{section}で一覧表示をさせているのですが、
各行で商品ごとの小計を計算させる箇所でエラーが出てしまいます。

Warning: Smarty error: math: parameter a: is not numericと表示されており、
「数量」欄の入力ボックスへ数字を入力しても、「小計」欄に数字は表示されません。

小計以外のデータベースから配列として持ってきたレコード内容の表示までは、ズレや抜け、文字化けなどなく動作しています。
また、入力された注文内容を次のページへPOSTする動きを考えていますが、まだ作成していないためinputなど抜けている動作があります。

また、ページ内での計算実行の処理をさせるボタンなどは作っておりませんが、
テンプレート内で完結するようリアルタイムで入力した値の計算をさせるのは、JQueryなどを使わないと難しいでしょうか?

Smartyを触るのが初めてなので、tplソースの書き方など根本的な誤りがあったらすみません。
みなさまの知恵をお力をお借りできれば幸いです。

tpl

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<meta name = "format-detection" content = "telephone=no"> 6<link rel="stylesheet" href="./common/css/jquery.mobile-1.1.0.min.css" /> 7<link rel="stylesheet" href="./common/css/style.css"> 8<link rel="stylesheet" href="./common/css/button.css"> 9<script src="http://code.jquery.com/jquery.min.js"></script> 10 11{literal} 12<script type="text/javascript" charset="utf-8"> 13</script> 14{/literal} 15 16</head> 17 <body class="ui-mobile-viewport"> 18 <div data-role="header" class="ui-header ui-bar-a" role="banner"> 19 <h1 class="ui-title" tabindex="0" role="heading" aria-level="1">{$TITLE}</h1> 20 </div> 21 22<br> 23 24 <div> 25 <table class ="center-position" border="1"> 26 <!-- 見出し項目表示箇所 Start --> 27 <tr style=color:"#ffffff" bgcolor="#000000" height=35px> 28 <th width=75>メーカー</th> 29 <th width=250>商品名</th> 30 <th width=100>単価(円)</th> 31 <th width=50>数量</th> 32 <th width=100>小計</th> 33 </tr> 34 <!-- 見出し項目表示箇所 End --> 35 36 <!-- 検索データ表示箇所 Start --> 37 {section name=dbList loop=$result} 38 <tr height=35px> 39 <td class="display-center">{$result[dbList].MAKER}</td> 40 <td class="display-left">{$result[dbList].NAMAE}</td> 41 <td class="display-right">{$result[dbList].KINGAKU}</td> 42 <td center"><input type="number" name="suryo" style="width:100; height:25px;font-size: 20px;"></td> 43 {assign var="element1 value={$result.KINGAKU}} 44 {assign var="element2 value="suryo"} 45 {math equation=a+b a=$element1 b=$element2 assign=syokei} 46 <td class="display-right">{$syokei}</td> 47 </tr> 48 {/section} 49 <!-- 検索データ表示箇所 End --> 50 </table> 51 <br> 52 </form> 53 </div> 54 55 </body> 56</html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

varの値が"閉じられていないようですが…
構文に自身がないときはドキュメントを確認しましょう。
Smarty:assign

テンプレート内で完結するようリアルタイムで入力した値の計算をさせるのは、JQueryなどを使わないと難しいでしょうか?

むしろPHP不要で、JavaScriptの範疇になります。
サーバーに情報を送信し、その情報でDBなどにアクセスしたりするのであれば
PHPの出番になります。
「リアルタイムにPHPもからめて」となるとJavaScriptでAjaxによりPHPを実行させるのもありますが、
単に計算させるためだけなら非効率です(学習のためなら構いませんが)

蛇足。
view内で計算するのではなくコントローラー時に計算しておいてviewでは出力するだけの方がコードも見やすく役割分担になると思います。
あまりviewに処理ロジックを書くのは好ましくありません。

投稿2019/10/29 07:05

編集2019/10/29 07:10
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukiko1025

2019/10/29 08:24

すみません、var=""の閉じ忘れは完全に見落としでした。 今回のコードではmySQLからのデータ取得→書き込みの動作をメインにしたいためphpを取り入れています。 リアルタイムで小計を算出する必要性は皆無で「簡単にできるなら」くらいの心情だったため、 入力された値をPOSTし、次ページでそれをもとに計算する方式に仕様を変更してみたいと思います。 一応、以下のように書き換えを考えています。 <div> <table class ="center-position" border="1"> <form method="post" action="toner_02.php"> <!-- 見出し項目表示箇所 Start --> <tr style=color:"#ffffff" bgcolor="#000000" height=35px> <th width=75>メーカー</th> <th width=250>商品名</th> <th width=100>単価(円)</th> <th width=50>数量</th> </tr> <!-- 見出し項目表示箇所 End --> <!-- 検索データ表示箇所 Start --> {section name=dbList loop=$result max=30} <tr height=35px> <td class="display-center">{$result[dbList].MAKER}</td> <td class="display-left">{$result[dbList].NAMAE}</td> <td class="display-right">{$result[dbList].KINGAKU}</td> <td center"><input type="number" name="suryo" style="width:100; height:25px; font-size: 20px;"></td> </tr> {/section} <!-- 検索データ表示箇所 End --> </table> <br> <button type="submit" name="" value="" class="moveButton">確認画面 &raquo;</button> </form> </div>
yukiko1025

2019/11/18 04:53

リアルタイムでのページ内での算出から、次ページへ入力された値をPOSTする仕様に変更しました。
m.ts10806

2019/11/18 05:00

あの、いえ 「考えています」の結果がどうなったのかなと
yukiko1025

2019/11/18 06:59

申し訳ありません、勘違いしておりました。 上記のソースで、<input>タグ~のname属性のみ"suryo[]”という配列形式に変更しましたが、 正常に配列形式でデータのPOSTができました。 その上で、次のphp内で配列データを計算する形で小計を出す形で解決しています。
m.ts10806

2019/11/18 08:59

了解です。ヒントになったようで何よりです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問