2

OK、それで、現在ログインしているユーザーを ProductRepository のカスタム メソッドに送信して、このユーザーに割り当てられている製品の製品をフィルター処理したいと思います。製品のリストへの私の product.yml ルート:

sylius_backend_product_index:
pattern: /
methods: [GET]
defaults:
    _controller: sylius.controller.product:indexAction
    _sylius:
        template: SyliusWebBundle:Backend/Product:index.html.twig
        method: createFilterPaginator2
        arguments: [$criteria, $sorting, $deleted, $user]

次にコントローラーに移動します。ProductController には indexAction メソッドがありませんが、その拡張機能である ResourceController には index アクションがあります。

 public function indexAction(Request $request)
{
    $criteria = $this->config->getCriteria();
    $sorting = $this->config->getSorting();
    $user = $this->get('security.context')->getToken()->getUser();

    $repository = $this->getRepository();

    if ($this->config->isPaginated()) {
        $resources = $this->resourceResolver->getResource(
            $repository,
            'createFilterPaginator2',
            array($criteria, $sorting, false, $user)
        );
        $resources->setCurrentPage($request->get('page', 1), true, true);
        $resources->setMaxPerPage($this->config->getPaginationMaxPerPage());

        if ($this->config->isApiRequest()) {
            $resources = $this->getPagerfantaFactory()->createRepresentation(
                $resources,
                new Route(
                    $request->attributes->get('_route'),
                    $request->attributes->get('_route_params')
                )
            );
        }
    } else {
        $resources = $this->resourceResolver->getResource(
            $repository,
            'findBy',
            array($criteria, $sorting, $this->config->getLimit(), $user)
        );
    }

    $view = $this
        ->view()
        ->setTemplate($this->config->getTemplate('index.html'))
        ->setTemplateVar($this->config->getPluralResourceName())
        ->setData($resources)
    ;

    return $this->handleView($view);
}

ここで私は追加しました

 $user = $this->get('security.context')->getToken()->getUser();

次に、$user を $resources のパラメーター配列に追加しました。createFilterPaginator2 メソッド自体は次のようになります。

 public function createFilterPaginator2($criteria = array(), $sorting = array(), $deleted = false, UserInterface $user = NULL)
{
    $queryBuilder = parent::getCollectionQueryBuilder()
        ->select('product, variant')
        ->leftJoin('product.variants', 'variant')
        ->where('product.seller = :user')
        ->setParameter('user', $user)
    ;

    //var_dump($user->getUsername());
    if (!empty($criteria['name'])) {
        $queryBuilder
            ->andWhere('product.name LIKE :name')
            ->setParameter('name', '%'.$criteria['name'].'%')
        ;
    }
    if (!empty($criteria['sku'])) {
        $queryBuilder
            ->andWhere('variant.sku = :sku')
            ->setParameter('sku', $criteria['sku'])
        ;
    }

    if (empty($sorting)) {
        if (!is_array($sorting)) {
            $sorting = array();
        }
        $sorting['updatedAt'] = 'desc';
    }

    $this->applySorting($queryBuilder, $sorting);

    if ($deleted) {
        $this->_em->getFilters()->disable('softdeleteable');
    }

    return $this->getPaginator($queryBuilder);
}

そして問題は、ResourceController で $user が現在ログインしているユーザーを正しく返しますが、$user がメソッドに正常に送信されないことです。私は重要な sth を見逃していると思います.引数: [$criteria, $sorting, $deleted, $user] は ResourceController によって返されるべきではないと思いますが、atm.

カスタムリポジトリメソッド、便利なリンクなどにパラメータを送信する方法について、助けていただければ幸いです。ありがとう!

4

2 に答える 2

0

私は自分で試したことはありませんが、ここで jbinfo の回答を確認してください: https://github.com/Sylius/Sylius/issues/1827

そのページが消えた場合、彼の例は次のとおりです。

acme_account_company_list:
pattern: /list
defaults:
    _controller: sylius.controller.company:indexAction
    _sylius:
        method: findAllCompaniesByUser
        arguments: ['expr:service("security.context").getToken().getUser()']
        paginate: 10
        sorting:
            updatedAt: desc
于 2016-11-15T21:31:29.453 に答える
0

製品モデルを更新しましたか? デフォルトではユーザーフィールドは含まれていません...

于 2014-11-19T23:12:56.227 に答える