是否反对使用变量在另一个视图中调用视图的MVC模式?

mir*_*rza 2 php model-view-controller seo codeigniter

编辑以澄清和修改示例伪代码

我试图理解mvc的概念,有时它给我带来了一些严重的麻烦.

我面临着一个问题,并试图想出一个解决方案.我正在使用codeigniter,问题是如何在我的网站上为不同的类别和搜索制作不同的页面标题和描述.

这是我认为的解决方案(我知道这不是演示它的最佳方式,但不要只是看看基本想法的细节):

调节器

 $data['results'] = call model and get results
 this->load->view(ad_details,$results);
Run Code Online (Sandbox Code Playgroud)

ad_categories查看:

foreach ($results as $key => $row) {
        $ad_title = $row->title; 
        $ad_id = $row->id;
        $ad_price = $row->price;
        $ad_status = $row->status;
        $ad_city = $row->city;
        $ad_user = $row->user;
        if ($key<1) {
          // let's be sure even customers enter same info we got unique titles and descriptions for search engines 
         $data['title'] = "$ad_title $ad_id $ad_price";
         $data['description'] = "Second Hand Autos for $ad_status from $ad_user in $ad_city";
         this->load->view(header,$data);
         <body>
        }
      $ad_description = $row->description; 
      <h2>$ad_title</h2>
      <p>$ad_description</p>
      }
      </body>
     <? this->load->view(footer); ?> 
Run Code Online (Sandbox Code Playgroud)

header_view文件

<!doctype html>
    <head>
        <meta charset="utf-8">
        <title><?=$title?></title>
        <META NAME="description" CONTENT="<?=$description">
        <META NAME="keywords" CONTENT="<?=$keywords?>" >    
        <meta name="viewport" content="width=device-width,initial-scale=1">
        <link rel="stylesheet" href="css/style.css">
        <script src="js/libs/modernizr-2.0.6.min.js"></script>              
    </head>
     <body>
Run Code Online (Sandbox Code Playgroud)

实际的标题和描述可能会有很大的不同,可能会有一些例外,我可能不得不对不同的类别和不同的搜索页面使用不同的代码.那么,以这种方式对抗MVC还是有更好的方法来做到这一点?

这样,我试图避免在控制器或视图中多次使用相同的foreach循环.实际的标题和描述可能会有很大的不同,可能会有一些例外,我可能不得不对不同的类别和不同的搜索页面使用不同的代码.那么,这样做是针对mvc还是有更好的方法呢?

Dam*_*rsy 6

由于MVC是一种设计模式而不是语法规则,因此您在这里有一定的自由度.我认为在视图中使用视图没有任何问题,不仅可以在CI中使用它,而且可以考虑调用不同的视图并嵌套它们而不必将"辅助"视图传递给它的数据集,作为视图缓冲,他们将无论如何都可用.

所以你可以这样做:

控制器:

$data['results'] = $this->your_model->get_details();
// this will be in the form of an array returned directly from the model 
// i.e. the model code would look someting like:
// $data = array();
// foreach($query->result() as $row)
// {
//   $data[] = $row;
// }
// return $data;

$this->load->view('ad_details',$data);
Run Code Online (Sandbox Code Playgroud)

在ad_details.php中:

<?php $this->load->view('header');?>
<!-- html code -->
<? $this->load->view('footer'); ?>
Run Code Online (Sandbox Code Playgroud)

如果你使用var_dump()它,你会看到header.php和footer.php现在都有一个变量$ results,而不必再次传递它.