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