CakePHP Pagination sort () на родственных моделях - PullRequest
0 голосов
/ 23 марта 2011

У меня есть две модели: Планы и PlanDetails .

Отношение: PlanDetails hasMany Планы . Планы принадлежат PlanDetails .

В PlanDetails view.ctp , я вытягиваю связанные планы.

Я пытаюсь отсортировать Планы по ЛЮБОМУ полю (я пробовал их все), и я не могу заставить его работать.Я предполагаю, что пропускаю что-то очень простое.

Вот мой базовый код:

PlanDetail >> view.ctp:

...foreach ($planDetail['Plan'] as $plan_edit) :
$class = null;
if ($i++ % 2 == 0) {
    $class = ' class="altrow"';
}...

<?php echo $this->Paginator->sort('Plan ID', 'Plan.id'); ?>...

...<?php echo $plan_edit['id']; ?>

plan_details_controller.php:

...function view($id = null) {
    if (!$id) {
        $this->Session->setFlash(__('Invalid plan detail', true));
        $this->redirect(array('action' => 'index'));
    }
    $this->PlanDetail->recursive = 2; // To run the editable form deeper.
    $this->set('planDetail', $this->PlanDetail->read(null, $id));
    $this->set('plan', $this->paginate('Plan'));
}...

Я должен добавить, что никаких ошибок не возникает, и стрелки sort () в поле идентификатора отображаются, как и ожидалось, но порядок сортировки не изменяется при нажатии в любом случае.

Ответы [ 2 ]

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

Извините, я не могу прокомментировать сам вопрос, но я заметил, что в вашем действии вы устанавливаете planDetail как запись PlanDetail, которую вы прочитали (с recursive, установленной в 2), изатем вы устанавливаете plan как результат вызова paginate.

Затем, в вашем шаблоне представления, вы перебираете Plan содержащую *1008* ассоциацию, например так:

foreach ($planDetail['Plan'] as $plan_edit):

Но чтобы выполнить сортировку и разбивку на страницы, вам нужно отобразить результаты вызова paginate, т.е. перебрать записи, содержащиеся в $plan.

Do* debug($plan) в шаблоне представления, чтобы увидеть, какие результаты вы получите, и посмотреть, изменяется ли порядок записей при сортировке по разным полям.

Кроме того, возможно, вы используете синтаксис, которого я не знаюиз, но если вы просто позвоните $this->paginate('Plan') в своем контроллере, я не знаю, что вы получите только соответствующие Plan записи для вашей конкретной записи PlanDetail.(Ничто не связывает $id, переданное в ваше действие view с записями Plan.) Возможно, вам понадобится добавить некоторые условия к вызову paginate, например:

$this->paginate['Plan'] = array('conditions' => array('Plan.plan_detail_id' => $id));
$this->set('plans', $this->paginate('Plan'));
0 голосов
/ 26 марта 2011

Вот что я сделал, чтобы решить эту проблему. Основано на некоторых полезных указаниях от johnp & tokes.

plan_details / view.ctp:

...$i = 0;
foreach ($plan as $plan_edit) : // note $plan here.
}...

В моем действии view_details_controller.php:

$conditions = array("Plan.plan_detail_id" => "$id");
$this->set('plan', $this->paginate('Plan', $conditions)); // note "plan" in the first argument of set (this is required to pass the results back to the view). Also. The $condition is set to return ONLY plans that match the plan_detail_id of id (on the plan_details table).

И, на мой взгляд, чтобы получить свои результаты (потому что я изменил имя массива), мне пришлось изменить способ получения значений на:

$plan_edit['Plan']['modified'] // note I placed ['Plan'] in front of these calls as the array called for this to get the data...

Ну, до следующей проблемы! Решаемые.

...