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.