think.studio/nova-page-settings

为laravel nova添加设置配置的临时解决方案

4.4.0 2023-08-28 12:22 UTC

This package is auto-updated.

Last update: 2024-09-28 14:46:56 UTC


README

Packagist License Packagist Version Total Downloads Build Status Code Coverage Scrutinizer Code Quality

为laravel nova添加设置配置的临时解决方案。

安装

您可以通过composer安装此包

composer require think.studio/nova-page-settings

可选发布配置

php artisan vendor:publish --provider="ThinkOne\NovaPageSettings\ServiceProvider" --tag="config"

使用方法

管理部分

  1. 创建设置表(迁移)
public function up() {
    Schema::create( config('nova-page-settings.default.settings_table'), function ( Blueprint $table ) {
        \Thinkone\NovaPageSettings\MigrationHelper::defaultColumns($table);
    } );
}
  1. 创建资源
namespace App\Nova\Resources;

class PageSettingResource extends Resource
{
    use \Thinkone\NovaPageSettings\Nova\Resources\Traits\AsPageSetting;

    public static $model = \Thinkone\NovaPageSettings\Adapters\CMSPageSettingModel::class;

    public static $searchable         = false;
    public static $globallySearchable = false;

    public static $title = \Thinkone\NovaPageSettings\QueryAdapter\InternalSettingsModel::ATTR_NAME;

    public static $perPageOptions = [ 1000 ];
    
    public static function label()
    {
        return 'Custom settings';
    }

    public static function uriKey()
    {
        return 'custom-page-settings';
    }
}
  1. 在您指定的文件夹中创建模板。系统将自动找到文件夹中的所有模板。
namespace App\Nova\PageSettings\Templates;

use Laravel\Nova\Fields\Image;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Http\Requests\NovaRequest;
use Thinkone\NovaPageSettings\Templates\BaseTemplate;
use NovaFlexibleContent\Flexible;

class MarketingPageSettings extends BaseTemplate
{
    public function fields(NovaRequest $request)
    {
        return [
            // NOTICE: do not forget use "templateKey" method
            Email::make('Notification email', $this->templateKey('notification_email'));
            Flexible::make('Slider', $this->templateKey('slider'))
                    ->addLayout('Custom Slide', 'custom_slide', [
                        Text::make('Title', 'title'),
                        Textarea::make('Text', 'text'),
                        Text::make('Button Text', 'btn_text'),
                        Text::make('Button Link', 'btn_link'),
                    ])
                    ->limit(4)
                    ->button('Add Slide'),
            // ... other fields
        ];
    }
}
  1. 结果,您应该看到如下内容

前端部分

 /** @var \Illuminate\Support\PageSettingsCollection $pageSettings */
 $pageSettings = MarketingPageSettings::retrieve();
 // get array of slides using helper
 $slides = $pageSettings->getSettingValue( 'slider', 'array', []);
 // get typed value
 $slides = $pageSettings->arraySettingValue( 'slider', []);
 $slides = $pageSettings->stringSettingValue( 'notification_email');

 // or
 /** @var array $viewData */
 $viewData = MarketingPageSettings::viewData();
 echo $viewData['slider'];

使用灵活的

如果您需要使用灵活内容包,您将需要覆盖默认模型

namespace App\Models;

class PageSetting extends \Thinkone\NovaPageSettings\Model\PageSetting
{
    use \NovaFlexibleContent\Concerns\HasFlexible;

    public function valueFlexible(array $layoutMapping = []): \NovaFlexibleContent\Layouts\LayoutsCollection
    {
        return $this->flexible('value', $layoutMapping);
    }
}

鸣谢

  • Think Studio