我正在使用MongoDB和FuelPHP。我成功连接到MongoDB并可以提取数据。我已经花了三天时间试图找出如何将数据注入视图。 我的观点是这样的:
<body>
<div class="middle">
<p><?php if (isset($_id)){echo $_id;} ?></p>
<p><?php if (isset($first_name)){echo $first_name;} ?></p>
<p><?php if (isset($last_name)){echo $last_name;} ?></p>
</div>
</body>
我的控制器是:
class Controller_Home extends Controller {
public function action_index()
{
$data['css'] = Asset::css(array('reset.css','main.css'));
$results = Model_Home::get_results();
//I thought all I have to do is this foreach loop and it would work
foreach($results as $row => $val){
$data = $val;
}
$this->response->body = View::factory('home/index', $data);
}
}
我的var_dump()是:
object(stdClass)#10 (2) {
[0]=>
array(5) {
["_id"]=>
object(MongoId)#13 (1) {
["$id"]=>
string(24) "4ef82a27b238f02ed9000000"
}
["cms"]=>
array(1) {
[0]=>
string(8) "Druapl_1"
}
["first_name"]=>
string(6) "Name_1"
["last_name"]=>
string(10) "Lst_Name_1"
["skills"]=>
array(3) {
[0]=>
string(6) "html_1"
[1]=>
string(5) "css_1"
[2]=>
string(8) "jQuery_1"
}
}
[1]=>
array(5) {
["_id"]=>
object(MongoId)#14 (1) {
["$id"]=>
string(24) "4ef81a0dcf163c7da3e5c964"
}
["cms"]=>
array(1) {
[0]=>
string(8) "Druapl_2"
}
["first_name"]=>
string(6) "Name_2"
["last_name"]=>
string(10) "Lst_Name_2"
["skills"]=>
array(3) {
[0]=>
string(6) "html_2"
[1]=>
string(5) "css_2"
[2]=>
string(8) "jQuery_2"
}
}
}
现在,它确实有效,但由于某种原因,我只能在视图中看到第一项:
4ef81a0dcf163c7da3e5c964
Name_2
Lst_Name_2
html_2
css_2
jQuery_2
Druapl_2
我认为在我的旧复仇形态循环中出现了严重的错误...... 请帮忙,这肯定会帮助我提高对对象,foreach循环和框架的理解。谢谢。
答案 0 :(得分:2)
试试这个:
foreach($results as $row => $val)
{
$data[$row] = $val;
}
也可以将完整的对象传递给模板,而不是先将其转换为数组。
答案 1 :(得分:1)
我不知道php,但在我看来,你正在迭代结果对象中的所有键值对:
foreach($results as $row => $val)
{
$data = $val;
}
为什么不说出
foreach($results as $obj)
{
$data = $obj
}
然后在视图中获取您想要的数据对象:
<?php if (isset($data['_id'])){echo $data['_id'];} ?>
同样,我不知道你是如何在php中做到的,但想法是你想循环结果然后访问每个对象的属性,而不是遍历属性。
更新:修复了一些代码,我假设燃料以某种方式将局部变量(如数据)传递给视图,但可能没有。
-Tyler
答案 2 :(得分:1)
我不熟悉FuelPHP,但好像你的$ data变量格式不正确。你有:
foreach($results as $row => $val){
$data = $val;
}
您很可能需要它(每次抓取新行时都会覆盖值):
foreach($results as $row => $val){
$data['results'][$row] = $val;
}
然后在你的观点中你应该有类似的东西(你没有迭代你的结果):
<body>
<div class="middle">
<?php foreach($results as $result): ?>
<p><?php if (isset($result['_id'])){echo $result['_id'];} ?></p>
<p><?php if (isset($result['first_name'])){echo $result['first_name'];} ?></p>
<p><?php if (isset($result['last_name'])){echo $result['last_name'];} ?></p>
<?php endforeach; ?>
</div>
</body>
然而,这过于复杂,因为您要重复两次数据。你的方法可能更好:
//Replace this:
foreach($results as $row => $val){
$data['results'][$row] = $val;
}
//with this:
$data['results'] = $results;
然后在您的视图中执行以下操作:
<body>
<div class="middle">
<?php foreach($results as $result): ?>
<p><?php if (isset($result['_id'])){echo $result['_id'];} ?></p>
<p><?php if (isset($result['first_name'])){echo $result['first_name'];} ?></p>
<p><?php if (isset($result['last_name'])){echo $result['last_name'];} ?></p>
<?php endforeach; ?>
</div>
</body>
编辑:
此答案所依据的附加信息 :(假设FuelPHP类似于CodeIgniter,它似乎是)
$data['some_item'] = some_val;
$data['some_item2'] = some_val2;
传递给视图时变为:
$ some_item(相当于some_val)和$ some_item2(相当于some_val2)