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

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

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

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

CakePHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Smarty

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

Q&A

解決済

1回答

9640閲覧

Smartyテンプレート上からjavascriptへ連想配列を渡したいです

Casca

総合スコア6

PHP

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

CakePHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Smarty

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

0グッド

0クリップ

投稿2017/06/03 12:05

###前提・実現したいこと
PHP(CakePHP3) + Smartyで料理レシピツールを作成しています。
やりたいこととしては、
以下のようにforeachによってaタグが並んでいるのですが、
aタグをクリックした時にonFoodNameClickイベントを通して連想配列をjs側に送りたいです。
送る方法としてはどのようなやり方があるのでしょうか?
よろしくお願いします。

HTML

1<div class="foodList"> 2 {foreach $response.masterFood as $index => $food} 3 <div class="item"> 4 <a id="foodInfo{$index}" class="header" onclick="OnFoodNameClick({$index});" 5 data-id="{$food.id}" 6 data-name="{$food.name}" 7 data-description="{$food.description}"> 8 {$food.name} 9 </a> 10 </div> 11 {/foreach} 12</div>

PHP側のコントローラは以下のようになっております。

PHP

1public function index() 2{ 3 $masterFood = array(0 => array("aaa", "iii"), 1 => array("aaa","iii")); 4 $masterRecipe = array(0 => array("aaa", "iii"), 1 => array("aaa","iii")); 5 $response = array( 6 "masterFood" => $masterFood, 7 "masterRecipe" => $masterRecipe, 8 ); 9 $this->set('response', $response); 10}

###試したこと

HTML

1<div class="foodList"> 2 {foreach $response.masterFood as $index => $food} 3 <div class="item"> 4 <a id="foodInfo{$index}" class="header" onclick="OnFoodNameClick({$index});" 5 data-id="{$food.id}" 6 data-name="{$food.name}" 7 data-description="{$food.description}"> 8 data-recipe="{$masterRecipe}" /* このようにして指定してもArrayとなってしまいダメでした */ 9 {$food.name} 10 </a> 11 </div> 12 {/foreach} 13</div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

PHP

1public function index() 2{ 3 $masterFood = array(0 => array("aaa", "iii"), 1 => array("aaa","iii")); 4 $masterRecipe = array(0 => array("aaa", "iii"), 1 => array("aaa","iii")); 5 $response = array( 6 "masterFood" => json_encode( $masterFood ), 7 "masterRecipe" => json_encode( $masterRecipe ), 8 ); 9 $this->set('response', $response); 10}

HTML

1<div class="foodList"> 2 {foreach $response.masterFood as $index => $food} 3 <div class="item"> 4 <a id="foodInfo{$index}" class="header" onclick="OnFoodNameClick({$index},'{$masterRecipe}');" 5 data-id="{$food.id}" 6 data-name="{$food.name}" 7 data-description="{$food.description}"> 8 {$food.name} 9 </a> 10 </div> 11 {/foreach} 12</div>

JavaScript

1function OnFoodNameClick( i, r ) { 2 var obj = JSON.parse( r ); 3}

【PHP: json_encode - Manual】
http://php.net/manual/ja/function.json-encode.php

【JSON.parse() - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

投稿2017/06/03 12:17

kei344

総合スコア69400

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

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

Casca

2017/06/03 13:14

回答頂きまして有難うございます。 onclick="OnFoodNameClick({$index},'{$masterRecipe}');" の '{masterRecipe}' を追記すると、クリック後以下のようなエラーがでてしまうようになってしまいました。 Uncaught SyntaxError: Invalid or unexpected token PHP側でjson_encodeしたデータがおかしいのでしょうか。 また、$masterRecipeが多くの要素数を持つ為、foreachで指定してしまうと重くなってしまうようです。なにかうまいこと回避する方法ございませんでしょうか。
kei344

2017/06/03 13:19

> OnFoodNameClick({$index},'{$masterRecipe}');" この部分の出力結果を提示してください。
Casca

2017/06/03 13:30

非常に長くなってしまいますが、このようになっております。 <a id="foodInfo1" class="header" onclick="OnFoodNameClick(1, '{" 1000":{"id":1000,"name":"\u9152\u306e\u6d44\u6c34","phase":1,"description":"\u304a\u9152\u95a2\u9023\u6599\u7406\u306e\u4e3b\u306a\u6750\u6599","created_at":"2017-06-02t21:00:00","updated_at":"2017-06-02t21:00:00","deleted_at":null,"recipes":[{"id":1,"master_food_id":1000,"material_name":"\u767a\u9175\u5264","required_num":1,"material_id":0},{"id":2,"master_food_id":1000,"material_name":"\u7a40\u7269\u7c89\u985e","required_num":1,"material_id":0},{"id":3,"master_food_id":1000,"material_name":"\u30d5\u30eb\u30fc\u30c4\u985e","required_num":1,"material_id":0}]},"1001":{"id":1001,"name":"\u30c9\u30ec\u30c3\u30b7\u30f3\u30b0","phase":1,"description":"\u6599\u7406\u306e\u30b5\u30d6\u6750\u6599","created_at":"2017-06-02t21:00:00","updated_at":"2017-06-02t21:00:00","deleted_at":null,"recipes":[{"id":4,"master_food_id":1001,"material_name":"\u30aa\u30ea\u30fc\u30d6\u30aa\u30a4\u30eb","required_num":1,"material_id":0},{"id":5,"master_food_id":1001,"material_name":"\u5375","required_num":1,"material_id":0},{"id":6,"master_food_id":1001,"material_name":"\u5869","required_num":2,"material_id":0},{"id":7,"master_food_id":1001,"material_name":"\u6599\u7406\u7528\u30df\u30cd\u30e9\u30eb\u30a6\u30a9\u30fc\u30bf\u30fc","required_num":1,"material_id":0}]},            // ~~データ省略~~// "1091":{"id":1091,"name":"\u30de\u30b4\u30ea\u30a2\u6d77\u9bae\u5b9a\u98df","phase":4,"description":"90\u5206\u9593\u3001\r\n\u6700\u5927\u6240\u6301\u91cd\u91cf+50lt\r\n\u79fb\u52d5\u901f\u5ea6+2\u6bb5\u968e\r\n\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u78ba\u7387+2\u6bb5\u968e\r\n\u6700\u5927hp+100","created_at":"2017-06-02t21:00:00","updated_at":"2017-06-02t21:00:00","deleted_at":null,"recipes":[{"id":378,"master_food_id":1091,"material_name":"\u5927\u6b63\u6d77\u8001\u30b5\u30e9\u30c0","required_num":1,"material_id":1087},{"id":379,"master_food_id":1091,"material_name":"\u5927\u6b63\u6d77\u8001\u84b8\u3057","required_num":1,"material_id":0},{"id":380,"master_food_id":1091,"material_name":"\u30ab\u30ad\u306e\u30c1\u30b8\u30df","required_num":1,"material_id":1089},{"id":381,"master_food_id":1091,"material_name":"\u30ed\u30d6\u30b9\u30bf\u30fc\u30d0\u30bf\u30fc\u713c\u304d","required_num":1,"material_id":1090},{"id":382,"master_food_id":1091,"material_name":"\u679c\u5b9f\u9152","required_num":2,"material_id":1015}]}}');"="" data-food_id="1001" data-food_name="ドレッシング" data-food_description="料理のサブ材料">ドレッシング</a>
kei344

2017/06/03 13:38

onclick='OnFoodNameClick({$index},`{$masterRecipe}`);' これでどうでしょう。 そもそも別の箇所でまとめてJSONとして渡して、$indexから内容を探しに行く、という実装のほうが良いとは思います。
Casca

2017/06/03 14:02

素早い回答有難うございます。 Uncaught SyntaxError: Unexpected token in JSON at position 2596 at JSON.parse (<anonymous>) at OnFoodNameClick (common.js:39) at HTMLAnchorElement.onclick (index:66) 次はこのようなエラーでJSON.parseが失敗してしまうようです。 common.js:39は var obj = JSON.parse(recipes); このようになっております。 確かにそうですね・・・。ご助言頂きました方法で方向性を変えて実装してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問