Istnieją pewne warunki wstępne i trzeba wprowadzić pewne modyfikacje w szablonie widoku. Ale nie musisz samodzielnie rozwijać tej funkcji.
Wymagania wstępne
- Potrzebujesz kolejności kolumn typu INT do tabeli bazy danych
- Widok listy powinien być już możliwy do sortowania (klikając nagłówki kolumn tabeli)
Modyfikacje
Jest to najważniejsza część umożliwiająca sortowanie wierszy tabeli metodą przeciągania i upuszczania:
JHtml::_('sortablelist.sortable', 'itemList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
Powinieneś aktywować (tj. Wykonać powyższą linię) tylko wtedy, gdy twoja tabela jest posortowana według kolejności kolumn w tabeli bazy danych . Musisz dowiedzieć się, według której kolumny jest posortowana tabela i w jakim kierunku (ASC lub DESC). Zrób to na początku pliku default.php:
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn = $this->escape($this->state->get('list.direction'));
Sprawdź, czy twoja tabela jest uporządkowana według kolejności kolumn
$saveOrder = $listOrder == 'a.ordering';
Ustaw rzędy tabeli w sortowalne, przeciągając i upuszczając, jeśli $ saveOrder jest prawdziwe. Zamień com_example na nazwę komponentu i „items” w task = items.saveOrderAjax na nazwę kontrolera listy:
if ($saveOrder)
{
$saveOrderingUrl = 'index.php?option=com_example&task=items.saveOrderAjax&tmpl=component';
JHtml::_('sortablelist.sortable', 'itemList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}
$ SaveOrderingUrl zostanie wywołana przez AJAX spędzaj go przed upadkiem element. Jeśli kontroler rozszerza odpowiednią klasę Joomla MVC (JControllerAdmin), ta metoda jest automatycznie dostępna dla Ciebie. itemList to identyfikator Twojej tabeli HTML, a adminForm to nazwa (lub identyfikator, nie jestem pewien) formularza HTML:
<form action="<?php echo JRoute::_('index.php?option=com_example&view=items'); ?>" method="post" name="adminForm" id="adminForm">
...
<table class="table table-striped" id="itemList">
...
</table>
...
</form>
Będziesz potrzebował nowej kolumny w tabeli HTML. Na twoim zrzucie ekranu kolumna jest bardzo po lewej stronie. Nagłówek kolumny tabeli wygląda następująco:
<th width="1%" class="nowrap center hidden-phone">
<?php echo JHtml::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
</th>
W przypadku korpusu tabeli najprawdopodobniej masz pętlę Foreach przechodzącą przez wszystkie elementy listy. Pierwszą komórką w każdym wierszu tabeli HTML będzie ikona przeciągania. Jeśli wyłączono przeciąganie i upuszczanie (ponieważ tabela nie jest uporządkowana przy składaniu zamówienia ), należy dezaktywować ikonę i utworzyć etykietkę:
<tbody>
<?php foreach ($this->items as $i => $item) :
$ordering = ($listOrder == 'ordering');
?>
<tr class="row<?php echo $i % 2; ?>">
<td class="order nowrap center hidden-phone">
<?php
$iconClass = '';
if (!$saveOrder) {
$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::tooltipText('JORDERINGDISABLED');
}
?>
<span class="sortable-handler <?php echo $iconClass ?>">
<span class="icon-menu"></span>
</span>
<?php if ($saveOrder) : ?>
<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order " />
<?php endif; ?>
</td>
...
</tbody>
task=items.saveOrderAjax
natask=myviews.saveOrderAjax
. Teraz działa dobrze.