Это против шаблона MVC, вызывающего представление в другом представлении с переменными? - PullRequest
2 голосов
/ 12 января 2012

отредактирован для пояснения и изменен пример псевдокода

Я пытался понять концепцию mvc, и иногда у меня возникают серьезные головные боли.

Я былсталкиваются с проблемой и пытаются найти решение.Я использую codeigniter, и проблема в том, как сделать разные заголовки и описания страниц для разных категорий и поисков на моем веб-сайте.

Вот решение, которое я подумал (я знаю, что это не лучший способ продемонстрировать это, ноне зацикливайтесь на деталях, просто посмотрите на основную идею):

контроллер

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

представление 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); ?> 

файл 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>

Фактические названия и описания могут быть совершенно разными, могут быть некоторые исключения, и мне, возможно, придется использовать разные коды для разных категорий и разных страниц поиска.Таким образом, делая это таким образом в отношении MVC, или есть лучший способ сделать это?

Таким образом, я стараюсь избегать использования одних и тех же циклов foreach несколько раз в контроллере или в представлениях.Фактические названия и описания могут быть совершенно разными, могут быть некоторые исключения, и мне, возможно, придется использовать разные коды для разных категорий и разных страниц поиска.Таким образом, это делается в отношении MVC или есть лучший способ сделать это?

Ответы [ 5 ]

6 голосов
/ 12 января 2012

Поскольку 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);

В ad_details.php:

<?php $this->load->view('header');?>
<!-- html code -->
<? $this->load->view('footer'); ?>

Если вы используете var_dump (), вы увидите, что и header.php, и footer.php теперь будут иметь переменную $ results без необходимости повторной передачи.

3 голосов
/ 17 января 2012

MVC призван облегчить вам жизнь и ускорить разработку, если вы не можете вызывать его с уровня контроллера и разрешено вызывать его внутри представления, сделайте это.

2 голосов
/ 16 января 2012

Редактировать: Из прочитанных комментариев к этому я узнал, что вы не можете использовать $results[0] в CodeIgniter, вы должны использовать $results->row(), по-видимому - я оставляю свой ответ таким, какой он есть потому что он не должен был быть на 100% специфичным для КИ, но имейте это в виду.


Вот как бы я написал ваше мнение:

<?php $this->load->view('header', array(
  'title' => $results[0]->title.' '.$results[0]->id.' '.$results[0]->price,
  'description' => 'Second hand autos for '.$results[0]->status.' from '.$results[0]->user.' in '.$results[0]->city
)); ?>
<body>
  <h2><?php echo htmlspecialchars($results[0]->title); ?></h2>
  <p><?php echo htmlspecialchars($results[0]->description); ?></p>

  <?php foreach($results as $row): ?>
    <!-- Deal with results -->
  <?php endforeach; ?>
  </body>
 <? this->load->view('footer'); ?>

Здесь вы можете видеть, что я исключил цикл foreach, за исключением случаев, когда вы на самом деле имеете дело с каждым из результатов по очереди. Сказав это, я лично считаю, что вы слишком далеко зашли над мантрой «не повторяйте себя», поскольку вы жертвуете читабельностью / удобством сопровождения кода ради него. Если объединение нескольких циклов foreach в один затрудняет понимание кода, не делайте этого.

Я также пытался сократить количество назначений PHP и переменных в представлении, что, как правило, хорошо, но это также может быть неудобно, если отодвинуться слишком далеко. Например, вы можете захотеть сократить все вещи $results[0]->, выполнив это прямо вверху экрана:

$r = $results[0];

Опять же, вы не можете. Что бы ни крякало твою утку. :)

2 голосов
/ 12 января 2012

Обрабатывайте свою логику в контроллере.

в общем, это означает, что цикл и условные выражения, которые решают, что отображать, остаются вне поля зрения.представление может использовать логику, чтобы решить, как отображать вещи, циклы для создания таблиц и т. д.

поместить все это в контроллер.

$data['results'] = call model and get results
$this->load->view(ad_details,$results);
foreach ($results as $key => $row) {
    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);
    }
this->load->view(body, data);
2 голосов
/ 12 января 2012

Как правило, вы хотите иметь одну модель - одно представление с взаимосвязью и данными / потоком, управляемыми через некоторый контроллер. Контроллер может управлять несколькими моделями и представлениями, но у каждого отдельного представления должна быть соответствующая модель.

Было бы неплохо почитать о ASP NET MVC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...