前提・実現したいこと
CodeIgniterのコントローラーで取得したDBのデータをsmartyのテンプレートで使いたいです。
環境は、
CentOS6.4-x86_64
CodeIgniter2.2.6
mysql5.5.48
php5.4.45
smarty3.1.29
を使用しています。
発生している問題・エラーメッセージ
上記の通り、CodeIgniterのコントローラーで取得したDBのデータをsmartyのテンプレートで使いたいのですが、私の書いたコードでは取得できなく困っています。
正しい記述方法をご存知の方、ご教授いただけないでしょうか・・・?
よろしくお願い致します。
2016/04/10 1:11 追記
申し訳ありません、一部ソースの添付間違いがあったため修正しました。
改めてお願い致します。
該当のソースコード
●sample.php(コントローラー)
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once(dirname(__FILE__).'/MY_Controller.php');
class Sample extends MY_Controller {
public function __construct()
{
parent::__construct();
}
// 設定画面
public function index()
{
$tpl = 'index';
// ユーザーデータを取得
$data['user_data'][] = array('user_id' => $row->user_id, 'user_name' => $row->user_name);
$data = array();
foreach ($user_data_query->result() as $row)
{
$data[] = array($row->user_id => $row->user_name);
}
$smarty = new Smarty();
$smarty->assign('user_data', 'data');
print_r($data);
$this->view($tpl . '.tpl', $data);
}
// 結果画面
public function result()
{
$tpl = 'result';
$this->view($tpl . '.tpl');
}
}
?>
●index.tpl
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form method="post" action="/sample/result">
<label for="user_select">ユーザー情報</label>
<select id="user_select">
{foreach from=$user_data key=user_id item=user_name}
<option value="{$user_id}">{$user_name}</option>
{/foreach}
</select><br>
<input type="submit" value="確認">
</form>
</body>
</html>
試したこと
【2016/04/10 12:52 追加】
・配列「$data」の形を修正
・変数「user_data」に格納する値の記述方法を修正
●sample.php
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once(dirname(__FILE__).'/MY_Controller.php');
class Sample extends MY_Controller {
public function __construct()
{
parent::__construct();
}
// 設定画面
public function index()
{
$tpl = 'index';
// ユーザーデータを取得
$user_data_query = $this->db->query('SELECT * FROM tbl_m_user');
$data = array();
foreach ($user_data_query->result() as $row)
{
// 配列の形を修正
$data[$row->user_id] = $row->user_name;
}
$smarty = new Smarty();
// 格納する値の指定を修正
$smarty->assign('user_data', $data);
print_r($user_data);
$this->view($tpl . '.tpl', $user_data);
}
// 結果画面
public function result()
{
$tpl = 'result';
$this->view($tpl . '.tpl');
}
}
?>
【2016/04/17 8:33 追加】
・$dataをassignの指定先を修正
●sample.php
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once(dirname(__FILE__).'/MY_Controller.php');
class Sample extends MY_Controller {
public $user_data;
public function __construct()
{
parent::__construct();
}
// 設定画面
public function index()
{
// ユーザーデータを取得
$user_data_query = $this->db->query('SELECT * FROM tbl_m_user');
$data = array();
foreach ($user_data_query->result() as $row)
{
$data[$row->user_id] = $row->user_name;
}
print_r($data);
$this->smarty->assign('user_data', $data);
$this->smarty->display('index.tpl');
}
// 結果画面
public function result()
{
$this->view('result.tpl');
}
}
?>
補足情報(言語/FW/ツール等のバージョンなど)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
【原因】
・$smartyを初期化していたこと
・$dataのassign先が間違っていたこと。
【解決方法】
$smartyの初期化設定をはずし、Sampleクラス自身に予め定義されていた$smartyに対して$dataを格納することで、該当の配列の内容がviewで利用できるようになった。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
ビュー側で表示しようとしている$user_dataの中身が
期待している形式になっていないのだと思います。
//想定
array(
user_id => user_name,
user_id => user_name,
...
)
//実際
array(
0 => array(user_id => user_name),
1 => array(user_id => user_name),
...
)
原因は配列に要素を追加している箇所で、
$data[] = array($row->user_id => $row->user_name);
配列[] = 追加要素という書き方だと、添え字は0から順に自動で振られて
その中にarray($row->user_id => $row->user_name)が詰められていく形になります。
添え字をuser_idにして中身をuser_nameにするならこうなります。
$data[$row->user_id] = $row->user_name;
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
nnssn
2016/04/10 01:30
ソースーコードの部分を```php と ``` で囲んでみてください。色付けされて見やすい表示になります。
sota_u
2016/04/10 01:39
nnssn様
teratailでの見やすい表記方法についてアドバイスいただきありがとうございます。
教えて頂いたとおり修正いたしました。