2015-01-20 9 views
0

예를 들어 Creating Discount Code System (MySQL/php)과 같이 Google에서 일부 샘플/솔루션을 찾았지만 좋은 해결책을 찾지 못했습니다.CakePHP 바우처/할인 코드 시스템

내 상황에 따라 사용자가 가상 ​​화폐로 균형을 유지하고 가상 항목을 구매할 수있는 플랫폼이 있습니다. 이제는 바우처 및 할인을 구현하고자합니다. 다른 종류의 코드가 있습니다. 예를 들어, 구매 항목을 50 % 할인하고, 추가 항목의 양 (최소 항목 금액의 유무에 관계없이), 일부 통화를 얻는 코드 또는 리퍼러에게 뭔가를 제공하는 참조 코드 .

저는 Campaign 및 CampaignType으로 구현했습니다. 캠페인 정보를 처음 보유하고 있고 두 번째로 작업 정보를 보유하고 있습니다. 여기

는 구조입니다 :

현재
-- Table structure for table `cake_campaigns` 

CREATE TABLE IF NOT EXISTS `cake_campaigns` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) CHARACTER SET utf8 NOT NULL, 
    `code` varchar(100) COLLATE utf8_bin NOT NULL, 
    `type_id` varchar(50) CHARACTER SET utf16 COLLATE utf16_bin NOT NULL DEFAULT '1', 
    `value` int(10) unsigned NOT NULL DEFAULT '5' COMMENT 'Percentage or amount', 
    `min_amount` bigint(20) unsigned NOT NULL DEFAULT '0', 
    `owner_id` bigint(20) unsigned NOT NULL, 
    `created` datetime NOT NULL, 
    `active` tinyint(1) unsigned NOT NULL DEFAULT '1', 
    `single_use` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `code` (`code`), 
    KEY `owner_id` (`owner_id`), 
    FULLTEXT KEY `name` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=4 ; 

-- Table structure for table `cake_campaign_types` 

CREATE TABLE IF NOT EXISTS `cake_campaign_types` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) CHARACTER SET utf8 NOT NULL, 
    `unit` varchar(10) CHARACTER SET utf16 NOT NULL DEFAULT '%', 
    `multiplier` double(10,8) NOT NULL DEFAULT '0.01000000', 
    `type` varchar(50) COLLATE utf8_bin DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=7 ; 

내 논리 캠페인을 사용하는 경우, 다음 조치가 구매 로직, 예를 들어, campaignType은 이름에 따라 때문이다 : 이제

if (isset($this->request->data['Purchase']['code'])) { 
    $code = $this->request->data['Purchase']['code']; 
    $campaign = $this->Campaign->findByCode($code); 
    $this->Campaign->id = $campaign['Campaign']['id']; 

    // campaign no longer active 
    if ($this->Campaign->field('active') == 0) $code = false; 

    if ($this->CampaignLog->find('first', array('conditions' => array(
      'user_id' => $this->User->field('id'), 
      'campaign_id' => $this->Campaign->field('id'), 
      'activated' => 1, 
     )))) $code = false; // code has already been used 

    unset($this->request->data['Purchase']['code']); 
} else $code = false; 

// Some purchasing logic here 

if ($code) { 
    $this->CampaignLog->create(); 
    $this->CampaignLog->save(array(
      'campaign_id' => $this->Campaign->field('id'), 
      'user_id' => $this->User->field('id'), 
      'activated' => 1, 
      'source' => $this->Session->read('referrer'), 
      'earnings' => $earned, 
      'created' => strftime('%Y-%m-%d %H:%M:%S'), 
     )); 

    if ($this->Campaign->field('single_use') == 1) { 
     $this->Campaign->saveField("active", 0); 
    } 

    // Apply code here 
} 

내 질문은 : if-then-else 또는 switch-case를 사용하여 가능한 모든 코드 유형을 살펴볼 때 약간 기분이 좋을 수 있기 때문에 이러한 코드를 적용하는 최선의 방법은 무엇일까요? 하지만 지금은 다른 것 (예 : 할인율 또는 정량)이 너무 많아서 유일한 옵션 인 것 같습니다. 아마도 코드의 구조/논리가 달라야할까요?

답변

0

내 관점에서 볼 때 구매와 통합하면 더 많은 문제를 파악하는 것이 가장 좋습니다. 가격이 $this->request->data['price']이라고 가정하면 type_id1의 할인으로 표시됩니다.

우리가 할 일은 우리가 그들의 논리를 분리하는 switch 경우에 그것을 구현하는 경우 그

$discount = floatval('0.' . $this->Campaign->value); 
$finalPrice = $this->request->data['price'] * $discount; 

처럼 더 나은 것, 그래서 value를 얻을 수 및 비율 방정식을하는 것입니다. 그것은 당신이 그것을 어떻게 구현 하느냐에 달려 있지만 개념의 요지입니다.

0

cart plugin을 확인하십시오. 모든 것이 using events이고 아무 것도 하드 코드되지 않습니다.이 방법을 사용하면 매우 유연합니다.

카트를 다시 계산해야 할 때마다 실행되는 one method이 있습니다. 그 안에는 세금 계산을위한 다른 방법이 있습니다. and discounts.

이벤트를 통해 구현하면 나중에 추가 할인이나 세금 계산을 통해 확장하기가 매우 쉽다는 이점이 있습니다.

플러그인의 전체 코드를 자유롭게 검토하면 간단한 구현이 아니며 장바구니 데이터의 쿠키, 세션 및 데이터베이스 저장소를 다루고 많은 이벤트가 있습니다.