Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

douglasjoanes

Ajuda com categorias e subcategorias infinitas

Recommended Posts

Boa noite pessoal!

 

Bom ... não sou novo aqui no fórum mas também não sou ativo. Criei esta conta a um tempo atrás e de lá pra cá deixei de lado a programação. Como disse volto hoje na condição de iniciante e gostaria de pedir uma ajuda a vocês.

 

Estou desenvolvendo um site de guia de ofertas e não gostaria de usar nenhum tipo de CMS, a primeira dúvida que surgiu foi a seguinte:

 

Com essa modelagem de tabela.

 

CAT_OFERTAS

[cat_id] => 1 [cat_nome] => Moda e Acessórios [cat_url] => moda-e-acessorios [id_pai] => 0

[cat_id] => 2 [cat_nome] => Masculino [cat_url] => masculino [id_pai] => 1

[cat_id] => 3 [cat_nome] => Camisetas [cat_url] => camisetas [id_pai] => 2

 

OFERTAS

[ofe_id] => 1 [ofe_titulo] => Camiseta Cavalera Estampada [ofe_categoria] => ???

 

Como eu poderia chegar por exemplo nesse tipo de url?

Url 1 -> www.meusite.com.br/moda-e-acessorios/masculino/camisetas/camiseta-cavalera-estampada

 

Como as subcategorias são infinitas, se talvez não existisse a subcategoria "Masculino"

Url 2 -> www.meusite.com.br/moda-e-acessorios/camisetas/camiseta-cavalera-estampada

 

Não tenho a mínima ideia de como fazer a url funcionar com esse tipo de modelagem?!

Na hora da listagem de categorias a pessoa poderia clicar em "Moda e Acessórios" e listar a tal "Camiseta Cavalera Estampada" ou por exemplo clicar em "Masculino" e listar novamente a tal "Camiseta Cavalera Estampada" e assim por diante.

 

Minha cabeça está dando um nó ... basicamente 3 níveis de categorias pra mim seriam suficientes, mas pode ser que no futuro eu precise ampliar esse número, por isso pensei nesse tipo de modelagem.

 

Alguém teria um exemplo ou um estudo que me ajudasse a resolver esse meu problema?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
junior.vieira

Como eu disse o site será um guia de ofertas e desta maneira seria mais interessante para o usuário poder pesquisar por aquilo que realmente lhe interessa.

 

No projeto vários tipos produtos poderão ser anunciados e não somente "Moda e Acessórios" por exemplo. Se fosse, bastaria eu criar a categoria "Camisetas" e separa-las por masculino e feminino, mas poderão ser anunciados "Veículos e acessórios", "Alimentação", etc... Por isso a necessidade de ter tantos níveis.

 

Se por um acaso eu estiver equivocado, poderia me ajudar com alguma sugestão?

Desde já agradeço a atenção. Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha sugestão é que a estrutura da url do seu produto siga uma lógica bem clara :

moda-e-acessorios/ => Isso seria uma Sessão que contem a Categoria que o produto pertence

masculino/ =>Isso é um atributo do produto

camisetas/ =>Isso seria uma CATEGORIA que o produto esta contido

/camiseta-cavalera-estampada => Isso seria a url-amigavel do nome do produto

Numa ordem mais real :
moda-e-acessorios/camisetas/masculinas/camiseta-cavalera-estampada


você teria:

tabela Sessao (*Moda e Acessorios,Eletrodomésticos, Cama Mesa e Banho, etc..)

tabela Categoria (Camiseta, Calça, Short, etc..)

=>Sessoa_FK

Tabela Produto (camiseta-cavalera-estampada, etc..)
=>Categoria_FK
=>ID

=>NOME

=>GENERO [Masculino, Feminino, Unissex] Pode ser um TINYINT(1) ;


Não sei se fui suficientemente claro.
Qualquer duvida, eu posso tentar melhorar a explicação.

PS: FK = Foreign Key (Chave Estrangeira)

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Rangel Dheo

 

Acho que entendi a sua lógica e gostei bastante, assim eu não precisaria criar "subcategorias" não é isso?

Acho que inverti a ordem da url por conta de que terão outros tipos de produtos que talvez não se encaixaria, exemplo:

 

SUA URL => veiculos-e-acessorios/pneu/pneus-rodas-e-calotas/pneu-pirelli-aro-13

MINHA URL => veiculos-e-acessorios/pneus-rodas-e-calotas/pneu/pneu-pirelli-aro-13

 

veiculos-e-acessorios => Seria a sessão

pneus-rodas-e-calotas => Seria a categoria

pneu => Seria o atributo

pneu-pirelli-aro-13 => Seria a url amigável

 

Ou falei besteira?

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha lógica :

veiculos-e-acessorios => Seria a sessão

pneus-rodas-e-calotas => Seria a categoria

 

pneu => Seria desnecessário pois fica subentendido que a categoria Pneus Rodas e Calotas, contem o produto PNEU

 

pneu-pirelli-aro-13 => Seria a url amigável do produto que teria o nome Pneu Pirelli aro 13.


Uma alternativa seria separas a Categoria Pneus Rodas e Calotas em três outras:
Pneus
Rodas
Calotas

 

ae sim você teria sua url :
veiculos-e-acessorios/pneus/pneu-pirelli-aro-13

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Rangel Dheo

 

Ahhh ... entendi!

Acho que sua solução será mais lógica para o meu projeto.

 

Se eu quisesse por alguns filtros para pesquisa, esse atributo do produto poderia ser um array? Se sim não iria ser ruim para SEO sendo que ficaria várias url's apontando para o mesmo produto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro, uma vez que o produto será um item na tabela, todos os campos que compõem a tabela Produtos podem ser tratados como um array, vai depender da maneira como você vai levar seu projeto pro código.

ex.;

$classProduto = new Produto();

$produdo = $classProduto->getUmProduto($codigoProduto);

var_dump($produto);

array[
 'id' => '1',
 'sessao' => 'Carros e acessórios',
 'categoria' => 'Pneus',
 'nome => 'Pneu Pirelli aro 13',
 .... todos os atributos
]

Mais ou menos assim.
Não repara no pseudo Código não, eu não tive tempo de projetar melhor.
mas é mais ou menos a lógica que eu seguiria, já falando no escopo do código neh.

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Rangel Dheo

 

Só pra gente finalizar....

 

Acho que não fui claro na minha pergunta ...

Se eu quisesse por filtros quando os usuários fossem fazer uma pesquisa.

 

Exemplo:

 

O usuário acessou a sessão "Moda e Acessórios", a categoria "Camisetas" e o atributo "Masculino", na página de pesquisa eu listo os filtros "Tamanhos = P, M, G, GG / Cor = Branca, Preta, Ciza ", etc...

 

Isso poderia ser feito em outro campo da tabela? Assim ficaria de uma forma mais genérica e eu poderia setar esses filtros no momento do cadastro de acordo com a categoria, não? Se não eu teria que criar uma tabela para cada tipo de produto, não?

array[
'id' => '1',
'sessao' => 'Moda e acessórios',
'categoria' => 'Camisetas',
'atributo' => 'Masculino'
'filtros' => 'Tamanho=P, Cor=Preta, etc...',
'nome => 'Camiseta Cavalera Estampada',
]

Desde já agradeço a sua atenção meu camarada, abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode ser feito sim.

Mas existem alguns cuidados interessantes na modelagem de dados.
Você está no caminho certo, sugiro essa leitura interessante sobre a "normalização de banco de dados"

http://pt.slideshare.net/LP0956/normalizao-banco-de-dados

 

http://imasters.com.br/artigo/7020/banco-de-dados/modelagem-de-dados-final-normalizacao

 

Sei que parece complicado, mas a NORMALIZAÇÃO DE BANDO DE DADOS, vai ajudar e elaborar bem a sua base e você não terá problemas estruturais num futuro.
Se conseguir absorver esse conteúdo, sua base ficará flexivel, coesa e altamente expansível sem gerar problema no que já estará funcionando.

Grande abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por bruno SALVIATI
      Olá estou precisando de ajuda com subcategorias, eu tenho um banco de dados que tem tabelas abaixo :

       
      acima mostra a tabela de categorias
       
      abaixo a de produtos
       

       
      posto isso eu no meu index retorno as categorias usando um foreach, solicitando que tudo que for categoria seja listado ou seja eu nao escrevo o nome de cada uma eu faço o banco fazer uma lista no meu layout mostrando todas as categorias que eu tenho, e cada uma puxa os produtos mas eu preciso criar uma subcategorias por exempplo

      marcar, como honda, fiat , renoaut por exemplo, 
      ai estas sao as categorias primarias 
      quando listar e alguem clicar ou passar o mouse sobre a Honda por exemplo
      Tem que aparecer as subs por exemplo
       
      carros, peças, cabeçote , pino, seja la o que for, estou dando um exemplo que tem bastante subcategorias, preciso pegar este bando e fazer ele me trazer subs atraves das categorias pensei em usar o ID da tabela um ou a REFERENCIA da tabela 2 mas infelizmente ainda estou estudando e nao faço a menor ideia de como fazer isso vou deixar meu codigo foreach aqui embaixo :


       
       <div class="col-md-6">
                                <div class="list-group">
                                  <div class="header-search">
                                     <form method="POST">
                                           <div class="dropdown">
                                                <select class="dropbtn" ><option align="center" hidden> <i class="glyphicon glyphicon-list">Categorias</i></option></select>
                                                <div class="dropdown-content">
                                               <a href="{$PAG_PRODUTOS}">Todos</a> 
                                                   
                                                {foreach from=$CATEGORIAS item=C}
                                                 <a href=" {$C.cate_link}">{$C.cate_nome}</a> 
                                                {/foreach}
                                                
                                              
                                          </div>
                                         </div>
                                         <form method="POST">
                                        <input name="txt_buscar" class="input" placeholder="Digite para buscar">
                                        <button class="search-btn">Buscar</button>
                                        </form>
                                      </form>
                                  </div> 
                              </div> 
                            </div> 


      e este é o PHP da categorias se precisar do de produtos me avise, no momento esta funcionando perfeitaente o que estou pedindo é ajuda para inserir subcategorias utilizando o que tenho feito

      PHP

       
      <?php 
      Class Categorias extends Conexao{
          private $cate_id, $cate_nome, $cate_slug;
          

          function __construct(){
              parent::__construct();
          }
          function GetCategorias(){
              //query para buscar os produtos de uma categoria especifica.
              $query = "SELECT * FROM {$this->prefix}categorias";
              $this->ExecuteSQL($query);
              $this->GetLista();
              
          }
          private function GetLista(){
              $i = 1;
              while($lista = $this->ListarDados()):
              $this->itens[$i] = array(
                   'cate_id' => $lista['cate_id'],
                   'cate_nome'  => $lista['cate_nome'] ,  
                   'cate_slug'  => $lista['cate_slug'] ,  
                   'cate_link'  => Rotas::pag_Produtos(). '/' .$lista['cate_id'] . '/' . $lista['cate_slug']  , 
                  
                  'cate_link_adm'  => Rotas::pag_ProdutosADM(). '/' .$lista['cate_id'] . '/' . $lista['cate_slug']  , 
                          );
              $i++;
              endwhile;
          }
          function Inserir($cate_nome){
              
              // trato os campos
              $this->setCate_nome($cate_nome);
              $this->setCate_slug($cate_nome);

              
              // monto a SQL
              $query = " INSERT INTO {$this->prefix}categorias (cate_nome, cate_slug )";
              $query.= " VALUES (:cate_nome, :cate_slug )";
              // passo so parametros
              $params = array(':cate_nome' => $this->getCate_nome(),
                              ':cate_slug' => $this->getCate_slug(),
                            
                  );
              // executo a minha SQL
                  if($this->ExecuteSQL($query, $params)):
                      return TRUE;
                      
                  else:
                      return FALSE;
                      
                  endif;
              
              
          }

          function Editar($cate_id,$cate_nome){
              
              // trato os campos
              $this->setCate_nome($cate_nome);
              $this->setCate_slug($cate_nome);
              
              // monto a SQL
              $query = " UPDATE {$this->prefix}categorias ";
              $query.= " SET cate_nome = :cate_nome, cate_slug = :cate_slug ";
              $query.= " WHERE cate_id = :cate_id ";
              // passo so parametros
              $params = array(':cate_nome' => $this->getCate_nome(),
                              ':cate_slug' => $this->getCate_slug(),
                              ':cate_id'   => (int)$cate_id,
                  );
              // executo a minha SQL
                  if($this->ExecuteSQL($query, $params)):
                      return TRUE;
                      
                  else:
                      return FALSE;
                      
                  endif;
              
              
          }
           function Apagar($cate_id){
              
                // verifico se  tenho itens antes de apagar a categoria
                $pro = new Produtos();
                $pro->GetProdutosCateID($cate_id);
                
              if( $pro->TotalDados() > 0):
                    echo '<div class="alert alert-danger" > Esta categoria tem: ';
                    echo $pro->TotalDados();
                    echo ' produtos. Não pode ser apagada, para apagar precisa primeiro apagar os produtos dela </div>';
           
                    // se nao tiver produtos nela  eu apago 
               else:
                  
                       // monto a SQL
              $query = " DELETE FROM {$this->prefix}categorias";
              $query.= " WHERE cate_id = :id";
              
              // passo os parametros
              $params = array(':id' => (int)$cate_id);
              // executo a SQL
          
               if($this->ExecuteSQL($query, $params)):
                      return TRUE;
                      
                  else:
                      return FALSE;
                      
                  endif;
              
              endif;
           
              
          }
          
          //MÉTODOS GET
           function getCate_nome() {
              return $this->cate_nome;
          }
          function getCate_slug() {
              return $this->cate_slug;
          }
          //MÉTODOS SET
          function setCate_nome($cate_nome) {
             
              $this->cate_nome = filter_var($cate_nome, FILTER_SANITIZE_STRING);
          }
          function setCate_slug($cate_slug) {
             
              
              $this->cate_slug = Sistema::GetSlug($cate_slug);
          }
      }
       ?>
       
    • Por gust.php
      Prezados, boa noite.
       
      Nunca fiz isso e estou dúvidas.
       
      Tenho as tabelas CATEGORIAS e SUBCATEGORIAS. Os cadastros e relacionamentos estão funcionando perfeitamente, tudo ok aqui.
      Tenho também a tabela PRODUTOS.
       
      Digamos que eu tenha produtos que fazem parte de categorias que não tem subcategoria, e tenho produtos que fazem parte de subcategorias de alguma categoria.
       
      Como fazer o relacionamento desses produtos?
       
      Vou relacionar a tabela PRODUTOS com CATEGORIAS e SUBCATEGORIAS ?
      A dúvida surgiu pois um produto pode fazer parte de uma categoria que não tem subcategoria, mas posso ter também produtos que fazem parte de subcategorias de uma categoria.
      E qual a cardinalidade desse relacionamento?
       
      Ja vi gente fazendo o relacionamento só com SUBCATEGORIA, mas e se não existir subcategoria????
       
      produto many to many categoria
      produto many to many subcategoria
       
      produto
      id | produto 
       
      prod_cat
      cat_id | prod_id
       
      categoria
      id | categoria 
       
      subcategoria
      id | categoria 
       
      prod_subcat
      subcat_id | prod_id
       
      Como resolver isso de um forma correta?
    • Por luiscarlos5046
      Olá Galera!
      Alguém pode me dar um help?
      Nesta Query eu listo todos os subgrupos(subcategorias) de um grupo(categoria), mas gostaria de não exibir os subgrupos vazios.... alguém tem algum exemplo pra me passar?
       
      SELECT g.*, sg.id AS idsg, sg.subgrupo FROM grupo g, subgrupo sg, produtos p WHERE sg.id = p.id_subgrupo AND sg.id_grupo = 1 GROUP BY sg.id ou esse
       
      SELECT grupo.*, subgrupo.id AS idsg, subgrupo.subgrupo FROM grupo INNER JOIN subgrupo ON subgrupo.id_grupo = grupo.id WHERE grupo.id = 1 Ambos funcionam da mesma forma, mas traz uma subcategoria cuja não existem produtos cadastrados (Vazios)
       
      Alguém pode me dar uma luz de como fazer isso?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.