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

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

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

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

JavaScript

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

Smarty

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

Q&A

解決済

2回答

818閲覧

PHP→smarty→外部jsでグラフ(chart.js)の表示方法

susumu_0414

総合スコア37

PHP

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

JavaScript

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

Smarty

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

0グッド

0クリップ

投稿2018/11/08 00:07

編集2018/11/08 00:41

Web開発初心者です。
PHPでデータを取得(配列)し、そのデータをもとにchart.jsでグラフ表示したいのですが、
PHPからsmartyへ配列は普通に渡せますが、smartyからJavaScript(外部ファイル)へ
どのように配列を渡せばよいのかがわかりません。
JavaScript外部ファイルはHTMLのheadで読み込んでいます。

初心者ですので具体的なソースコードを載せてもらえると助かります。
よろしくお願いします。

ご指摘がありましたので、こちらで試したサンプルソースを載せてみます。
下記のコードでは一度HTMLファイルにsmartyの配列をもとに
テーブル(表)を作成し、その表をjavascriptでもう一度読み込んで配列を作成し、
chart.jsのデータに設定しています。
しかし、コードが非常に長くなることと表からもう一度読み込むという部分が
回りくどく感じるため、直接配列をchart.jsのデータに設定したいのです。

JavaScript

1window.onload = function() { 2 //項目用の配列を定義 3 var array01 = []; //売上年 4 var array02 = []; //売上数量 5 var array03 = []; //売上合計 6 var array04 = []; //粗利合計 7 var array05 = []; //粗利率 8 //テーブルから値取得(売上年) 9 $('#tbl_result td.s_year').each(function(){ 10 var amount01 = $(this).find('span').text(); 11 array01.push(amount01); 12 }); 13 //テーブルから値取得(売上数量) 14 $('#tbl_result td.sum_suryo').each(function(){ 15 var amount02 = $(this).find('span').text(); 16 array02.push(amount02); 17 }); 18 //テーブルから値取得(売上合計) 19 $('#tbl_result td.sum_kingaku').each(function(){ 20 var amount03 = $(this).find('span').text(); 21 array03.push(amount03); 22 }); 23//テーブルから値取得(粗利合計) 24 $('#tbl_result td.sum_arari').each(function(){ 25 var amount04 = $(this).find('span').text(); 26 array04.push(amount04); 27 }); 28//テーブルから値取得(粗利率) 29 $('#tbl_result td.araritu').each(function(){ 30 var amount05 = $(this).find('span').text(); 31 array05.push(amount05); 32 }); 33 34 var complexChartOption = { 35 responsive: false, 36 scales: { 37 yAxes: [ 38 { 39 id: "y-axis-1", // Y軸のID 40 type: "linear", // linear固定 41 position: "left", // どちら側に表示される軸か? 42 scaleLabel : { 43 display: true, 44 labelString: '売上金額(円)', 45 }, 46 gridLines:{ 47 display : true, 48 }, 49 ticks: { 50 callback: function(label, index, labels) { 51 return label.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') +' 円'; 52 }, 53 }, 54 }, 55 { 56 id: "y-axis-2", 57 type: "linear", 58 position: "right", 59 scaleLabel : { 60 display: true, 61 labelString: '粗利率(%)', 62 fontColor :"#e61f4b", 63 }, 64 gridLines:{ 65 display : false, 66 }, 67 ticks: { 68 callback: function(label, index, labels) { 69 return label +' %'; 70 }, 71 }, 72 }, 73 ], 74 } 75 }; 76 77 var ctx = document.getElementById('graph').getContext('2d'); 78 79 var myChart = new Chart(ctx, { 80 type: 'bar', 81 data: { 82 labels: array01, 83 datasets: [ 84 { 85 label: '売上合計金額', 86 data: array03, 87 backgroundColor: "rgba(153,255,51,0.4)", 88 yAxisID: "y-axis-1", 89 }, 90 { 91 type: 'line', 92 label: '粗利率', 93 data: array05, 94 backgroundColor: "rgba(255, 0, 0, 0.51)", 95 borderColor : "#ff0000", 96 borderWidth : "1", 97 pointBackgroundColor : "#ff0000", 98 yAxisID: "y-axis-2", 99 lineTension: 0, 100 fill: false, 101 }, 102 ] 103 }, 104 options: complexChartOption, 105 }); 106};

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

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

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

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

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

m.ts10806

2018/11/08 00:22

この質問内容で具体的なコードなどは無理です。どのようなデータを渡すかによります。自身の試したコードや具体的なデータを提示してください。またサーバーサイドとクライアントサイドの関係性をきちんと理解しないことには今後の理解や成長が見込めませんし解決に時間ばかりかかるのでこの際きちんと理解するようにしてください
m.ts10806

2018/11/08 00:30

PHPで作った配列を外部JSで、と概念は全く同じなのでSmarty独自の問題はありません。Smartyも裏ではガリガリPHPで置換走ってるPHPそのものですしね
m.ts10806

2018/11/08 00:34

「外部jsでなければできる」のであれば外部jsでもできますので、その観点からも考えてみてください
guest

回答2

0

ベストアンサー

具体的なデータが提示されないのでひとつの考え方として参考にしてもらいたいのですが、

Smartyのいいところってロジックとか処理系統と画面表示部分を分離できる部分だと思うんですね。
そこであまり処理っぽいところが入ってくるとメリットを潰してしまってることにもなりますし「データをどう表示させよう」と考えるのは冗長にも思います。

そこでajaxを使うのはいかがでしょうか。
「phpからどうやってデータを渡すか」ではなく、「JavaScriptから必要なデータをphpに取りに行く」という考え方です。
php側はデータの配列をjson_encodeして返すだけ、JavaScript側はjsonオブジェクトを表示用(chart用)に整形するだけ、
と役割分担ができます。
Smarty関係なく、外部js、直js関係なくできますしね。

ご参考まで。

投稿2018/11/08 01:25

m.ts10806

総合スコア80850

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

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

ms5025

2018/11/08 01:53

0 >JavaScript側はjsonオブジェクトを表示用(chart用)に整形するだけ 個人的にはここもsmartyでtpl化して、 ajaxで形成されたviewをhtml形式を受けとり、 jsでは指定の場所にそのhtmlごと埋め込むほうがスマートかなと思います。 私もjsで形成は可読性も悪くなるかなと思います。 ごめんなさい、コメントに書くつもりが回答になってしまいました。。
m.ts10806

2018/11/08 02:15

質問者さんが何をどうやりたいのか今一つ分からない内容ですが、chartのdata部分をphpで作るのであればview不要じゃないです? viewにはchart置く箱だけ用意することになるので。 dataの形式次第ですが、ajaxで取ってきたデータそのままセットするだけにもできるのでそんなに冗長にはならないようにも思います
susumu_0414

2018/11/08 02:29

大変勉強になります。まだajaxに手を付けていませんので、 話についていけてないのが残念です。(なんとなく伝わってますが) まず、ajaxを勉強してみます。 どこかよいサイトとかありますか。いつも聞いてばかりですいません。
m.ts10806

2018/11/08 02:46

まずはhello worldから なのでphp ajax で検索して記事を試してください。 書き方にもトレンドがいちおうあるのでなるべく新しい日付の記事の方が好ましいですが、こうじゃなきゃできないというのはなくて、リクエストとレスポンスの考え方は同じなのでQiitaなどで評価数の多い記事を試していくといいです
ms5025

2018/11/08 02:59

すいませんchart.jsというのはグラフ作成ライブラリなんですね。 そのようなものがあるとは知りませんでした。 js側でガリガリ描画するおつもりかと思いまして。 それならviewで形成したほうが可読性もいいよと思ったわけですが、 そのようなライブラリがあるならAjaxでdataで受け取り、 chart.jsで形成がいいと思います。
m.ts10806

2018/11/08 03:11

ms5025さん はい。結構知られたライブラリですが、確かにこの質問内容だとライブラリ利用がこのライブラリを知らない人には伝わりにくいかもしれませんね。 そのあたりは質問者さんも色々とやりたいことと調べたことと試したことで整理がついてないところはあるのかもしれません。
guest

0

例えば 配列itemListを
tpl側でこのように表示したとして

<div class="list"> {foreach from=$itemList key=key item=detail } //この辺テーブルだったりなんだったり色々ですがとりあえず回答の為hiddenで <input type="hidden" class="detail_number" id="detail_number{$key}" name="detail_number[]" value="{$detail.detail_number}"> {/foreach} </div>

js側ではこんな感じで

$('.list').find('.detail_number').each(function (i) { var $val = $list.find('.detail_number') }

eachでループ処理する感じですかね。
配列として渡すというより、htmlの要素で回す感じで処理する事が多いです。
グラフ表示はすべてjsでされるんですか?

もし、グラフ表示部分は別tplにし、
ajaxで飛ばしてコントローラーで処理をして、その別tplをhtml形式で受け取る感じにする場合は、

var itemarray = []; foreach itemarray.push($val); /foreach

でitemarrayを飛ばしてあげるといいと思います。

投稿2018/11/08 00:35

ms5025

総合スコア292

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

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

ms5025

2018/11/08 00:44

すいません、js部間違えました $('.list').find('.detail_number').each(function (i) { var $val = $(this).val(); } です。この場合.detail_numberクラスをループしてるので、 中では$(this).val()で価がとれます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問