2013-06-12 3 views
0

Я хочу использовать комплексный запрос с paginate(). Вот мой код:CakePHP: complexe paginated query не сортирует по столбцам

// PhasesController.php 
public function manage($id = null) { 
    $this->loadModel('ProjectDomainPhasesUser'); 
    $this->ProjectDomainPhasesUser->recursive = 0; 
    $this->paginate = array(
     'ProjectDomainPhasesUser' => array(
     'order' => array('Phase.label_'.$_SESSION['lang']), 
     'joins' => array(
     array(
      'table' => 'users', 
      'alias' => 'User', 
      'type' => 'INNER', 
      'foreignKey' => false, 
      'conditions'=> array(
      'ProjectDomainPhasesUser.user_id = User.id AND User.id = '.$this->Auth->User('id') 
      ) 
     ), 
     array(
      'table' => 'project_domains_phases', 
      'alias' => 'ProjectDomainsPhase', 
      'type' => 'INNER', 
      'foreignKey' => false, 
      'conditions'=> array(
      'ProjectDomainsPhase.id = ProjectDomainPhasesUser.project_domain_phase_id' 
      ) 
     ), 
     array(
      'table' => 'processes_phases', 
      'alias' => 'ProcessesPhase', 
      'type' => 'LEFT', 
      'foreignKey' => false, 
      'conditions'=> array(
      'ProjectDomainsPhase.process_phase_id = ProcessesPhase.id' 
      ) 
     ), 
     array(
      'table' => 'phases', 
      'alias' => 'Phase', 
      'type' => 'LEFT', 
      'foreignKey' => false, 
      'conditions'=> array(
      'ProcessesPhase.phase_id = Phase.id' 
      ) 
     ), 
     array(
      'table' => 'projects_domains', 
      'alias' => 'ProjectsDomain', 
      'type' => 'LEFT', 
      'foreignKey' => false, 
      'conditions'=> array(
      'ProjectDomainsPhase.project_domain_id = ProjectsDomain.id' 
      ) 
     ), 
     array(
      'table' => 'domains', 
      'alias' => 'Domain', 
      'type' => 'LEFT', 
      'foreignKey' => false, 
      'conditions'=> array(
      'ProjectsDomain.domain_id = Domain.id' 
      ) 
     ), 
     array(
      'table' => 'projects', 
      'alias' => 'Project', 
      'type' => 'LEFT', 
      'foreignKey' => false, 
      'conditions'=> array(
      'ProjectsDomain.project_id = Project.id' 
      ) 
     ) 
    ), 
     'fields' => array('Project.title', 'Project.date_target', 'ProcessesPhase.step_number', 'Domain.label_fr AS domain_fr', 'Domain.label_es AS domain_es', 'Phase.label_fr AS phase_fr', 'Phase.label_es AS phase_es', 'ProjectDomainsPhase.date_notification', 'ProjectDomainsPhase.done', 'ProjectDomainsPhase.date_finished', 'ProjectDomainsPhase.id') 
    ) 
    ); 
    $this->set('taches', $this->paginate()); 

Я сделал это, следуя cakephp: using a join for search results

Мое мнение:

// manage.ctp 
<table cellpadding="8" cellspacing="0"> 
<tr> 
    <th><?php echo $this->Paginator->sort('Project.title','Projet'); ?></th> 
    <th><?php echo $this->Paginator->sort('Project.date_target','Date cible du projet'); ?></th> 
    <th><?php echo $this->Paginator->sort('ProcessesPhase.step_number','Etape'); ?></th> 
    <th><?php echo $this->Paginator->sort('Domain.domain_'.$_SESSION['lang'],'Domaine'); ?></th> 
    <th><?php echo $this->Paginator->sort('Phase.phase_'.$_SESSION['lang'],'Tâche'); ?></th> 
    <th><?php echo $this->Paginator->sort('ProjectDomainsPhase.date_notification','Date notification'); ?></th> 
    <th><?php echo __('Statut'); ?></th> 
    <th><?php echo $this->Paginator->sort('ProjectDomainsPhase.date_finished','Date fin tâche'); ?></th> 
</tr> 
<?php 
foreach ($taches as $key => $tache){ ?> 
<tr> 
    <td><?php echo $tache['Project']['title']; ?>&nbsp;</td> 
    <td><?php echo $this->Date->date_inv($tache['Project']['date_target']); ?>&nbsp;</td> 
    <td><?php echo $tache['ProcessesPhase']['step_number']; ?>&nbsp;</td> 
    <td><?php echo $tache['Domain']['domain_'.$_SESSION['lang']]; ?>&nbsp;</td> 
    <td><?php echo $tache['Phase']['phase_'.$_SESSION['lang']]; ?>&nbsp;</td> 
    <td><?php echo $this->Date->date_inv($tache['ProjectDomainsPhase']['date_notification']); ?>&nbsp;</td> 
    <td><?php 
    echo '<input type="hidden" name="data['.$key.'][ProjectDomainsPhase][done]" value=0 />'; 
    echo '<input type="checkbox" name="data['.$key.'][ProjectDomainsPhase][done]" value="1"'; 
    if ($tache['ProjectDomainsPhase']['done']==1) 
    echo ' checked'; 
    echo ' />'; 
    echo '<input type="hidden" name="data['.$key.'][ProjectDomainsPhase][id]" value='.$tache['ProjectDomainsPhase']['id'].' />'; 
    ?>&nbsp;</td> 
    <td><?php echo $this->Date->date_inv($tache['ProjectDomainsPhase']['date_finished']); ?>&nbsp;</td> 
</tr> 
<?php }; 
?> 
</table> 

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

+0

у вас есть сортируемые данные? –

+0

Я не знаю, что это значит. Может быть, проблема может возникнуть здесь ... – KmeCnin

+0

У вас есть достаточно разных записей, чтобы при сортировке в каком-то поле изменилось представление данных? –

ответ

0

Я получил новое решение для этого ..

На самом деле я тоже сталкивался с такой же проблемой, и, наконец, получил трюк, чтобы сделать это ..

Вот мой запрос присоединиться и функциональность ..

 $fields = array('SubjectCategory.name,Subject.name'); 
     $joins = array(); 
     $joins[] = array(
      'table' => 'subject_category_link', 
      'foreignKey' => false, 
      'conditions' => array('SubjectCategoryLink.subject_id = Subject.subject_id' 
      ), 
      'type' => 'INNER', 
      'alias' => 'SubjectCategoryLink', 
     ); 
     $joins[] = array(
      'table' => 'subject_category', 
      'foreignKey' => false, 
      'conditions' => 'SubjectCategory.subject_category_id = SubjectCategoryLink.subject_category_id', 
      'type' => 'INNER', 
      'alias' => 'SubjectCategory', 
     ); 
     $conditions = array('SubjectCategory.parent_category_id' => NULL); 
     $limit = 10; 
     $group = 'Subject.name'; 
     $this->paginate = array('Subject' => compact('conditions', 'fields', 'order', 'limit', 'joins', 'group')); 
     $order=''; 
     /* Here you should solution code provided bellow */ 

     $this->paginate('Subject'); 

компонент CakePHP Paginator только сортировать вышеуказанные записи, когда я называю сильфона код в моем файле просмотра ..

echo $this->Paginator->sort('Subject.name'); 

Проблема, с которой я столкнулся, не может сортировать записи по SubjectCategory.name, щелкнув ссылку, сгенерированную в файле вида.

echo $this->Paginator->sort('SubjectCategory.name'); 

Но это работает только при начальной загрузке, определяя $ порядка в контроллере ..

$order = 'SubjectCategory.name asc'; 

Так я анализировал компонент Paginator (расположен в приложение/Cake/Controller/Компонент/PaginatorComponent.php) в CakePHP и получил трюк для сортировки записей ..

1.Add эта часть до вашего постраничного вызова ($ this-> постраничного ('Subject')) в контроллере ..

if (array_key_exists('sort', $this->params['named'])) { 
     $order = $this->params['named']['sort'] . ' ' . $this->params['named']['direction']; 
    } else { 
     $order = 'Subject.name asc'; 
    } 
    $this->Session->write('paginate_custom',1); 
    $this->paginate = array('Subject' => compact('conditions', 'fields', 'order', 'limit', 'joins', 'group')); 

    $this->set(compact('order'));// Dont forget to set this order variable to view 
  1. Go и редактировать компонент CakePHP Paginator. (Приложение/Cake/Controller/Component/PaginatorComponent.php)

В строке 141 вы можете увидеть сильфона код в функции постраничной().

$options = $this->mergeOptions($object->alias); 

После этой строки вы добавляете следующую логику.

if ($this->Controller->Session->read('paginate_custom')) { 
     unset($options['sort']); 
     unset($options['direction']); 
     $this->Controller->Session->delete('paginate_custom'); 
    } 

3.In ваш взгляд заменить сильфон код при каждом вызове сортировки ($ this-> paginator-> сортировки ('SubjectCategory.name'))

<td><?php 
     $col_string = explode(' ', $order); 
     $col = $col_string[0]; 
     if ($col == 'SubjectCategory.name') { 
      $dir = ($col_string[1] == 'asc') ? 'desc' : 'asc'; 
     } else { 
      $dir = 'asc'; 
     } 
     echo $this->Paginator->sort('SubjectCategory.name', 'Name', array('direction' => $dir));?> 
    </td> 

Я думаю, что это может помочь вам ..

Все самое лучшее ..

Удачного программирование ..