«Примечание (8): неопределенный индекс» в представлении при циклическом просмотре «содержащихся» результатов - PullRequest
1 голос
/ 28 февраля 2011

Я используюableable для извлечения связанных записей в действие view и получаю сообщение об ошибке при циклическом просмотре результатов.

Кроме того, я использую «медленное» поведение, поэтому у операции поиска есть условие для поиска по этой переменной.

Когда я отлаживаю переменную find в представлении, я вижу правильные записи. Но когда я пытаюсь перебрать их в представлении, я получаю «Notice (8): Undefined index: error». В идеале мне нравилось понимать, как устранить эту ошибку, поскольку она иногда возникает.

Настройка модели:

турниров имеют много турнирных деталей

турнирДетали имеют много обновлений

Записи, которые я пытаюсь отобразить:

турнир с> tournamentDetails-> Обновления

Контроллер турнира выглядит так:

    $tournament = $this->Tournament->find('first', array(
         'conditions' => array( 'slug' => $slug),
         'contain' => array(
        'TournamentDetail' => array(
             'Update' => array('order' => 'Update.id DESC'),
        ))));

Действие просмотра турнира выглядит следующим образом:

<?php foreach ($tournament ['Update'] as $update): ?>
   <h3>Update: <?php echo $update ['Update']['date']; ?></h3>
     <h4><?php echo $update['Update']['title']; ?></h4>
     <p><?php echo $update  ['Update']['body']; ?></p>
   <hr/>
<?php endforeach; ?>

Обновление данных в представлении при отладке выглядит следующим образом:

[Update] => Array
                    (
                        [0] => Array
                            (
                                [id] => 2
                                [title] => Indoor Challenge
                                [date] => 2010-03-19
                                [body] => Congratulations 2010 Champion 
                                [tournament_detail_id] => 4
                                [homeStatus] => no
                            )

                        [1] => Array
                            (
                                [id] => 1
                                [title] => first round matches start today 
                                [date] => 2010-03-19
                                [body] => this tournament's first round matches start today. 
                                [tournament_detail_id] => 4
                                [homeStatus] => no
                            )

Есть ли что-то действительно очевидное, что я пропускаю при просмотре "обновлений"?

Спасибо, Пол

Разрешение

Спасибо всем за вклад. Сделав несколько шагов назад, мне пришло в голову, что происходит с «неопределенным индексом» и комментариями о том, как выполнить цикл.

Проблема заключалась в том, что цикл foreach не был вложенным, он только зацикливался на первом уровне ассоциации. Цикл предисловия имеет дело с «турнирами», в которых есть много «турниров по деталям».

Цикл, необходимый для того, чтобы перейти на один уровень глубже к "tourDetails, которые имеют много" обновлений ".

Вот код, который разрешил это в представлении.

<?php foreach ($tournament['TournamentDetail'] as $tournamentDetail): ?>
  <?php foreach ($tournamentDetail ['Update'] as $update): ?>
    <h3>Update: <?php echo $update['date']; ?></h3>
      <h4><?php echo $update['title']; ?></h4>
      <p><?php echo $update['body']; ?></p>
    <hr/>
  <?php endforeach; ?>
<?php endforeach; ?>

Если другие хотят понять, как использовать сдерживаемое поведение с более чем одним уровнем ассоциации, просто помните, что вам может потребоваться иметь вложенные циклы foreach в представлении для отображения результатов, к которым вы стремитесь.

Ура, Пол

Ответы [ 5 ]

1 голос
/ 01 марта 2011

Пол,

учитывая, что все остальное правильно, может ли быть то, что вы смешиваете единственное, множественное число, прописные и строчные буквы?В частности, обновление / обновления в различных комбинациях.

Редактировать 0: Быстрый выстрел ?: Такой индекс просто не определен, обратите внимание, что вы работаете с массивом, состоящим из массивов.Кажется, вам нужно использовать другой цикл, вложенный в первый.

Edit 1: К сожалению, я могу предоставить только довольно общую помощь, так как я не нахожусь перед вашим кодом.Из вашего поста и комментариев я бы предположил, что некоторые имена переменных перепутались.Как правило, это происходит через весь поток данных.Каково точное имя переменной в контроллере, который выдает правильные данные?Если есть, правильно ли это set от контроллера к представлению?Правильно ли обращается к этому представление?

Вы думаете замечательно, это то, что я делал на прошлой неделе , но я совершенно уверен, что должно это сделать.Очистите весь код представления, который в настоящее время использует любые переменные из контроллера, действуйте, как описано выше, помня поток данных (но не тратьте больше одного часа на это).

Если он не работает:

Что-то не так.Прежде чем вы проведете еще одну неделю в отчаянии, я бы

  1. попробовал бы это без сдерживаемого поведения, посмотрите, работает ли оно
  2. , попытайтесь настроить точно такой же сценарий
    в полностьюновая
    среда CakePHP (в вашем случае 1.2.5), посмотрите, работает ли она

Если вы достигнете своих целей, попробуйте увидеть, что пошло не так в оригинале (часто момент, когда ударили по лицу).

Если нет:

  1. попытаться выяснить, есть ли известная ошибка
  2. рассмотреть возможность обновления (или сначала попытаться достичь своих целей в 1.3.7)

Удачи, Бенджамин

0 голосов
/ 04 марта 2011

Разрешение

Спасибо всем за вклад. Сделав несколько шагов назад, мне пришло в голову, что происходит с «неопределенным индексом», и комментарии о том, как выполнить цикл.

Проблема заключалась в том, что цикл foreach не был вложенным, он только зацикливался на первом уровне ассоциации. Цикл предисловия связан с «турнирами», в которых есть много «турниров по деталям».

Цикл, необходимый для того, чтобы перейти на один уровень глубже к "tourDetails, которые имеют много" обновлений ".

Вот код, который разрешил это в представлении.

<?php foreach ($tournament['TournamentDetail'] as $tournamentDetail): ?>
  <?php foreach ($tournamentDetail ['Update'] as $update): ?>
    <h3>Update: <?php echo $update['date']; ?></h3>
      <h4><?php echo $update['title']; ?></h4>
      <p><?php echo $update['body']; ?></p>
    <hr/>
  <?php endforeach; ?>
<?php endforeach; ?>

Если другие хотят понять, как использовать сдерживаемое поведение с более чем одним уровнем ассоциации, просто помните, что вам может потребоваться наличие вложенных циклов foreach в представлении для отображения результатов, к которым вы стремитесь.

Приветствия, Пол

0 голосов
/ 03 марта 2011

Все это предполагает, что ваша информация отладки является отладочной ($ турнир) и не отладочной ($ update)

/* your old code */
<?php foreach ($tournament ['Update'] as $update): ?>
    <h3>Update: <?php echo $update ['Update']['date']; ?></h3>
    <h4><?php echo $update['Update']['title']; ?></h4>
    <p><?php echo $update  ['Update']['body']; ?></p>
    <hr/>
<?php endforeach; ?>

Если предоставленное вами значение отладки было отладкой турнира $переменной, то первая часть вашего цикла просто присваивает массивам с числовыми ключами внутри переменной турниров значение $ update.

Итак, когда вы отправляете $ tour ['Update'] через цикл, вы получаетеСтруктура в массиве $ update выглядит следующим образом.

array(
    [id] => 2
    [title] => Indoor Challenge
    [date] => 2010-03-19
    [body] => Congratulations 2010 Champion 
    [tournament_detail_id] => 4
    [homeStatus] => no
)

Но в вашем цикле вы пытаетесь получить доступ к ключевым значениям, как если бы они существовали в дополнительном слое с ключом «Update».Этот ключ не существует в вашем внутреннем массиве.

Так что, если мое предположение верно, ваш цикл должен выглядеть следующим образом:

/* your old code with edits removing the additional interior Update key */
<?php foreach ($tournament ['Update'] as $update): ?>
    <h3>Update: <?php echo $update['date']; ?></h3>
    <h4><?php echo $update['title']; ?></h4>
    <p><?php echo $update['body']; ?></p>
    <hr/>
<?php endforeach; ?>

В скобках также, возможно, есть некоторый интервалоригинальный код - я не знаю, является ли это проблемой или нет, но мне это показалось странным.

0 голосов
/ 01 марта 2011

Ответ RSK должен быть правильным, так как он все еще не работает, вы, вероятно, не предоставляете всю необходимую информацию.Что означает этот вывод: debug($tournament);?

0 голосов
/ 28 февраля 2011

Мне кажется, я понимаю вашу проблему, и, пожалуйста, попробуйте выполнить цикл таким образом

<?php foreach ($tournament ['Update'] as $update): ?>
   <h3>Update: <?php echo $update['date']; ?></h3>
     <h4><?php echo $update['title']; ?></h4>
     <p><?php echo $update['body']; ?></p>
   <hr/>
<?php endforeach; ?>
...