Автор Тема: Горизонтальное меню с разными стилями( цветом)  (Прочитано 1666 раз)

14 Ноябрь 2014, 12:43:21
  • Новичок
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Всем привет! Помогите новичку разобраться!

Есть идея сделать меню, чтоб у каждого пункта - был свой цвет, конкретно в каждом мультимагазине был свой цвет.

К примеру:
1) Проекты домов - зеленый
2)Работы и услуги - коричневый
3) Экодом - еще какой-то

Я сначала думал, чтобы править код в файлах global.css и superfish-modified.css, но как это сделать я не знаю! Подскажите пожалуйста!
14 Ноябрь 2014, 12:55:57
Ответ #1
  • Партнер
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +11/-0
  • SEO оптимизация сайтов, интенет-магазинов.
    • Просмотр профиля
Поисковая оптимизация, SEO  оптимизация сайтов, интенет-магазинов.  Работа на результат –  вывод в топ, увеличение посещяемости и увеличение продаж.
14 Ноябрь 2014, 13:03:42
Ответ #2
  • Новичок
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
14 Ноябрь 2014, 13:41:55
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 33068
  • Репутация: +26762/-0
    • Просмотр профиля
Такого нет, бесплатно только самому переделывать.
14 Ноябрь 2014, 13:55:45
Ответ #4
  • Новичок
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Такого нет, бесплатно только самому переделывать.

Я понимаю, для этого я и задал вопрос, как в css-файлах мне изменить код, чтоб каждому пункту присвоить свой цвет.
14 Ноябрь 2014, 14:26:00
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 14063
  • Репутация: +14569/-2
  • Сообщество PrestaShop
    • Просмотр профиля
В стилях /themes/default-bootstrap/css/modules/blocktopmenu/css/superfish-modified.css добавить классы, класс 1 - цвет 1;  классы, класс 2 - цвет 2; ...
В модуле /modules/blocktopmenu/blocktopmenu.php добавить эти классы в код в функции makeMenu.
14 Ноябрь 2014, 14:29:44
Ответ #6
  • Новичок
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В стилях /themes/default-bootstrap/css/modules/blocktopmenu/css/superfish-modified.css добавить классы, класс 1 - цвет 1;  классы, класс 2 - цвет 2; ...
В модуле /modules/blocktopmenu/blocktopmenu.php добавить эти классы в код в функции makeMenu.

Спасибо большое, буду пробовать!!!! :)
14 Ноябрь 2014, 15:20:09
Ответ #7
  • Новичок
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В стилях /themes/default-bootstrap/css/modules/blocktopmenu/css/superfish-modified.css добавить классы, класс 1 - цвет 1;  классы, класс 2 - цвет 2; ...
В модуле /modules/blocktopmenu/blocktopmenu.php добавить эти классы в код в функции makeMenu.

Подскажите пожалуйста, в каком месте надо вставить классы из superfish-modified.css

Вот код функции makeMenu private function makeMenu()
{
$menu_items = $this->getMenuItems();
$id_lang = (int)$this->context->language->id;
$id_shop = (int)Shop::getContextShopID();

foreach ($menu_items as $item)
{
if (!$item)
continue;

preg_match($this->pattern, $item, $value);
$id = (int)substr($item, strlen($value[1]), strlen($item));

switch (substr($item, 0, strlen($value[1])))
{
case 'CAT':
$this->getCategory($id, $id_lang, $id_shop);
break;

case 'PRD':
$selected = ($this->page_name == 'product' && (Tools::getValue('id_product') == $id)) ? ' class="sfHover"' : '';
$product = new Product((int)$id, true, (int)$id_lang);
if (!is_null($product->id))
$this->_menu .= '<li'.$selected.'><a href="'.Tools::HtmlEntitiesUTF8($product->getLink()).'">'.$product->name.'</a></li>'.PHP_EOL;
break;

case 'CMS':
$selected = ($this->page_name == 'cms' && (Tools::getValue('id_cms') == $id)) ? ' class="sfHover"' : '';
$cms = CMS::getLinks((int)$id_lang, array($id));
if (count($cms))
$this->_menu .= '<li'.$selected.'><a href="'.Tools::HtmlEntitiesUTF8($cms[0]['link']).'">'.$cms[0]['meta_title'].'</a></li>'.PHP_EOL;
break;

case 'CMS_CAT':
$category = new CMSCategory((int)$id, (int)$id_lang);
if (count($category))
{
$this->_menu .= '<li><a href="'.Tools::HtmlEntitiesUTF8($category->getLink()).'">'.$category->name.'</a>';
$this->getCMSMenuItems($category->id);
$this->_menu .= '</li>'.PHP_EOL;
}
break;

// Case to handle the option to show all Manufacturers
case 'ALLMAN':
$link = new Link;
$this->_menu .= '<li><a href="'.$link->getPageLink('manufacturer').'">'.$this->l('All manufacturers').'</a><ul>'.PHP_EOL;
$manufacturers = Manufacturer::getManufacturers();
foreach ($manufacturers as $key => $manufacturer)
$this->_menu .= '<li><a href="'.$link->getManufacturerLink((int)$manufacturer['id_manufacturer'], $manufacturer['link_rewrite']).'">'.$manufacturer['name'].'</a></li>'.PHP_EOL;
$this->_menu .= '</ul>';
break;

case 'MAN':
$selected = ($this->page_name == 'manufacturer' && (Tools::getValue('id_manufacturer') == $id)) ? ' class="sfHover"' : '';
$manufacturer = new Manufacturer((int)$id, (int)$id_lang);
if (!is_null($manufacturer->id))
{
if (intval(Configuration::get('PS_REWRITING_SETTINGS')))
$manufacturer->link_rewrite = Tools::link_rewrite($manufacturer->name);
else
$manufacturer->link_rewrite = 0;
$link = new Link;
$this->_menu .= '<li'.$selected.'><a href="'.Tools::HtmlEntitiesUTF8($link->getManufacturerLink((int)$id, $manufacturer->link_rewrite)).'">'.$manufacturer->name.'</a></li>'.PHP_EOL;
}
break;

// Case to handle the option to show all Suppliers
case 'ALLSUP':
$link = new Link;
$this->_menu .= '<li><a href="'.$link->getPageLink('supplier').'">'.$this->l('All suppliers').'</a><ul>'.PHP_EOL;
$suppliers = Supplier::getSuppliers();
foreach ($suppliers as $key => $supplier)
$this->_menu .= '<li><a href="'.$link->getSupplierLink((int)$supplier['id_supplier'], $supplier['link_rewrite']).'">'.$supplier['name'].'</a></li>'.PHP_EOL;
$this->_menu .= '</ul>';
break;

case 'SUP':
$selected = ($this->page_name == 'supplier' && (Tools::getValue('id_supplier') == $id)) ? ' class="sfHover"' : '';
$supplier = new Supplier((int)$id, (int)$id_lang);
if (!is_null($supplier->id))
{
$link = new Link;
$this->_menu .= '<li'.$selected.'><a href="'.Tools::HtmlEntitiesUTF8($link->getSupplierLink((int)$id, $supplier->link_rewrite)).'">'.$supplier->name.'</a></li>'.PHP_EOL;
}
break;

case 'SHOP':
$selected = ($this->page_name == 'index' && ($this->context->shop->id == $id)) ? ' class="sfHover"' : '';
$shop = new Shop((int)$id);
if (Validate::isLoadedObject($shop))
{
$link = new Link;
$this->_menu .= '<li class="sfHide"><span>'.$shop->name.'</span></li>'.PHP_EOL;
}
break;
case 'LNK':
$link = MenuTopLinks::get((int)$id, (int)$id_lang, (int)$id_shop);
if (count($link))
{
if (!isset($link[0]['label']) || ($link[0]['label'] == ''))
{
$default_language = Configuration::get('PS_LANG_DEFAULT');
$link = MenuTopLinks::get($link[0]['id_linksmenutop'], $default_language, (int)Shop::getContextShopID());
}
$this->_menu .= '<li><a href="'.Tools::HtmlEntitiesUTF8($link[0]['link']).'"'.(($link[0]['new_window']) ? ' target="_blank"': '').'>'.$link[0]['label'].'</a></li>'.PHP_EOL;
}
break;
}
}
}
14 Ноябрь 2014, 15:36:17
Ответ #8
  • Ветеран
  • *****
  • Сообщений: 935
  • Репутация: +10/-0
  • Сообщество PrestaShop
    • Просмотр профиля
16 Ноябрь 2014, 13:38:17
Ответ #9
  • Новичок
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В теги LI вставить атрибут CLASS.
Если Вас не затруднит, покажите куда конкретно вставить написанные классы

Это классы, которые я создал в файле superfish-modified.css
.class_color1
{
background-color: #FFA500;
}
.class_color2
{
background-color: #9932CC;
}
.class_color3
{
background-color: #00FF00;
}
.class_color4
{
background-color:#008B00;
}

А вот это код blacktopmenu.php, конкретно функции makeMenu
private function makeMenu()
{
$menu_items = $this->getMenuItems();
$id_lang = (int)$this->context->language->id;
$id_shop = (int)Shop::getContextShopID();

foreach ($menu_items as $item)
{
if (!$item)
continue;

preg_match($this->pattern, $item, $value);
$id = (int)substr($item, strlen($value[1]), strlen($item));

switch (substr($item, 0, strlen($value[1])))
{
case 'CAT':
$this->getCategory($id, $id_lang, $id_shop);
break;

case 'PRD':
$selected = ($this->page_name == 'product' && (Tools::getValue('id_product') == $id)) ? ' class="sfHover"' : '';
$product = new Product((int)$id, true, (int)$id_lang);
if (!is_null($product->id))
$this->_menu .= '<li'.$selected.'><a href="'.Tools::HtmlEntitiesUTF8($product->getLink()).'">'.$product->name.'</a></li>'.PHP_EOL;
break;

case 'CMS':
$selected = ($this->page_name == 'cms' && (Tools::getValue('id_cms') == $id)) ? ' class="sfHover"' : '';
$cms = CMS::getLinks((int)$id_lang, array($id));
if (count($cms))
$this->_menu .= '<li'.$selected.'><a href="'.Tools::HtmlEntitiesUTF8($cms[0]['link']).'">'.$cms[0]['meta_title'].'</a></li>'.PHP_EOL;
break;

case 'CMS_CAT':
$category = new CMSCategory((int)$id, (int)$id_lang);
if (count($category))
{
$this->_menu .= '<li><a href="'.Tools::HtmlEntitiesUTF8($category->getLink()).'">'.$category->name.'</a>';
$this->getCMSMenuItems($category->id);
$this->_menu .= '</li>'.PHP_EOL;
}
break;

// Case to handle the option to show all Manufacturers
case 'ALLMAN':
$link = new Link;
$this->_menu .= '<li><a href="'.$link->getPageLink('manufacturer').'">'.$this->l('All manufacturers').'</a><ul>'.PHP_EOL;
$manufacturers = Manufacturer::getManufacturers();
foreach ($manufacturers as $key => $manufacturer)
$this->_menu .= '<li><a href="'.$link->getManufacturerLink((int)$manufacturer['id_manufacturer'], $manufacturer['link_rewrite']).'">'.$manufacturer['name'].'</a></li>'.PHP_EOL;
$this->_menu .= '</ul>';
break;

case 'MAN':
$selected = ($this->page_name == 'manufacturer' && (Tools::getValue('id_manufacturer') == $id)) ? ' class="sfHover"' : '';
$manufacturer = new Manufacturer((int)$id, (int)$id_lang);
if (!is_null($manufacturer->id))
{
if (intval(Configuration::get('PS_REWRITING_SETTINGS')))
$manufacturer->link_rewrite = Tools::link_rewrite($manufacturer->name);
else
$manufacturer->link_rewrite = 0;
$link = new Link;
$this->_menu .= '<li'.$selected.'><a href="'.Tools::HtmlEntitiesUTF8($link->getManufacturerLink((int)$id, $manufacturer->link_rewrite)).'">'.$manufacturer->name.'</a></li>'.PHP_EOL;
}
break;

// Case to handle the option to show all Suppliers
case 'ALLSUP':
$link = new Link;
$this->_menu .= '<li><a href="'.$link->getPageLink('supplier').'">'.$this->l('All suppliers').'</a><ul>'.PHP_EOL;
$suppliers = Supplier::getSuppliers();
foreach ($suppliers as $key => $supplier)
$this->_menu .= '<li><a href="'.$link->getSupplierLink((int)$supplier['id_supplier'], $supplier['link_rewrite']).'">'.$supplier['name'].'</a></li>'.PHP_EOL;
$this->_menu .= '</ul>';
break;

case 'SUP':
$selected = ($this->page_name == 'supplier' && (Tools::getValue('id_supplier') == $id)) ? ' class="sfHover"' : '';
$supplier = new Supplier((int)$id, (int)$id_lang);
if (!is_null($supplier->id))
{
$link = new Link;
$this->_menu .= '<li'.$selected.'><a href="'.Tools::HtmlEntitiesUTF8($link->getSupplierLink((int)$id, $supplier->link_rewrite)).'">'.$supplier->name.'</a></li>'.PHP_EOL;
}
break;

case 'SHOP':
$selected = ($this->page_name == 'index' && ($this->context->shop->id == $id)) ? ' class="sfHover"' : '';
$shop = new Shop((int)$id);
if (Validate::isLoadedObject($shop))
{
$link = new Link;
$this->_menu .= '<li class="sfHide"><span>'.$shop->name.'</span></li>'.PHP_EOL;
}
break;
case 'LNK':
$link = MenuTopLinks::get((int)$id, (int)$id_lang, (int)$id_shop);
if (count($link))
{
if (!isset($link[0]['label']) || ($link[0]['label'] == ''))
{
$default_language = Configuration::get('PS_LANG_DEFAULT');
$link = MenuTopLinks::get($link[0]['id_linksmenutop'], $default_language, (int)Shop::getContextShopID());
}
$this->_menu .= '<li><a href="'.Tools::HtmlEntitiesUTF8($link[0]['link']).'"'.(($link[0]['new_window']) ? ' target="_blank"': '').'>'.$link[0]['label'].'</a></li>'.PHP_EOL;
}
break;
}
}
}
16 Ноябрь 2014, 14:53:58
Ответ #10
  • Ветеран
  • *****
  • Сообщений: 33068
  • Репутация: +26762/-0
    • Просмотр профиля
Нужно переделать минимум 2 функции. Весь код писать не буду, напишу один пример, остальное сделаете также .
Для категорий:
1. Добавляте стили (вы уже сделали)
.class_color1 {
        background-color: #FFA500;
}
.class_color2 {
        background-color: #9932CC;
}
.class_color3 {
        background-color: #00FF00;
}
.class_color4 {
        background-color:#008B00;
}

2. В файле /modules/blocktopmenu/blocktopmenu.php меняете функции:
строчка  465
private function makeMenu()
{
$menu_items = $this->getMenuItems();
$id_lang = (int)$this->context->language->id;
$id_shop = (int)Shop::getContextShopID();
        $i = 0;
foreach ($menu_items as $item)
{
if (!$item)
continue;
preg_match($this->pattern, $item, $value);
$id = (int)substr($item, strlen($value[1]), strlen($item));
                $i++;
                $color = 'class_color'.$i;
switch (substr($item, 0, strlen($value[1])))
{
case 'CAT':
$this->_menu .= $this->generateCategoriesMenu(Category::getNestedCategories($id, $id_lang, true, $this->user_groups),0,$color);
break;
...
и в линии 599
private function generateCategoriesMenu($categories, $is_children = 0,$color = 0)
{
$html = '';

foreach ($categories as $key => $category)
{
if ($category['level_depth'] > 1)
{
$cat = new Category($category['id_category']);
$link = Tools::HtmlEntitiesUTF8($cat->getLink());
}
else
$link = $this->context->link->getPageLink('index');

                $color = $color ? 'class="'.$color.'"': '';

$html .= '<li '.(($this->page_name == 'category' && (int)Tools::getValue('id_category') == (int)$category['id_category']) ? ' class="sfHoverForce"' : ' '.$color.'').'>';
$html .= '<a href="'.$link.'" title="'.$category['name'].'">'.$category['name'].'</a>';
...
16 Ноябрь 2014, 15:17:51
Ответ #11
  • Новичок
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Coder, огромное спасибо Вам что откликнулись!

Скажите пожалуйста, а функцию  private function generateCategoriesMenu($categories, $is_children = 0,$color = 0) - отдельно дописать, т.к в исходном коде файла blocktopmenu я не нашел такую функцию.

И если Вам будет не трудно, покажите полностью код, просто я не пойму, как что по аналогии делать, в php я полный 0 :-(
16 Ноябрь 2014, 15:32:49
Ответ #12
  • Ветеран
  • *****
  • Сообщений: 14063
  • Репутация: +14569/-2
  • Сообщество PrestaShop
    • Просмотр профиля
Если не знаете php, то поставьте модуль Advanced Top Menu PrestaShop.
Модули как раз и создают для тех, кто не умеет сам делать необходимые функции.
16 Ноябрь 2014, 15:39:12
Ответ #13
  • Новичок
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если не знаете php, то поставьте модуль Advanced Top Menu PrestaShop.
Модули как раз и создают для тех, кто не умеет сам делать необходимые функции.

Я с вами согласен, но к сожалению не могу позволить себе за такую сумму купить данный модуль.
Я неплохо знаю HTML и CSS, думал что возможно эту проблему решить так, оказалось что надо переделывать функции написанные на php.
Пытаюсь с помощью Ваших подсказок и собственных сил разобраться.