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