TYPO3 extbase,更改前端元素的排序

TYPO3 extbase, change sorting of elements in frontend

我用 TYPO3 9.5 的 extensionbuilder 创建了一个新的扩展。在我的扩展中,有一个 1:n 关系。 n 个元素是可排序的。通过将元素拖动到所需的顺序并保存 1-element,可以在 1-element 的后端 flexform 中轻松对元素进行排序。我试图找到一种解决方案,如何在前端获得相同的功能,以便前端用户可以更改元素的排序。 extbase 和 fluid 中是否有我应该遵循的概念以达到预期的结果?还是我必须自己发明?

没有真正实现的概念。 因为您使用了 Extension Builder,所以我假设您的 table 有一个名称为 'sorting' 的列。我在我的存储库中实现了一个 updateOrder 方法:

/**
 * @param int $uid1
 * @param int $uid2
 */
public function updateOrder($uid1, $uid2) {
    $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
       ->getQueryBuilderForTable('your_table_name');

    $sorting = $queryBuilder        
      ->select("uid", "sorting")
      ->from("your_table_name")
      ->where($queryBuilder->expr()->in("uid", [$uid1, $uid2]))
      ->execute()->fetchAll();

    $queryBuilder
      ->update("your_table_name")
      ->set("sorting", $sorting[0]['sorting'])
      ->where($queryBuilder->expr()->eq("uid", $sorting[1]["uid"]))
      ->execute();
    $queryBuilder
      ->update("your_table_name")
      ->set("sorting", $sorting[1]["sorting"])
      ->where($queryBuilder->expr()->eq("uid", $sorting[0]["uid"]))
      ->execute();
}

然后我通过在我的控制器中实现一个 changeOrderAction 来调用这个方法:

/**
 * action changeOrder
 *
 * @param int $uid1
 * @param int $uid2
 *
 * @return void
 * @throws StopActionException
 * @throws UnsupportedRequestTypeException
 */
public function changeOrderAction($uid1, $uid2) {
    $this->yourRepository->updateOrder($uid1, $uid2);

    $this->redirect("list");
}

编辑: 这是我解决前端的方法(肯定有改进的余地):

<f:for each="{objects}" as="object" iteration="iterator">
    <tr>
        <td><f:link.action action="show" arguments="{object : object}">{object.name}</f:link.action></td>
        <td><f:link.action action="edit" arguments="{object : object}">Edit</f:link.action></td>
        <td><f:link.action action="delete" arguments="{object : object}">Delete</f:link.action></td>
        <td>
            <div>
                <f:variable name="object_before_idx" value="{iterator.index - 1}"/>
                <f:variable name="object_before_uid" value="{objects.{object_before_idx}.uid}"/>
                <f:if condition="{objects.{object_before_idx}.uid}">
                    <f:then>
                        <f:link.action action="changeOrder" arguments="{uid1 : object.uid, uid2 : object_before_uid}">
                            Up
                        </f:link.action>
                    </f:then>
                </f:if>
            </div>
            <div>
                <f:variable name="object_after_idx" value="{iterator.index + 1}"/>
                <f:variable name="object_after_uid" value="{objects.{object_after_idx}.uid}"/>

                <f:if condition="{objects.{object_after_idx}.uid}">
                    <f:then>
                        <f:link.action action="changeOrder" arguments="{uid1 : object.uid, uid2 : object_after_uid}">
                            Down
                        </f:link.action>
                    </f:then>
                </f:if>
            </div>
        </td>
    </tr>
</f:for>