Отображение зарегистрированных данных в CakePHP 2.5.1

У меня есть таблицы:

  • users (модель User) - id, person_id, логин, пароль
  • people (модель Person) - id, parent_id (внешний ключ той же таблицы), last_name, first_name
  • addresses (Address) - id, person_id, улица, город

И, модели:

 class User extends AppModel {
       public $actsAs = array('Containable');
       public $belongsTo = array(
            'Person'
        );
  }  

class Person extends AppModel {
    public $belongsTo = array(
        'Parent' => array(
            'className' => 'Person',
            'foreignKey' => 'parent_id',
        ),
    );

    public $hasMany = array(
        'User',
        'Address',
        'Subordinate' => array(
            'className' => 'Person',
            'foreignKey' => 'parent_id',
        ),
    );
}
class Address extends AppModel{

    public $belongsTo = array(
        'Person'
    );
}

Представления в папке View/Users/:

register.ctp
login.ctp
logout.ctp
profile.ctp

После регистрации и входа мне нужно показать данные профиля. Для этого я использую следующую функцию inUsersController:-

public function profile() { 
       $this->set('userProfile', $this->Auth->User());

}

У меня есть следующее в profile.ctp:

<table>
    <tr>
       <th>Username </th>
       <th>First Name </th>
       <th>Last Name </th>

       <th>street</th>
       <th>house_no</th>

 </tr>

   <?php foreach ($userProfile as $profiledata){ ?> 

    <tr>
        <td><?php echo $profiledata['username']; ?> </td>

        <td><?php echo $profiledata['Person']['first_name']; ?> </td>
        <td><?php echo $profiledata['Person']['last_name']; ?> </td>

        <td><?php echo $profiledata['Person']['Address']['street']; ?> </td>
        <td><?php echo $profiledata['Person']['Address']['house_no']; ?> </td>

    </tr>
    <?php } ?>
</table>

компонент авторизации в AppController.php

 public $components = array(
    'DebugKit.Toolbar',
    'Session',
    'Flash',
    'Auth' => array(
        'loginRedirect' => array('controller' => 'users', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
        'authenticate' => array('Form' => array(
                        'contain'   => array('Person'=>'Address'),
                        'passwordHasher' => 'Blowfish'))

        )
    );

он может извлекать данные из таблиц пользователей и людей, но не из таблицы адресов.

Я получаю следующую ошибку:

Notice (8): Undefined index: street [APP\View\Users\profile.ctp, line 32]

Может ли кто-нибудь сказать мне, что здесь не так? Нужно ли мне создавать другую модель для профиля (Profile.php) для отображения данных профиля?


person Tom    schedule 04.02.2016    source источник
comment
Когда вы получаете сообщение об ошибке типа «Невозможно использовать смещение строки в качестве массива», самым быстрым способом решения проблемы будет отладка переменной и проверка того, что она содержит. Использование debug($userProfile) или print_r($userProfile) покажет, что структура переменной несовместима с вашим циклом foreach.   -  person drmonkeyninja    schedule 04.02.2016


Ответы (1)


Функция

$this->Auth->User() 

не возвращает массив моделей.

Вместо этого он возвращает что-то похожее на:

Array
(
    [id] => 1
    [user_name] => john.doe
    [Person] => Array
        (
            [id] => 1
            [first_name] => John
            [last_name] => Doe
        )
    [Address] => Array
        (
            [id] => 1
            [street] => Piccadilly Street
            [house_no] => 4
        )
)

Поэтому вам нужно удалить цикл foreach и получить доступ к данным, выполнив следующие действия:

<tr>
    <td><?php echo $userProfile['user_name']; ?> </td>

    <td><?php echo $userProfile['Person']['first_name']; ?> </td>
    <td><?php echo $userProfile['Person']['last_name']; ?> </td>

    <td><?php echo $userProfile['Address']['street']; ?> </td>
    <td><?php echo $userProfile['Address']['house_no']; ?> </td>

</tr>

Обратите внимание, что есть только одна строка.

person Inigo Flores    schedule 04.02.2016
comment
спасибо дружище еще раз! :) Теперь он показывает зарегистрированные данные для человека, но показывает другую ошибку: Неопределенный индекс: Пользователь и Неопределенный индекс: Адрес - person Tom; 04.02.2016
comment
Извини за это. Я исправил опечатку. Вам не нужно включать ключ 'User'. Что касается Address, я полагаю, что он связан с Person, а не с User, поэтому AuthComponent его не получит. Чтобы это работало, вы должны использовать в AuthComponent. Вы можете найти пример в этом ответе. Не забудьте включить array('Person'=>'Address'). На ваш взгляд, вы должны использовать echo $userProfile['Person']['Address']['house_no'] . - person Inigo Flores; 04.02.2016
comment
я включил в authcomponent. но он все еще показывает ту же проблему. :( - person Tom; 08.02.2016
comment
он извлекает данные из таблиц пользователей и людей, но не может отображать такие данные, как улица, дом_номер из таблицы адресов. показывает ошибку: Неопределенный индекс: улица [APP\View\Users\profile.ctp - person Tom; 09.02.2016
comment
после использования echo $userProfile['Person'][0]['Address']['street']; он показывает ошибку: Уведомление (8): Неопределенное смещение: 0 [APP\View\Users\profile.ctp, - person Tom; 09.02.2016
comment
в порядке ли конфигурация авторизации? - person Tom; 09.02.2016
comment
отладка показывает данные из адресной таблицы. но он показывает ошибку на странице профиля. - person Tom; 09.02.2016
comment
Я думаю, что сделал опечатку. Вместо этого попробуйте <?php echo $userProfile['Person']['Address'][0]['house_no']; ?>. - person Inigo Flores; 09.02.2016
comment
если я хочу добавить другую электронную почту таблицы (отношение, подобное адресу), что мне делать в authcomponent? это как 'contain' =› array('Person'=›'Address', 'Person'=›'Email')? - person Tom; 09.02.2016
comment
Здорово! Я уверен, что вы поняли, что вышеуказанное перезаписывает индекс 'Person' и что правильный синтаксис 'contain' => array('Person'=>array('Address','Email')) - person Inigo Flores; 10.02.2016
comment
да я получил его. если вы не возражаете, у меня есть еще одна проблема :) я хочу добавить еще одно отношение, например, 'contain' =› array('Person' =›array('Address','Email' =› array('Apple' ))). и у меня есть таблица Apple с моделью Apple. для сохранения данных таблицы Apple, стоит ли использовать тот же контроллер (UsersController)? или я должен создать еще один контроллер, например ApplesController? в любом случае, извините за наивный вопрос :D - person Tom; 11.02.2016
comment
Обратите внимание, что вам не нужно добавлять все эти отношения в ваш массив конфигурации AuthComponent. Добавляйте только те, которые вы хотите получать при входе в систему. Что касается сохранения данных, это зависит от того, хотите ли вы сохранить все данные за один раз, используя единую форму, или добавить дополнительные данные только после создания пользователя. Передовой опыт предписывает не углубляться слишком далеко, так как это увеличивает сложность. Кроме того, вы не хотите иметь очень длинные формы, так как пользователям будет скучно их заполнять. Все дело в том, чтобы выяснить ваш рабочий процесс. - person Inigo Flores; 12.02.2016
comment
я буду использовать другую форму, чтобы добавить данные для таблицы Apple. это будет после регистрации и входа в систему, будет использоваться новая форма для сохранения данных Apple и их отображения. эти данные связаны с пользователем. - person Tom; 12.02.2016
comment
я использовал новый контроллер ApplesController, и теперь данные можно сохранять. но проблема в том, что он не сохраняет внешний ключ (person_id). Столбец person_id таблицы apples остается пустым. вы можете сказать мне, в чем проблема? - person Tom; 15.02.2016
comment
Мне нужно было бы увидеть некоторый код для контроллера, представлений и моделей (часть отношений). Возможно, вы можете создать еще один вопрос. - person Inigo Flores; 15.02.2016
comment
Я разместил свои коды в новом вопросе, может ли Зоу помочь, пожалуйста? :) stackoverflow.com/questions/35791264/ - person Tom; 07.03.2016