Elemente ce necesita sortare / ordonare manuala

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:

  1. 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.
  2. 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

 

About

Software Development Manager, Architect

Leave a Reply

Your email address will not be published. Required fields are marked *

[TOP]