отредактирован для пояснения и модифицированного примера псевдокода
Я пытался понять концепцию 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 или есть лучший способ сделать это?
Изменить: я узнал из чтения комментариев к этому, что вы не можете использовать $results[0]
в CodeIgniter, вы должны использовать $results->row()
видимо, – я оставляю свой ответ так, как это было, потому что это не должен был быть 100% CI-специфичным, но помните об этом.
Вот так я бы написал ваше мнение:
<?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];
Опять же, вы не можете. Какая бы ни была ваша утка. 🙂
Поскольку MVC является шаблоном проектирования, а не синтаксическим правилом, здесь у вас определенная степень свободы. Я не вижу ничего плохого в использовании представления внутри представления, и не только это возможно в CI, но так продуманно, что вы можете вызывать разные представления и вставлять их с необходимостью передавать «вторичный» вид своего набора данных, поскольку представления буферизованы, и они будут доступны всем в любом случае.
Итак, вы можете сделать что-то вроде:
контроллер:
$data['results'] = $this->your_model->get_details(); // this will be in the form of an array returned directly from the model // ie 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, без необходимости передавать их снова.
MVC там, чтобы ваша жизнь была проще и ваша разработка была быстрее, если вы не можете назвать ее с уровня контроллера, и разрешено вызывать ее внутри представления, сделайте это.
Как правило, вы хотите иметь одну модель – один вид с отношением и данными / потоком, управляемый через некоторый контроллер. Контроллер может управлять несколькими моделями и представлениями, но каждый отдельный вид должен иметь соответствующую модель.
Было бы неплохо читать ASP.NET MVC.
Управляйте своей логикой в контроллере.
в общем, это означает, что цикл и условные обозначения, которые определяют, что отображать, остаются вне представления. представление может использовать логику, чтобы решить, как отображать материал, создавать петли для создания таблиц и т. д.
поместите все это в контроллер.
$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);