0

カスタムCMSの関数から出力されるナビゲーションHTMLにクラスを追加する必要があります。

必要な出力を取得する唯一の方法は、PHPを使用してHTMLを解析することです。

<li>PHPのDOMメソッドを使用してHTMLを調べ、子を含む要素<ul>(トップレベルのナビゲーションアイテム)にクラスを追加しています。

これまでのところ機能していますが、2つの質問があります。

  1. このDOMデータを調べるためのより効率的な方法はありますか?面倒に思えますが、それは私の経験不足かもしれません。

  2. 場合によっては、<li>要素にすでにクラスがある場合がありますが、既存のクラス属性に、すでに存在する場合と存在しない場合があるものを破棄せずに追加するにはどうすればよいですか?

-

    <?
        $mcms_nav = getContent(
            // call to cms that returns navigation html as a string
            // ex. <ul id="pnav"><li><a href="/">home</a></li>....</ul>
        );

        $dom = new DOMDocument();
        $dom->preserveWhiteSpace = FALSE;
        $dom->loadHTML($mcms_nav);


        $x = new DOMXPath($dom);
        foreach($x->query('//ul/li/ul') as $node)
        {
            $parent = $node->parentNode;
            $parent_attr = $dom->createAttribute('class');
            $parent_attr->value = 'has-flyout';
            $parent->appendChild($parent_attr);

            $flyout_attr = $dom->createAttribute('class');
            $flyout_attr->value = 'flyout';
            $node->appendChild($flyout_attr);
        }

        $mcms_nav = $dom->getElementByID('pnav');
        echo $dom->saveHTML($mcms_nav);
    ?>
4

1 に答える 1

1
  1. あまり。CakePHPフレームワークからXMLクラスを取得し、これを配列に変換し、配列を操作して、元に戻すことができます。それがあなたの場合の選択肢かどうかはわかりません。http://book.cakephp.org/2.0/en/core-utility-libraries/xml.html

  2. dom->hasAttribute()およびを使用しdom->getAttribute()て、既存の属性コンテンツが存在する場合はそれらを取得できます。

また、新しい仕事は害にはなりません;)

于 2013-01-15T20:47:37.363 に答える