バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ゲスト
投稿日時: 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
居住地:
投稿: 2085
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
各受注はOrder -> OrderItem -> Product -> Creatorというように辿っていけば、登録者の情報に行き当たります。

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

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


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

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

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


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


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

ゲスト
投稿日時: 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
居住地:
投稿: 3217
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
居住地:
投稿: 3217
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
居住地:
投稿: 2085
Re: 売上集計プラグインに表示される商品をログインしているメンバーの商品のみにしたい
QueryBuilderでJoinを行なってもあまり本質的な解決にはならないんですね。(1段階目のふるい分けにはなりますが)
その商品を"含んだ"受注を取得するだけで、他の管理者が登録した商品のデータもくっついてきてしまうので。

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


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

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


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,290名です
総投稿数は109,689件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1568
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

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

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.