Проблема CakePHP с поиском и нумерацией страниц - PullRequest
0 голосов
/ 26 апреля 2011

У меня проблема с моим сайтом CakePhp.

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

Есть идеи, где мой код неверен?

class ItemsController extends AppController {
var $name = 'Items';


// load any helpers used in the views
var $helpers = array('Paginator', 'Html', 'Form', 'Javascript', 'Misc', 'Time', 'Tagcloud');
var $components = array('RequestHandler'); 

/**
 * index()
 * main index page for items
 * url: /items/index
 */
function index() {
    // get all options for form
    $tags = $this->Item->Tag->find('list', array(
        'fields'=>'id, name', 
        'order'=>'Tag.name',
        'conditions'=> array(
            'Tag.status'=>'1'
        )
    ));

    // add name to option
    $tags   = array(''=>'Tags') + $tags;

    //pr($tags);

    // if form submitted
    if (!empty($this->data)) {
        // if reset button pressed redirect to index page
        if(isset($this->data['reset'])) {
            $this->redirect(array('action'=>'index'));
        }

        // init
        $url = '';

        // remove search key if not set
        if($this->data['search'] == '') {
            unset($this->data['search']);
        }

        // loop through filters
        foreach($this->data as $key=>$filter) {
            // ignore submit button
            if($key != 'filter') {
                // init
                $selected = '';

                switch($key) {
                    case 'tag':
                        $selected = $tags[$filter];
                    break;
                    case 'search':
                        $selected = $filter;
                    break;
                }
                // if filter value is not empty
                if(!empty($filter)) {
                    $selected = $this->slug($selected);
                    $url .= "/$key/$selected";
                }
            }
        }

        // redirect
        $this->redirect('/items/index/'.$url);
    } else {
        // set form options
        $this->data['tag'] = '';
        $this->data['search'] = '';
    }

    // if any parameters have been passed
    if(!empty($this->params['pass'])) {
        // only select active items
        $conditions = array('Item.status'=>1);

        // get params
        $params = $this->params['pass'];
        // loop
        foreach($params as $key=>$param) {
            // get the filter value
            if(isset($params[$key+1])) {
                $value = $params[$key+1];
            }

            // switch on param
            switch($param)
            {
                case 'tag':
                    // get tag
                    $tag = $this->Item->Tag->find('first', array(
                        'recursive' => 0,
                        'conditions' => array(
                            'Tag.slug'=>$value
                        )
                    ));
                    // save value for form
                    $this->data['tag'] = $tag['Tag']['id'];
                break;
                case 'search':
                    // setup like clause
                    $conditions['Item.name LIKE'] = "%{$value}%";
                    // save search string for form
                    $this->data['search'] = str_replace('_', ' ', $value);
                break;
            }
        }

        //pr($conditions);

        // get all items with param conditions
        $items = $this->Item->find('all', array(
            'order' => 'Item.name',
            'conditions' => $conditions
        ));

        // if tag filter has been set
        if(isset($tag)) {
            // loop through items
            foreach($items as $key=>$item) {
                // init
                $found = FALSE;
                // loop through tags
                foreach($item['Tag'] as $k=>$g) {
                    // if the tag id matches the filter tag no need to continue
                    if($g['id'] == $tag['Tag']['id']) {
                        $found = TRUE;
                        break;
                    }
                }

                // if the tag was not found in items
                if(!$found) {
                    // remove from list
                    unset($items[$key]);
                }
            }
        }

    } else {
        // get all items from database where status = 1, order by name
        $items = $this->Item->find('all', array(
            'order' => 'Item.name',
            'conditions' => array(
                'Item.status'=>1
            )
        ));
    }

     $this->paginate = array( 
     'limit' => 10
     );    

     $data = $this->paginate('Item');    


    // set page title
    $this->pageTitle = 'Index Page';
    // set layout file
    $this->layout = 'index';
    // save the items in a variable for the view

    $this->set(compact('data', 'tags', 'items'));

}

1 Ответ

0 голосов
/ 26 апреля 2011

Вы хотите передать свои условия поиска в функциональные возможности пагинации. Вы делаете это через свойство paginate контроллера.

function index() {
    ...
    switch($param) {
        ...
        case 'search':
            $this->paginate['conditions']['Item.name LIKE'] = "%{$value}%";

Более подробную информацию о настройке нумерации страниц можно найти здесь .

...