0

我写了一个扩展来制作服务订单。我在这里面临的问题是,

FE 用户属于“client”、“Admin”和“Employee”三个 FE 用户组。

在这里客户可以下订单,他应该只能看到他的订单。管理员可以看到不同客户完成的所有订单。并且员工应该只能看到一些客户的订单。

目前我制作了一个与 FE 用户表具有 N:1 关系的订单表。因此,每个订单都应该与任何一个客户相关。

所以在控制器中,我正在检查登录用户并在存储库中使用自定义查询,我正在访问与登录客户端(FE 用户)相关的订单

在 OrdersController.php 文件中

public function listAction() {
     $orders = $this->ordersRepository->orderForLoginUsr();
     $this->view->assign('orders', $orders);
}

在 OrdersRepository.php 文件中

public function orderForLoginUsr(){
      $loggedInUserId = $GLOBALS ['TSFE']->fe_user->user['uid'];
      $query = $this->createQuery();
      $query->matching(
         $query->equals('user', $loggedInUserId)
      );
      $query->setOrderings(array('crdate' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING));
      return $query->execute();
}

但在这里我的问题是如何让管理员用户能够看到所有客户完成的所有订单?我必须编写调用函数 findAll() 的不同模板和操作?

$orders = $this->ordersRepository->findAll();

以及如何设置用户组 Employee ?

提前致谢

4

2 回答 2

0

我认为最简单的方法是使用 3 个不同的插件实际实现 3 个操作,例如:listClientAction、listAdminAction 和 listEmployeeAction

在每个操作中,您在存储库中实现一个方法,该方法以良好的顺序获取正确的订单列表:orderForLoginClient()、orderForLoginEmployee()、orderForLoginAdmin()

诀窍实际上是在您的页面上将有 3 个插件,每个操作一个。在插件的每个实例中,您都为正确的 be_group 设置访问权限。

不要忘记在 localconf 和 ext_table 文件中添加操作和插件。

我希望它会有所帮助!奥利维尔

于 2013-09-08T00:35:16.310 回答
0

如果您的客户、管理员、员工的视图几乎相同,您应该简单地添加一个方法,如 getOrderWithPermissionsForUser($currentUser);

在方法本身中,您应该检查用户组并在您的 Repo 上调用不同的查询。

如果您的视图从用户组到用户组不同,您应该为相同的部分使用带有部分的不同模板。

如果视图的数据相同,只需更改操作中每个用户组的模板即可。如果不使用不同的操作。

这是一个轻松更改模板文件的辅助方法。

/**
 * This method can change the used template file in an action method.
 *
 * @param string $templateName Something like "List" or "Foldername/Actionname".
 * @param string $templateExtension Default is "html", but for other output types this may be changed as well.
 * @param string $controllerName Optionally uses another subfolder of the Templates/ directory
 *                  By default, the current controller name is used. Example value: "JobOffer"
 * @param \TYPO3\CMS\Fluid\View\AbstractTemplateView $viewObject The view to set this template to. Default is $this->view
 */
protected function changeTemplateFile($templateName, $templateExtension = 'html', $controllerName = null, AbstractTemplateView $viewObject = null)
{
    if (is_null($viewObject)) {
        $viewObject = $this->view;
    }

    if (is_null($controllerName)) {
        $controllerName = $this->getControllerContext()->getRequest()->getControllerName();
    }

    $templatePathAndFilename = $this->getTemplateRootpathForView($controllerName . '/' . $templateName . '.' . $templateExtension);
    $viewObject->setTemplatePathAndFilename($templatePathAndFilename);
}
于 2014-08-04T15:08:31.110 回答