1 <?php
2 /**
3 * Базовый класс для шагов формы заказа
4 *
5 * За основу взят аналогичный класс от sshop
6 *
7 * Как правило каждый шаг определяет 3 (или более методов)
8 * 1. метод отображения шага
9 * 2. метод генерации формы шага
10 * 3. метод - обрабочик формы (или несколько)
11 *
12 * Все шаги находятся в одном пространстве имен, поэтому имена методов в них должны быть уникальны
13 * Для шагов можно использовать шаблоны: CheckoutPage_имяшага, CheckoutPage, Page
14 *
15 * @package cart
16 * @subpackage steppedcheckout
17 * @author dvp
18 */
19 class CheckoutStep extends Extension{
20
21 /**
22 * якорь который можно использовать в шаблонах для позиционирования
23 * @static
24 */
25 static $continue_anchor = "cont";
26
27 /**
28 * Имя следующего шага
29 *
30 * @return string|NULL
31 */
32 private function nextStep(){
33 $steps = SteppedCheckout::$steps;
34 $found = false;
35 foreach ($steps as $step => $class) {
36 if (method_exists($this, $step)) { //determine if current step
37 $found = true;
38 }elseif ($found) {
39 return $step;
40 }
41 }
42 return null;
43 }
44
45 /**
46 * Ссылка на следующий шаг
47 *
48 * @param string $nextStep - имя шага, если опущено - определяется автоматически
49 *
50 * @return string|NULL
51 */
52 function NextStepLink($nextStep = null){
53 if (!$nextStep) {
54 $nextStep = $this->nextStep();
55 }
56 return ($nextStep) ? $this->owner->Link($nextStep)."#".self::$continue_anchor : null;
57 }
58
59 /**
60 * Имя предыдущего шага
61 *
62 * @return string|NULL
63 */
64 private function prevStep(){
65 $steps = $this->owner->StepsList();
66 $prev = null;
67 foreach ($steps as $step) {
68 if (method_exists($this, $step->Action)) { //determine if current step
69 return $prev;
70 }
71 if ($step->Active) {
72 $prev = $step->Action;
73 }
74 }
75 return null;
76 }
77
78 /**
79 * Ссылка на предыдущий шаг
80 *
81 * @param string $prevStep - имя шага, если опущено - определяется автоматически
82 *
83 * @return string|NULL
84 */
85 function PrevStepLink($prevStep = null){
86 if (!$prevStep) {
87 $prevStep = $this->prevStep();
88 }
89 return ($prevStep) ? $this->owner->Link($prevStep)."#".self::$continue_anchor : null;
90 }
91
92 /**
93 * Возвращает список кнопок для пошаговых форм
94 *
95 * @param FormAction $nextAction - кнопка для перехода дальше !!! а если кнопок несколько???? - перейти на FieldSet ???
96 *
97 * @return FieldSet
98 */
99 function getStepActions($nextAction = null) {
100 $actions = new FieldSet();
101 if ($link = $this->PrevStepLink()) {
102 $actions->push(new LiteralField('prevstep', sprintf('<a class="action goPrevStep button button__second button__backCheckout" href="%s">%s</a>', $link, _t('OrderForm.PrevStepButton', "Back"))));
103 }
104 if ($nextAction) {
105 $actions->push($nextAction);
106 }
107 return $actions;
108 }
109
110 /**
111 * Служебное имя шага
112 *
113 * @return string
114 */
115 function stepName() {
116 return strtolower(substr($this->class, strlen('CheckoutStep_')));
117 }
118
119 /**
120 * Локализованное название шага
121 *
122 * @return string
123 */
124 function stepTitle() {
125 $step = $this->stepName();
126 return _t('CheckoutPage.step_'.$step, 'Step '.$step);
127 }
128
129 /**
130 * Сообщение шага
131 *
132 * @return string
133 */
134 function stepMessage() {
135 return $this->owner->getStepMessage($this->stepName());
136 }
137
138 /**
139 * Является ли шаг активным
140 * Шаг может пропускать, например, если доступен только 1 способ оплаты или доставки - он выбирется автоматически
141 *
142 * @return bool
143 */
144 function StepIsActive() {
145 return true;
146 }
147 }