<?php
namespace Plugin\HsdDiscountRate42;
use Eccube\Event\TemplateEvent;
use Eccube\Event\EventArgs;
use Plugin\HsdDiscountRate42\Repository\HsdDiscountRate42ConfigRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class Event implements EventSubscriberInterface
{
/**
* @var HsdDiscountRate42ConfigRepository
*/
protected $configRepository;
/**
* ConfigController constructor.
*
* @param HsdDiscountRate42ConfigRepository $configRepository
*/
public function __construct(HsdDiscountRate42ConfigRepository $configRepository)
{
$this->configRepository = $configRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'Product/detail.twig' => 'showDiscountRate',
'Product/list.twig' => 'showDiscountRateList',
];
}
public function showDiscountRateList(TemplateEvent $event){
$twig = '@HsdDiscountRate42/default/Product/discount_rate42_show_list.twig';
$event->addSnippet($twig);
$config = $this->configRepository->get();
$parameters = $event->getParameters();
$product_class = null;
$discount_data = array();
$pr_num = 0;
foreach($parameters['pagination'] as $product){
$discount_rate_1 = 110; // 最小の割引
$discount_rate_2 = 0; // 最大の割引
$has_product_class = 0;
$product_id = $product->getId();
$tmp_ritu = array();
if( $product->hasProductClass() ){
/*
* 規格あり
*/
$has_product_class = 1;
$product_classes = $product->getProductClasses();
foreach($product_classes as $pc){
/*
if( !empty($pc->getPrice01()) && !empty($pc->getPrice02()) ){
$tmp = floatval($pc->getPrice02()) / floatval($pc->getPrice01());
$tmp_b = ( 1.0 - $tmp ) * 100.0;
if( $tmp_b < $discount_rate_1 ){
$discount_rate_1 = $tmp_b;
}
if( $tmp_b > $discount_rate_2 ){
$discount_rate_2 = $tmp_b;
}
}
*/
/*
* 規格の組み合わせから割引率を計算するように変更
*/
$product_class_id = $pc->getId();
$tmp_b = 0.0;
if( !empty($pc->getPrice01()) && !empty($pc->getPrice02()) ){
$tmp = floatval($pc->getPrice02()) / floatval($pc->getPrice01());
$tmp_b = ( 1.0 - $tmp ) * 100.0;
}
$tmp_ritu[] = $product_class_id . ':' . round($tmp_b);
}
}else{
/*
* 規格なし
*/
if( !empty($product->getPrice01Min()) && !empty($product->getPrice02Min()) ){
$tmp = floatval($product->getPrice02Min()) / floatval($product->getPrice01Min());
$discount_rate_1 = ( 1.0 - $tmp ) * 100.0;
}else{
$discount_rate_1 = 0; // 最小の割引に0(%)を設定
}
}
$discount_data[$pr_num]['discount_rate_1'] = round($discount_rate_1);
$discount_data[$pr_num]['discount_rate_2'] = round($discount_rate_2);
$discount_data[$pr_num]['has_product_class'] = $has_product_class;
$discount_data[$pr_num]['product_id'] = $product_id;
$discount_data[$pr_num]['product_class_id_ritu'] = implode(',', $tmp_ritu); // product_class ごとの割引率
$pr_num++;
}
$parameters['discount_rate'] = $discount_data;
if($config != null){
// 割引の前に表示するテキスト
if( method_exists($config, 'getBefTxt') ){
$parameters['bef_txt'] = $config->getBefTxt();
}else{
$parameters['bef_txt'] = '';
}
// 割引の後に表示するテキスト
if( method_exists($config, 'getAftTxt') ){
$parameters['aft_txt'] = $config->getAftTxt();
}else{
$parameters['aft_txt'] = 'OFF';
}
// 割引のフォントの大きさ(%)
if( method_exists($config, 'getShowSizeList') ){
$parameters['font_rate'] = $config->getShowSizeList();
}else{
$parameters['font_rate'] = '50';
}
// フォント色
if( method_exists($config, 'getShowColor') ){
$parameters['font_color'] = $config->getShowColor();
}else{
$parameters['font_color'] = '#ffffff'; // 白
}
// 背景色
if( method_exists($config, 'getBackColor') ){
$parameters['back_color'] = $config->getBackColor();
}else{
$parameters['back_color'] = '#ff0000'; // 赤
}
// 割引表示をする/しない
if( method_exists($config, 'getIsShow') ){
$parameters['is_show'] = $config->getIsShow();
}else{
$parameters['is_show'] = 1; // 割引表示をする
}
// 商品一覧に表示をする/しない
if( method_exists($config, 'getIsListpage') ){
$parameters['is_listpage'] = $config->getIsListpage();
}else{
$parameters['is_listpage'] = 1; // 一覧に表示する
}
}else{
$parameters['bef_txt'] = '';
$parameters['aft_txt'] = 'OFF';
$parameters['font_rate'] = '50';
$parameters['font_color'] = '#ffffff'; // 白
$parameters['back_color'] = '#ff0000'; // 赤
$parameters['is_show'] = 1; // 割引表示をする
$parameters['is_listpage'] = 1; // 一覧に表示する
}
// 割引の後に表示するテキスト
$event->setParameters($parameters);
}
public function showDiscountRate(TemplateEvent $event){
$twig = '@HsdDiscountRate42/default/Product/discount_rate42_show.twig';
$event->addSnippet($twig);
$config = $this->configRepository->get();
$parameters = $event->getParameters();
$product = $parameters['Product'];
$product_class = null;
$discount_rate_1 = 110; // 最小の値引
$discount_rate_2 = 0; // 最大の値引
$has_product_class = 0;
$product_id = $product->getId();
$tmp_ritu = array();
if( $product->hasProductClass() ){
/*
* 規格あり
*/
$has_product_class = 1;
$product_classes = $product->getProductClasses();
foreach($product_classes as $pc){
/*
if( !empty($pc->getPrice01()) && !empty($pc->getPrice02()) ){
$tmp = floatval($pc->getPrice02()) / floatval($pc->getPrice01());
$tmp_b = ( 1.0 - $tmp ) * 100.0;
if( $tmp_b < $discount_rate_1 ){
$discount_rate_1 = $tmp_b;
}
if( $tmp_b > $discount_rate_2 ){
$discount_rate_2 = $tmp_b;
}
}
*/
/*
* 規格の組み合わせから割引率を計算するように変更
*/
$product_class_id = $pc->getId();
$tmp_b = 0.0;
if( !empty($pc->getPrice01()) && !empty($pc->getPrice02()) ){
$tmp = floatval($pc->getPrice02()) / floatval($pc->getPrice01());
$tmp_b = ( 1.0 - $tmp ) * 100.0;
}
$tmp_ritu[] = $product_class_id . ':' . round($tmp_b);
}
}else{
/*
* 規格なし
*/
if( !empty($product->getPrice01Min()) && !empty($product->getPrice02Min()) ){
$tmp = floatval($product->getPrice02Min()) / floatval($product->getPrice01Min());
$discount_rate_1 = ( 1.0 - $tmp ) * 100.0;
}else{
$discount_rate_1 = 0; // 最小の割引に0(%)を設定
}
}
$parameters['discount_rate_1'] = round($discount_rate_1);
$parameters['discount_rate_2'] = round($discount_rate_2);
$parameters['has_product_class'] = $has_product_class;
$parameters['product_id'] = $product_id;
$parameters['product_class_id_ritu'] = implode(',', $tmp_ritu); // product_class ごとの割引率
/*
* パラメータのデフォルト設定
*/
if($config != null){
// 表示位置
if( method_exists($config, 'getShowAddr') ){
$parameters['show_addr'] = $config->getShowAddr();
}else{
$parameters['show_addr'] = 3; // 販売価格の右
}
// 割引の前に表示するテキスト
if( method_exists($config, 'getBefTxt') ){
$parameters['bef_txt'] = $config->getBefTxt();
}else{
$parameters['bef_txt'] = '';
}
// 割引の後に表示するテキスト
if( method_exists($config, 'getAftTxt') ){
$parameters['aft_txt'] = $config->getAftTxt();
}else{
$parameters['aft_txt'] = 'OFF';
}
// 割引のフォントの大きさ(%)
if( method_exists($config, 'getShowSize') ){
$parameters['font_rate'] = $config->getShowSize();
}else{
$parameters['font_rate'] = '100';
}
// フォント色
if( method_exists($config, 'getShowColor') ){
$parameters['font_color'] = $config->getShowColor();
}else{
$parameters['font_color'] = '#ffffff'; // 白
}
// 背景色
if( method_exists($config, 'getBackColor') ){
$parameters['back_color'] = $config->getBackColor();
}else{
$parameters['back_color'] = '#ff0000'; // 赤
}
// 割引表示をする/しない
if( method_exists($config, 'getIsShow') ){
$parameters['is_show'] = $config->getIsShow();
}else{
$parameters['is_show'] = 1; // 割引表示をする
}
}else{
$parameters['show_addr'] = 3; // 販売価格の右
$parameters['bef_txt'] = '';
$parameters['aft_txt'] = 'OFF';
$parameters['font_rate'] = '100';
$parameters['font_color'] = '#ffffff'; // 白
$parameters['back_color'] = '#ff0000'; // 赤
$parameters['is_show'] = 1; // 割引表示をする
}
$event->setParameters($parameters);
}
}