Exista elemente pentru care este necesara sortarea lor de catre user.
De exemplu campurile custom -> ordinea in care ele apar in formularul lor.
Pentru aceasta, trebuie sa permitem user-ului sa le sorteze manual, in listing-ul acestora.
Cum se face
Pentru exemplificare, vom lucra direct pe tabela custom_field.
In tabela avem un camp “de sortare” – de exemplu “oord” – care va tine la insert valoarea id-ului. Avem deci custom_field.oord.
La afisare, vom face ORDER BY custom_field.oord
Sortarea propriu-zisa se face prin schimbarea succesiva a ordinii a 2 row-uri adiacente, adica – in fapt – interschimbarea valorilor din oord intre aceste 2 row-uri.
Cum se implementeaza
Pas 0: in tabela se creeaza un camp de sortare, de exact acelasi tip cu id-ul tabelei (am zis mai sus ca avem custom_field.oord).
Pas 1: controller-ul trebuie sa extinda CommonController ( in cazul nostru class CustomFieldController extends CommonController)
Pas 2: in init-ul controller-ului trebuie sa facem cateva setari cu privire la aceasta sortare
public function init() {
parent::init();
// the field the ordering is done by
$this->sortField = "oord";
// the condition on which the sorting is done
// (because we don't want to mix the order of fields in invoices
// with the order of fields in contracts, or even
// throughout other companies so we restrict
// the sorting to these criteria)
$this->sortCondition = function($model){
$ret = "companyId=" . Company::currentId();
$ret .= " AND moduleId IS NULL ";
$ret .= " AND modelType = " . $model->modelType;
return $ret;
};
}
Pas 3: adaugam butoanele de sortare in index
'move-up' => function ($url, $model, $key) {
return Html::a('<i class="icon md-long-arrow-up btn btn-pure btn-' . ($GLOBALS['dea'] ?'primary' :'success') . ' waves-effect waves-circle waves-classic"></i>',
['move-up', 'id' => $model->id],
['data-tooltip' => 'true',
'data-original-title' => Yii::t('app', 'Move up')]
);
},
'move-down' => function ($url, $model, $key) {
return Html::a('<i class="icon md-long-arrow-down btn btn-pure btn-' . ($GLOBALS['dea'] ?'primary' :'success') . ' waves-effect waves-circle waves-classic"></i>',
['move-down', 'id' => $model->id],
['data-tooltip' => 'true',
'data-original-title' => Yii::t('app', 'Move down')]
);
},
(...)
'template' => '{move-up}{move-down}{update}{delete}'
Atentie
implementarea se bazeaza pe faptul ca in coloana oord sunt valori distincte! Pe cale de consecinta deci:
- daca implementezi acest sistem pe o tabela existenta, nu uita ca in migrare sa faci si UPDATE tabela SET oord=id imediat dupa ce creezi oord ca sa initializezi sortarea.
- daca – prin absurd – in oord nu ai valori distincte, sortarea nu va functiona corect; in acest caz repara executant sql-ul de la punctul 1