MultipleSteps.php 2.6 KB
<?php
/**
 * +-----------------------------------------------------------------------------------------------------------------------
 * 重写 laravel-admin Widgets\MultipleSteps 类
 * +-----------------------------------------------------------------------------------------------------------------------
 *
 * PHP version 7
 *
 * @category  App\Admin\Rewrite\Widgets
 * @package   App\Admin\Rewrite\Widgets
 * @author    Richer <yangzi1028@163.com>
 * @date      2020年11月12日13:49:31
 * @copyright 2020-2022 Richer (http://www.Richer.com/)
 * @license   http://www.Richer.com/ License
 * @link      http://www.Richer.com/
 */
namespace App\Admin\Rewrite\Widgets;

use Illuminate\Contracts\Support\Renderable;

/**
 * Class MultipleSteps
 *
 * @category  App\Admin\Rewrite\Widgets
 * @package   App\Admin\Rewrite\Widgets
 * @author    Richer <yangzi1028@163.com>
 * @date      2020年11月12日13:49:31
 * @copyright 2020-2022 Richer (http://www.Richer.com/)
 * @license   http://www.Richer.com/ License
 * @link      http://www.Richer.com/
 */
class MultipleSteps implements Renderable
{
    /**
     * @var int|string
     */
    protected $current;

    /**
     * @var array
     */
    protected $steps = [];

    /**
     * @var string
     */
    protected $stepName = 'step';

    /**
     * MultipleSteps constructor.
     *
     * @param array $steps
     * @param null  $current
     */
    public function __construct($steps = [], $current = null)
    {
        $this->steps = $steps;

        $this->current = $this->resolveCurrentStep($steps, $current);
    }

    /**
     * @param array $steps
     * @param null  $current
     *
     * @return static
     */
    public static function make($steps, $current = null): self
    {
        return new static($steps, $current);
    }

    /**
     * @param array      $steps
     * @param string|int $current
     *
     * @return string|int
     */
    protected function resolveCurrentStep($steps, $current)
    {
        $current = $current ?: request($this->stepName, 0);

        if (!isset($steps[$current])) {
            $current = key($steps);
        }

        return $current;
    }

    /**
     * @return string|null
     */
    public function render()
    {
        $class = $this->steps[$this->current];

        if (!is_subclass_of($class, StepForm::class)) {
            admin_error("Class [{$class}] must be a sub-class of [Encore\Admin\Widgets\StepForm].");

            return;
        }

        /** @var StepForm $step */
        $step = new $class();

        return $step
            ->setSteps(array_keys($this->steps))
            ->setCurrent($this->current)
            ->render();
    }
}