Архив метки: order

Удобная сортировка записей

Появилась необходимость сортировать записи в админке. Безусловно проще сделать текстовое поле, в котором будем прописывать порядковый номер записи, но мы простых путей не ищем 🙂 Выбор пал на jQuery плагин sortable: http://joxi.ru/nAy6Lz1hYW1jrZ .
То есть просто берем и перетягиваем запись вверх или вниз. Итак, у нас есть табличка club_forum_parts, в которой есть 3 поля: part_id, part_sort и part_name, где part_sort и есть поле, отвечающее за сортировку.
В модельке, в функции search добавляем сортировочку по полю part_sort:
$criteria->order = ‘part_sort ASC’;

    public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.

$criteria=new CDbCriteria;

$criteria->compare('part_id',$this->part_id);
$criteria->compare('part_sort',$this->part_sort);
$criteria->compare('part_name',$this->part_name,true);
$criteria->order = 'part_sort ASC';

return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}

Далее идем во вьюшку и тут начинают твориться чудеса:

<?php
$this->breadcrumbs=array(
'Разделы форума',
);

$table_id = 'forum-parts'; // указываем ID нашей таблички
$action_url = '/admin/forumParts/sort'; // указываем action, в котором будем сохранять наши отсортированные поля

// Далее идет код, в котором можно и не разбираться =)
$str_js = "
var fixHelper = function(e, ui) {
ui.children().each(function() {
$(this).width($(this).width());
});
return ui;
};

$('#".$table_id."-grid table.table tbody').sortable({
forcePlaceholderSize: true,
forceHelperSize: true,
items: 'tr',
update : function () {
serial = $('#".$table_id."-grid table.table tbody').sortable('serialize', {key: 'items[]', attribute: 'class'});
$.ajax({
'url': \"$action_url\",
'type': 'post',
'data': serial,
'success': function(data){
},
'error': function(request, status, error){
alert('Что-то пошло не так. Попробуйте выполнить сортировку чуть позже.');
}
});
},
helper: fixHelper
}).disableSelection();
";
Yii::app()->clientScript->registerCoreScript('jquery.ui'); // подключаем jQuery user interface
Yii::app()->clientScript->registerScript('sortable-'.$table_id, $str_js); // Выводим написанный выше JS код
Yii::app()->clientScript->registerCss('css','.cursor { cursor: pointer; }'); // Меняем курсор над строчкой записи. Ну он же должен выглядеть как указатель?
?>

<h3>Разделы форума</h3>
<?php echo CHtml::link('Добавить раздел','/admin/forumParts/create/',array('class'=>'btn btn-default btn-primary')); ?>&nbsp;
<?php $this->widget('zii.widgets.grid.CGridView',array( // ну да, с бутстраповским TbGridView не совсем удобно, поэтому юзаем стандартный CGridView
'id'=>$table_id.'-grid',
'dataProvider'=>$model->search(),
'summaryText'=>'',
'itemsCssClass' => 'table table-striped table-condensed',
'rowCssClassExpression'=>'"items[]_{$data->part_id} cursor"', // указываем классы для каждой записи. Используется part_id (замените на свой ID-шник)
'columns'=>array(
'part_id',
'part_name',
array(
'class'=>'bootstrap.widgets.TbButtonColumn',
'template' => '{update}{delete}',
),
),
)); ?>

Ну вот почти и все. Осталось лишь сохранить все это дело в контроллере:

    public function actionSort()
{
if (isset($_POST['items']) && is_array($_POST['items'])) {
$i = 0;
foreach ($_POST['items'] as $item) {
$model = ForumParts::model()->findByPk($item);
$model->part_sort = $i;
$model->save();
$i++;
}
}
}

Спасибо за внимание! =)