Я ударил кирпичную стену. У меня есть файл просмотра header.php
что я хочу использовать на всех страницах сайта. В этом файле я хочу вывести $total_items
значение которого равно $total_items
в моем getTotalItems()
метод, который я имею в контроллере (Items
). Это связано с моделью ItemsModel
с запросом SELECT count(item_id) as total_items FROM items;
,
Проблема у меня в том, что хотя localhost/somemvcproject/items/get_total_items
выходы $total_items
без каких-либо проблем, любой другой URL, который я ввожу, не распознает его или не извлекает ItemsModel
, Я понимаю, что это связано с настройкой моей маршрутизации URL, например localhost/somemvcproject/controller/action/param1/param2/param3
и т. д. и что я не создал контроллер с именем header, скажем так. Но как я могу получить доступ $total_items
(или в этом отношении любая другая переменная) из Items
getTotalItems()
для представления, которое по существу не связано.
Единственное, что близко к работе вокруг меня, это загрузка ItemsModel
в каждом контроллере каждый раз, когда я хочу включить header.php в противном случае $total_items
является неопределенной переменной Но для каждой страницы сайта это кажется смешным.
То, что я хочу быть в состоянии сделать, это что-то вроде
`
<!--header.php-->
<html>
<head>
<title>My Items</title>
</head>
<body>
<div id="header">
<?php echo $total_items ?>
</div>
</body>
</html>
`
Как я могу получить доступ $total_items
?
Вы можете вызывать запрос модели в каждом контроллере, куда бы вы ни захотели получить $total_items
ИЛИ ЖЕ
Вы можете расширить свой текущий класс контроллера своим собственным классом контроллера и поместить свой метод в свой класс контроллера.
Поскольку вы еще не объявили свой фреймворк, вам сложно показать пример кодирования.
Вы можете сделать запрос на вызов контроллера для получения данных при загрузке страницы.
пример:
// use document ready function to make call on document load
$(document).ready(function()
//create ajax call
});
Я думаю, что ваша работа правильная. Единственное, что я хотел бы добавить, это то, что вы создаете parent controller
, унаследованный всеми вашими контроллерами, где вы вычисляете $total_items
и передать его на вид.
Затем вам нужно убедиться, что вызывается какая-то функция инициализации; это вполне может быть __construct()
,
Что-то вроде:
abstract class ControllerBase
{
function __contruct()
{
$total_items = getTotalItems();
// Pass the $total_items to the views as you normally do
}
}
Тогда каждый из ваших контроллеров должен наследовать базовый класс:
class MyController extends ControllerBase
{
// Do the stuff
}
Вы должны помнить, хотя, если вы реализуете __construct()
в ваших подклассах вы должны вызвать родителей:
class MyController extends ControllerBase
{
function __construct()
{
parent::__construct();
// MyController's own stuff
}
}
Таким образом, к тому времени ваш action
называется, $total_items
переменная уже была рассчитана и сделана доступной для просмотра.