バージョン選択

フォーラム

メニュー

オンライン状況

106 人のユーザが現在オンラインです。 (78 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 105
agenbola7 もっと...

サイト内検索

プラグイン > 開発について > 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ゲスト
投稿日時: 2019/4/6 13:19
対応状況: 開発中
売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
[EC-CUBE] EC-CUBE 4.0.2
[レンタルサーバ] KAGOYA CLOUD 2
[OS] CentOS7
[PHP] PHP 7.1
[データベース] MySQL 5.7
[WEBサーバ] Apache 2.4.6
[ブラウザ] Google Chrome
[現象] 売上集計プラグインで表示される商品をログインしているメンバーのみの表示にしたいです。
前にも同様のスレッドを作ったのですが、変更するphpは分かったもののうまく構文を書き換えることが出来ませんでした。
どのように構文を変更すればいいでしょうか。できれば追加するコードまで教えてくれれば幸いです。
umebius
投稿日時: 2019/4/6 23:34
対応状況: −−−
登録日: 2016/7/22
居住地: 東京日本橋
投稿: 1296
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
各受注はOrder -> OrderItem -> Product -> Creatorというように辿っていけば、登録者の情報に行き当たります。

このCreatorがログインしているユーザーと一致するかどうかで、レポートの数字を絞り込むしかないかと思います。

管理者のエンティティは色々取得方法がありますが、$this->tokenStorage->getToken()->getUser()等で取得可能
(この場合tokenStorageはTokenStorageInterfaceの依存性注入しておく)


----------------
EC-CUBE3系4系 カスタマイズ ECのプロがシステム特急案件承ります。
公式インテグレートパートナー (株)U-Mebius

ゲスト
投稿日時: 2019/4/7 6:04
対応状況: −−−
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
エンティティの取得方法は理解できたのですが、登録者情報の辿り方がよく分かりません。
Order->OrderItem->Product->Creatorという構文でCreatorの情報を取得するということでしょうか。

umebius
投稿日時: 2019/4/7 12:48
対応状況: −−−
登録日: 2016/7/22
居住地: 東京日本橋
投稿: 1296
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
例えばOrderにはgetOrderItemsというゲッターメソッドがあります。
Order.phpにあるこのようなメソッドです。
これで情報を辿っていけるかと思います。


/**
* Get orderItems.
*
* @return \Doctrine\Common\Collections\Collection|OrderItem[]
*/
public function getOrderItems()
{
return $this->OrderItems;
}


----------------
EC-CUBE3系4系 カスタマイズ ECのプロがシステム特急案件承ります。
公式インテグレートパートナー (株)U-Mebius

ゲスト
投稿日時: 2019/4/7 15:17
対応状況: −−−
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
辿って構文は辿って確認したのですがPHPがあまり分からず、絞り込む構文を書くことができませんでした。
申し訳ないのですが、絞り込みの構文を教えてはいただけないでしょうか。急ぎの為、依頼の形でも構いません。
ゲスト
投稿日時: 2019/4/7 20:36
対応状況: 開発中
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
あずみ.net様のEC-CUBE4の管理画面にログインしたら自分が登録した商品しか商品一覧に表示されないようにする方法を参考にコードをSalesReportServiceに追加したのですが、まだ実装することが出来ていません。どこかおかしい箇所がありましたら、助言をいただけると幸いです。

use Eccube\Doctrine\Query\WhereCustomizer;
use Eccube\Doctrine\Query\WhereClause;
use Eccube\Repository\QueryKey;
use Eccube\Entity\Member;
use Eccube\Entity\Master\Authority;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Eccube\Entity\Product;

/**
* @var TokenStorageInterface
*/
protected $tokenStorage;

public function __construct(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}

protected function createStatements($params, $queryKey)
{
$qb = $this->entityManager->createQueryBuilder();
$qb
->select('oi')
->from('Eccube\Entity\OrderItem', 'oi');

if (null !== $token = $this->tokenStorage->getToken()) {
// ユーザーがメンバーの場合
if($token->getUser() instanceof Member) {
// メンバーが管理者ではない場合
if($token->getUser()->getAuthority()->getId() != Authority::ADMIN) {
if(WhereClause::eq('p.Creator', ':creator_id', [$productid = 'creator_id' => $token->getUser()])) {
return [Whereclause::eq('oi.Product', ':product_id', [$productid->getid() => 'product_id'])];
}
}
}
}

return $this;
}

public function getQueryKey(): string
{
return QueryKey::PRODUCT_SEARCH_ADMIN;
}
468
投稿日時: 2019/4/8 9:32
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 1791
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
該当プラグインのソースを読んでいないので改修内容が合っているのか判断できませんが、
改修前のfunction createStatements()は何をreturnしていますか?


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

ゲスト
投稿日時: 2019/4/9 17:22
対応状況: −−−
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
改修前のreturnは下記のコードで、自分はproduct.phpのCreatorクラスからcreator_idを受け取り、そのcreator_idを$tokenから受け取ったログイン中のユーザーと照合する、と解釈しています。

return [WhereClause::eq('p.Creator', ':creator_id', ['creator_id' => $token->getUser()])];
468
投稿日時: 2019/4/10 11:36
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 1791
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
リンク先のあずみ.net様のコードは、元々あるリポジトリのQueryBuilder生成の挙動を変更する為のコードですので、
SalesReportServiceに書き加えるような記述ではないのではないかと思います。

SalesReportService内でQueryBuilderを生成している記述はありませんか?

$qb->innerJoin('o.OrderItem', 'oi')
->innerJoin('oi.Product', 'p')
->addWhere('p.Creator = :creator')
->setParameter('creator', $token->getUser());

元のQueryBuilderの記述がどうなっているか分かりませんが、
Order→OrderItem→ProductとJoinして(もしかしたら既にjoinされているかもしれません)
Whereでp.Creatorとログインユーザーと比較する形で絞り込めるのではないかと思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

umebius
投稿日時: 2019/4/13 21:05
対応状況: −−−
登録日: 2016/7/22
居住地: 東京日本橋
投稿: 1296
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
QueryBuilderでJoinを行なってもあまり本質的な解決にはならないんですね。(1段階目のふるい分けにはなりますが)
その商品を"含んだ"受注を取得するだけで、他の管理者が登録した商品のデータもくっついてきてしまうので。

なので、Joinを行うよりもSaleReportServiceのconvertByProductなどの集計データを作っている部分で、
foreach やIF文を使って、Creatorで絞り込んでやってください。


----------------
EC-CUBE3系4系 カスタマイズ ECのプロがシステム特急案件承ります。
公式インテグレートパートナー (株)U-Mebius

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


ec-cube.co

統計情報

総メンバー数は46,471名です
総投稿数は92,301件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
nanasess
1904
4
468
1791
5
yuh
1594
6
red
1313
7
umebius
1296
8
fukap
907
9
tsuji
840
10
shutta
835
11 ramrun 789
12
tao_s
758
13
h_tanaka
748
14 karin 656
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
483
20 tonton 436


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© LOCKON CO.,LTD. All Rights Reserved.