storephp/bundler

此包的最新版本(v1.0.0-beta.2)没有可用的许可证信息。

这是StorePHP用于构建捆绑包的框架

v1.0.0-beta.2 2023-09-13 16:03 UTC

This package is auto-updated.

Last update: 2024-09-13 18:16:09 UTC


README

Source Packagist Version

StorePHP Bundler

这是StorePHP用于构建捆绑包的框架

模块结构

.
└── <vendor>/<module>/
    └── etc/
    │   ├── forms
    │   ├── grids
    │   ├── routes/
    │   │   └── admin.php
    │   ├── acl.php
    │   ├── module.php
    │   └── sidebar.php
    └── storephp.php

创建新模块

vendor目录中的module目录下创建一个storephp.php文件

<?php

use StorePHP\Bundler\BundleRegistrar;

BundleRegistrar::register(BundleRegistrar::MODULE, '<vendor>_<module>', __DIR__);

表单

构建新表单

<?php

use StorePHP\Bundler\Contracts\Form\FormHasFields;
use StorePHP\Bundler\Contracts\Form\FormHasTabs;
use StorePHP\Bundler\Lib\Form\Fields;
use StorePHP\Bundler\Lib\Form\Tabs;

return new class implements FormHasTabs, FormHasFields
{
    public function tabs(Tabs $tabs)
    {
        $tabs->addTab('default', 'Product info');
        $tabs->addTab('priceing', 'Product price');
        $tabs->addTab('images', 'Images');
    }

    public function fields(Fields $form)
    {
        $form->addField('text', [
            'label' => 'Product name',
            'model' => 'name',
            'rules' => 'required',
            'order' => 10,
        ]);

        $form->addField('text', [
            'label' => 'Product price',
            'model' => 'price',
            'rules' => 'required',
            'order' => 10,
            'hint' => 'Add product price',
        ], 'priceing');

        $form->addField('text', [
            'label' => 'Product discount price',
            'model' => 'discount_price',
            'rules' => 'nullable',
            'order' => 20,
            'hint' => 'Add product discount price',
        ], 'priceing');

        $form->addField('file', [
            'label' => 'Product thumbnail',
            'model' => 'thumbnail_path',
            'rules' => 'required',
            'order' => 10,
            'hint' => 'Update product',
        ], 'images');
    }
};

渲染此表单

<?php

namespace StorePHP\Catalog\Http\Livewire\Products;

use Livewire\WithFileUploads;
use Store\Support\Facades\Product;
use StorePHP\Bundler\Abstracts\FromAbstract;
use StorePHP\Dashboard\Views\Layouts\DashboardLayout;

class ProductCreate extends FromAbstract
{
    use WithFileUploads;

    protected $pretitle = 'Catalog';
    protected $title = 'Create new product';

    public $formId = 'storephp_catalog_products_form';

    public function layout()
    {
        return DashboardLayout::class;
    }

    public function submit()
    {
        $validateData = $this->validate();

        $product = Product::create([
            'sku' => $validateData['sku'],
        ]);

        foreach ($this->models(['sku', 'thumbnail_path']) as $model) {
            $product->{$model} = $validateData[$model];
        }

        if ($this->thumbnail_path) {
            $product->thumbnail_path = $this->thumbnail_path->store('photos');
        }

        $product->save();

        return $this->pushAlert('success', 'The product has been created');
    }
}

网格

构建新网格

<?php

use StorePHP\Bundler\Contracts\Grid\GridHasButtons;
use StorePHP\Bundler\Contracts\Grid\GridHasCTA;
use StorePHP\Bundler\Contracts\Grid\GridHasTable;
use StorePHP\Bundler\Lib\Grid\Bottom;
use StorePHP\Bundler\Lib\Grid\CTA;
use StorePHP\Bundler\Lib\Grid\Table;

return new class implements GridHasTable, GridHasButtons, GridHasCTA
{
    public function model()
    {
        return config('store.catalog.products.model');
    }

    public function createBottom(Bottom $bottom)
    {
        $bottom->setBottom('Create new product', 'store.dashboard.catalog.products.create');
    }

    public function table(Table $table)
    {
        $table->setColumn('#', 'id')
            ->setColumn('Name', 'name')
            ->setColumn('Slug', 'slug');
    }

    public function CTA(CTA $CTA)
    {
        $CTA->setCall('Edit', [
            'type' => 'route',
            'color' => 'info',
            'route' => 'store.dashboard.catalog.products.update',
        ]);
    }
};

渲染此网格

<?php

namespace StorePHP\Catalog\Http\Livewire\Products;

use StorePHP\Bundler\Abstracts\GridAbstract;
use StorePHP\Dashboard\Views\Layouts\DashboardLayout;

class ProductsIndex extends GridAbstract
{
    public $gridId = 'storephp_catalog_products_index';

    protected $pretitle = 'Catalog';
    protected $title = 'Products listing';

    public function layout()
    {
        return DashboardLayout::class;
    }
}

创建路由

在路由文件夹中,您可以创建一个admin.php文件。

Route::prefix('catalog')->group(function () {
    // Set routes
});

创建ACL

<?php

use StorePHP\Bundler\Lib\ACL;
use StorePHP\Bundler\Contracts\ACL\HasPermissions;

return new class implements HasPermissions
{
    public function permissions(ACL $acl)
    {
        $acl->permission('Catalog', 'catalog');
    }
};

模块

<?php

use StorePHP\Catalog\Providers\StoreCatalogServiceProvider;
use StorePHP\Bundler\Lib\Module;
use StorePHP\Bundler\Contracts\Module\iModule;

return new class implements iModule
{
    public function info(Module $module)
    {
        $module->name('Catalog');
        $module->provoiders([
            StoreCatalogServiceProvider::class
        ]);
    }
};

侧边栏构建器

<?php

use StorePHP\Bundler\Contracts\Sidebar\HasLinks;
use StorePHP\Bundler\Contracts\Sidebar\HasMenu;
use StorePHP\Bundler\Lib\Sidebar\Menu;
use StorePHP\Bundler\Lib\Sidebar\Links;

return new class implements HasMenu, HasLinks
{
    public function menu(Menu $menu)
    {
        $menu->info(
            icon: 'clipboard-list',
            label: 'Catalog',
            order: 20,
        );
    }

    public function links(Links $links)
    {
        $links->link(
            icon: 'category',
            label: 'Categories',
            href: 'store.dashboard.catalog.categories.index',
        );
        $links->link(
            icon: 'packages',
            label: 'Products',
            href: 'store.dashboard.catalog.products.index',
        );
    }
};