#php #codeigniter
#php #codeigniter — инициализатор кода #codeigniter
Вопрос:
У меня есть контроллер, который извлекает массив из модели и отправляет его в представление. Пример таблицы
user id user name user email
1 Mike mike@yahoo.com
2 Tom Tom@live.com
Теперь я добавил в модель еще одну функцию для извлечения другого массива данных из другой таблицы для каждого пользователя в этой таблице, чтобы выглядеть следующим образом
user id user name user email
1 Mike mike@yahoo.com
order:10 order total:50 order date: 2016-09-12
order:12 order total:100 order date: 2016-09-14
2 Tom Tom@live.com
order:15 order total:80 order date: 2016-09-13
order:16 order total:120 order date: 2016-09-14
order:17 order total:140 order date: 2016-10-10
Функция index() контроллера содержит этот код
$this->data['users'] = $users; //fetches data from a model function
$this->data['content'] = $this->load->view('users_view', $this->data);
Итак, у меня есть функция orders($user_id), которая извлекает заказы из базы данных для пользователя. Код представления:
<table>
<tr>
<th>
<?php echo 'user id';?>
</th>
<th>
<?php echo 'user name';?>
</th>
<th>
<?php echo 'user email';?>
</th>
</tr>
<?php foreach($users as $val){
?>
<tr>
<td>
<?=$val->user_id?>
</td>
<td>
<?=$val->user_name;?>
</td>
<td>
<?=$val->user_email;?>
</td>
</tr>
<?php
// how to call the model function here and loop through the orders array to
display orders for each user?
}?>
</tbody>
</table>
Комментарии:
1. получайте заказы с идентификаторами клиентов. создайте многоуровневый массив заказов с идентификатором каждого клиента в качестве индекса. передайте его в представление. затем используйте идентификатор клиента, чтобы отобразить соответствующие заказы в вашем представлении.
2. ХОРОШО, теперь вопрос в том, как построить многомерный массив в контроллере. Я начал изучать codeigniter и не нахожу достаточно руководств по созданию многомерного массива, как мне нужно. Спасибо за вашу помощь
Ответ №1:
Вы определенно этого не делаете. Это совершенно неверно. Вот как это должно быть сделано:
- Запрос к контроллеру
- Контроллер вызывает соответствующие библиотеки и модели для объединения данных
- Контроллер отправляет данные в представления
Итак, в вашем контроллере вам нужно вызвать свои данные для пользователей из одной модели, затем для каждого пользователя получать заказы из другой модели. Как вы это делаете в своих моделях или библиотеках, конечно, зависит от вас, но контроллер должен заранее собрать все необходимые данные.
При создании представлений ваш контроллер, библиотека шаблонов или модель страницы могут вызывать другие подвиды или части для создания строк для фрагментов страницы, модулей или заданных разделов вашей страницы. Затем используйте эти строки как часть основного представления. ИЛИ ваш основной вид может вызывать другие представления напрямую. В любом случае, данные, необходимые для представления, должны быть отправлены в представление. В случае представлений, вызывающих другие частичные элементы (которые я лично ненавижу, но некоторым людям, похоже, это нравится), все данные отправляются в исходное представление, а частичное отправляют только те данные, которые требуются в качестве подмножества исходного набора данных.
Представления никогда не должны вызывать модели, другие контроллеры или библиотеки. Думайте о них как о статических элементах дизайна страницы, которые просто получают необработанные данные и определяют, как отображать эти данные. Вот и все.
Точно так же, как у вас никогда не должно быть HTML в ваших контроллерах или моделях, у вас никогда не должно быть обработки PHP в ваших представлениях (за исключением макетных конструкций, таких как циклы foreach, операторы if и т. Д.).
Ответ №2:
Вы должны проиндексировать свою таблицу заказов, чтобы иметь некоторый общий ключ индекса с другой таблицей, такой как имя пользователя (order_username), идентификатор пользователя (order_userid), адрес электронной почты пользователя (order_useremail), чтобы вы могли получать только заказы, сделанные по имени пользователя / идентификатору пользователя / электронной почте.
Скажем, это ваш контроллер :
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
//Load My_Model
$this->load->model("my_model");
}
public function index()
{
$users = $this->my_model->get_users();
foreach ($users->username as $user) {
$user_orders = $this->my_model->get_orders_by_username($user);
}
$this->load->view('users_view', array("user_orders" => $user_orders, "users" => $users));
}
}
И это ваша модель, которая извлекает данные из таблицы users и таблицы orders с одним и тем же общим именем пользователя :
class MY_Model extends CI_Model
{
public function get_users()
{
$results = $this->db->get('users');
return $results;
}
public function get_orders_by_username($user)
{
$this->db->select('*');
$this->db->where("order_username", $user);
$results = $this->db->get('orders');
return $results;
}
}
Теперь вы можете просматривать данные в файле представления, и вы можете использовать их следующим образом :
$users-> username -$users-> email или в цикле foreach примерно так :
foreach ($users as $user) {
foreach ($user_orders as $order) {
echo "$user->user_name , $user->user_lastname - $user->user_email";
echo "$order->orders_date - $order->orders_count";
}
}
Комментарии:
1. Я изменил функцию модели orders на простую и отображаю только имя пользователя идентификатора пользователя, переданного ему, но он продолжает повторять первого пользователя только с каждой строкой, не получая правильное имя пользователя для каждого
2. Возможно, это потому, что ваша функция не принимает параметры для отображения указанных данных, покажите мне свой код функции.