Fórum OpenCart Brasil

Por um e-commerce livre, confiável e profissional

#1711
Olá Galera, estive pesquisando como fazer um menu horizontal com categorias, consegui um tutorial americano e fiz aqui.... Deu certo!!! :)

Então resolvi compartilhar com vocês e traduzi o conteúdo:


Como colocar as categorias num menu horizontal (dropdown) no OpenCart.

Fiz numa instalação da versão 1.4.9 mas acho que serve para todos.

veja a minha loja como ficou: http://www.virtuopolis.com.br/modelos/lojas/farmacia

IMPORTANTE: como sempre faça primeiro backup de sua loja antes de tentar usar o menu horizontal!

OS dropdowns (Abertura dos sub-menus não irão funcionar no IE6, mas as categorias de nível superior serão utilizaveis.


Esta modificação será feita em três etapas:

1. Criar cópias dos arquivos necessários e renomea-los para criação do módulo
2. Inserir o código que será informado abaixo, nos arquivos criados (utilizando como base o conteudo da cópia)
3. Alterar o CSS para o funcionamento.


PASSO 1

1.1 Criar uma cópia do arquivo: /admin/controller/module/category.php e de o nome a esse arquivo de: headermenu.php

Abra o headermenu.php

Alterar a linha 2 de:
Código: Selecionar todos
class ControllerModuleCategory extends Controller {
para:
Código: Selecionar todos
class ControllerModuleHeaderMenu extends Controller {

Agora, usando a função procurar no Dreamweaver (Control+F) altere o texto "category" para "headermenu" você terá 21 ocorrências.

No final da linha 25, cole o seguinte código:
Código: Selecionar todos
$this->data['text_header'] = $this->language->get('text_header');

1.2 Crie uma cópia do arquivo: /language/admin/portuguese-br/module/category.php e dê o nome a esse arquivo de: headermenu.php

Abra-o

Alterar o título para "Menu Horizontal"

Adicione esta linha antes de "text_right":
Código: Selecionar todos
$_['text_header']       = 'Header';

1.3 Crie uma cópia do arquivo: /admin/view/template/module/category.tpl e dê o nome a esse arquivo de: headermenu.tpl

Agora, sando a função procurar no Dreamweaver (Control+F) altere o texto "category" para "headermenu" você terá 7 ocorrências.

No final da linha 27 cole o seguinte código:
Código: Selecionar todos
<?php if ($headermenu_position == 'header') { ?>
<option value="header" selected="selected"><?php echo $text_header; ?></option>
<?php } else { ?>
<option value="header"><?php echo $text_header; ?></option>
<?php } ?>

1.4 Crie uma cópia do arquivo: /catalog/controller/module/category.php e dê o nome a esse arquivo de: headermenu.php

delete todo o conteúdo e substitua por:
Código: Selecionar todos
<?php  
class ControllerModuleHeaderMenu extends Controller {
	protected $category_id = 0;
	protected $path = array();
	
	protected function index() {
		$this->language->load('module/headermenu');
		
    	$this->data['heading_title'] = $this->language->get('heading_title');
		
		$this->load->model('catalog/category');
		$this->load->model('tool/seo_url');
		
		if (isset($this->request->get['path'])) {
			$this->path = explode('_', $this->request->get['path']);
			
			$this->category_id = end($this->path);
		}
		
		$this->data['category'] = $this->getCategories(0);
												
		$this->id = 'headermenu';

		if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/headermenu.tpl')) {
			$this->template = $this->config->get('config_template') . '/template/module/headermenu.tpl';
		} else {
			$this->template = 'default/template/module/headermenu.tpl';
		}
		
		$this->render();
  	}
	
	protected function getCategories($parent_id, $current_path = '') {
		$category_id = array_shift($this->path);
		
		$output = '';
		
		$results = $this->model_catalog_category->getCategories($parent_id);
		
		if ($results) { 
			$output .= '<ul>';
    	}
		
		foreach ($results as $result) {	
			if (!$current_path) {
				$new_path = $result['category_id'];
			} else {
				$new_path = $current_path . '_' . $result['category_id'];
			}
			
			$output .= '<li>';
			
			$children = '';

			$children = $this->getChildCategories($result['category_id'], $new_path);

			$output .= '<a class="hide" href="' . $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $new_path)  . '">' . $result['name'] . '</a>';
		
        	$output .= $children;
        
        	$output .= '</li>'; 
		}
 
		if ($results) {
			$output .= '</ul>';
		}
		
		return $output;
	}
	
	protected function getChildCategories($parent_id, $current_path = '') {
		$category_id = array_shift($this->path);
		
		$output = '';
		
		$results = $this->model_catalog_category->getCategories($parent_id);
		
		if ($results) { 
			$output .= '<ul>';
    	}
		
		foreach ($results as $result) {	
			if (!$current_path) {
				$new_path = $result['category_id'];
			} else {
				$new_path = $current_path . '_' . $result['category_id'];
			}
			
			$output .= '<li>';
			
			$children = '';
			
			if ($category_id == $result['category_id']) {
				$children = $this->getChildCategories($result['category_id'], $new_path);
			}
			
			$output .= '<a href="' . $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $new_path)  . '">' . $result['name'] . '</a>';
						
        	$output .= $children;
        
        	$output .= '</li>'; 
		}
 
		if ($results) {
			$output .= '</ul>';
		}
		
		return $output;
	}
}
?>

1.5 Crie uma cópia do arquivo: catalog/language/english/module/category.php e dê o nome a esse arquivo de: headermenu.php

Mude o título de: "Categories" para "Menu Horizontal"


1.6 Crie uma cópia do arquivo: of /catalog/view/theme/default/template/module/category.tpl e dê o nome a esse arquivo de: headermenu.tpl

Delete o conteúdo e insira apenas este código:
Código: Selecionar todos
<div class="menu">
	<?php echo $category; ?>
</div>


PASSO 2

2.1 Abra o arquivo: /catalog/controller/common/header.php

No final da Linha 3 'protected function index() {' cole o seguinte código:
Código: Selecionar todos
// START OF HEADER MODULE MOD
		$module_data = array();
		
		$this->load->model('checkout/extension');
		
		$results = $this->model_checkout_extension->getExtensions('module');

		foreach ($results as $result) {
			if ($this->config->get($result['key'] . '_status') && ($this->config->get($result['key'] . '_position') == 'header')) {
				$module_data[] = array(
					'code'       => $result['key'],
					'sort_order' => $this->config->get($result['key'] . '_sort_order')
				);
				
				$this->children[] = 'module/' . $result['key'];		
			}
		}

		$sort_order = array(); 
	  
		foreach ($module_data as $key => $value) {
      		$sort_order[$key] = $value['sort_order'];
    	}

    	array_multisort($sort_order, SORT_ASC, $module_data);			
		
		$this->data['modules'] = $module_data;
		
		// END OF HEADER MODULE MOD

2.2 Abra o arquivo /catalog/view/theme/default/template/common/header.tpl

Aqui você precisa saber um pouco de HTML/CSS, você precisa decidir onde você quer que seu menu apareça. copie e cole o seguinte código no local que você acha que esta melhor para seu design:
Código: Selecionar todos
<?php foreach ($modules as $module) { ?>
<?php echo ${$module['code']}; ?>
<?php } ?>

PASSO 3

Abra o arquivo: /catalog/view/theme/YOUR_THEME/stylesheet/stylesheet.css e cole o código abaixo no final da página:
Código: Selecionar todos
/* ================================================================ 
This copyright notice must be untouched at all times.

The original version of this stylesheet and the associated (x)html
is available at http://www.cssplay.co.uk/menus/dd_valid.html
Copyright (c) 2005-2007 Stu Nicholls. All rights reserved.
This stylesheet and the assocaited (x)html may be modified in any 
way to fit your requirements.
=================================================================== */
/* common styling */
.menu {font-family: arial, sans-serif; width:900px; height:30px; position:relative; font-size:11px; z-index:100;}
.menu ul li a, .menu ul li a:visited {display:block; text-decoration:none; color:#fff;width:120px; height:30px; text-align:center; border-left:1px solid #fff; border-right:1px solid #fff; background:#467bb1; line-height:30px; font-size:11px; overflow:hidden;}
.menu ul {padding:0; margin:0; list-style: none;}
.menu ul li {float:left; position:relative;}
.menu ul li ul {display: none;}

/* specific to non IE browsers */
.menu ul li:hover a {color:#fff; background:#36f;}
.menu ul li:hover ul {display:block; position:absolute; top:30px; left:0; width:120px;}
.menu ul li:hover ul li a.hide {background:#6a3; color:#fff;}
.menu ul li:hover ul li:hover a.hide {background:#6fc; color:#000;}
.menu ul li:hover ul li ul {display: none;}
.menu ul li:hover ul li a {display:block; background:#ddd; color:#000;}
.menu ul li:hover ul li a:hover {background:#6fc; color:#000;}
.menu ul li:hover ul li:hover ul {display:block; position:absolute; left:105px; top:0;}
.menu ul li:hover ul li:hover ul.left {left:-120px;}

3,2 Agora, é só ativá-lo! Entre no seu painel de administração e va para Extensões -> Módulos, instale o módulo Menu Horizontal e edite a posição para "Header" e status para "habilitado". Vá para a sua frente de loja e dê uma olhada!


Espero que desfrutem!
Abraços amigos!!!!


Miguel Muñoz
http://www.virtuopolis.com.br
#1727
maxno escreveu:só colocar o css no template category.tpl
ai vc alteraria o category e nao o menu horizontal...

vc faz "cópia" do category e renomeia para headermenu

Eles fica distintos, mas pode-se tentar fazer com o headermenu.tpl e ver o que acontece...
#1908
Pessoal
Boa Noite,

Funcionou perfeitamente, mas hoje apareceu esse erro:

Notice: Undefined variable: modules in /home/megarapi/public_html/catalog/view/theme/megarapid/template/common/header.tpl on line 58Warning: Invalid argument supplied for foreach() in /home/megarapi/public_html/catalog/view/theme/megarapid/template/common/header.tpl on line 58

Não fiz nenhuma alteração, será que alguém já passou por isso e pode me ajudar?
#1909
rodolfols escreveu:Pessoal
Boa Noite,

Funcionou perfeitamente, mas hoje apareceu esse erro:

Notice: Undefined variable: modules in /home/megarapi/public_html/catalog/view/theme/megarapid/template/common/header.tpl on line 58Warning: Invalid argument supplied for foreach() in /home/megarapi/public_html/catalog/view/theme/megarapid/template/common/header.tpl on line 58

Não fiz nenhuma alteração, será que alguém já passou por isso e pode me ajudar?

Problema resolvido, foi o Modulo F2b que instalei que deu conflito aqui!!
#2204
Era mesmo isso que eu tava tentando fazer. Valeu!

Agora só preciso descobrir como fazer para ter um menu para Homepage, outro para Conta e outro para Contatos. Por isso, se alguém tiver alguma idéia epuder me apontar o caminho, agradeço a ajuda.

obrigado.
#2487
3,2 Agora, é só ativá-lo! Entre no seu painel de administração e va para Extensões -> Módulos, instale o módulo Menu Horizontal e edite a posição para "Header" e status para "habilitado". Vá para a sua frente de loja e dê uma olhada!

Aqui não apareceu a opção "Header", apenas "esquerda" e "direita" e eu
configuei tudo certinho, será que é a versão do OC? to usando a 1.4.9.3.

Ola @felipesujf Se você extrai os arquiv[…]

extensção -> Módulos

Voltou ao normal sozinho

Olá Uso o OpenCart 2 e tenho algumas d&uac[…]

Night games. One night, no worries Real Women P[…]