Оберните содержимое тега привязки с помощью SPAN, используя PHP - PullRequest
0 голосов
/ 02 марта 2011

Мне нужно взять простой тег UL, сгенерированный в PHP (Joomla 1.5), и обернуть текстовое содержимое каждого тега привязки тегом SPAN. Входящий HTML выглядит так:

<ul>
  <li>
      <a href="#">Home</a>
    </li>
    <li>
      <a href="#">Watch UNC-TV</a>
    </li>
    <li>
      <a href="#" >Contact</a>
    </li>
</ul>

Вывод должен выглядеть так:

<ul id="top-nav" class="flatList">
  <li class="selected">
      <a href="#"><span class="embed embed-top-nav">Home</span>
        <p >news, highlights</p></a>
    </li>
    <li>
      <a href="#"><span class="embed embed-top-nav">Watch UNC-TV</span>
        <p>schedule, local programs</p></a>
    </li>
    <li id="nav-last">
      <a href="#"><span class="embed embed-top-nav">Contact</span>
        <p>feedback, connect, share</p></a>
    </li>
</ul>

Также обратите внимание на класс, добавленный к активному тегу LI («selected») и класс, добавленный к последнему в списке («nav-last»). Это в Joomla 1.5, где я переопределяю модуль mod_mainmenu, используемый в главном меню. Код использует библиотеку SimpleXML для чтения и записи HTML в modMainMenuXMLCallback(&$node, $args):

<?php
defined('_JEXEC') or die('Restricted access');

if ( ! defined('fancyMenuPatch') ) 
{
  function fancyMenuPatch($result,$tag){
    // Replace UL tag with ours. 
    // Replace LI tag with ours.

    // Add to the start of the UL tag.
    $begin_ul = "<ul id=\"top-nav\" class=\"flatList\">";
    $begin_li = "<li>"; //not sure what to do with this.

    // do the replacement
    $result = str_replace("<ul>",$begin_ul, $result);
    $result = str_replace("<li>", $begin_li, $result);

    return $result;
  }

  define('fancyMenuPatch', true);
}

if ( ! defined('modMainMenuXMLCallbackDefined') )
{
function modMainMenuXMLCallback(&$node, $args)
{
  $user = &JFactory::getUser();
  $menu = &JSite::getMenu();
  $active   = $menu->getActive();
  $path = isset($active) ? array_reverse($active->tree) : null;

  if (($args['end']) && ($node->attributes('level') >= $args['end']))
  {
    $children = $node->children();
    foreach ($node->children() as $child)
    {
      if ($child->name() == 'ul') {
        $node->removeChild($child);
      }
    }
  }

  if ($node->name() == 'ul') {
    foreach ($node->children() as $child)
    {
      if ($child->attributes('access') > $user->get('aid', 0)) {
        $node->removeChild($child);
      }
    }
  }

  if (($node->name() == 'li') && isset($node->ul)) {
    $node->addAttribute('class', 'parent');
  }

  if (isset($path) && (in_array($node->attributes('id'), $path) || in_array($node->attributes('rel'), $path)))
  {
    if ($node->attributes('class')) {
      $node->addAttribute('class', $node->attributes('class').' active');
    } else {
      $node->addAttribute('class', 'active');
    }
  }
  else
  {
    if (isset($args['children']) && !$args['children'])
    {
      $children = $node->children();
      foreach ($node->children() as $child)
      {
        if ($child->name() == 'ul') {
          $node->removeChild($child);
        }
      }
    }
  }

  if (($node->name() == 'li') && ($id = $node->attributes('id'))) {
    if ($node->attributes('class')) {
      $node->addAttribute('class', $node->attributes('class').' item'.$id);
    } else {
      $node->addAttribute('class', 'item'.$id);
    }
  }

  if (isset($path) && $node->attributes('id') == $path[0]) {
    $node->addAttribute('id', 'current');
  } else {
    $node->removeAttribute('id');
  }
  $node->removeAttribute('rel');
  $node->removeAttribute('level');
  $node->removeAttribute('access');
}
  define('modMainMenuXMLCallbackDefined', true);
}

ob_start();

modMainMenuHelper::render($params, 'modMyMainMenuXMLCallback');
$menu_html = ob_get_contents();
ob_end_clean(); 

if($params->get('menutype')=="primarynav"){
  $tag = $params->get('tag_id');
  }
//output the menu!
echo fancyMenuPatch($menu_html,$tag);
?>

Спасибо.

1 Ответ

1 голос
/ 03 марта 2011

Хорошо, вот как вы хотите это сделать. Выпрыгните из скрипта default.php, который вы разместили выше. Как Joomla! использует основной модуль главного меню для всех меню и деревьев, кроме того, вам нужно будет отредактировать вспомогательный скрипт. Это должно сохраняться независимо от любого стороннего расширения меню, которое вы можете использовать.

rootdirectory/modules/mod_mainmenu/helper.php

Теперь перейдем к оператору switch в строке 358. В частности, мы хотим отредактировать строку 363. Это выглядит так:

$data = '<a href="'.$tmp->url.'">'.$image.$tmp->name.'</a>';

Теперь отредактируйте это так:

$data = '<span class="embed embed-top-nav"><a href="'.$tmp->url.'">'.$image.$tmp->name.'</a></span>';

Ну вот, теперь меню Joomla! Класс getMenu добавит этот тег span вокруг ссылок.

Обратите внимание, что вы также можете сделать это для строки 375 для ссылок, которые откроются в новом окне и т. Д. Также обратите внимание на забавный комментарий Луи "// хм ... это немного глупо".

ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...