Version: current

      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 }

[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. -