Добавить динамические классы в неупорядоченный список с помощью PHP - PullRequest
1 голос
/ 08 июня 2011

Я пытаюсь добавить последовательные классы для всех элементов списка в списке с классом 'nav'. По сути, я хочу, чтобы у каждого элемента списка был класс 'nthChild-x', где x представляет его позицию в списке. Я главный новичок в PHP, так что будьте проще.

Вот текущая разметка:

<ul id="primaryNav" class="nav">
    <li>Blah Blah Uno</li>
    <li>Blah Blah Dos</li>
    <li>Blah Blah Tres</li>
</ul>

Я хочу, чтобы этот список отображался следующим образом:

<ul id="primaryNav" class="nav">
    <li class="nthChild-1">Blah Blah Uno</li>
    <li class="nthChild-3">Blah Blah Dos</li>
    <li class="nthChild-3">Blah Blah Tres</li>
</ul>

Пожалуйста, не отвечайте с помощью JavaScript или JQuery. Я знаю, как сделать это с JS, но нужно, чтобы это было на стороне сервера. Кроме того, я не обязательно хочу указывать идентификатор списка, потому что я бы предпочел сделать это один раз и настроить таргетинг на все списки (хотя это может быть началом).

Есть идеи?

Ответы [ 3 ]

1 голос
/ 08 июня 2011

Для этого вы можете использовать DOMDocument.

Этот будет работать с существующими классами и не будет добавлять один и тот же класс дважды.

$dom = new DOMDocument;

$dom->loadHTML($html);

$lists = $dom->getElementsByTagName('ul');

foreach($lists as $list) {
    $index = 1;
    foreach($list->childNodes as $node) {
        if ($node->nodeName != 'li') {
            continue;
        }

        $class = array();

        if ($node->hasAttribute('class')) {
            $class = preg_split('/\s+/', $node->getAttribute('class'));
        }

        $addClass = 'nthChild-' . $index;

        if (in_array($addClass, $class)) {
            continue;
        }

        $class[] = $addClass;

        $node->setAttribute('class', implode(' ', $class));

        $index++;
    }

}

$html = '';

foreach($dom->getElementsByTagName('body')->item(0)->childNodes as $element) {
    $html .= $dom->saveXML($element, LIBXML_NOEMPTYTAG);
}

CodePad .

0 голосов
/ 08 июня 2011

Если у вас есть только список, отформатированный как показано здесь (не в массиве PHP), вы можете сделать это следующим образом

$markup = '<ul id="primaryNav" class="nav">
    <li>Blah Blah Uno</li>
    <li>Blah Blah Dos</li>
    <li>Blah Blah Tres</li>
</ul>';

if (preg_match_all("/<li>(.*)<\/li>/U",$markup,$result) > 0)
{
    $newMarkup = "<ul id=\"primaryNav\" class=\"nav\">\n";
    $count = 0;
    foreach ($result[1] as $listElement)
    {
        $count++;
        $newMarkup .= "\t<li class=\"nThCild-{$count}\">$listElement</li>\n";
    }
    print $newMarkup."</ul>\n";

}
0 голосов
/ 08 июня 2011

Полагаю, вы не используете какую-либо систему шаблонов (например, Smarty) для генерации этого.Затем вы должны использовать цикл для генерации полей вместе с целочисленной переменной, в которой будет храниться номер итерации.Это можно сделать, например, так:

<ul id="primaryNav" class="nav">
    <?php
    $values = array(1 => "Blah Blah Uno", 2 => "Blah Blah Dos", 3 => "Blah Blah Tres");

    for ($i = 1; $i <= 3; $i++) {
        echo "<li class=\"nthChild-" . $i . "\">" . $values[$i] . "</li>";
    }
    ?>
</ul>

Это решение довольно простое, конечно, есть много лучших способов сделать это.

...