1

jqueryアドレスプラグインを使用してajax駆動型サイトを構築していますが、動作しています。わーい!この質問の目的のために、テストサイトを使用できます。

http://www.asual.com/jquery/address/samples/crawling
http://www.asual.com/download/jquery/address (クロールの例を機能させるには、
2つの呼び出しを削除する必要がありました。)urlencode()

通話に問題が発生してい$crawling->nav()ます。基本的に、jsとphpを使用してxmlファイルの一部をdomにロードします。私は(ほとんど)それがどのように機能するかを理解しており、サブページを含むようにサンプルコードを変更したいと思います。

たとえば、とで'subnav-project.html'を表示したいのですが、では表示'/!#/project''/!#/project/blue'ません'/!#/contact'。これを行うには、phpがユーザーがどのページを表示しているかを「知っている」必要があると考えます。そうすれば、ロジックのベースになります。

これはクレイジーですか?この方法でサイトを構築している場合、phpはサイトの現在の状態を知ることができますか?そうでない場合、どのようにしてhtmlスニペットを選択的にロードするか、ナビゲーションメニューに表示されるリンクを変更しますか?

私はこれまでajaxに夢中になりすぎたことがないので、フィードバックがあれば役に立ちます。

編集

これはクロールクラスです。

class Crawling { 

    const fragment = '_escaped_fragment_';

    function Crawling(){ 

        // Initializes the fragment value
        $fragment = (!isset($_REQUEST[self::fragment]) || $_REQUEST[self::fragment] == '') ? '/' : $_REQUEST[self::fragment];

        // Parses parameters if any
        $this->parameters = array();
        $arr = explode('?', $fragment);
        if (count($arr) > 1) {
            parse_str($arr[1], $this->parameters);
        }

        // Adds support for both /name and /?page=name
        if (isset($this->parameters['page'])) {
            $this->page = '/?page=' . $this->parameters['page'];
        } else {
            $this->page = $arr[0];
        }

        // Loads the data file
        $this->doc = new DOMDocument();
        $this->doc->load('data.xml');
        $this->xp = new DOMXPath($this->doc);
        $this->nodes = $this->xp->query('/data/page');
        $this->node = $this->xp->query('/data/page[@href="' . $this->page . '"]')->item(0);

        if (!isset($this->node)) {
            header("HTTP/1.0 404 Not Found");
        }
    }

    function base() {
        $arr = explode('?', $_SERVER['REQUEST_URI']);
        return $arr[0] != '/' ? preg_replace('/\/$/', '', $arr[0]) : $arr[0];
    }

    function title() {
        if (isset($this->node)) {
            $title = $this->node->getAttribute('title');
        } else {
            $title = 'Page not found';
        }
        echo($title);
    }

    function nav() {
        $str = '';

        // Prepares the navigation links
        foreach ($this->nodes as $node) {
            $href = $node->getAttribute('href');
            $title = $node->getAttribute('title');
            $str .= '<li><a href="' . $this->base() . ($href == '/' ? '' : '?' . self::fragment . '=' .html_entity_decode($href)) . '"' 
                . ($this->page == $href ? ' class="selected"' : '') . '>' 
                . $title . '</a></li>';
        }
        echo($str);
    }

    function content() {
        $str = '';

        // Prepares the content with support for a simple "More..." link
        if (isset($this->node)) {
            foreach ($this->node->childNodes as $node) {
                if (!isset($this->parameters['more']) && $node->nodeType == XML_COMMENT_NODE && $node->nodeValue == ' page break ') {
                    $str .= '<p><a href="' . $this->page . 
                        (count($this->parameters) == 0 ? '?' : '&') . 'more=true' . '">More...</a></p>';
                    break;
                } else {
                    $str .= $this->doc->saveXML($node);
                }
            }
        } else {
            $str .= '<p>Page not found.</p>';
        }

        echo(preg_replace_callback('/href="(\/[^"]+|\/)"/', array(get_class($this), 'callback'), $str));
    }

    private function callback($m) {
        return 'href="' . ($m[1] == '/' ? $this->base() : ($this->base() . '?' . self::fragment . '=' .$m[1])) . '"';
    }
}

$crawling = new Crawling();
4

1 に答える 1

0

#フラグメント識別子(つまり、文字の右側のすべて)を使用してサーバー側の決定を行うことはできません。これは、ブラウザがフラグメント識別子をサーバーに送信しないためです。サーバー側で決定を下したい場合は、JavaScriptの支援(AJAXを含む)を使用して、現在のフラグメント識別子が何であるかを伝える必要があります。

于 2011-09-21T17:39:55.697 に答える