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

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

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

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

PHP

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

CakePHP

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

Q&A

解決済

3回答

2342閲覧

index.ctpに書いた変数をcontrollerの中に書き直す記述の仕方が知りたい。

amakusa

総合スコア176

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2015/06/25 06:54

編集2015/06/25 06:56

皆さんお疲れ様です。
先ほどこちらの質問をさせていただいた者です。

foreachの中でtableを回すとき、そのtable内のstatusの値の表示を変更したい。

一先ず、ちゃんと表示できてよかったと安堵していたのですが、このforeachの文を書くのをviewのindex.ctpの方に書いており、変数などはcontrollerの方に書き直したいと考えています。(この改善案で合っているのか正直わかりません。)

現在、controllerの方には

lang

1<?php 2 public function index() { 3 $this->set('collection', $this->Report->find('count')); 4 $timeline = $this->Report->find('all', array('order' => array('created' => 'DESC'))); 5 $this->set('res', $timeline); 6 }

こう書いておりまして、
index.ctpには

lang

1 <table summary="一覧" border="1"> 2 <tr><th>A</th><th>B</th><th>C</th><th>D</th></tr> 3 <?php 4 foreach($res as $doc) { 5 $id = $doc["Report"]["id"]; 6 7 if($doc["Report"]["status"] == 0){ 8 $status = "未処理"; 9 }else if($doc["Report"]["status"] == 1){ 10 $status = "処理済み"; 11 } 12 13 $modified = $doc["Report"]["modified"]->toDateTime()->format('Y-m-d H:i:s'); 14 $created = $doc["Report"]["created"]->toDateTime()->format('Y-m-d H:i:s'); 15 16 echo "<tr id='$id'> 17 <td>$status</td> 18 <td><a href='../details/index?id=$id'>$id</a></td> 19 <td>$modified</td> 20 <td>$created</td> 21 </tr>\n"; 22 } 23 ?> 24 </table>

と、このように書いています。
途中で、$modifiedや$createdなど、変数を定めているのが、セキュリティ的によくないと指摘を受けた?(なぜだめかあんまりわかっていない)ので表示は変わらずにcontrollerの方にうまく書きたいと思っています。
ただforeachのところで$res as $docなどの記述がしているところがあるため、どうcontrollerに書けばよいか困っています。

ご助力お願いいたします。

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

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

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

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

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

guest

回答3

0

日付のフォーマット(Y-m-d H:i:s)がシステム内で共通の日付フォーマットである場合はModelのafterFindなどで処理してしまってもよいかもしれません。

lang

1// Report.php 2public function afterFind($results, $primary = false) { 3 foreach ($results as $key => $val) { 4 if (isset($val[$this->alias]['created'])) { 5 $results[$key][$this->alias]['created'] = $val['created']->toDateTime()->format('Y-m-d H:i:s'); 6 } 7 if (isset($val[$this->alias]['modified'])) { 8 $results[$key][$this->alias]['modified'] = $val['modified']->toDateTime()->format('Y-m-d H:i:s'); 9 } 10 } 11 return $results; 12}

ModelでなくControllerでやる場合はゴリゴリforeachを書いていくしかないかと思います。。
foreachでリファレンスはforeach($timeline as &$value)としてやるとしっかり動きます。

lang

1 public function index() { 2 $this->set('collection', $this->Report->find('count')); 3 $timeline = $this->Report->find('all', array('order' => array('created' => 'DESC'))); 4 $timeline = Hash::extract($timeline, '{n}.Report'); 5 foreach($timeline as &$value) { 6 $value['created'] = $value['created']->toDateTime()->format('Y-m-d H:i:s'); 7 $value['modified'] = $value['modified']->toDateTime()->format('Y-m-d H:i:s'); 8 9 } 10 $this->set('res', $timeline); 11 $this->set('status', array('0' => '未処理', '1' => '処理済み')); 12 }

lang

1<table summary="一覧" border="1"> 2 <tr><th>A</th><th>B</th><th>C</th><th>D</th></tr> 3 <tr id="<?php echo $doc['id']?>"> 4 <td><?php echo $status[$doc['status']]?></td> 5 <td> 6 <a href="../details/index?id=<?php echo $doc['id']?>"><?php echo $doc['id']?></a> 7 </td> 8 <td><?php echo $doc['modified']?></td> 9 <td><?php echo $doc['created']?></td> 10 </tr> 11</table>

投稿2015/07/12 16:12

編集2015/07/13 00:01
ShoheiTai

総合スコア897

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

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

0

コントローラ内で処理するのであれば、以下のように別途フォーマットするメソッドを通してはいかがでしょうか?
viewは、フォーマットして得た値を表示するように修正が必要になります。

lang

1 public function index() { 2 $this->set('collection', $this->Report->find('count')); 3 $reportList = $this->Report->find('all', array('order' => array('created' => 'DESC'))); 4 $this->set('res', $this->formattedReportList($reportList)); 5 } 6 7 private function formattedReportList($reportList) { 8 if (count($reportList) === 0) { 9 return $reportList; 10 } 11 12 $result = array(); 13 foreach ($reportList as $line) { 14 $report = $line['Report']; 15 if ($report['status'] == 0){ 16 $status = '未処理'; 17 }else if($report['status'] == 1){ 18 $status = '処理済み'; 19 } 20 $result[] = array( 21 'id' => $report['id'], 22 'status' => $status, 23 'modified' => $report['modified']->toDateTime()->format('Y-m-d H:i:s'), 24 'created' => $report['created']->toDateTime()->format('Y-m-d H:i:s'), 25 ); 26 } 27 28 return $result; 29 }

$modifiedと$createdの件は、直接ユーザが入力した値が登録されてあるのでしたら
好ましくないとは思いますが、おそらくシステム的に登録した値ですよね?
それであればセキュリティ上うんぬんというのは理由がよく分からないですね。

※ 動作の確認はしてません。

投稿2015/06/25 09:21

編集2015/06/25 09:24
icham

総合スコア559

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

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

0

ベストアンサー

こんな感じでできるかも・・・

$this->set('collection', $this->Report->find('count'));
$timeline = $this->Report->find('all', array('order' => array('created' => 'DESC')));

// リファレンス渡しを利用して、配列内のデータを上書き
foreach(&$timeline as $k => $v) {
$timeline[$k]['Report']['status'] = '未処理';
// $timeline[$k]['Report']['statusstr'] = '未処理';
if($timeline['Report']['status'] == 1)
$timeline[$k]['Report']['status'] = '処理済み';
// $timeline[$k]['Report']['statusstr'] = '処理済み';
}

$this->set('res', $timeline);

※でもこのやり方だと、statusの値を上書きしてしまうので注意して下さい。
statusの値をつぶしたくないのであれば、新しい連想配列statusstrを利用するようにする。
その場合取得する際は、$doc["Report"]["statusstr"] になるので注意


$modifiedや$createdですが何でかな?
変数予測されやすいからかな?

ちなみにだけど、

$modified = $doc["Report"]["modified"]->toDateTime()->format('Y-m-d H:i:s');
$created = $doc["Report"]["created"]->toDateTime()->format('Y-m-d H:i:s');

いらないと思います。

echo "<tr id='$id'>
<td>$status</td>
<td><a href='../details/index?id=$id'>$id</a></td>
<td>$doc["Report"]["modified"]->toDateTime()->format('Y-m-d H:i:s')</td>
<td>$doc["Report"]["created"]->toDateTime()->format('Y-m-d H:i:s')</td>
</tr>\n";

で大丈夫だと思うけど。。。

投稿2015/06/25 07:28

takayukiinaba

総合スコア1158

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

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

amakusa

2015/06/25 08:23

うまくいきません(;;) 正直、このままでも問題ないことはないんですかね?
takayukiinaba

2015/06/25 08:28

foreach(&$timeline as $k => $v) { $v['Report']['status'] = '未処理'; // $v['Report']['statusstr'] = '未処理'; if($v['Report']['status'] == 1) $v['Report']['status'] = '処理済み'; // $v['Report']['statusstr'] = '処理済み'; } すみません、値の参照値が間違っていました。
amakusa

2015/06/25 08:47

返信本当にありがとうございます! リファレンス渡しの&がエラーで引っかかるようです。 あと、$modifiedと$createdは直接$doc["Report"][~~]~~で書いたところ、""についてエラーをもらってしまい解決となりませんでした。
takayukiinaba

2015/06/25 08:50

なるほどですね。 > あと、$modifiedと$createdは直接$doc["Report"][~~]~~で書いたところ、""についてエ > ラーをもらってしまい解決となりませんでした。 であれば、わざわざコントローラ内に記述しなくても良さげですね。 もしかするとですが、上記のようなコーディング規約的なものが存在しているのでは??? と思いますので確認してみては如何でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問