NP_ArchiveIndexのFancyURL化(Nucleus)


この記事はNP_ArchiveIndex Ver0.77 – Nucleusだとかに対する改造について記載したものです。
そちらでは、最新バージョンは0.80にになっています。
0.80でこの記事のまま対応出来るか分かりませんが、そちらの解析をする余裕がないため以前のまま転載しておきます。



以下の元ソース及びその行番号はNP_ArchiveIndex0.77からです。

まずURL解析部分。
89行目付近//get value from requestと書いてあるところ。

        $page = intRequestVar('ap');
        if ($catid) {
            $item_order = requestVar('ao');
            //check value (also used to make flip link)
            list($itarget, $iorder) = @split(' ',$item_order);
            if(!($itarget=='time' or $itarget=='title' or $iorder =='desc'  or $iorder =='asc')) {
                $item_order = $this->getOption('itemOrder2');
                list($itarget, $iorder) = @split(',',$item_order);
                $iorder = strtolower($iorder);
            }
        }



を次のように変更します。

        //get value from request
        if ($catid) {
            $uri = sprintf("%s%s%s","http://",$_SERVER["HTTP_HOST"],$_SERVER["REQUEST_URI"]);
            list($pagelink, $currentpage) = explode("/page/",$uri);
            list($page, $item_order) = explode("/mode/",$currentpage);
 
            list($itarget, $iorder) = @split(',',$item_order);
            if(!($itarget=='time' or $itarget=='title' or $iorder =='desc'  or $iorder =='asc')) {
                $item_order = $this->getOption('itemOrder2');
                list($itarget, $iorder) = @split(',',$item_order);
                $iorder = strtolower($iorder);
            }
        }



そしてその少し下にあるswitch ($item_order)の中にある
case ‘title asc’などの部分をcase ‘title,asc’と書き換えます(4箇所)
この部分、0.76から変わってるところです。
出力URLでも半角スペースにしようと思ったらURLには%20とか出てきちゃったので、うまくできるか不安に思って,に戻しました。

ここまでがURL解析部。
次からが出力部分です。
変更してないソースの233行目付近から。

                $orderURL = serverVar('REQUEST_URI');
                $orderURL = preg_replace('/[?&]ap=[0-9]*/','',$orderURL); //delete to add 'ap' param to last
                $orderURL = preg_replace('/[?&]ao=[^&0-9]*/','',$orderURL);
 
                if (strpos($orderURL,'?')===false) $orderURL .= "?ao=";
                else $orderURL .= "&ao=";
 
                $orderURL1 = $orderURL . "$itarget_flip+$itarget_flip_order&ap=".$page;
                $orderURL2 = $orderURL . "$itarget+$iorder_flip&ap=".$page;
                $pagenavi = "Sort: <b>$itarget</b>/<a href='$orderURL1'>$itarget_flip</a>, ";
                $pagenavi.= "<b>$iorder_str</b>/<a href='$orderURL2'>$iorder_flip_str</a>";
 
                //make 'page link'
                $pagenavi.= "&nbsp;&nbsp; Page: ";
                for ($i=1; $i<=$pagemax; $i++) {
                    if ($i==$page) $pagenavi.= "<b>$i</b> ";
                    else {
                        $pageURL = serverVar('REQUEST_URI');
                        $pageURL = preg_replace('/([?&]ap=)[0-9]*/','',$pageURL);
                        if (strpos($pageURL,'?')===false) $pageURL .= "?ap=$i";
                        else $pageURL .= "&ap=$i";
                        $pagenavi.= "<a href='$pageURL'>[$i]</a> ";
                    }



ここを次のように変更。

                $orderURL1 = $pagelink . "/page/1/mode/$itarget_flip,$itarget_flip_order";
                $orderURL2 = $pagelink . "/page/1/mode/$itarget,$iorder_flip";
 
                $pagenavi = "Sort: <b>$itarget</b>/<a href='$orderURL1'>$itarget_flip</a>, ";
                $pagenavi.= "<b>$iorder_str</b>/<a href='$orderURL2'>$iorder_flip_str</a>";
 
                //make 'page link'
                $pagenavi.= "&nbsp;&nbsp; Page: ";
                for ($i=1; $i<=$pagemax; $i++) {
                    if ($i==$page) $pagenavi.= "<b>$i</b> ";
                    else {
                        if ($itarget=='title' || $iorder =='ASC') $mode = "/mode/$itarget,$iorder";
                        $pageURL = $pagelink . "/page/$i" . $mode;
                        $pagenavi.= "<a href='$pageURL'>[$i]</a> ";
                    }


ばっさり削ってます。あと、FancyURLsっぽく?ap,aoはpage,modeという表示にしてあるので元のほうが好みの場合は修正を。
ちなみに表示方式を変更したら1ページ目に戻るようなおせっかい設定だったりします。
削りたい場合は/page/1となってる部分を/page/$pageにしてください。

コメントをどうぞ