从模型中获取数组,然后传递给视图

问题描述 投票:0回答:3

简单,但对于我这个初学者来说,是个问题。我需要将模型中的数组(读取文本文件时数组中充满信息)传递到控制器,最后传递到视图。 我的型号:

    function show_notes(){
    $file = "notes.txt";

    foreach(file($file) as $entry)
    {
            list($user, $content) = array_map('trim', explode(':', $entry));
            $notes = array (
                'user'=> '$user',
                'content'=> '$content'
            );
    }
    return $notes;
}

控制器:

    function members_area()
{
    $this->load->model('Note_model');
    $notes[] = $this->Note_model->show_notes();

    $this->load->view('includes/header');
    $this->load->view('members_area', $notes);
    $this->load->view('includes/footer');   
}

在视图中我使用这个:

        foreach ($notes as $item)
    {
    echo "<h1>$user</h>";
    echo "<p>$content</p>";
            }

我收到错误,指出 notes 变量在我看来未定义。

我想我只是不明白数组是如何工作的。我试图阅读有关内容,我尝试过一些与此类似的示例,但仍然无法得到它。

arrays codeigniter
3个回答
0
投票

在您的控制器中:

$data['notes'] = $this->Note_model->show_notes();
... 
$this->load->view('members_area', $data);

编辑:

您认为:

<?php foreach ($notes as $item):?>
   <h1><?php echo $item['user']; ?></h1>
   <p><?php echo $item['content'] ?></p>
<?php endforeach; ?>

在您的模型中:

$notes = array();
foreach(file($file) as $entry)
{
        list($user, $content) = array_map('trim', explode(':', $entry));
        array_push($notes, array('user' => $user, 'content' => $content));
}
return $notes;

0
投票

更换这个

$notes[] = $this->Note_model->show_notes();

有了这个

$notes['notes'] = $this->Note_model->show_notes();

0
投票
  1. 控制器的职责是将所有必需的参数传递给其他层(模型/库/服务/帮助程序/等——您的情况下的模型方法),并以所需的格式打印可使用的有效负载(如果,比如说,一个 API 端点)或将数据有效负载传递到视图(要渲染/格式化)。

  2. 模型应该完全不知道从哪里检索输入数据。换句话说,模型方法永远不应该访问超全局变量(如 get、post、request、session 等)。应该为实用性构建模型方法,以便可以轻松地测试它们并从项目中的各个其他位置调用它们。

  3. 视图层应该很少甚至不进行数据处理(应尽可能避免过滤、搜索、重组、合并、清理、验证和算术)。与数据的交互应在很大程度上限于基本循环、琐碎条件和特定于区域设置的格式。


您的控制器正在调用

show_notes()
,然后将返回的数据推送为名为
$notes
的数组的第一个元素。这不符合你的意图。

在模型方法中,您没有将新遇到的数据作为新元素推送到

$notes
数组中,实际上每次迭代都覆盖了相同的元素。

为了让视图能够访问名为

$notes
的变量,控制器必须传递一个数组,其中包含一个名为
notes
的元素,作为视图方法调用的第二个参数。
这是因为当数据从控制器传输到 CodeIgniter 中的视图时,传入的数据会根据第一级键分解为各个变量(请参阅原生 PHP 的
extract()
函数以更好地理解效果)。

在视图循环中,永远不会声明

$user
$content
变量。您将需要声明这些变量或使用数组访问语法访问关联值。

这是我建议的 MVC 方法重写:

  • 控制器

    public function members_area(): void
    {
         $this->load->model('Note_model');
         $data['notes'] = $this->Note_model->show_notes('file.txt');
    
         $this->load->view('includes/header');
         $this->load->view('members_area', $data);
         $this->load->view('includes/footer');   
    }
    
  • 型号

    public function show_notes(string $fileName): array
    {
        $notes = [];
        foreach(file($fileName) as $entry) {
            [$user, $content] = array_map('trim', explode(':', $entry));
            $notes[] = compact(['user', 'content']);
        }
        return $notes;
    }
    
  • 查看

    foreach ($notes as ['user' => $user, 'content' => $content]) {
        echo "<h1>$user</h>";
        echo "<p>$content</p>";
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.