Вход • Регистрация

Убрать ссылку на первый пункт меню

  • 27 сентября 2017 г.
  • Доброго всем времени суток.

    Что-то запуталась в менюшке.

    Код
    // начало уровня меню

    foreach ($result["rows"][$result["parent_id"]] as $row)
    {

    $class = ($row["attributes"]) ? $row["attributes"] : 'class="ul-list"';
    if ($row["active"])
    {
    // начало пункта меню для текущей страницы
    echo '<li '.$class.'>';
    }
    elseif ($row["active_child"])
    {
    // начало пункта меню для активного дочернего пункта
    echo '<li '.$class.'>';
    }
    elseif ($row["children"])
    {
    // начало пункта меню для элемента -родителя
    echo ' <li id="menu_trigger" '.$class.'>';
    } else
    {
    // начало любого другого пункта меню
    echo '<li id="menu_trigger" '.$class.'>';
    }
    if (
    // на текущей странице нет ссылки, если не включена настройка "Текущий пункт как ссылка"
    (!$row["active"] || $result["current_link"])

    // влючен пункт "Не отображать ссылку на элемент, если он имеет дочерние пункты"
    && (!$result["hide_parent_link"] || empty($result["rows"][$row["id"]]))
    )
    {
    if ($row["othurl"])
    {
    echo '<a href="'.$row["othurl"].'"'.$row["attributes"].''
    .(!empty($row["active"]) || !empty($row["active_child"]) ? 'class="navlink active"' : 'class="navlink"')
    .'>';
    }
    else
    {
    echo '<a href="'.BASE_PATH_HREF.$row["link"].'"'.$row["attributes"]
    .(!empty($row["active"]) || !empty($row["active_child"]) ? 'class="navlink active"' : 'class="navlink"')
    .'>';
    }
    }
    else
    {
    echo '<span>';
    }

    //вывод изображения
    /* if (! empty($row["img"]))
    {
    echo '<img src="'.$row["img"]["src"].'" width="'.$row["img"]["width"].'" height="'.$row["img"]["height"]
    .'" alt="'.$row["img"]["alt"].'" title="'.$row["img"]["title"].'"> ';
    }
    */
    // название пункта меню
    if (! empty($row["name"]))
    {
    echo $row["name"];
    }

    if (
    // на текущей странице нет ссылки, если не включена настройка "Текущий пункт как ссылка"
    (!$row["active"] || $result["current_link"])

    // влючен пункт "Не отображать ссылку на элемент, если он имеет дочерние пункты"
    && (!$result["hide_parent_link"] || empty($result["rows"][$row["id"]]))
    )
    {
    echo '</a>';
    }
    else
    {
    echo '</span>';
    }
    if ($result["show_all_level"] || $row["active_child"] || $row["active"])
    {
    // вывод вложенного уровня меню
    $menu_data = $result;
    $menu_data["parent_id"] = $row["id"];
    $menu_data["level"]++;

    echo $this->get('show_level_leftmenu_2', 'menu', $menu_data);
    }

    if ($row["active"])
    {
    // окончание пункта меню - текущей страницы
    echo '</li>';
    }
    elseif ($row["active_child"])
    {
    // окончание пункта меню для активного дочернего пункта
    echo '</li>';
    }
    else
    {
    // окончание любого другого пункта меню
    echo '</li>';
    }
    }
    // окончание уровня меню


    Это код вывода меню.
    Хочу убрать ссылку с первого пункта меню (только с него).
    Никак не соображу, как это правильнее прописать.

    Мыслю в эту сторону:
    Код
    if (
    // на текущей странице нет ссылки, если не включена настройка "Текущий пункт как ссылка"
    (!$row["active"] || $result["current_link"])

    // влючен пункт "Не отображать ссылку на элемент, если он имеет дочерние пункты"
    && (!$result["hide_parent_link"] || empty($result["rows"][$row["id"]]))
    )

    Добавить сюда условие типа, если пункт является "children", то типа тоже не выводить ссыль.
    Или сюда же вставить условие: если $result["parent_id"]=4655 (id конкретного меню взять), то тоже не выводить ссыль.

    В общем, не соображу, как это правильнее сделать (чтобы еще полсайта не сломать ).

    Подскажите, пожалуйста.
    Может быть кто-то уже делал.
    • 27 сентября 2017 г.
    • Если с первого. То я делаю так
      Код
      $is_not_first_element = false;
      foreach ($result["rows"][$result["parent_id"]] as $row) {
      if ($is_not_first_element) {
      // выводим ссылку
      } else {
      $is_not_first_element = true;
      }
      ....
      }
    • 27 сентября 2017 г.
    • Соответсвенно где "выводим ссылку" попадает этот кусок.
      Код
      if (
      // на текущей странице нет ссылки, если не включена настройка "Текущий пункт как ссылка"
      (!$row["active"] || $result["current_link"])

      // влючен пункт "Не отображать ссылку на элемент, если он имеет дочерние пункты"
      && (!$result["hide_parent_link"] || empty($result["rows"][$row["id"]]))
      )
      {
      if ($row["othurl"])
      {
      echo '<a href="'.$row["othurl"].'"'.$row["attributes"].''
      .(!empty($row["active"]) || !empty($row["active_child"]) ? 'class="navlink active"' : 'class="navlink"')
      .'>';
      }
      else
      {
      echo '<a href="'.BASE_PATH_HREF.$row["link"].'"'.$row["attributes"]
      .(!empty($row["active"]) || !empty($row["active_child"]) ? 'class="navlink active"' : 'class="navlink"')
      .'>';
      }
      }
      else
      {
      echo '<span>';
      }

      и закрывашку также ниже надо обработать.
  • 27 сентября 2017 г.
  • Я чего то не понял. Почему у Сашеньки форматированый красивый код а у меня шляпа какая то? :)
    • 27 сентября 2017 г.
    • Видимо длинные строки с тернарными операторами так переносятся :)
      (не мог не выпендрится знанием слова тернарный оператор)
      • 27 сентября 2017 г.
      • Магия какая-то теперь и у меня красиво.
        • 27 сентября 2017 г.
        • Никакой магии. Скрипт в поля с кодом подгружается только к уже существующим страницам. После обновления страницы неоформленное новое поле тоже "подхватится". Иногда, правда, бывает что не ко всем подгружается (но редко). Короче F5 рулит.
  • 27 сентября 2017 г. , редакция: 27 сентября 2017 г.
  • Я сделал бы, например, через переменную.
    Код

    $i = 1;
    // Цикл
    foreach
    {
    // В нужном месте делаем проверку
    if($i === 1)
    {
    // не выводим ссылку
    }
    else
    {
    // // Выводим ссылку
    }
    }

    Примерно так
  • 27 сентября 2017 г.
  • Спасибо всем за ответы.
    Пример Дениса реализовать не получилось почему-то (может скобку закрывающую не туда впихнула).

    Получилось решить самостоятельно.

    Если кому нужно, то вставляем && (!$row["children"]) в этот кусок:

    Код
    if (
    // на текущей странице нет ссылки, если не включена настройка "Текущий пункт как ссылка"
    (!$row["active"] || $result["current_link"])
    //убирает ссылку на первый пункт меню
    && (!$row["children"])
    // влючен пункт "Не отображать ссылку на элемент, если он имеет дочерние пункты"
    && (!$result["hide_parent_link"] || empty($result["rows"][$row["id"]]))
    )


    В файле этот кусок кода встречается два раза: когда выводим ссылку и когда ее закрываем.
    Собственно, тестировщик сказал, что все работает норм.
    • 27 сентября 2017 г.
    • А зачем Вам на 1й пункт ссылку убирать?
  • 27 сентября 2017 г.
  • Мне кажется что
    Код
    //убирает ссылку на первый пункт меню
    && (!$row["children"])

    Это всё таки не-то но при определённых обстоятельствах может смахивать на то что требуется.
    По логике вещей $row["children"] хранит потомков. И если в шаблоне уровня где используется такая конструкция встретится пункт без сынков и дочек то ему не будет выведена ссылка вне зависимости того первый это пункт или какой-то другой.

    Поправьте меня если я ошибаюсь. Я не расстроюсь. :)
    • 27 сентября 2017 г.
    • Ну, в моем случае что имеем:
      используется leftmenu (шаблон модуля меню), их по количеству две штуки 1 и 2.
      Первый файл отвечает за вывод списка-родителя, второй - за выпадающий подсписок.
      Первым идет каталог продукции, следующие - статические страницы.
      Когда тычешь на каталог - появляется выпадающий список.
      Суть: если там стоит ссылка "каталог продукции", то и вылетаешь по ссылке. Если ссылки нет, то разворачивается подменю.

      В полной версии сайта выпадашка сама выпадает, а в мобильной выпадашка появляется щелчком мыши. Вот в мобильной эта ссылка и мешает.

      Собственно, данное изменение было внесено только в первом файле, отвечающем за родительское меню.
      Менять на данном сайте меню никто не будет. Если захотят это сделать, то поломается много чего, т.к. у клиента в файлах жестко прописаны менюхи с id. Поменялось id - перестало все меню работать.

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум