как сохранить массив в контроллере и использовать в файле представления в cakephp
Вопрос
В моем контроллере Users я нахожу количество форм, созданных пользователем, путем запроса таблицы 'Forms' и сохраняю ее в массиве. Но как использовать переменные массива в файле представления.
Обычно я устанавливаю переменную в контроллере с помощью функции set и использую ее в файле представления как таковую. Но как установить массив в контроллере? Я получаю значения в контроллере (сделал эхо).
Код моего контроллера:
function users(){
$this->set('users',$this->User->find('all'));
$users=$this->User->find('all');
foreach($users as $user):
$id=$user['User']['id'];
$userFormCount[$id]=$this->Form->find('count',array('conditions'=>array('Form.created_by'=>$user['User']['id'])));
$userFormCount[$id]=$this->Form->find('count',array('conditions'=>array('Form.created_by'=>$user['User']['id'])));
echo "users : ".$id." ".$userFormCount[$id];
endforeach;
}
Мой файл просмотра:
<?php foreach($users as $user):?>
<tr>
<td class="people_profile">
<a href="/users/angeline"><?php echo $user['User']['name'];?></a>
</td>
<td>
<?php
$id=$user['User']['id'];
echo $userFormCount[$id]." ";?>forms, //need the array value here.
0 reports,
0 badges
</td>
</tr>
<?php endforeach;?>
Поскольку я сохранил значение в переменном $ userFormCount в контроллере, я не получаю значение в файле представления. но как установить и получить значение массива?
Решение
Прежде всего вам следует избегать повторения вызовов функций.
Первые две строки вашей функции можно заменить на:
$users=$this->User->find('all');
$this->set('users', $users);
Затем вы можете изменить свой объект перед его передачей для просмотра и добавить вычисляемое свойство для этого объекта.
function users(){
$users=$this->User->find('all');
// notice the & here
foreach($users as & $user):
// you are repeating the same line here as well, that's not necessary
$user['User']['custom_field'] = $this->Form->find('count',
array('conditions'=>array('Form.created_by'=>$user['User']['id'])));
endforeach;
$this->set('users', $users);
}
и затем вы можете использовать его в своем представлении, как любое другое поле, которое вы получаете из базы данных. Чтобы улучшить его еще больше, вы можете рассмотреть возможность перемещения этого кода в обратный вызов afterFind
в вашей модели User
, по крайней мере, если эти пользовательские значения используются более одного раза. р>
Другие советы
Вы уже знаете, как установить значение массива: -)
В этом коде вы устанавливаете массив 'users'
$this->set('users',$this->User->find('all'));
Таким образом, вы можете сделать то же самое для другого массива:
$this->set('userFormCount',$userFormCount);
... и прочитайте его так же, как переменную вашего пользователя.
Но, пожалуйста, посмотрите на ответ RaYell, потому что он объясняет, как сделать ваш текущий код лучше.