Intereting Posts
Вложенные модели отношений в формах – Laravel Как подготовленные заявления PHP PDO предотвращают инъекцию sql? Каковы другие преимущества использования PDO? Использует ли PDO эффективность? PHP не читает весь CSV-файл Правильное выравнивание изображения PHPExcel ArrayCollection (Doctrine) содержит функцию, возвращающую неверные результаты Изменение размера с помощью GD-выходов Множественные сигнатуры методов для одной абстрактной функции / абстрактной перегрузки Запрос SOAP в PHP с CURL Можно ли присвоить значение javascript переменной php? Использование Laravel 5.4 толкателя Как я могу использовать методы в PHP? Библиотеки и псевдокод для физической панели мониторинга / состояния как я могу сопоставить две строки, даже если они отличаются 1 символом? «Pdo_mysql» отключен, и я не могу включить его. У меня установлен MAMP v. 3.0.4 на моем iMac 7.1 OSX 10.6.8 Как получить элемент из массива объектов PHP?

Это противоречит шаблону MVC, вызывающему представление в другом представлении с переменными?

отредактирован для пояснения и модифицированного примера псевдокода

Я пытался понять концепцию 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);