2016-04-03 1 views
1

Я работаю над веб-проектом в php, который потенциально может иметь много пользователей. С административной точки зрения, я пытаюсь отобразить таблицу, содержащую информацию о каждом пользователе, и, увидев, что таблица пользователей может расти чрезвычайно велика, я хотел бы использовать разбиение на страницы.Как достичь pagination html php mysql

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

    public static function getUsersInfo($limit = 50, $offset=1) 
    { 
        $users_count = Users::count(
          array(
           "column" => "user_id" 
          ) 
         ); 
    
        $users_info = array(); 
        $users = Users::query() 
         ->order('created_at') 
         ->limit($limit, $offset) 
         ->execute() 
         ->toArray(); 
    
        foreach ($users as $index => $user) { 
         $users_info[$index]['user_id'] = $user['user_id']; 
         $users_info[$index]['name'] = $user['first_name'] . " " . $user['last_name']; 
         $users_info[$index] ['phone'] = $user['phone']; 
         $users_info[$index] ['profile_image_url'] = $user['profile_image_url']; 
        } 
    
        $results = array(
         'users_count' => $users_count, 
         'users_info' => $users_info 
        ); 
        return !empty($results) ? $results : false; 
    } 
    
  • На веб-интерфейсе, что я хотел бы получить в идеале есть, есть навигация отображается в нижней части таблицы , с типичными предыдущими, следующими кнопками и, кроме того, несколькими номерами, которые позволяют пользователю быстро перейти на нужную страницу, если отображается номер страницы. Это то, что я имею до сих пор для UserController, без разбивки на страницы.

    class UsersController extends ControllerBase 
    { 
        public function indexAction() 
        { 
         $usersObject = new Users(); 
         $data = $usersObject->getUsers(); 
    
         if ($data['status'] == Constants::SUCCESS) { 
          $users = $data['data']['users_info']; 
          $users_count = $data['data']['users_count'];  
          $this->view->setVar('users', $users); 
         } 
    
         echo $this->view->render('admin/users');  
        } 
    
        public function getUsersAction() 
        { 
         echo Pagination::create_links(15, 5, 1); 
        } 
    } 
    

У меня нет никакой рабочей пагинации, но я думал, хороший способ пойти бы создать Pagination библиотеки с create_links функции, которая принимает

  • total_count записей в базе данных, поэтому я знаю, сколько страниц ожидается
  • limit поэтому я знаю, сколько записей необходимо собрать
  • cur_page так что я знаю, с чего начать извлечение из

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

Я никогда не делал этого раньше, но из исследования, которое я сделал до сих пор, похоже, что это может быть хорошим способом приблизиться к нему. Любое руководство, предложения или что-либо вообще на самом деле, в отношении этого было бы весьма полезно.

+0

google: http://code.tutsplus.com/tutorials/how-to-paginate-data-with-php--net-2928 –

+0

Покажите нам некоторый код. – sensation

ответ

0

Похоже, вы используете какую-то внешнюю структуру MVC-ish. Хотя он не отвечает на ваш вопрос точно, у меня есть несколько моментов:

  1. Если вы ищете множество пользователей, разбиение на страницы является наименьшей из ваших проблем. Вам нужно подумать о том, как индексируется база данных, как возвращаются результаты и многое другое.
  2. Не понимая, какой базовый абстрактный абстрактный слой/драйвер базы данных вы используете, сложно определить, будет ли ваша линия ->limit($limit, $offset) работать правильно. Смещение должно, по-видимому, равняться 0, но не зная кода, который трудно сказать.
  3. Тернарный оператор в вашем первом методе (return !empty($results) ? $results : false;) в настоящее время не имеет значения, потому что выражение перед ним будет означать, что переменная всегда будет массивом.
  4. Избегайте выражений эха в контроллерах. Они должны вернуться к шаблону для вывода представления.
  5. Класс Users будет лучше назван User, так как структура MVC подразумевает, что «Модель» является особой сущностью.

Хотя это не является общим правилом, большинство разбиения на страницы системы я использовал работали на системе с нулевым индексом (Страница 1 Страница 0), так что вычисления предела диапазона прост:

$total_records = 1000; 
$max_records = 20; 
$current_page = 0; 

$offset = $max_records * $current_page; 

$sql = "SELECT * FROM foo LIMIT $offset, $max_records";