Alguem pode me ajudar (loja vitual)

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

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:

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

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…




    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.

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 :)