Ahe meus brothers,
Estou desenvolvendo um site paracido com uma loja virtual, estou com uma duvida e gostaria que vcs me ajuda-se…
Qual a melhor forma de fazer um menu desta forma:
> Sessão Principal
> > Subsessao
> > > Subsessao da Subsessao
… e assim vai.
Estou com duvida de como eu poderia fazer isso na banco a respeito de tabelas. E como seria as consultas para que retorne desta forma acima.
Desculpe é que sou um pouco leigo em desenvolvimento de loja virtual.
Agradeço a ajuda
Valews
gusnips
(Gustavo)
January 5, 2011, 7:18pm
2
algo como o seguinte
cod nome link cod_pai
dae pra montar o menu faz um select onde o cod_pai for 0
dae pra cada submenu um select onde o cod_pai for o codigo deste
o que daria muitas queries mas funcionaria
algo como o seguinte
cod nome link cod_pai
dae pra montar o menu faz um select onde o cod_pai for 0
dae pra cada submenu um select onde o cod_pai for o codigo deste
o que daria muitas queries mas funcionaria
Acho que assim ficaria muito complicado, alguem tem uma outra forma. valew
Acredito que essa é a forma mais simples que existe. Se ficou complicado, então a situação ta preta
Umas das maneiras mais interessantes de lidar com isso é utilizar nested sets:
The nested set model is a particular technique for representing nested sets (also known as trees or hierarchies) in relational databases.
The term was apparently introduced by Joe Celko; others describe the same technique using different terms.
The standard relational algebra and relational calculus, and the SQL operations based on them, are unable to express directly all desirable operations on hierarchies. The nested set model is a solution to that problem.
An alternative solution is the exp...
Utilizando nested sets, você consegue pegar toda uma hierarquia de pais e filhos com uma única consulta.
Como estamos falando de Yii, acredito que é o mais interessante é utilizar o Active Record para isso. Nesse caso, você pode experimentar a seguinte extensão:
http://www.yiiframework.com/extension/nestedsetbehavior
Newerton
(Newerton Araujo)
January 6, 2011, 10:26am
5
Ahe meus brothers,
Estou desenvolvendo um site paracido com uma loja virtual, estou com uma duvida e gostaria que vcs me ajuda-se…
Qual a melhor forma de fazer um menu desta forma:
> Sessão Principal
> > Subsessao
> > > Subsessao da Subsessao
… e assim vai.
Estou com duvida de como eu poderia fazer isso na banco a respeito de tabelas. E como seria as consultas para que retorne desta forma acima.
Desculpe é que sou um pouco leigo em desenvolvimento de loja virtual.
Agradeço a ajuda
Valews
Edson,
Eu fiz uma CTreeView com categoria e subcategoria, tu vai precisar criar uma tabela com id, codpai, titulo.
Tem um cookbook que peguei como base para criar.
http://www.yiiframework.com/wiki/61/
Chegando em casa, mando detalhadamente como eu fiz!
Newerton:
Edson,
Eu fiz uma CTreeView com categoria e subcategoria, tu vai precisar criar uma tabela com id, codpai, titulo.
Tem um cookbook que peguei como base para criar.
http://www.yiiframework.com/wiki/61/
Chegando em casa, mando detalhadamente como eu fiz!
Valew
blz fico no aguardo dos detalhes…
Newerton
(Newerton Araujo)
January 11, 2011, 11:33pm
7
function menu() {
$models = Galeriacategoria::model()->findAll('codpai = 0');
$i = 0;
foreach ($models as $model) {
$row['text'] = '<p class="txtRosa txtBold f14 ' . (($i > 0) ? '' : '') . ' marginBottom10px"><a href="' . Yii::app()->createUrl('galeria/index/', array('id' => $model->codgaleriacategoria)) . '">' . $model->titulo . '</a></p>';
$row['children'] = childs($model->codgaleriacategoria);
$data[] = $row;
$i++;
}
return $data;
}
function childs($id) {
foreach (Galeriacategoria::model()->findAll('codpai = ' . $id) as $model) {
$row['text'] = '<p class="marginBottom5px"><a href="' . Yii::app()->createUrl('galeria/index/', array('id' => $model->codgaleriacategoria)) . '">' . $model->titulo . '</a></p>';
$row['children'] = childs($model->codgaleriacategoria);
$data[] = $row;
}
return $data;
}
$this->widget('CTreeView', array('data' => menu()));
[sql]
CREATE TABLE IF NOT EXISTS galeriacategoria
(
codgaleriacategoria
int(4) NOT NULL auto_increment,
codpai
int(4) NOT NULL,
titulo
varchar(120) NOT NULL,
datacriacao
datetime NOT NULL,
dataatualizacao
datetime NOT NULL,
PRIMARY KEY (codgaleriacategoria
)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;
[/sql]
Eu criei 1 categoria para cada item no banco de dados, por que o investimento era pouco, e não estava com cabeça pra ficar me preocupando com tipo de categoria, eu poderia colocar uma coluna tipo varchar(120) no banco de dados.
Foi mais ou menos isso que usei, na administração fico assim:
Se tu não selecionar nenhuma categoria, ele vai ser uma categoria, e vai receber 0(zero) em codpai, então tudo que tiver codpai = 0, será categoria, senão será sub-categoria.
Newerton:
function menu() {
$models = Galeriacategoria::model()->findAll('codpai = 0');
$i = 0;
foreach ($models as $model) {
$row['text'] = '<p class="txtRosa txtBold f14 ' . (($i > 0) ? '' : '') . ' marginBottom10px"><a href="' . Yii::app()->createUrl('galeria/index/', array('id' => $model->codgaleriacategoria)) . '">' . $model->titulo . '</a></p>';
$row['children'] = childs($model->codgaleriacategoria);
$data[] = $row;
$i++;
}
return $data;
}
function childs($id) {
foreach (Galeriacategoria::model()->findAll('codpai = ' . $id) as $model) {
$row['text'] = '<p class="marginBottom5px"><a href="' . Yii::app()->createUrl('galeria/index/', array('id' => $model->codgaleriacategoria)) . '">' . $model->titulo . '</a></p>';
$row['children'] = childs($model->codgaleriacategoria);
$data[] = $row;
}
return $data;
}
$this->widget('CTreeView', array('data' => menu()));
Dica:
NUNCA coloque lógica desse tipo em uma view! Isso é totalmente contra o MVC (e na verdade, totalmente contra qualquer boa prática). Uma view deve apenas exibir dados. Nada além disso.
Caso precise de algo mais elaborado para preparar dados para exibição, você pode criar helpers ou widgets. Assim, você consegue manter a separação das responsabilidades e criar um código reutilizável.
Não leve como uma crítica, mas é que acho importante deixar isso claro, principalmente pro pessoal novato que ainda está apanhando na OO e no MVC. A pior coisa que tem pra eles é começar aprendendo conceitos errados
Newerton
(Newerton Araujo)
January 13, 2011, 10:51pm
9
davi_alexandre:
Dica:
NUNCA coloque lógica desse tipo em uma view! Isso é totalmente contra o MVC (e na verdade, totalmente contra qualquer boa prática). Uma view deve apenas exibir dados. Nada além disso.
Caso precise de algo mais elaborado para preparar dados para exibição, você pode criar helpers ou widgets. Assim, você consegue manter a separação das responsabilidades e criar um código reutilizável.
Não leve como uma crítica, mas é que acho importante deixar isso claro, principalmente pro pessoal novato que ainda está apanhando na OO e no MVC. A pior coisa que tem pra eles é começar aprendendo conceitos errados
Davi,
Obrigado pela dica, eu tentei fazer um helpers, mais como eu tinha 3 dias para o desenvolvimento, eu não me atento pra isso.
Isso é um site institucional, os sistema que eu faço não deixo o código misturando com funções.
Se tu acha que o conceito está errado, exemplifica essa logica que fiz em um um helper ou widget para os novatos aprender