2010-02-21 3 views
3

Я понятия не имею, как обращаться с этими двумя отдельными страницами в одном и том же представлении. Спасибо за помощь.Cakephp две отдельные страницы той же модели

код контроллера:

[...] 
$this->Post->bindModel(array(
'hasAndBelongsToMany'=>array('Tag'), 
'belongsTo'=>array('User')),false); 
if($this->Session->check('Auth.User.id')) 
    $this->Post->bindModel(array(
    'hasMany'=>array(
    'UserVote'=>array('conditions'=>array('UserVote.user_id'=>$this->Session->read('Auth.User.id'))), 
    'Favorite'=>array('conditions'=>array('Favorite.user_id'=>$this->Session->read('Auth.User.id'))) 
)), false); 


$posts = $this->paginate($this->Post,array('Post.public'=>1,'Post.user_id'=>$uid)); 

$posts2 = $this->paginate($this->Post,array('Post.public'=>0,'Post.user_id'=>$uid)); 


$this->set('posts',$posts); 
$this->set('posts2',$posts2); 

[...] 
+0

Пожалуйста, прочтите мой ответ на аналогичный вопрос: http: // stackoverflow.com/a/21211278/2486198 – Mitja

ответ

0

Как помощник PAGINATION полагается на контроллер-> постраничной поле $ Я думаю, что это невозможно. Быстро взломать было бы превратить одну или обе страницы в Ajax-based. Помощник разбиения на страницы отлично работает с помощником Ajax.

0

Это хорошая идея иметь две отдельные страницы на странице? Похоже, вы пытаетесь разбивать страницы на публичные сообщения и непубличные сообщения - что, безусловно, невозможно сделать одновременно? То есть пользователь никогда не будет на странице 3 публичных сообщений и стр. 2 непубличных должностей одновременно. Единственный случай, когда это действительно работает, - это AJAX с разбивкой страницы на странице, как это было предложено matiasf.

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

2

Даже если в большинстве случаев правильным решением будет перепроектировать ваш пользовательский интерфейс, чтобы удалить необходимость двойной нумерацией страниц, следующий рабочий раствор:

Во-первых, в контроллере перекрытии постраничной торта() функция ищет ключ Paginator:

/** 
    * Handles automatic pagination of model records. 
    * 
    * @param mixed $object Model to paginate (e.g: model instance, or 'Model', or 'Model.InnerModel') 
    * @param mixed $scope Conditions to use while paginating 
    * @param array $whitelist List of allowed options for paging 
    * @return array Model query results 
    * @access public 
    * @link http://book.cakephp.org/view/165/Controller-Setup 
    */ 
    function paginate($object = null, $scope = array(), $whitelist = array(), $key = null) { 
     $results = parent::paginate($object, $scope, $whitelist); 
     if ($key) { 
     $this->params['paging'][$key] = $this->params['paging'][$object]; 
     unset($this->params['paging'][$object]); 
     } 

     return $results; 
    } 

Тогда

/** 
    * undocumented function 
    * 
    * @param string $key 
    * @return void 
    * @access public 
    */ 
    function _pageForPagination($by) { 
     $page = 1; 
     $samekey = isset($this->params['named']['by']) && $this->params['named']['by'] == $by; 
     $pageInUrl = isset($this->params['named']['page']); 
     if ($samekey && $pageInUrl) { 
     $page = $this->params['named']['page']; 
     } 

     $this->passedArgs['page'] = $page; 
     return $page; 
    } 

     /** 
    * FIXME: Wrapper for Cake's pagination 
    * Change pagination criteria on the fly (conditions, grouping, order, limit) 
    * 
    * @param string $model 
    * @param string $criteria 
    * @return void 
    * @author Andrew 
    */ 
    function _paginateBy($key) { 
     $this->User->unbindModel(array('hasMany' => array('UserImage')), false); 
     $this->paginate['User'] = am($this->User->getCriteria($key), array('page' => $this->_pageForPagination($key))); 
     return $this->paginate('User', array(), array(), $key); 
    } 

Затем использовать его как и в контроллере: $ this-> s et ('byJoinDate', $ this -> _ paginateBy ('random'));

В модели: echo $ paginator-> prev ('prev', array ('model' => $ by, 'class' => 'back'), null, array ('model' => $ by, 'class' => 'disabled back'));

2

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

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

Пример:

Базовая модель

class Post extends appmodel { }; 

Фиктивные Модели - это важно, что они используют ту же таблицу в качестве базовой модели

class Posts1 extends Post { var $useTable = 'posts'; } 
class Posts2 extends Post { var $useTable = 'posts'; } 

В контроллере

function multiview($id = null) { 

    $this->paginate['Posts1'] = array(
     'conditions'=>array('Posts1.field'=>0), 
     'limit'=>5 
    ); 
    $this->set('posts1', $this->paginate('Posts1')); 

    $this->paginate['Posts2'] = array(
     'conditions'=>array('Posts2.field'=>1), 
     'limit'=>5 
    ); 
    $this->set('posts2', $this->paginate('Posts2')); 
} 

Тогда, на ваш взгляд,

+0

Отличное обходное решение –

Смежные вопросы