cakephp Косвенная модификация перегруженного свойства PaginatorHelper

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

<?php
echo $this->Form->create('Order', array('action' => 'search','type'=>'get'));?>
<?php echo $this->Form->input('SearchTerm',array('label' => 'Find:')); ?>
<?php $options=array('full_name'=>'By Name','code'=>'By Code','phone'=>'By Phone','email'=>'By Mail'); ?>
<?php echo $this->Form->input('options', array('type'=>'select', 'label'=>'Search:', 'options'=>$options)); ?>

<?php echo $this->Form->end('search'); ?>  

<?php if($rs!=0){?>
<?php if($rs!=null) { ?>
    results found : <?php print $results; //print_r ($result['Order']['full_name']); ?>
<h1 class="ico_mug">Results Matching Term: <?php print '"'.$term.'"' ;?></h1>
<table id="table">
    <tr>

        <th>Client Name</th>
        <th>Order Code</th>
        <th>Phone</th>
        <th>Received Order</th>
        <th>Working On Order </th>
        <th>Order Ready </th>
    </tr>

    <!-- Here is where we loop through our $posts array, printing out post info -->

    <?php foreach ($rs as $order): ?>
    <tr>

        <td>
            <?php echo $this->Html->link($order['Order']['full_name'],
            array('controller' => 'orders', 'action' => 'view', $order['Order']['id'])); ?>
        </td>
        <td><?php echo $order['Order']['code']; ?></td>
        <td><?php echo $order['Order']['phone']; ?></td>
        <td><?php echo $this->OrderStatus->getStatusString($order['Order']['receive_state']); ?></td>
        <td><?php echo $this->OrderStatus->getStatusString($order['Order']['working_state']); ?></td>
        <td><?php echo $this->OrderStatus->getStatusString($order['Order']['ready_state']); ?></td>
        <td> <?php //echo $this->Html->link($this->Html->image("cancel.jpg"), array('action' => 'index'), array('escape' => false));?><?php echo $this->Html->link($this->Html->image("edit.jpg"), array('action' => 'edit',$order['Order']['id']), array('escape' => false));/*echo $this->Html->link('Edit', array('action' => 'edit', $order['Order']['id']));*/?></td>
    </tr>
    <?php endforeach; ?>
    <tr ><?php //echo $this->Paginator->numbers(array('first' => 'First page')); ?></tr>
    <?php
    $urlParams = $this->params['url'];
    unset($urlParams['url']);
    $optionss=array('url' => array('?' => http_build_query($urlParams)));
    //$this->Paginator->options($optionss);
    $this->Paginator->settings['paramType'] = 'querystring';

    ?>

    <tr ><?php  //echo" << ".$this->Paginator->counter(
       // 'Page {:page} of {:pages}');
        ?></tr>

</table>

 <?php }else echo"no results found"; ?>


<?php } //endif?>

и это мое действие контроллера

function search($options=null){
        $this->set('results',"");
        $this->set('term',"");
        $this->set('rs',0);    

        if ((isset($_GET["SearchTerm"]))||(isset($_GET["options"])) ) {
            $SearchTerm=$_GET["SearchTerm"];
            $options=$_GET["options"];

            if (!$options || !$SearchTerm) {
                $this->Session->setFlash('Please enter something to search for');
            }
            else {
                $SearchArray = array($options." LIKE " => "%".$SearchTerm."%");

                $this->paginate = array('conditions' =>  $SearchArray,'limit'=>2,'convertKeys' => array($options, $SearchTerm));
                $data=$this->paginate('Order');
                $this->set('rs', $data);
                $this->set('term',$SearchTerm);

            }
        }

как вы можете видеть, я использую опции параметров Get и SearchTerm. Я хочу, чтобы эти двое остались в ссылках на страницы. Я пробовал различные исправления, которые я нашел в stackoverflow и на другом сайте (например, например:

$urlParams = $this->params['url'];
    unset($urlParams['url']);
    $optionss=array('url' => array('?' => http_build_query($urlParams)));

но я все еще получаю следующее сообщение об ошибке:

Косвенная модификация перегруженного свойства PaginatorHelper::$settings не имеет эффекта [APP\View\orders\search.ctp, строка 75

это почему? а как насчет решения этого? (даже если я использую wxample из поваренной книги

$this->Paginator->settings['paramType'] = 'querystring';

я все еще получаю ту же ошибку: S не могли бы вы помочь/объяснить?


person George    schedule 09.02.2012    source источник
comment
Существует как PaginatorComponent, так и PaginatorHelper. $settings — это свойство компонента, поэтому $this->Paginator->settings следует переместить на ваш контроллер. Вот откуда ошибка перегруженного свойства.   -  person Wylie    schedule 10.02.2012


Ответы (1)


Если я правильно понимаю ваш код, вы сможете заменить:

<?php
    $urlParams = $this->params['url'];
    unset($urlParams['url']);
    $optionss=array('url' => array('?' => http_build_query($urlParams)));
    //$this->Paginator->options($optionss);
    $this->Paginator->settings['paramType'] = 'querystring';
?>

с участием

<?php $this->Paginator->options(array('url' => $this->passedArgs)); ?>

Поля формы в нумерации страниц Если вы на самом деле пытаетесь поместить элементы формы в нумерацию страниц, вам потребуется немного изменить свой код. Вам нужно будет создать именованные параметры для каждого элемента в параметрах поиска. Затем в действии контроллера вам нужно будет проверить как запрос->данные, так и версии поиска params['named'], чтобы убедиться, что вы используете их в обоих случаях. Я бы также почистил код, чтобы он был немного более читабельным.

Во-первых, вам нужно использовать методы торта для получения данных. Он позаботится о том, чтобы очищать запросы для вас и т. д. Кроме того, вам нужно будет учитывать условие поиска и параметры фильтра, которые передаются как в виде именованной переменной, так и в форме. Итак, вам нужно обновить контроллер следующим образом:

function search($options=null){

    $this->set('results',""); // where is this used ??
    $this->set('rs', 0); 
    $this->set('SearchTerm', '');
    $this->set('FilterBy', '');   
    $this->set('options', array('full_name'=>'By Name','code'=>'By Code','phone'=>'By Phone','email'=>'By Mail'));

    if ($SearchTerm = $this->request->data['Order']['SearchTerm']) or $SearchTerm = $this->params['named']['SearchTerm']) {
        if ($FilterBy = $this->request->data['Order']['FilterBy'] or $FilterBy = $this->params['named']['FilterBy'])) {
            $this->paginate = array(
                'conditions' => array($FilterBy." LIKE " => "%".$SearchTerm."%"), 
                'limit' => 2, 
                'convertKeys' => array($FilterBy, $SearchTerm)
            );
            $this->set('rs', $this->paginate('Order'));
            $this->set('SearchTerm', $SearchTerm);
            $this->set('FilterBy', $FilterBy);
        } else {
            $this->Session->setFlash('Please enter something to search for');
        }
    } else {
        $this->Session->setFlash('Please enter something to search for');
    }
}

Далее мы сосредоточимся на представлении. Удалить переместить это:

$options=array('full_name'=>'By Name','code'=>'By Code','phone'=>'By Phone','email'=>'By Mail');

Его не должно быть в поле зрения. Он принадлежит контроллеру (где он сейчас и находится).

Далее очищаем форму:

<?php
  echo $this->Form->create('Order', array('action' => 'search','type'=>'get'));
  echo $this->Form->input('SearchTerm',array('label' => 'Find:'));
  echo $this->Form->input('FilterBy', array('type'=>'select', 'label'=>'Search:', 'options'=>$options));
  echo $this->Form->end('search'); 
?>  

*Обратите внимание, что я изменил имя options на FilterBy, чтобы его было легче найти в контроллере. Также есть другие вещи, которые можно было бы очистить в представлении. Однако я буду обращаться только к тем вещам, которые соответствуют вопросу.

Теперь вам нужно заменить этот код:

<tr ><?php //echo $this->Paginator->numbers(array('first' => 'First page')); ?></tr>
    <?php
    $urlParams = $this->params['url'];
    unset($urlParams['url']);
    $optionss=array('url' => array('?' => http_build_query($urlParams)));
    //$this->Paginator->options($optionss);
    $this->Paginator->settings['paramType'] = 'querystring';

    ?>

    <tr ><?php  //echo" << ".$this->Paginator->counter(
       // 'Page {:page} of {:pages}');
        ?></tr>

</table>

С этим кодом:

</table>
<p>
<?php
  $this->Paginator->options(array('url' => array_merge(array('SearchString' => $SearchString, 'FilterBy' => $FilterBy), $this->passedArgs)));

echo $this->Paginator->counter(array(
'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%')
));
?>  
</p>

<div class="paging">
    <?php echo $this->Paginator->prev('<< ' . __('previous'), array(), null, array('class'=>'disabled'));?>
 |  <?php echo $this->Paginator->numbers();?>
 |  <?php echo $this->Paginator->next(__('next') . ' >>', array(), null, array('class' => 'disabled'));?>
</div>

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

Удачи и счастливого кодирования!

person Chuck Burgess    schedule 10.02.2012
comment
спасибо :) на самом деле я новичок в MVC, и я до сих пор многого не понял в cakephp, но ваш ответ был действительно полезным и исчерпывающим :) - person George; 10.02.2012
comment
Не за что! Я люблю торт и знаю, что такое входной барьер. Тем не менее, я знаю силу этого и люблю поощрять людей придерживаться его. Это окупится в долгосрочной перспективе. - person Chuck Burgess; 10.02.2012