0

シンプルなブログを作ってみました。ページ コンテンツの下部に、次および前のブログ エントリへのリンクを表示するページネーションを配置しました。ブログ タイトルは、「pages」というデータベース テーブルの列「menu_name」から取得したリンクに含まれています。これを行うには、最初にクエリを作成し、「ブログ」というクラスの関数を介して配列を作成し、次にいくつかの変数を設定しました。

$sql = "SELECT * FROM pages ";
$sql .= "ORDER BY id DESC ";
$pages = Blog::find_by_sql($sql);
$blog_page = reset($pages);
$page_id = Blog::find_by_id(isset($_GET['page']) ? $_GET['page'] : $blog_page->id);

次に、以前のブログ リンクのコードを次のように作成しました。

public function pagination_previous(){
    global $address; //$address = "list_blogs.php?page=";
    global $page_id;
    global $pagination; //a class for storing functions that handle pagination
    global $pages;
    if($pagination->has_next_page()){
        echo "\n        <a class=\"olderblog\" href=" . $address;
        echo $pagination->next_page();
        echo " title=\"Newer Blog\">&laquo; ";
        foreach($pages as $page => $value){
            if($page_id->id + 1 == $value->id){
                echo $value->menu_name;
            }
        };
        echo "</a> ";   
    }else{
        echo "";
    }   
}

これは関数 has_next_page() です

public function has_previous_page(){
    return $this->previous_page() >= 1 ? true : false;  
}

これは、previous_page() です。

public function previous_page(){
    global $blog;
    return $this->current_page - 1;
}

ブログエントリを削除できる管理領域を作成することを決定するまで、これはうまく機能しました。ID が 6 のブログ エントリを削除すると、問題が発生します。データベース テーブル「ページ」に ID=6 のアイテムがなくなるため、行方不明の前後のページの次または前のページへのリンクが失われます。 page は空ですが、has_previous_page() が $current_page から 1 を引くため、まだ page=6 を指しています。pagination_next() 関数を次のように設定することで、この混乱から抜け出す方法を途中で見つけました。

public function pagination_next(){
    global $address;
    global $pagination;
    global $page_id;
    global $pages;
    if($pagination->has_previous_page()){
        foreach($pages as $page => $value){
            if($page_id->id - 1 == $value->id){

                echo "\n        <a class=\"newerblog\" href=" . $address;
                echo $value->id;
                echo " title=\"Older Blog\">";
                echo $value->menu_name;
                break;
            }

        }
        echo " &raquo;</a> ";   
    }else{
        echo "";
    }   
}

ただし、これは foreach ループ内の if 条件のためにまだ機能しません。この条件を pagination_previous() と pagination_next() の両方で設定して、id ($value->id) ではなく配列インデックス ($page) に基づいて次と前の配列項目を参照する必要がありますが、わかりませんこれは私の人生のために。配列 $pages は次のようになります。

Array
(
[0] => Blog Object
    (
        [id] => 8
        [subject_id] => 2
        [menu_name] => Aliquam sed interdum
        [position] => 4
        [visible] => 1
        [created] => 
        [content] => 
    Aliquam sed interdum tortor. Vivamus et blandit velit...

[1] => Blog Object
    (
        [id] => 7
        [subject_id] => 2
        [menu_name] => Vestibulum ante ipsum
        [position] => 3
        [visible] => 1
        [created] => 
        [content] => 
    Vestibulum ante ipsum primis in faucibus orci luctus et ultrices...

[2] => Blog Object
    (
        [id] => 5
        [subject_id] => 2
        [menu_name] => Praesent massa mi
        [position] => 2
        [visible] => 1
        [created] => 
        [content] => 
    Praesent massa mi, pretium et leo vitae, aliquam...

[3] => Blog Object
    (
        [id] => 4
        [subject_id] => 2
        [menu_name] => Nam interdum tincidunt
        [position] => 1
        [visible] => 1
        [created] => 
        [content] => 
    Nam interdum tincidunt purus quis lacinia. Aliquam erat volutpat.
)

)

誰かがこれで私を助けることができますか?

ご回答いただきありがとうございますが、残念ながら、私の問題を解決するのに役立つ回答はありませんでした。すべてのオプションを使い果たした後、コード全体を台無しにすることなくこれを解決する唯一の方法は、if 条件で 1 を加算または減算せずに次または前の既存の $value->id を参照する方法を見つけることであると結論付けました。データベースに id がない場合に空のリンクが表示されるため、次のページに移動します。このパズルを解ける人がいたら、私はその人に永遠に感謝します。

4

4 に答える 4

1

previous_pageこれらの行に沿って関数を何かに変えることができます:

public function previous_page( )
{
    global $blog;

    $prev = -1; // Initialize

    $arrayKeys = array_keys( $blog );

    rsort( $arrayKeys );    //  Sort keys array in reverse order

    while( list( $key ,$cursor ) = each( $arrayKeys ) )
    {
        if( $cursor == $this->current_page )
        {
            if( list( $key ,$prev ) = each( $arrayKeys ) ) return $prev;
            break;
        }
    }
    return $prev;
}

以下は、より多くの理解を与えるかもしれません:

//  Test data

$array = array( 0 => 'Obj 0' ,1 => 'Obj 1' ,2 => 'Obj 2' ,3 => 'Obj 3' ,4 => 'Obj 4' , );


$current = 3;   //  Try with any valid key of the array


//  Get the keys into an array

$arrayKeys = array_keys( $array );

//  Search for next

$next = -1; // Initialize

sort( $arrayKeys ); //  Sort the keys array

while( list( $key ,$cursor ) = each( $arrayKeys ) )
{
    if( $cursor == $current )
    {
        if( list( $key ,$cursor ) = each( $arrayKeys ) )
        {
            $next = $cursor;
        }
        break;
    }
}
//  Search for previous

$prev = -1; // Initialize

rsort( $arrayKeys );    //  Sort keys array in reverse order

while( list( $key ,$cursor ) = each( $arrayKeys ) )
{
    if( $cursor == $current )
    {
        if( list( $key ,$cursor ) = each( $arrayKeys ) )
        {
            $prev = $cursor;
        }
        break;
    }
}

if( $prev <> -1 )   echo '<br>Prev : ' ,$array[$prev];
if( $next <> -1 )   echo '<br>Next : ' ,$array[$next];
于 2013-10-19T22:30:14.433 に答える
0

配列の foreach ループが array_values 関数を使用して配列インデックスを更新する前に、配列のインデックスが再作成されるため、ロジックは同じままで適切に機能します。

于 2013-10-17T08:20:07.207 に答える
0

フル機能のオプションは、ブログ オブジェクトに永続的なシーケンス インデックス フィールドを設定することです。ページネーションは、前/次のシーケンス インデックスをチェックできます。+1/-1 を簡単に実装するために、それらが本当にシーケンシャルであると盲目的に想定する関数を作成するか (投稿を削除するときにそれらを再インデックスするようにしてください)、次の最高/最低を見つける関数を作成することができます (おそらく db から)。これにより、それらを任意に移動したり、存在を確認したりできます。注文を任意のオブジェクト ID から切り離します。

于 2013-10-16T18:05:22.430 に答える
0

SQL を使用して前後のブログ エントリを取得することをお勧めします

前の投稿

select * from pages where id = ( select max(id) from pages where id < <current_post_id> )

次の投稿

select * from pages where id = ( select min(id) from pages where id > <current_post_id> )
于 2013-10-16T18:03:05.370 に答える