Listar as categorias no grid

Alguem sabe com fazer para listar as categoria e subcategorias em um grid como mostra a imagem anexa dado um espaço na subcategorias:

Eu estou usando com referencia isto como referencia http://www.yiiframework.com/wiki/61/.

Valews Brodis

Edson,

Uma vez eu precisei fazer um menu com Categoria e Subcategoria, com Hierarquia.

Suei, suei e suei uns 2 dias e consegui.




CREATE TABLE IF NOT EXISTS `produtocategoria` (

  `codprodutocategoria` int(4) NOT NULL,

  `codpai` int(4) NOT NULL,

  `titulo` varchar(120) NOT NULL,

  `datacriacao` datetime NOT NULL,

  `dataatualizacao` datetime NOT NULL,

  PRIMARY KEY (`codprodutocategoria`)

) ENGINE=MyISAM;



CGridView (Imagem anexada)




...

array(

    'name' => 'titulo',

),

array(

    'name' => 'codpai',

    'filter' => CHtml::listData(Produtocategoria::model()->findAll(), 'codprodutocategoria', 'titulo'),

    'value'=>'Produtocategoria::model()->findByPk($data->codpai)->titulo',

),

...



_form.php




...

    <div class="row titulo">

        <?php echo $form->labelEx($model, 'titulo'); ?>

        <?php echo $form->textField($model, 'titulo', array('class' => 'input w400px', 'maxlength' => 120)); ?>

        <?php echo $form->error($model, 'titulo'); ?>

    </div>


    <div class="row codpai">

        <?php echo $form->labelEx($model, 'codpai'); ?>

        <?php

        $this->widget('CTreeView', array('data' => Yii::app()->controller->getCategorias('produtocategoria', $model, 'codpai')));

        ?>

        <?php echo $form->error($model, 'codpai'); ?>

    </div>



Funções




public function getCategorias($controller, $value, $id) {

    $controllers = ucfirst(preg_replace('/categoria/', '', $controller)) . 'categoria';

    $atributo = 'cod' . strtolower(preg_replace('/categoria/', '', $controller)) . 'categoria';


    $models = CActiveRecord::model($controllers)->findAll('codpai = 0');

    foreach ($models as $model) {

        $row['text'] = CHtml::label(CHtml::radioButton(ucfirst($controller) . "[{$id}]", ($model->$atributo == $value->$id ? true : false), array('value' => $model->$atributo)) . ' ' . $model->titulo, '');

        $row['children'] = $this->getChilds($model->$atributo, $controller, $id, $value);

        $data[] = $row;

    }

    return $data;

}


public function getChilds($id, $controller, $attr, $value) {

    $controllers = ucfirst(preg_replace('/categoria/', '', $controller)) . 'categoria';

    $atributo = 'cod' . strtolower(preg_replace('/categoria/', '', $controller)) . 'categoria';


    $models = CActiveRecord::model($controllers)->findAll('codpai = ' . $id);

    foreach ($models as $model) {

        $row['text'] = CHtml::label(CHtml::radioButton(ucfirst($controller) . "[{$attr}]", ($model->$atributo == $value->$attr ? true : false), array('value' => $model->$atributo)) . ' ' . $model->titulo, '');

        $row['children'] = $this->getChilds($model->$atributo, $controller, $attr, $value);

        $data[] = $row;

    }

    return $data;

}



Obs.: As funções eu coloquei no components/Controller.php, fiz tudo na preça pelo tempo de desenvolvimento, mais vai servir pra outras coisas, hoje eu refiz essa função, para usar comente na tabela CATEGORIA, tinha separado por Produtocategoria, Galeriacategoria entre outros, por que futuramente ia fazer alterações diferentes para cada categoria, por isso separei, e fiz o tratamento nas funções.

Blz,

Newerton Muito interessante a sua ideia de montar o gridview com uma coluna com o nome da categoria e a coluna da categoria pai, qualquer coisa vou usar esta idea valew por compartilhar.

Era que no grid monta-se parecido do a tree em forma de escadinha no nomes da categoria, tipo se a categoria fosse sub ela da alguns espaço para frente.

Mais quero deixar desde ja que agradeço a sua ideia ela é interessante caso eu nao consiga fazer.

mais agora se tiver ideia de como fazer isso.

categoria

----subcategoria

--------subdasub

categoria

e assim vai…

Valew

Edson,

Esqueci de falar sobre a listagem das categorias hehehe

Como pode ver, na coluna Categoria, existe uns itens sem ‘Categoria’, esse são as Categorias PAI.

Sobre deixar em árvores, vou te enviar uma OUTRA função auhauhhuauauhhuaua

Essa função eu usei no site, para listar as categorias e subs, ai vc analisa e adequa ela do seu modo.

1º Imagem




function childs($id) {

   foreach (Produtocategoria::model()->findAll('codpai = ' . $id) as $model) {

	   $row['text'] = '<p class="marginBottom5px"><a href="' . Yii::app()->createUrl('produto/index/', array('id' => $model->codprodutocategoria)) . '">' . $model->titulo . '</a></p>';

	   $row['children'] = childs($model->codprodutocategoria);

	   $data[] = $row;

   }

   return $data;

}


function menu() {

   $models = Produtocategoria::model()->findAll('codpai = 0');

   $i = 0;

   foreach ($models as $model) {

	   $row['text'] = '<p class="txtRosa txtBold f14 marginBottom10px"><a href="' . Yii::app()->createUrl('produto/index/', array('id' => $model->codprodutocategoria)) . '">' . $model->titulo . '</a></p>';

	   $row['children'] = childs($model->codprodutocategoria);

	   $data[] = $row;

	   $i++;

   }

   return $data;

}

$this->widget('CTreeView', array('data' => menu(), 'htmlOptions' => array('class' => 'treeview-newerton')));



2º Imagem




function menu() {

	$models = Produtocategoria::model()->findAll('codpai = 0');

	foreach ($models as $model) {

		echo '<p class="txtRosa txtBold f14 marginBottom10px marginTop20px"><a href="' . Yii::app()->createUrl('produto/index/', array('id' => $model->codprodutocategoria)) . '">' . $model->titulo . '</a></p>';

		childs($model->codprodutocategoria);

	}

}


function childs($id) {

	foreach (Produtocategoria::model()->findAll(array('condition'=>'codpai = ' . $id, 'order'=>'titulo ASC')) as $model) {

		echo '<p class="marginBottom5px"><a href="' . Yii::app()->createUrl('produto/index/', array('id' => $model->codprodutocategoria)) . '">' . $model->titulo . '</a></p>';

		childs($model->codprodutocategoria);

	}

}

menu();



valew brodi,

Vou analisar e vou ver o que posso fazer aqui.