Yii フレームワークでのデータページング: データ表示の最適化

WBOY
リリース: 2023-06-21 13:51:05
オリジナル
953 人が閲覧しました

インターネットの急速な発展に伴い、データの増加速度もますます速くなっています。 Web アプリケーションでは、データ ページングは​​ユーザー エクスペリエンスを向上させるために必要なツールの 1 つです。 Yii フレームワークでは、データ ページングを簡単に実装できます。この記事では、Yii フレームワークにおけるデータ ページングと、データ量が多い場合にデータ表示を最適化する方法を紹介します。

1. Yii フレームワークでのデータ ページング

1.1 ページング クラス

Yii フレームワークでは、ページング関数は CPagination クラスにカプセル化されています。 CPagination クラスは、次の共通メソッドを提供します:

  • setPageVar: ページング パラメータ名を設定します (デフォルトは 'page');
  • getPageCount: ページの総数を取得します;
  • getItemCount : データ項目の数を取得します;
  • getLimitOffset: LIMIT... OFFSET... ステートメントを取得します;
  • getPages: ページング HTML コードを取得します。

1.2 CPagination の使用

ユーザー モデル User があり、ページに表示する必要があるデータが 10,000 個あるとします。まず、UserController の actionIndex メソッドで CPagination オブジェクトをインスタンス化する必要があります:

$pagination = new CPagination(10000);

次に、各ページのデータ量を設定できます。

$pagination->pageSize = 20;

またはデフォルト値を使用します:

$pagination->pageSize = Yii::app()->user -> ;pageSize;

次に、現在のページ番号を計算する必要があります:

$pagination->setCurrentPage($_GET['page']);

最後に、表示するデータは、現在のページ番号と各ページのデータ量に基づいて取得する必要があります。

$users = User::model()->findAll(array(#) ##

'limit' => $pagination->getLimit(),
'offset' => $pagination->getOffset(),
ログイン後にコピー

));

最後に、ビュー ファイルで getPages メソッドを使用してページング HTML コードを取得する必要もあります:

<?php $this->widget('CLinkPager', array(
    'pages' => $pagination,
)); ?>
ログイン後にコピー

2. データ表示の最適化

データ量が多い場合、従来のページング方法ではページの読み込みが遅くなり、ユーザー エクスペリエンスが低下する可能性があります。データ表示を最適化する 2 つの方法を次に示します。

2.1 Ajax ページング

Ajax ページングを使用すると、ページを切り替えるたびにページ全体が更新されるという問題を回避できます。ユーザーがページング リンクをクリックすると、更新する必要がある部分のみを更新する Ajax リクエストが送信され、ページの更新速度が大幅に向上します。

#$pagination = new CPagination(10000);

$pagination->pageSize = 20;

$pagination->setCurrentPage($_GET['page']);

$this->render('index', array(

'users' => User::model()->findAll(array(
    'limit' => $pagination->getLimit(),
    'offset' => $pagination->getOffset(),
)),
'pagination' => $pagination,
ログイン後にコピー

));

ビュー ファイルでは、yii-ajax-linkpager-widget を使用して CLinkPager コントロールを置き換えます。 。ユーザーがページング リンクをクリックすると、Ajax を使用してデータが更新されます:

<?php $this->renderPartial('_userlist', array('users' => $users)); ?>
ログイン後にコピー

<?php $this->widget('ext.yii-ajax-linkpager-widget.EAjaxLinkPager', array(
    'ajaxUpdate' => 'userlist',
    'pages' => $pagination,
)); ?>
ログイン後にコピー

_controller フォルダーに、ページング要求が処理されるメソッド actionPage を追加する必要があります。

public function actionPage()

{

// 处理分页请求,返回分页数据
$pagination = new CPagination(10000);
$pagination->pageSize = 20;
$pagination->setCurrentPage($_GET['page']);

$users = User::model()->findAll(array(
    'limit' => $pagination->getLimit(),
    'offset' => $pagination->getOffset(),
));

$this->renderPartial('_userlist', array('users' => $users));
ログイン後にコピー

}

2.2 ページング データのキャッシュ

ページング データをキャッシュ サーバーにキャッシュすると、ページングのパフォーマンスが大幅に向上します。ユーザーがページング データを要求すると、まずキャッシュ サーバーにデータがキャッシュされているかどうかを確認し、キャッシュされている場合はデータを直接返します。そうでない場合は、データベースにクエリを実行し、データをキャッシュ サーバーに保存してからデータを返します。

Yii フレームワークによって提供されるキャッシュ メカニズムを使用できます。コントローラーの actionIndex メソッドで COutputCache を使用して、ページング データをキャッシュします。

public function actionIndex()

{

// 缓存时间为10分钟
$cacheId = __CLASS__.__METHOD__.md5(Yii::app()->user->id);
$cacheTime = 10*60;

if(!$this->beginCache($cacheId, array(
    'duration' => $cacheTime,
)))
{
    $pagination = new CPagination(10000);
    // ...
    $users = User::model()->findAll(array(
        'limit' => $pagination->getLimit(),
        'offset' => $pagination->getOffset(),
    ));

    $this->render('index', array(
        'users' => $users,
        'pagination' => $pagination,
    ));

    $this->endCache();
}
ログイン後にコピー

}

ユーザーがページング データをリクエストしたとき、キャッシュの場合データがキャッシュ サーバーに存在する場合は、キャッシュ データが直接返されます。そうでない場合は、データベースがクエリされ、データがキャッシュ サーバーに格納されて、データが返されます。

要約すると、Yii フレームワークのデータ ページング機能は実装が簡単で、さまざまな最適化方法をサポートしているため、Web アプリケーションのユーザー エクスペリエンスを大幅に向上させることができます。少量のデータでも大量のデータでも、データ ページングを簡単に実装できます。

以上がYii フレームワークでのデータページング: データ表示の最適化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート