1 <?php
2
3 4 5 6 7 8 9 10
11 class SimpleOrderPage extends Page {
12
13
14 static $can_be_root = true;
15 static $allowed_children = "none";
16
17 static $db = array(
18 'OrderEmail' => 'Varchar(255)',
19 'DeliveryPrice' => 'Text',
20 );
21
22 static $has_many = array(
23 'Orders' => 'SimpleOrderData',
24 'PaymentTypes' => 'PaymentType',
25 );
26
27 static $defaults = array(
28 'DevEditType' => 'Fixed',
29 );
30
31 32 33
34 static $use_spam_protection = true;
35
36 static function use_spam_protection($value = true) {
37 SimpleOrderPage::$use_spam_protection = $value;
38 }
39
40 41 42 43 44
45 function ActivePaymentTypes() {
46 return $this->PaymentTypes('Active=1');
47 }
48
49 function getCMSFields() {
50 SiteTree::disableCMSFieldsExtensions();
51 $fields = parent::getCMSFields();
52 SiteTree::enableCMSFieldsExtensions();
53
54
55 $fields->addFieldToTab('Root.Content.Main', new TextField('OrderEmail', $this->fieldLabel('OrderEmail')), 'Content');
56 $fields->addFieldToTab('Root.Content.Main', new TextField('DeliveryPrice', $this->fieldLabel('DeliveryPrice')), 'Content');
57
58 $fields->addFieldToTab('Root.Content', new Tab('Orders', _t('SimpleOrderPage.tab_Orders', 'Orders')), 'Metadata');
59 $fields->addFieldToTab(
60 'Root.Content.Orders',
61 $orders = new HasManyComplexTableField($this, 'Orders', 'SimpleOrderData')
62 );
63 $orders->setPermissions(array('delete', 'edit'));
64 $orders->setRelationAutoSetting(true);
65 $orders->Markable = false;
66
67 $fields->addFieldToTab('Root.Content', new Tab('Payments', _t('SimpleOrderPage.tab_PaymentTypes', 'Payment Types')), 'Metadata');
68 $fields->addFieldToTab(
69 'Root.Content.Payments',
70 $payTypes = new HasManyComplexTableField($this, 'PaymentTypes', 'PaymentType')
71 );
72 $payTypes->setPermissions(array('add', 'delete', 'edit'));
73 $payTypes->relationAutoSetting = true;
74 $payTypes->Markable = false;
75
76 $this->extend('updateCMSFields', $fields);
77
78 return $fields;
79 }
80
81 function canCreate() {
82
83 return (DataObject::get_one('SimpleOrderPage')) ? false : parent::canCreate();
84 }
85
86 function canDelete() {
87 return (Director::isDev()) ? parent::canDelete() : false;
88 }
89
90 function requireDefaultRecords() {
91 if ($this->class != 'SimpleOrderPage') return;
92 if (class_exists('CheckoutPage')) return;
93
94
95 if(!$page = DataObject::get_one('SimpleOrderPage')) {
96 $page = new SimpleOrderPage();
97 $page->Title = _t('SimpleOrderPage.DefaultTitle', 'Order');
98 $page->URLSegment = 'order';
99 $page->Status = 'Published';
100 $page->write();
101 $page->publish('Stage', 'Live');
102 $page->flushCache();
103 DB::alteration_message('SimpleOrderPage created', 'created');
104 }
105 }
106
107 function onBeforeDelete() {
108 parent::onBeforeDelete();
109 foreach ($this->Orders() as $order)
110 $order->delete();
111
112 foreach ($this->PaymentTypes() as $type)
113 $type->delete();
114 }
115 }
116
117 class SimpleOrderPage_Controller extends Page_Controller {
118
119 protected $item = false;
120 protected $itemCount = 1;
121
122 123 124 125 126 127
128 static function get_instance() {
129 $page = DataObject::get_one('SimpleOrderPage');
130 if (!$page) user_error(_t('SimpleOrderPage.OrderPageNeed', 'Need to create order page first'), E_USER_ERROR);
131 return new SimpleOrderPage_Controller($page);
132 }
133
134 function init() {
135 parent::init();
136 $data = $this->getRequest();
137
138 if (isset($data['Num']) && is_numeric($data['Num']) && $data['Num'] > 0) {
139 $this->itemCount = (int) $data['Num'];
140 }
141
142 $id = 0;
143 if (isset($data['itemId']) && is_numeric($data['itemId'])) {
144 $id = $data['itemId'];
145 }
146 elseif (isset($data['ProductID']) && is_numeric($data['ProductID'])) {
147 $id = $data['ProductID'];
148 }
149 if ($id) {
150 $this->item = DataObject::get_by_id(singleton('Product')->ClassName, $id);
151 }
152 else {
153 Director::redirect('');
154 }
155 }
156
157 function index() {
158 return $this->checkout();
159 }
160
161 162 163 164 165
166 function checkout() {
167 if ($this->item) {
168 return $this->render(array(
169 'Product' => $this->item,
170 'ProductCount' => $this->itemCount,
171 'TotalSum' => $this->item->Price(1) * $this->itemCount,
172 'Form' => $this->SimpleOrderForm(),
173 ));
174 }
175 Director::redirect('');
176 }
177
178 179 180 181 182 183 184 185
186 public function complite($data, $form) {
187 if ($this->item) {
188 $order = new SimpleOrderData();
189
190 $form->saveInto($order);
191
192 $order->ProductID = $this->item->ID;
193 $order->ParentID = $this->ID;
194 $order->Num = $this->itemCount;
195 $order->TotalSum = $order->Product()->Price(1) * $order->Num;
196 $order->write();
197
198
199 $siteName = $this->SiteConfig()->Title;
200 if (!$siteName)
201 $siteName = Director::absoluteBaseURL();
202
203
204 $mail = new Email($this->SiteConfig()->SenderEmail(), $this->OrderEmail, sprintf(_t('SimpleOrderPage.SellerSubject', 'New order from %s'), $siteName));
205 $mail->setTemplate('SimpleOrderSeller');
206 $mail->populateTemplate($order);
207 $mail->send();
208 unset($mail);
209
210
211 $mail = new Email($this->SiteConfig()->SenderEmail(), $order->Email, sprintf(_t('SimpleOrderPage.CustomerSubject', 'Order from %s'), $siteName));
212 $mail->setTemplate('SimpleOrderCustomer');
213 $mail->populateTemplate($order);
214 $mail->send();
215 unset($mail);
216
217
218 return $this->renderWith(array('SimpleOrderComplite', 'Page'), array('Order' => $order));
219 }
220 }
221
222 223 224 225 226 227 228 229
230 public function SimpleOrderForm() {
231 if (!$this->item) return 'xxx';
232
233 $payments = $this->data()->ActivePaymentTypes();
234 if (!$payments) {
235 user_error(_t('SimpleOrderPage.PaymentTypeNeed', 'Create one payment type first'), E_USER_ERROR);
236 }
237 $order = singleton('SimpleOrderData');
238
239 $form = new Form(
240 $this,
241 'SimpleOrderForm',
242 $order->getOrderFields($payments->toDropDownMap(), $this->item, $this->itemCount),
243 new FieldSet(
244 new FormAction('complite', _t('SimpleOrderForm.OrderButton', 'Checkout'))
245 ),
246 new CustomRequiredFields($order->getOrderRequiredFields())
247 );
248 $form->setTemplate('SimpleOrderForm');
249
250 $this->extend('updateSimpleOrderForm', $form);
251
252
253 if (class_exists('SpamProtectorManager') && SimpleOrderPage::$use_spam_protection)
254 SpamProtectorManager::update_form($form);
255
256 return $form;
257 }
258 }
259
[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the
Silverstripe Forums to ask development related questions.
-