2014-10-30 2 views
0

Для CakePhp 2.5Paginating results from function function

У меня есть следующая функция поиска в моем контроллере.

public function search($query = null, $lim = null) 
{ 
    $tokens = explode(" ", $query); 
     $this->Paginator->settings = array(
        'conditions' => array(
         'Customer.site_id LIKE' => '%' . $this->viewVars['shopId'], 
         'CONCAT(Customer.first_name," ",Customer.last_name," ",Customer.organisation) LIKE' => '%' . implode(' ', $tokens) . '%' 
        ), 
        'limit' => $lim 
       ); 
     $this->set('customers', $this->Paginator->paginate()); 
} 

Это прекрасно работает и получает результаты, которые я хочу.

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

public function getActiveTasks($id){ 
     return $this->Task->find('all', array(
      'conditions' => array(
       'Task.customer_id' => $id, 
       'Task.status' => 0 
      ), 
      'order' => array('Task.due_date ASC'), 
      'recursive' => -1, 
     )); 
    } 

Проблема у меня в том, что я не могу (или не знаю как) использовать Paginator с пользовательским поиском. Есть ли способ разбивать на страницы результаты из пользовательских функций?

т.е. я могу сделать следующее:

public function CustomModelSearch($query = null, $lim = null) 
{ 
    return $this->Task->find('all', array(
     'conditions' => array(
      'Customer.site_id LIKE' => '%' . $this->viewVars['shopId'], 
      'CONCAT(Customer.first_name," ",Customer.last_name," ",Customer.organisation) LIKE' => '%' . implode(' ', $tokens) . '%' 
     ), 
     'limit' => $lim 
    )); 
} 

, а затем в вызове контроллера

$results = $this->Model->CustomModelSearch($query, $lim); 
$this->set('results',$this->Paginate($results)); 

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

ответ

1

Для создания пользовательских нумерацией страниц у вас есть два варианта:

  • Создать Custom Query Pagination с микросхемой paginate и paginateCount Funtions

    // постраничной и paginateCount реализован по поведению. функция постраничной общественности (модель $ модель, $ условие, $ поля, $ порядок, $ предела, $ стр = 1, $ рекурсивного = NULL, $ = дополнительный массив()) {// содержания метода }

    функция paginateCount общественности (модель $ модель, $ условия = NULL, $ рекурсивный = 0, $ = дополнительный массив()) {// тело метода }

  • или создать custom find и установить Paginator использовать что найти.

0

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

Функция в модели «Задача» вы не должны ставить $this->task->find только $this->find, что если вы в модели не нуждаетесь, укажите, какую модель вы используете, вам нужно только это сделать в контроллере.

модель/Task.php:

public function CustomModelSearch($query = null, $lim = null) 
{ 
    return $this->find('all', array(
     'conditions' => array(
      'Customer.site_id LIKE' => '%' . $this->viewVars['shopId'], 
      'CONCAT(Customer.first_name," ",Customer.last_name," ",Customer.organisation) LIKE' => '%' . implode(' ', $tokens) . '%' 
     ), 
     'limit' => $lim 
    )); 
} 
+0

Я знаю об этом. Выложенная функция является лишь примером, иллюстрирующим мою точку зрения. –

+0

Положите ваш вопрос, объясните вашу проблему, и эта ошибка даст вам и вашему коду примеры wihtout – CoolLife