在组件中添加拖放顺序


13

我已经基于Joomla Hello World教程开发了一个小型组件,现在我想实现与许多其他Joomla组件相同的拖放重排序功能:

在此处输入图片说明

通过按第一列进行排序,可以拖动每个表格行以更改位置。

是否有在Joomla中添加此功能的本地方法,还是我必须自己对其进行编程?

任何朝着正确方向前进的人都表示赞赏。

Answers:


16

有一些先决条件,并且您必须对视图模板进行一些修改。但是您不必自己全部开发此功能。

先决条件

  • 您需要对数据库表输入INT类型的列顺序
  • 您的列表视图应该已经可以排序(通过单击表列标题)

修改项

这是使表行可通过拖放排序的最重要部分:

JHtml::_('sortablelist.sortable', 'itemList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);

如果您的表是按数据库表列顺序排序的,则仅应激活(即执行上一行)。您需要找出表的排序依据和排序方向(ASC或DESC)。在您的default.php开头执行此操作:

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));

检查您的表是否按列顺序排序

$saveOrder = $listOrder == 'a.ordering';

如果$ saveOrder为true,则使表行可以通过拖放进行排序。将com_example替换为组件名称,并将task = items.saveOrderAjax中的“ items”替换为列表控制器的名称:

if ($saveOrder)
{
    $saveOrderingUrl = 'index.php?option=com_example&task=items.saveOrderAjax&tmpl=component';
    JHtml::_('sortablelist.sortable', 'itemList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}

$ saveOrderingUrl将通过您放置项目的AJAX每次调用。如果您的控制器扩展了正确的Joomla MVC类(JControllerAdmin),则此方法自动为您使用。itemList是HTML表的ID,而adminForm是HTML表单的名称(或ID,不确定):

<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>

HTML表中将需要一个新列。在屏幕快照中,它是最左侧的列。表列标题看起来像这样:

<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>

对于您的表主体,您很可能在所有列表项中都有一个foreach循环。HTML表格每一行的第一个单元格就是该拖动图标。如果您禁用了拖放操作(因为未通过命令对表进行排序),则应停用该图标并进行工具提示:

<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>

谢谢,非常好的回答。我实际上还没有设法使其正常工作,但是我正在接近:)
Bogowoe 2015年

如果您有任何疑问,或者我的指南中有错误或需要改进的地方,请告诉我。
fruppel

我知道了!我忘了改task=items.saveOrderAjaxtask=myviews.saveOrderAjax。现在一切正常。
Bogowoe,2015年

拖放排序与搜索工具链接在一起。如果您尚未实现搜索工具(如文章中所述),则通过拖放链接进行的可排序不起作用。
丹尼斯·海登

这里缺少一些东西。我无法拖动表格项,也无法对排序列进行排序。
TIIUNDER
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.