Jump to content

"Árvore" de categorias em php


diesel10
 Share

Recommended Posts

Boas pessoal,

é possível criar uma árvore com categorias e subcategorias recorrendo só a uma tabela na base de dados.

Será depois possível criar uma espécie de formulário(em árvore recorrendo a tabela criada) e depois no formulário ao seleccionar uma opção, este envia a lista dos produtos especifica para cada (categoria1/categoria2/produto) ou categoria1/categoria2) ou (categoria1)através dearrays?

Algo deste género:

TreeMenu.jpg

Rui(diesel10)

Link to comment
Share on other sites

é possível criar uma árvore com categorias e subcategorias recorrendo só a uma tabela na base de dados.

create table tree (
 id int auto_increment primary key,
 id_parent int,
 name varchar(64),
 foreign key fk_parent (id_parent) references tree(id) on update cascade on delete cascade
)

Será ainda possível seleccionar a lista dos produtos para cada (categoria1/categoria2/produto) ou categoria1/categoria2) ou (categoria1) através de arrays?

hum ? não percebi ...

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

create table tree (
 id int auto_increment primary key,
 id_parent int,
 name varchar(64),
 foreign key fk_parent (id_parent) references tree(id) on update cascade on delete cascade
)

hum ? não percebi ...

boas 'HappyHippyHippo' 🙂

muito obrigado pela tua resposta, em relação à parte que não percebeste, deixa-me já pedir desculpa pois a pergunta estava incompleta e é o seguinte: será possivel criar uma espécie de formulário(em árvore recorrendo a tabela criada) e depois no formulário ao seleccionar uma opção, este envia a lista dos produtos especifica para cada (categoria1/categoria2/produto) ou categoria1/categoria2) ou (categoria1)através de arrays?

Link to comment
Share on other sites

create table product (
 id int auto_increment primary key,
 id_tree int,
 name varchar(64),
 foreign key fk_tree (id_tree) references tree(id) on update cascade on delete cascade
)

$id_tree_selected;

$products = array();
do {
 $sql = "select name from product where id_tree = {$id_tree_selected}";
 $products = array_merge(execute_sql($sql), $products);

 $sql = "select id_parent from tree where id = {$id_tree_selected}";
 $id_tree = execute_sql($sql);
} while ($id_tree != null)

var_dump($products);
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

create table product (
 id int auto_increment primary key,
 id_tree int,
 name varchar(64),
 foreign key fk_tree (id_tree) references tree(id) on update cascade on delete cascade
)

$id_tree_selected;

$products = array();
do {
 $sql = "select name from product where id_tree = {$id_tree_selected}";
 $products = array_merge(execute_sql($sql), $products);

 $sql = "select id_parent from tree where id = {$id_tree_selected}";
 $id_tree = execute_sql($sql);
} while ($id_tree != null)

var_dump($products);

Desde já um obriga-dão por estares a ajudar-me 'HappyHippyHippo',

mas tenho algumas dúvidas no código que me envias-te e não consigo transformar com os meus dados da minha tabela que se designa 'tabletreeproductgroup` ,

Tabela 'tabletreeproductgroup`

contém os seguintes campos:

STR_ID | int(11) | Não é nulo | Primário|

STR_ID_PARENT | int(11) | Nao é nulo |

STR_TYPE | smallint(6) | NULL |

STR_LEVEL | smallint(6) | NULL |

STR_TEXT | varchar(30) utf8_general_ci | Não é nulo|

Link to comment
Share on other sites

o que é o STR_TYPE e o STR_LEVEL ?

O STR_TYPE define o tipo e o STR_LEVEL o nível:

exemplo:

O tipo 1 define automóveis ligeiros:

Automóveis ligeiros: tipo 1; nível 1

Motor: tipo 1 , nível 2;

Lubrificação, tipo 1, nível 3;

Sistema de luzes, tipo 1, nível 2;

O tipo 2 define Camiões:

Camiões: tipo 2; nível 1

Motor: tipo 2, nível 2;

Lubrificação, tipo 2, nível 3;

Sistema de luzes, tipo 2, nível 2;

Esta tabela faz parte de um programa para consulta de peças para carros, chamado TECDOC.

Link to comment
Share on other sites

Não precisas desses dois campos (a menos que os queiras..) para fazer a tree-view. Basta-te três campos.

Eu necessito do STR_LEVEL porque é o campo que me define juntamente com o STR_ID_PARENT se é uma sub-categoria, exemplo:

STR_ID | STR_ID_PARENT | STR_TYPE | STR_LEVEL | STR_TEXT

10001 | 0 | 1 | 1 | Veiculos ligeiros

10101 | 10001 | 1 | 2 | Motor

10103 | 10002 | 1 | 3 | Lubrificação

10343 | 10002 | 1 | 3 | Juntas

10455 | 10343 | 1 | 4 | Juntas de kk

10549 | 10002 | 1 | 3 | Cárter

Que vai dar mais isto:

Veículos Ligeiros

Motor

Lubrificação

Juntas

Juntas de kk

Cárter
Edited by diesel10
Link to comment
Share on other sites

como foi dito, esses dois campos são redundantes ... no entanto olha bem para os dados da tua tabela e verás que as relações STR_ID_PARENT estão incorrectas.

isso não acontecia se tivesses usados as foreign key como no código que apresentei

Talvez estejam, mas como vos disse esta tabela é importada do programa TECDOC, e até fiz uma ligação funcional entre elas usando select list dentro de um form que funciona, mas a minha ideia era troca-las para uma árvore de categorias. Porque neste momento para mostrar as subcategorias de nivel 5(estou a fazer com 4 select list 😞 ). Até vos deixo parte do código para verem.

Ps: sou iniciante nisto 😁!!

Código do form:

<form id="form1" name="form1" method="post">
<label for="campo1"></label>
<select name="campo1" size="34" multiple="multiple" id="campo1" onchange="this.form.submit();MM_showHideLayers('campo2','','show')">
<?php
do {
?>
<option value="<?php echo $row_Recordset1['STR_ID']?>"><?php echo $row_Recordset1['STR_TEXT']?></option>
<?php
} while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));
$rows = mysql_num_rows($Recordset1);
if($rows > 0) {
 mysql_data_seek($Recordset1, 0);
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
}
?>
</select>
<select name="campo2" size="34" multiple="multiple" id="campo2" ondblclick="this.form.submit()">
<?php
do {
?>
<option value="<?php echo $row_Recordset2['STR_ID']?>"><?php echo $row_Recordset2['STR_TEXT']?></option>
<?php
} while ($row_Recordset2 = mysql_fetch_assoc($Recordset2));
$rows = mysql_num_rows($Recordset2);
if($rows > 0) {
 mysql_data_seek($Recordset2, 0);
$row_Recordset2 = mysql_fetch_assoc($Recordset2);
}
?>
</select>
<select name="campo3" size="34" multiple="multiple" id="campo3" ondblclick="this.form.submit()">
<?php
do {
?>
<option value="<?php echo $row_Recordset3['STR_ID']?>"><?php echo $row_Recordset3['STR_TEXT']?></option>
<?php
} while ($row_Recordset3 = mysql_fetch_assoc($Recordset3));
$rows = mysql_num_rows($Recordset3);
if($rows > 0) {
 mysql_data_seek($Recordset3, 0);
$row_Recordset3 = mysql_fetch_assoc($Recordset3);
}
?>
</select>
<select name="campo4" size="34" multiple="multiple" id="campo4" ondblclick="this.form.submit()">
<?php
do {
?>
<option value="<?php echo $row_Recordset4['STR_ID']?>"><?php echo $row_Recordset4['STR_TEXT']?></option>
<?php
} while ($row_Recordset4 = mysql_fetch_assoc($Recordset4));
$rows = mysql_num_rows($Recordset4);
if($rows > 0) {
 mysql_data_seek($Recordset4, 0);
$row_Recordset4 = mysql_fetch_assoc($Recordset4);
}
?>
</select>

<input name="btsearc" type="submit" class="bttsearch" id="btsearc" onclick="MM_goToURL('parent','produtos.php?<?php echo $row_Recordset4['STR_ID']; $row_Recordset3['STR_ID']; $row_Recordset2['STR_ID']; $row_Recordset1['STR_ID']; ?>=');return document.MM_returnValue" value="Pesquisar" align="left" />



</form>

Código php:

mysql_select_db($database_con_site, $con_site);
$query_Recordset1 = "SELECT * FROM tabletreeproductgroup WHERE STR_TYPE=1 AND STR_LEVEL=2 GROUP BY STR_TEXT ASC";
$Recordset1 = mysql_query($query_Recordset1, $con_site) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
$tipo2 = "-1";
if (isset($_POST['campo1'])) {
$tipo2 = $_POST['campo1'];
}
mysql_select_db($database_con_site, $con_site);
$query_Recordset2 = sprintf("SELECT * FROM tabletreeproductgroup WHERE STR_ID_PARENT = %s AND STR_TYPE=1 AND STR_LEVEL=3 ORDER BY STR_TEXT ASC", GetSQLValueString($tipo2, "int"));
$Recordset2 = mysql_query($query_Recordset2, $con_site) or die(mysql_error());
$row_Recordset2 = mysql_fetch_assoc($Recordset2);
$totalRows_Recordset2 = mysql_num_rows($Recordset2);
$tipo3 = "-1";
if (isset($_POST['campo2'])) {
$tipo3 = $_POST['campo2'];
}
mysql_select_db($database_con_site, $con_site);
$query_Recordset3 = sprintf("SELECT * FROM tabletreeproductgroup WHERE STR_ID_PARENT = %s AND STR_TYPE=1 AND STR_LEVEL=4 ORDER BY STR_TEXT ASC", GetSQLValueString($tipo3, "int"));
$Recordset3 = mysql_query($query_Recordset3, $con_site) or die(mysql_error());
$row_Recordset3 = mysql_fetch_assoc($Recordset3);
$totalRows_Recordset3 = mysql_num_rows($Recordset3);
$tipo4 = "-1";
if (isset($_POST['campo3'])) {
$tipo4 = $_POST['campo3'];
}
mysql_select_db($database_con_site, $con_site);
$query_Recordset4 = sprintf("SELECT * FROM tabletreeproductgroup WHERE STR_ID_PARENT = %s AND STR_TYPE=1 AND STR_LEVEL=5 ORDER BY STR_TEXT ASC", GetSQLValueString($tipo4, "int"));
$Recordset4 = mysql_query($query_Recordset4, $con_site) or die(mysql_error());
$row_Recordset4 = mysql_fetch_assoc($Recordset4);
$totalRows_Recordset4 = mysql_num_rows($Recordset4);

// Ler dados
$tipo2 = array($row_Recordset1['STR_ID']);
$tipo3 = array($row_Recordset2['STR_ID']);
$tipo4 = array($row_Recordset3['STR_ID']);
$tipo5 = array($row_Recordset4['STR_ID']);
$resultados = array(); // Não existem resultados...
if (isset($_POST['campo1'])) {
 $tipo3 = array('campo2'); // ler nivel 3
$tipo4 = array('campo3'); // ler nivel 4
$tipo5 = array('campo4'); // ler nivel 5
 $resultados = array('btsearc'); // obter resultados, de uma base de dados ou XML, etc...
}
?>
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.