Organizar Categorias e SubCategorias

Ahe meus Brothis blz…

Estou fazendo este post para compartilhar a extensão que fiz na minha aplicação e que possa ser util para a comunidade yii.

Fiz uma extensão em que vc possa organizar as categorias e subcategorias utilizando ou ate mesmo menu pois estou estou extendendo o CMenu para criaçao da lista. Segue abaixo os codigo que precisa e como deve ser configurado:

Tabela:


CREATE TABLE `categorias` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `ordem` int(11) DEFAULT NULL,

  `parente` int(11) DEFAULT NULL,

  `nome` varchar(100) DEFAULT NULL,

  PRIMARY KEY (`id`)

)

no model da categoria de ser implementado esta relaçao e a funçao para listar os itens:


public function relations(){

            return array(

                'pegarparente' => array(self::BELONGS_TO, 'Categorias', 'parente'),

                'filhos' => array(self::HAS_MANY, 'Categorias', 'parente', 'order' => 'ordem ASC'),

            );

        }


        

        public function listar($url = false) {


            $subitems = array();

            if($this->filhos) foreach($this->filhos as $child) {

                $subitems[] = $child->listar($url);

            }

            

            if($url){

                $returnarray = array('label' => $this->nome, 'url' => $url,'itemOptions'=> array('id'=> 'list_'.$this->id));

            }else{

                $returnarray = array('label' => $this->nome,'itemOptions'=> array('id'=> 'list_'.$this->id));

            }

            

            if($subitems != array())

                $returnarray = array_merge($returnarray, array('items' => $subitems));

            return $returnarray;

        }

E no controller deve lista o itens no array para carregar na view, e deve criar uma funçao para salvar a ordem:


public function actionOrganizar()

	{

                $model = new Categorias;

		$categorias=Categorias::model()->findAll(array('condition'=>'parente = 0', 'order'=>'ordem ASC'));

                foreach ($categorias as $cat){

                            $models = Categorias::model()->findBypk($cat->id);

                            $items[] = $models->listar();

                }


		$this->render('organizar',array(

			'model'=>$model,

                        'items'=>$items,

                       

		));

	}


      public function actionSalvarordem(){

          $i = 1;

          foreach (array_keys($_POST['list']) as $item){

               $model = Categorias::model()->findByPk($item);

               $model->ordem = $i;

               $model->parente = $_POST['list'][$item] !='root'? $_POST['list'][$item] : 0;

               $model->save();

               $i++;


           }

           echo "Sua ordem foi salva com Sucesso!";

            Yii::app()->end();


        }

Depois é só aplicar o widget na view:


$this->widget('backend.extensions.sortable.Sortable', array(

    'items'=>$items,

    'target'=>'sortable',

    'action'=>'salvarordem',

    'htmlOptions'=>array('class'=>'sortable'),

    'itemTemplate'=>'<div class="ui-widget-content">{menu}</div>',

    'config'=> array(

        'disableNesting'=>'no-nest',

	'forcePlaceholderSize'=>true,

	'handle'=>'div',

	'items'=>'li',

	'opacity'=> .6,

	'placeholder'=> 'placeholder',

	'tabSize'=> 25,

	'tolerance'=> 'pointer',

	'toleranceElement'=> '> div'

    )

));

Bom sei que deve dar para melhorar aceito sugestoes, mas fica ai para quem deseja usar. Espero ter ajudado.

Legal, valeu por compartilhar

Logo vou usar pra um test drive ;)