0

私はCakePHPを使用して、MySQLバックエンドを使用してPowerDNSのフロントエンドUIを作成しています。アプリのフロントページに、いくつかのウィジェット(「レコードをすばやく追加する」、「ドメインをすばやく追加する」など)が必要です。私が欲しいウィジェットの1つは、既存のドメインのページ付けされたリストです。

DomainsController.phpのインデックス関数は次のようになります。

public $paginate = array(
  'fields'     => array('id', 'name'),
  'limit'      => 25,
  'order'      => array( 'name' => 'asc' ),
  'conditions' => array( "NOT" => array( "name LIKE" => "%.arpa" ) )
);

public function index() {
  $domains = $this->paginate();
  if ( $this->request->is('requested')) {
    return $domains;
  } else {
    $this->set('domains', $domains);
  }
}

次のような要素を作成しました。

<?php $domains = $this->requestAction('Domains/index'); ?>

<ol>
  <?php foreach( $domains as $domain) :?>
    <li>echo $domains['domain']['name']</li>
  <?php endforeach; ?>
</ol>

<?php echo $paginator->numbers(); ?>

フロントページにアクセスすると、「未定義の変数:paginator」エラーが発生します。代わりに$this->Paginator-> numbers()を使用してみましたが、「Undefined property:View ::$Paginator」が表示されます。「Paginator」ヘルパーをPagesController.phpに追加しても、どちらも役に立ちません。$ this-> Paginatorが使用可能になりますが、「Undefined index:pageCount」が表示されます。

home.ctpの要素からこの種のページ付けを行うことは可能ですか、それともカスタムJavaScriptの処理を行う必要がありますか?

編集

今、私はどこかに到達しています:DomainsControllerインデックス関数を次のように変更しました:

public function index() {
 $domains = $this->paginate();
 $paginator = $this->params;
 if ( $this->request->is('requested')) {
  return compact( 'domains', 'paginator' );
 } else {
  $this->set('domains', $domains);
 }
}

そして、domainList.ctp要素に以下を追加しました。

<?php 
$result = $this->requestAction('Domains/index');
$domains = $result['domains'];
$this->Paginator->request = $result['paginator'];
?>

<ol>
  <?php foreach( $domains as $domain) :?>
    <li>echo $domains['domain']['name']</li>
  <?php endforeach; ?>
</ol>

<?php echo $paginator->numbers(); ?>

$ this-> Paginatorが正常に機能するようになり、通常どおり、そのすべてのメソッドやプロパティなどにアクセスできます。私の問題は、たとえば「2」をクリックすると、ブラウザが/ pages / home / page:2に移動しますが、ドメインリストにはまだページ1が表示されていることです。「page:2」を渡す方法を理解する必要があります。要素に。そして、ページ全体を更新する必要がないように、全体をAJAX化してください。

4

2 に答える 2

0

OK、私はこの問題を解決しましたが、私の解決策はおそらくあまりエレガントではありません。

DomainsController.phpには、次のようなlistDomains()関数があります。

public function listDomains() {
 $domains = $this->paginate(); 
 $paginator = $this->params;
 if ( $this->request->is('ajax') ) {
  $this->set( 'domains', $domains );
 }
 if ( $this->request->is('requested')) {
  return array( 'domains' => $domains, 'paginator' => $paginator, 'paging' => $this->params['paging'] );
 } else {
  $this->set( 'domains', $domains );
 }
}

home.ctpは、domainList.ctpという要素を参照します。以下のdomainList.ctpは、次にrequestAction()を使用して、上記のdomainList()関数を呼び出します。リクエストがリクエストされると、$domainsと$paginatorの値を含む配列が要素に返送されます。

domainList.ctpには次のコードが含まれています。

<?php
$result = $this->requestAction('Domains/listDomains', array('updateId' => 'domainList') );
$domains = $result['domains'];
$paginator = $result['paginator'];
$this->Paginator->request = $paginator;

$this->Paginator->options(array(
 'update' => '#domainList',
 'evalScripts' => true,
 'url' => array('controller' => 'Domains', 'action' => 'listDomains', 'updateId' => 'domainList' ),
));

?>

基本的に、ここで行っているのは、$ this-> Paginator-> requestに、最初にDomainControllerのdomainList()関数に送信されたパラメーターを手動で再入力することです。これにより、numbers()、prev()、next()などのさまざまなページネーター関数に適切にアクセスできます。少し面倒ですが、どうでしょう?少し面倒になります。

これらのページネーター関数によって作成されたリンクをクリックすると、'if($ this-> request-> is(' ajax'))'セグメントが実行され、ページ上のdivオブジェクトがビュー/ドメインのコンテンツで更新されます。 View / Elements/domainList.ctpの代わりに/domainList.ctp。View / Domains / domainList.ctpの内容は、対応する要素とほぼ同じであり、2つは多かれ少なかれ同期されている必要があります。違いは、$this->Paginatorを手動で入力する必要がないことです。

<?php
$this->Paginator->options(array(
 'update' => '#domainList',
 'evalScripts' => true,
 'url' => array('controller' => 'Domains', 'action' => 'listDomains', 'updateId' => 'domainList' ),
));

?>

私が言ったように、それは厄介でエレガントではありませんが、それは私にとってはうまくいきました。誰かがこれを行うためのより厄介な方法を持っているかどうかを知ってうれしいです。

于 2012-06-01T17:54:19.603 に答える
0

まず、これを行わないでください:

$ domains = $ this-> requestAction('Domains / index'); それは高価で良い習慣ではなく、なぜあなたがあなたの例からそれをする必要があるのか​​分かりません。

次に、次のようにパジネートを呼び出します。

$ domains = $ this-> Paginate('Domain');

于 2012-05-23T10:28:19.140 に答える