valleydelexy/laravel-wizard

Laravel 应用程序的网页设置向导。

4.x-dev 2024-09-07 07:16 UTC

This package is auto-updated.

Last update: 2024-09-07 07:22:16 UTC


README

Latest Version on Packagist Software License GitHub Tests Action Status Style CI Build Status Total Downloads

Laravel 应用程序的网页设置向导。

此包是从 smajti1/laravel-wizard 调整而来的。

Laravel wizard main image.

目录

版本兼容性

安装

通过 composer 安装包

composer reqre vallerydelexy/laravel-wizard

发布配置

php artisan vendor:publish --tag=wizard-config

使用方法

1. 生成控制器和向导步骤

现在您可以快速生成向导控制器和向导步骤

php artisan make:wizard User NameStep,EmailStep

此命令生成 UserWizardControllerNameStepEmailStep 类,并将向导路由追加到 routes/web.php

routes/web.php

use App\Http\Controllers\UserWizardController;
use Illuminate\Support\Facades\Route;
use vallerydelexy\LaravelWizard\Facades\Wizard;

...

Wizard::routes('/wizard/user', UserWizardController::class, 'wizard.user');

如果您不能使用自动追加路由,可以将 config/wizard.php 属性 append_route 设置为 false

2. 设置步骤

这是生成的 NameStep 类,您可以将其 model 方法设置为模型,将 rules 方法设置为表单验证,并通过 saveData 方法将 $data 保存到您的数据库中,例如

app/Steps/User/NameStep.php

<?php

namespace App\Steps\User;

use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use vallerydelexy\LaravelWizard\Step;

class NameStep extends Step
{
    /**
     * The step slug.
     *
     * @var string
     */
    protected $slug = 'name';

    /**
     * The step show label text.
     *
     * @var string
     */
    protected $label = 'Name';

    /**
     * Set the step model instance or the relationships instance.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation|null
     */
    public function model(Request $request)
    {
        return User::find(1);
    }

    /**
     * Save this step form data.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  array|null  $data
     * @param  \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation|null  $model
     * @return void
     */
    public function saveData(Request $request, $data = null, $model = null)
    {
        $data = Arr::only($data, 'name');
        $model->update($data);
    }

    /**
     * Validation rules.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function rules(Request $request)
    {
        return [
            'name' => 'reqred',
        ];
    }
}

然后添加一些步骤视图,例如

resources/views/steps/user/name.blade.php

<div class="form-group mb-3">
    <label for="name">Name</label>
    <input type="text" name="name" id="name" @class(['form-control', 'is-invalid' => $errors->has('name')]) value="{{ old('name', $step->data('name')) }}">

    @error('name')
        <span class="invalid-feedback">{{ $message }}</span>
    @enderror
</div>

resources/views/steps/user/email.blade.php

<div class="form-group mb-3">
    <label for="email">E-mail</label>
    <input type="email" name="email" id="email" @class(['form-control', 'is-invalid' => $errors->has('email')]) value="{{ old('email', $step->data('email')) }}">

    @error('email')
        <span class="invalid-feedback">{{ $message }}</span>
    @enderror
</div>

接下来,浏览 URL /wizard/user,并开始使用 Laravel Wizard。

如果您想获取布局,可以将 Laravel layouts/app.blade.php 复制到 resources/views/layouts/app.blade.php

3. 安装向导步骤 CSS 包

此包默认视图的 CSS 基于 Bootstrap Steps,使用 NPM 安装即可使用

npm install bootstrap bootstrap-steps
// or yarn
yarn add bootstrap bootstrap-steps

将其导入到 app.scss 文件中,并运行 npm run devyarn run dev

resources/sass/app.scss

...

@import 'bootstrap/scss/bootstrap';
@import 'bootstrap-steps/scss/bootstrap-steps';

缓存

数据库驱动

要使用 database 向导缓存驱动程序,您需要一个数据库表来存储向导的缓存数据。生成创建此表的迁移,并运行 wizard:table Artisan 命令

php artisan wizard:table

php artisan migrate

禁用缓存

config/wizard.php 中的 cache 设置为 false 以禁用缓存输入数据

'cache' => false,

或将它设置到您的 WizardController 的 wizardOptions 属性

protected $wizardOptions = [
    'cache' => false,
];

如果禁用缓存,则数据将在每个步骤发送后立即保存。如果您担心重复保存数据,可以隐藏上一个按钮,或者使用 Model::updateOrCreate() (https://laravel.net.cn/docs/6.x/eloquent#other-creation-methods)。

控制器

设置配置

wizardOptions 属性添加到您的向导控制器中,您可以使用 cachedriverconnectiontable 选项来覆盖配置。

app/Http/Controllers/UserWizardController.php

/**
 * The wizard options.
 *
 * @var array
 */
protected $wizardOptions = [
    'cache' => true,
    'driver' => 'session',
    'table' => 'wizards',
];

自定义视图

此包布局视图使用 Bootstrap 5,但如果您不想使用默认视图,则可以发布视图以进行自定义

php artisan vendor:publish --tag=wizard-views-bs5

如果您使用了 Bootstrap 4,则可以发布布局

php artisan vendor:publish --tag=wizard-views-bs4

如果您使用了 Tailwind CSS,则可以发布布局

php artisan vendor:publish --tag=wizard-views-tailwind

现在您可以在 Laravel 项目中自定义 resources/views/vendor/wizard/*.blade.php

但如果您只想有一个定制的向导视图基本视图,您可以将视图从 resources/views/vendor/wizard/*.blade.php 复制到 resources/views/wizards/user/*.blade.php。 (user 是您的向导控制器上的 wizardName 属性值),

步骤

获取缓存数据

例如,FirstStepnameemail 字段,而 SecondStepagephone 字段。您可以使用步骤的 data 方法来获取步骤数据

$name = $firstStep->data('name');
// 'Lucas'

$data = $secondStep->data();
// ['age' => '30', 'phone' => '0900111222']

或者您可以使用步骤仓库来获取其他步骤数据

$data = $secondStep->find('first')->data();
// ['name' => 'Lucas']

$name = $secondStep->find('first')->data('name');
// 'Lucas'

步骤存储库

步骤仓库保存所有步骤数据,如果您想使用另一个步骤,则需要使用它

从向导中获取

$stepRepo = $wizard->stepRepo();

从步骤中获取

$stepRepo = $step->getRepo();

获取上一个步骤

$prevStep = $step->prev();
// same as:
$prevStep = $step->getRepo()->prev();

获取下一个步骤

$prevStep = $step->next();
// same as:
$nextStep = $step->getRepo()->next();

步骤仓库所有可使用的方法详细参考:src/StepRepository.php

上传文件

v2.3.3 开始,支持在 CacheNo Cache 中上传文件,如果使用 Cache Mode,则可以缓存所有输入数据和上传的文件以在最后一步保存

<?php

class LastStep extends Step
{
    public function model(Request $request)
    {
        return $request->user();
    }

    public function saveData(Request $request, $data = null, $model = null)
    {
        $data = [
            'avatar' => $this->find('has-avatar-step')->data('avatar'),
        ];

        $data['avatar'] = $data['avatar']->store('avatar', ['disk' => 'public']);

        $model->update($data);
    }
}

然后添加一个步骤视图来上传头像图像

resources/views/steps/user/has-avatar.blade.php

<div class="form-group mb-3">
    <label for="avatar">Avatar</label>
    <input type="file" name="avatar" id="avatar" @class(['form-control', 'is-invalid' => $errors->has('avatar')])>

    @error('avatar')
        <span class="invalid-feedback">{{ $message }}</span>
    @enderror
</div>

跳过步骤

注意v2.3.3+

为了使步骤可跳过,将 $skip 属性设置为 true,然后这个步骤将跳过验证并保存数据

app/Steps/User/NameStep.php

<?php

class NameStep extends Step
{
    /**
     * Is it possible to skip this step.
     *
     * @var boolean
     */
    protected $skip = true;
}

向视图中传递数据

因为每个步骤都被注入到步骤的视图中,所以只需在步骤类中添加返回数据的方法即可。例如,将选择选项的数据传递给视图

app/Steps/User/NameStep.php

<?php

class NameStep extends Step
{
    public function getOptions()
    {
        return [
            'Taylor',
            'Lucas',
        ];
    }
}

resources/views/steps/user/name.blade.php

<div class="form-group mb-3">
    <label for="name">Select name</label>
    <select id="name" name="name" @class(['form-control', 'is-invalid' => $errors->has('name')])>
        <option value="">Select...</option>
        @foreach ($step->getOptions() as $option)
            <option
                value="{{ $option }}"
                @selected($option === old('name', $step->data('name')))
            >
                {{ $option }}
            </option>
        @endforeach
    </select>

    @error('name')
        <span class="invalid-feedback">{{ $message }}</span>
    @enderror
</div>

getOptions 方法是自定义的,可以随意更改。

在另一个步骤中保存数据

假设现在有两个步骤 NameStepEmailStep。首先,不要为所有步骤设置模型,但不要使用最后一个

app/Steps/User/NameStep.php

<?php

class NameStep extends Step
{
    public function model(Request $request)
    {
        //
    }

    public function saveData(Request $request, $data = null, $model = null)
    {
        //
    }
}

接下来,在最后一步接收所有数据并保存模型

app/Steps/User/EmailStep.php

<?php

class EmailStep extends Step
{
    public function model(Request $request)
    {
        return new User();
    }

    public function saveData(Request $request, $data = null, $model = null)
    {
        $data = $this->getStepsData();
        $model->fill($data)->save();
    }
}

设置关系模型

同样,您可以在步骤的 model 方法中设置关系模型。

use Illuminate\Support\Arr;

/**
 * Set the step model instance or the relationships instance.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation|null
 */
public function model(Request $request)
{
    return $request->user()->posts();
}

/**
 * Save this step form data.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  array|null  $data
 * @param  \Illuminate\Database\Eloquent\Model\Illuminate\Database\Eloquent\Relations\Relation|null  $model
 * @return void
 */
public function saveData(Request $request, $data = null, $model = null)
{
    $data = Arr::only($data, ['title', 'content']);
    $model->create($data);
}

命令

制作向导:

make:wizard 命令和 make:wizard:controller 命令的区别是,make:wizard 命令将附加路由且不会确认生成步骤。

php artisan make:wizard User NameStep,EmailStep

制作控制器:

make:wizard:controller 命令仅生成 WizardControllerNameStepEmailStep 类。

php artisan make:wizard:controller UserController --steps=NameStep,EmailStep

制作步骤:

php artisan make:wizard:step NameStep

与步骤标签和向导一起使用

php artisan make:wizard:step NameStep --label="Name" --slug=name --wizard=user

添加自定义视图路径

php artisan make:wizard:step NameStep --label="Name" --slug=name --view=steps.user.name --wizard=user

赞助

如果您认为这个包对您有所帮助,请考虑成为赞助商来支持我的工作~并且您的头像将出现在我的主要项目中。

Become a Patron

鸣谢

许可协议

MIT 许可证