1 <?php
2
3 4 5 6 7 8
9 class CheckoutPage extends Page {
10
11 static $icon = "cart/img/cart";
12 static $allowed_children = 'none';
13
14 static $db = array(
15 'PurchaseComplete' => 'HTMLText',
16 'ChequeMessage' => 'HTMLText'
17 );
18
19 static $has_one = array(
20 'TermsPage' => 'Page'
21 );
22
23 static $defaults = array(
24 'AutoChild' => 0,
25 "DevEditType" => "Fixed",
26 'ShowInSiteMap' => 0,
27 'ShowInSearch' => 0,
28 'ShowInMenu' => 0,
29 'URLSegment' => 'checkout',
30 );
31
32 static $use_steps = false;
33
34 35 36 37 38 39
40 static function find_link($action = '') {
41 if (!$page = DataObject::get_one('CheckoutPage')) {
42 user_error('Создайте страницу заказа', E_USER_ERROR);
43 }
44
45 return $page->Link($action);
46 }
47
48 49 50 51
52 function requireDefaultRecords() {
53 parent::requireDefaultRecords();
54
55 if (!$page = DataObject::get_one('CheckoutPage')) {
56 $page = new CheckoutPage();
57 $page->writeToStage('Stage');
58 $page->publish('Stage', 'Live');
59
60 if (method_exists('DB', 'alteration_message'))
61 DB::alteration_message('Checkout page created', 'created');
62 }
63
64 if ($page->TermsPageID == 0 && $termsPage = DataObject::get_one('Page', "\"URLSegment\" = 'terms'")) {
65 $page->TermsPageID = $termsPage->ID;
66 $page->writeToStage('Stage');
67 $page->publish('Stage', 'Live');
68
69 if (method_exists('DB', 'alteration_message'))
70 DB::alteration_message("Page '{$termsPage->Title}' linked to the Checkout page '{$page->Title}'", 'changed');
71 }
72 }
73
74 function canCreate() {
75 return (DataObject::get_one('CheckoutPage')) ? false : true;
76 }
77
78 function populateDefaults() {
79 parent::populateDefaults();
80
81 $this->Title = $this->i18n_singular_name();
82 $this->PurchaseComplete = _t('CheckoutPage.default_PurchaseComplete', 'Thank You for purchase');
83 $this->ChequeMessage = _t('CheckoutPage.default_ChequeMessage', 'Payment accepted via Cheque. Please note : products will not be shipped until payment has been received');
84 $this->URLSegment = 'checkout';
85 }
86
87 function getCMSFields() {
88 SiteTree::disableCMSFieldsExtensions();
89 $fields = parent::getCMSFields();
90 SiteTree::enableCMSFieldsExtensions();
91
92 $fields->addFieldToTab('Root.Content.Main', new TreeDropdownField('TermsPageID', $this->fieldLabel('TermsPage'), 'SiteTree'));
93
94 $fields->addFieldToTab('Root.Content', new Tab("Messages", _t('CheckoutPage.tab_Messages', 'Message Config')), 'Metadata');
95 $fields->addFieldsToTab('Root.Content.Messages', array(
96 new HtmlEditorField('PurchaseComplete', $this->fieldLabel('PurchaseComplete'), 20),
97 new HtmlEditorField('ChequeMessage', $this->fieldLabel('ChequeMessage'), 20)
98 ));
99
100 $this->extend('updateCMSFields', $fields);
101
102 return $fields;
103 }
104
105 106 107 108 109 110 111
112 function CanCheckout($price=null) {
113 return Cart::current_order()->CanCheckout($price);
114 }
115
116 117 118 119 120 121 122
123 function MinTotalPrice($real=false) {
124 return Cart::current_order()->MinTotalPrice($real);
125 }
126
127 128 129 130 131
132 function HasItems() {
133 return Cart::has_items();
134 }
135
136 137 138 139 140
141 function Cart() {
142 return Cart::current_order();
143 }
144 }
145
146 class CheckoutPage_Controller extends Page_Controller {
147
148 static $allowed_actions = array('order', 'printorder', 'OrderForm');
149
150 151 152 153
154 private $orderError = '';
155
156 function isEmptyContent() {
157 return false;
158 }
159
160 161 162 163 164
165 function Form() {
166 if (!$form = $this->OrderForm()) return false;
167
168 if($member = Member::currentUser()){
169 $form->loadDataFrom($member);
170 }
171 $form->loadDataFrom(Cart::get_info());
172
173 return $form;
174 }
175
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
191 function OrderForm() {
192 if (CheckoutPage::$use_steps) return false;
193 $siteConfig = SiteConfig::current_site_config();
194 if ($siteConfig->CartRegisterRequire && !Member::currentUser()) {
195 return $this->redirect('/Security/login?BackURL=' . $this->Link());
196 }
197
198 $fields = singleton('Order')->getFrontendFields();
199 if ($this->TermsPageID && $terms = $this->TermsPage()) {
200 $fields->push(new CheckboxField('Agree', sprintf(_t('OrderForm.Agree', 'I agree with <a href="%s">terms and conditions</a>'), $terms->Link())));
201 }
202
203 $required = $this->getOrderRequired();
204 if ($siteConfig->hasMethod('SiteAgreementField') && ($rulesField = $siteConfig->SiteAgreementField())) {
205 $required[] = $rulesField->Name();
206 }
207 $form = new Form(
208 $this,
209 'OrderForm',
210 $fields,
211 new FieldSet(new FormAction("saveorder", _t('OrderForm.SaveOrderButton', "Confirm and Pay"))),
212 new CustomRequiredFields($required)
213 );
214 $form->addExtraClass('OrderForm');
215
216 $this->extend('updateOrderForm', $form);
217 return $form;
218 }
219
220 221 222 223 224 225 226 227 228 229 230 231 232
233 function saveorder($data, $form) {
234 foreach ($form->fields()->saveableFields() as $field) {
235 if ($field->name == 'SecurityID') continue;
236 if ($field->name == 'Agree') continue;
237 $val = 0;
238 if (isset($data[$field->name])) {
239 $val = $data[$field->name];
240 }
241 Cart::set_info($field->name, $val);
242 }
243
244 if (!$order = $this->placeOrder()) {
245 $form->sessionMessage($this->getOrderError(), 'bad');
246 Director::redirectBack();
247 return false;
248 }
249
250
251 if (class_exists('PaymentMethod') && Order::$use_payments) {
252 $paymentResult = false;
253 if ($paymentMethodID = Cart::get_info('PaymentMethod')) {
254 $method = DataObject::get_by_id('PaymentMethod', $paymentMethodID);
255 if ($method) {
256 $paymentResult = $method->makePayment($order);
257 } else {
258 user_error("Ошибочный тип платежа!", E_USER_ERROR);
259 }
260 }
261
262
263 if (!Director::redirected_to()) {
264 $value = false;
265 if ($paymentResult)
266 $value = $paymentResult->getValue();
267
268 $newOrder = DataObject::get_by_id('Order', $order->ID);
269 $html = $this->renderWith(
270 array('CheckoutPage_done', 'CheckoutPage', 'Page'),
271 array('Form' => false, 'Order' => $newOrder, 'PaymentResult' => $value)
272 );
273 }
274 } else {
275 if (!Director::redirected_to()) {
276 $html = $this->renderWith(
277 array('CheckoutPage_done', 'CheckoutPage', 'Page'),
278 array('Form' => false, 'Order' => $order)
279 );
280 }
281 }
282
283
284 $order->extend('OnAfterCreateOrder', Member::CurrentUser());
285 return $html;
286 }
287
288 289 290 291 292 293 294 295 296 297 298
299 function placeOrder($order = null) {
300 if (!$order) $order = Cart::current_order();
301
302 $this->extend('OnBeforeOrder', $order);
303
304 $result = $order->validate();
305 if (!$result->valid()) {
306 $this->orderError = $result->message();
307 return false;
308 }
309
310 $order->write();
311 $order->createItems(Cart::get_items(), true);
312 $this->extend('OnAfterOrder', $order);
313
314 Cart::set_info('ClientNotes', '');
315 Cart::clear();
316
317 return $order;
318 }
319
320 321 322 323 324
325 function getOrderError() {
326 return $this->orderError;
327 }
328
329
330
331 332 333 334 335 336 337
338 function order() {
339 if (!$order = Order::get_by_hash($this->getRequest()->param('ID'))) $this->httpError(404, 'Page not found');
340
341 return $this->render(array(
342 'Form' => false,
343 'Order' => $order,
344 ));
345 }
346
347 348 349 350
351 function printorder() {
352 return $this->order();
353 }
354
355
356
357 358 359 360 361 362 363 364
365 function getContactDetailsFields() {
366 $fields = singleton('Order')->getContactFields();
367 $this->extend('updateContactDetailsFields', $fields);
368 return $fields;
369 }
370
371 372 373 374 375 376 377 378
379 function getSummaryFields() {
380 $fields = singleton('Order')->getSummaryFields();
381
382 if ($this->TermsPageID && $terms = $this->TermsPage()) {
383 $fields->push(new CheckboxField('Agree', sprintf(_t('OrderForm.Agree', 'I agree with <a href="%s">terms and conditions</a>'), $terms->Link())));
384 }
385
386 $this->extend('updateSummaryFields', $fields);
387 return $fields;
388 }
389
390 391 392 393 394 395 396 397
398 function getOrderRequired() {
399 $required = singleton('Order')->getRequredFields();
400
401 if ($this->TermsPageID && $terms = $this->TermsPage()) {
402 $required[] = 'Agree';
403 }
404
405 $this->extend('updateOrderRequired', $required);
406 return $required;
407 }
408
409 }
410
[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.
-