質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1305閲覧

CakePHP3:フォームでの自動計算の実装方法について

michael_

総合スコア13

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2019/04/10 10:15

前提

現在Cakephp3系にてフォーム機能の実装をしております。
フォーム内に、項目の自動計算部分を設けたいのですが、記述方法がわからずで困っております。

やりたい事

履歴A + 履歴B + 履歴C = 合計
手動入力+手動入力+手動入力=自動計算

現在は全て手打ちで、データベースへポストしているのですが、合計部分を自動入力に変えて
同様にポストできるように変更できればと思っております。

現在記述ずみの該当のソースコード

<h2>購入履歴</h2> <table> <tbody> <tr> <th class="form_ttl">履歴A</th> <td class="required_none"> <div class="input_wrap"> <?= $this->Form->text('priceA',['label' => false], ['required' => true]); ?> </div> </td> <th class="form_ttl">履歴B</th> <td class="required_none"> <div class="input_wrap"> <?= $this->Form->text('priceB',['label' => false], ['required' => true]); ?> </div> </td> <th class="form_ttl">履歴C</th> <td class="required_none"> <div class="input_wrap"> <?= $this->Form->text('priceC', ['label' => false], ['required' => true]); ?> </div> </td> <th class="form_ttl">合計</th> <td class="required_none"> <div class="input_wrap"> <?= $this->Form->text('total', ['label' => false], ['required' => true]); ?> </div> </td> </tr> </tbody> </table>

試したこと

検索するとjQueryでの実現方法などは出るのですが、自由記述ではなくプルダウンでの実装等でした。
どういった形で機能を実現するのが良いかアドバイス含めご教授いただければと思い、初めて投稿させて頂きました。
何卒宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

合計を変化させねばならないのは、履歴A,B,Cのどれかの内容が変化したときです。
従って jQuery で、対象の input の内容が変化したとき(change イベントが発火したとき)に演算をすればよいのです。

JavaScript

1$("input[name^=price]").on("change", function() { 2 var priceA = $("input[name=priceA]").val() * 1; 3 var priceB = $("input[name=priceB]").val() * 1; 4 var priceC = $("input[name=priceC]").val() * 1; 5 $("input[name=total]").val(priceA + priceB + priceC); 6});

投稿2019/04/10 10:29

tacsheaven

総合スコア13703

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

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

michael_

2019/04/10 11:43 編集

ご回答ありがとうございます。 現在教えて頂きました記述を元に手がかりが掴めそうです。 ### スクリプト部分 <?= $this->Html->scriptStart(['block' => true]) ?> $(".kawaru").on("change", function() { var priceA = $("input[name=price_test1]").val() * 1; var priceB = $("input[name=test_name2]").val() * 1; var priceC = $("input[name=other_test3]").val() * 1; $("input[name=total]").val(priceA + priceB + priceC); }); <?= $this->Html->scriptEnd() ?> ### コード部分 <h2>購入履歴</h2> <table> <tbody> <tr> <th class="form_ttl">履歴A</th> <td class="required_none"> <div class="input_wrap"> <?= $this->Form->text('price_test1',['label' => false, 'class' => 'kawaru'], ['required' => true]); ?> </div> </td> <th class="form_ttl">履歴B</th> <td class="required_none"> <div class="input_wrap"> <?= $this->Form->text('test_name2',['label' => false, 'class' => 'kawaru'], ['required' => true]); ?> </div> </td> <th class="form_ttl">履歴C</th> <td class="required_none"> <div class="input_wrap"> <?= $this->Form->text('other_test3', ['label' => false, 'class' => 'kawaru'], ['required' => true]); ?> </div> </td> <th class="form_ttl">合計</th> <td class="required_none"> <div class="input_wrap"> <?= $this->Form->text('total', ['label' => false], ['required' => true]); ?> </div> </td> </tr> </tbody> </table> 現在このように変更して記述をしてみております。 ただ、ブラウザのコンソールログで直接記載すると、動くのですが, 実際にコードとして記述して確認をすると動作しません。 初歩的な jQueryの読み込みなどは確認したのですが、他に原因がわからず。 もしこちらも分かりましたらご教授いただければ幸いです。
tacsheaven

2019/04/10 23:43

イベントハンドラを登録するスクリプトが、HTMLレンダリングの終わる前、すなわち対象のエレメントがないときに動いてしまっているのでしょう。 $.when($.ready).then(function() {...}) を使って、HTML レンダリング終了後にイベントハンドラ登録スクリプトが動くようにしましょう。
michael_

2019/04/11 03:12 編集

ご返答ありがとうございます。 無事に解決いたしました。最終的に、 ーーーーーーーーーーーーーーー ### スクリプト部分 ーーーーーーーーーーーーーーー <?= $this->Html->scriptStart(['block' => true]) ?> $( function() { $(".●●●●").on("change", function() { var priceA = $("input[name=◇◇◇]").val() * 1; var priceB = $("input[name=◆◆◆]").val() * 1; var priceC = $("input[name=■■■]").val() * 1; $("input[name=□□□]").val(priceA + priceB + priceC); }); } ); <?= $this->Html->scriptEnd() ?> この形の記述で無事に動作させることができました。 $( function() { } ); これで囲っていなくて動いておりませんでした。 tacsheaven様、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問