Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 28 мар 2024, 14:48

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: 22 май 2014, 13:06 
Не в сети
Бывалый

Зарегистрирован: 17 сен 2012, 13:35
Сообщения: 91
Всем приветы :) !!! Периодически занимаюсь саморазвитием. Когда-то давно назрел вопрос постраничной навигации результатов поиска.

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

Как сделать, так чтобы не терялся результат поиска ещё и пагинация продолжала корректно работать? Понятно, что полученные переменные от запроса и пагинации надо засунуть в сессии. Вопрос - как?

только, чур, не смеяться))) тяжко мне даётся это, ох тяжко...

Код:
public function action_search()
       {           
            $find_id = $this->request->param('id');//привязка к идентификатору
           
        //поиск заказов
        if(isset($_POST['btnsrch']))
        {   
            //валидация
             $_POST = Arr::map('trim', $_POST);

             $post = Validation::factory($_POST);
             $post -> rule('search', 'not_empty');
             
              if($post -> check())//если данные прошли проверку
                    {
                 
                $all = DB::select(DB::expr('COUNT(*) AS mycount'))
                 ->from('main')
                            ->join('apparat')
                            ->on('apparat.apparat_id', '=', 'main.apparat_id')
                            ->join('made')
                            ->on('made.made_id', '=', 'main.made_id')
                            ->join('customer')
                            ->on('customer.customer_id', '=', 'main.customer_id')
                            ->join('master')
                            ->on('master.master_id', '=', 'main.master_id')
                            ->join('check')
                            ->on('check.check_id', '=', 'main.check_id')
                  ->where_open()
                  ->where('customer.fio','like', $_POST['search'].'%')
                  ->or_where('zakaz_id','like', $_POST['search'])
                  ->or_where('customer.adres','like',$_POST['search'].'%')
                  ->or_where('customer.tels','like',$_POST['search'])
                  ->or_where('apparat','like',$_POST['search'].'%')
                  ->or_where('made','like',$_POST['search'].'%')
                  ->or_where('broken','like',$_POST['search'].'%')
                  ->or_where('sn','like', $_POST['search'].'%')
                  ->or_where('model','like',$_POST['search'].'%')
                  ->where_close()
                ->execute()
                ->get('mycount'); 
                       
                //создание ссылок установка значений
      $pagination = Pagination::factory(array('total_items' => $all, 'items_per_page'=>1));
               
                        $search = DB::select('main.*','customer.*','master.master','made.*','apparat.*','check.*')
                          ->from('main')
                                ->join('apparat')
                                ->on('apparat.apparat_id', '=', 'main.apparat_id')
                                ->join('made')
                                ->on('made.made_id', '=', 'main.made_id')
                                ->join('customer')
                                ->on('customer.customer_id', '=', 'main.customer_id')
                                ->join('master')
                                ->on('master.master_id', '=', 'main.master_id')
                                ->join('check')
                                ->on('check.check_id', '=', 'main.check_id')
                          ->where_open()
                          ->where('customer.fio','like', $_POST['search'].'%')
                          ->or_where('zakaz_id','like', $_POST['search'])
                          ->or_where('customer.adres','like',$_POST['search'].'%')
                          ->or_where('customer.tels','like',$_POST['search'])
                          ->or_where('apparat','like',$_POST['search'].'%')
                          ->or_where('made','like',$_POST['search'].'%')
                          ->or_where('broken','like',$_POST['search'].'%')
                          ->or_where('sn','like', $_POST['search'].'%')
                          ->or_where('model','like',$_POST['search'].'%')
                          ->where_close()
                          ->order_by('zakaz_id', 'DESC')
                            ->limit($pagination->items_per_page)
                            ->offset($pagination->offset)
                          ->execute()
                          ->as_array();           
                         
                       
                        // формирование ссылок, разбиение на страницы
                        $page = $pagination->render();
                    }
           
                    else     //если в поле поиска ниче не введено
                    {
                        Session::instance()->set('error', 'Ничего не введено в поле поиска');
                    }
                   
                } 
               

               //здесь я начинаю чудит с сессиями
                Session::instance()->set('page_links', $page);
                Session::instance()->set('search', $search);
                Session::instance()->set('count', $all);
               
                $page_links = Session::instance()->get('page_links');
                $finds = Session::instance()->get('user_id');
                $count = Session::instance()->get('count');
               
          $content = View::factory('searchview')
               ->bind('page_links', $page_links)   //постраничная навигация
               ->bind('finds', $finds)
               ->bind('count', $count)
                        ;
         
          $this->template->content = $content;
       }


естественно все работает неправильно, как только я перехожу на n-страницу, то мне вылетает пойманная ошибка Session::instance()->set('error', 'Ничего не введено в поле поиска'), работает только роут формируя ссылку "rbt/getin/search/1/2"

Спасибо за ваше терпение :oops: ;)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 май 2014, 20:09 
Не в сети
Бывалый

Зарегистрирован: 09 авг 2012, 13:17
Сообщения: 43
я не совсем пойму задачу, зачем писать результаты поиска в сессию?
Но если нужно то может так

Код:
$pagination =new Pagination(array('total_items' => $all));
$search['result'] =/*запрос*/

$search['pagination']=$pagination;
Session::instance()->set('search', $search);


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 май 2014, 11:58 
Не в сети
Бывалый

Зарегистрирован: 17 сен 2012, 13:35
Сообщения: 91
в сессию, чтобы результат поиска разбить на страницы. Если делать стандартную пагинацию для вывода результатов поиска то - результаты формируются, всё, что попадает на первую сформированную страницу, выводится нормально, но как только перехожу на следующую (вторую, пятую, последнюю - не важно) - все результаты поиска и пагинация сбрасываются (работает только роут) а на странице выводится ошибка о том, что ничего не введено в поле поиск.

спасиб за подсказку. буду пробовать. о результатах отпишусь


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 май 2014, 14:27 
Не в сети
Бывалый

Зарегистрирован: 17 сен 2012, 13:35
Сообщения: 91
забавно работает ХD

когда я перехожу на другую страницу - результат теряется, НО если я тутже ввожу в поле поиска тотже самый параметр для поиска, то результат поиска выводится и на отображается на той странице, на которую я пыталась до этого перейти. Т.е. если я после первого ввода в поле поиск вводила "телевизор" вводится результаты по этому запросу, перехожу на страницу, допустим, 5, тона страницу выводится ошибка о том, что я ничего не ввела в поле поиска, роут сохраняется, я тут же ввожу в поле поиска "телевизор" - формируется результат с пагинацией на той самой 5й странице.

Значит он "помнит", пагинацию, но результат поиска сбрасывается.
И ещё один момент: если я ввожу, другие параметры в поле поиск отличные от предыдущих, то поиск не работает и выводится ошибка о том, что ничего не введено в поле поиск, повторно ввожу предыдущий текст запроса в поле поиска - срабатывает с выше описанными нюансами. Ну это понятно, надо очищать сессию.

Хммм....
Я когда начала заниматься решение этого вопроса, смотрела как это делают нормальные люди. А там вообще все просто. Достаточно начать сессию session_start(); в начале файла

как-то ещё через метод GET делают люди, но раз уж взялась за сессии, значит надо их сначала понять


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 май 2014, 15:47 
Не в сети
Бывалый

Зарегистрирован: 06 авг 2012, 22:39
Сообщения: 91
что бы разбить результат на несколько страниц тебе достаточно знать номер текущей страницы и поисковый запрос. результат формируется исходя из этих данных: берем номер страницы, считаем offset/limit, получаем данные. если уж решила юзать сессии - то в сессии достаточно хранить поисковый запрос, номер страницы в роуте
$page нужно передавать в шаблон, т.к. это кусок хтмла, $all тоже нет смысла хранить в сессии. для получения общего количества и лимитированной выборки можно использовать один запрос (см ORM reset(false))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 май 2014, 15:48 
Не в сети
Бывалый

Зарегистрирован: 06 авг 2012, 22:39
Сообщения: 91
вот пример для reset http://blogocms.ru/2012/11/kohana-orm-c ... esetfalse/


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 июн 2014, 16:16 
Не в сети
Бывалый

Зарегистрирован: 17 сен 2012, 13:35
Сообщения: 91
reset(false) классная штука! Ну а для query builder чего-то подобного видимо нет( ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 июн 2014, 19:26 
Не в сети
Бывалый

Зарегистрирован: 06 авг 2012, 22:39
Сообщения: 91
для query builder'а нет, там все сложнее. но в одном запросе можно и так получить


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group