1

私はZendFrameworkアプリケーションに取り組んでおり、http://tfountain.co.uk/blog/2010/9/9/vanity-urls-zend-framework/のガイドを使用して、バニティルーティングを機能させましたが、ページネーションが機能しておらず、バニティURLガイドのどれも私がそれに触れることができませんでした。

私のバニティルートは'として設定されてい/:username/:filter/:pagます。最後の2つのパラメーターはオプションです。ページは正しく表示されています。「/jaimerump/ Badges / 2」はバッジの2ページ目に移動しますが、次のページのURLがわからないため、ページネーターが機能していません。すべてのZendページ付けチュートリアルの標準paginationControl.phtmlファイルを使用しています。コードは次のとおりです。

<?php if ($this->pageCount): ?>
<div class="paginationControl" id="paginationControl">
<!-- Previous page link -->
<?php if (isset($this->previous)): ?>
    <a href="<?php echo $this->url(array('page' => $this->previous)); ?>" id="previous">
        &lt; Previous
    </a> |
<?php else: ?>
    <span class="disabled">&lt; Previous</span> |
<?php endif; ?>

<!-- Infinite Scroll doesn't use numbered page links -->

<!-- Next page link -->
<?php if (isset($this->next)): ?>
    <a id="next" href="<?php echo $this->url(array('page' => $this->next)); ?>" >
    Next &gt;
    </a>
<?php else: ?>
    <span class="disabled">Next &gt;</span>
<?php endif; ?>
</div>
<?php endif; ?>

'/ jaimerump / Badges / 3'を$this->url()返す代わりに、'/'を返します。これは私のカスタムルートクラスと関係があると確信しています。Tim Fountainのチュートリアルからmatch関数を変更し、クラスの名前をVanityRouteUserに変更して、modelsフォルダーに配置しましたが、それ以外はすべて同じです。マッチ機能:

public function match( $path, $partial = false )
{
    /* User profile routes are of form /:username/:filter/:page
    Where filter can be haves, wants, badges, etc.
    */

    if ($path instanceof Zend_Controller_Request_Http) {
        $path = $path->getPathInfo();
    }

    $path = trim($path, $this->_urlDelimiter);
    $pathBits = explode($this->_urlDelimiter, $path);

    if ( count($pathBits) < 1 ) {
        return false;
    }

    // check database for this user
    $result = DB::call()->fetchRow('SELECT user_id 
                                    FROM users 
                                    WHERE username = ?', $pathBits[0]);
    if ($result) {
        // user found
        $values = $this->_defaults;
        $values['username'] = $pathBits[0];
        $values['page'] = ( empty( $pathBits[2] ) )?1:$pathBits[2]; //if they didn't provide a page

        // figure out which action based on second segment
        $filter = $pathBits[1];
        if( empty( $filter ) || $filter == 'default' 
            || $filter == 'haves' || $filter == 'wants' ){
            //Looking for user's haves, wants, or both 
            $values['action'] = 'index';
            $values['filter'] = ( empty($filter) )?'default':$filter; //To catch the blank
        }
        else if( $filter == 'badges' ){
            //Looking for user's badges
            $values['action'] = 'badges';
        }
        else if( $filter == 'shelves' ){
            //Looking for user's shelves
            $values['action'] = 'shelves';
        }
        else{
            //Must be a shelf id
            $values['action'] = 'index';
            $values['filter'] = $filter;
        }

        return $values;
    }

    return false;
} 

$this->url()ですか?ZendPaginatorでURL​​関数を見つけることができませんでした。そして、次のページのURLを取得するために、routeクラスの関数を呼び出していると想定しています。それはどの関数を呼び出していますか、そして私はそれをオーバーロードする必要がありますか?

4

1 に答える 1

0

問題はアセンブル関数でした。私はTimFountainのチュートリアルで提供されている関数を使おうとしていました。それは次のとおりです。

public function assemble($data = array(), $reset = false, $encode = false)
{
    return $data['username'];
}

$data['username']そして、定義されていないため、「/」が返されていました。ルーターはページパラメーターのみを提供していました。独自のカスタムルートクラスを作成する場合、アセンブル関数は、データ配列で渡されないセグメントのデフォルト値を提供する必要があります。それを修正しました:

public function assemble($data = array(), $reset = false, $encode = false)
{
    //Check if username was provided
    $username = ( $data['username'] )?$data['username']:$this->_defaults['username'];

    //Check if filter was provided
    $filter = ( $data['filter'] )?$data['filter']:$this->_defaults['filter'];

    //Check if page was provided
    $page = ( $data['page'] )?$data['page']:$this->_defaults['page'];

    return $username.'/'.$filter.'/'.$page;
}
于 2013-03-14T15:50:01.137 に答える