Article

Cupiditate possimus earum ut ex omnis fuga vitae. Aperiam rerum eos labore corrupti aliquam. Nemo repellendus ipsum id quos nihil voluptatem aliquid. Distinctio ut est rerum magni tempore iusto unde.

module structure

demo-module/
├─ Livewire/
│  ├─ Home.php
│  ├─ ArticlesTable.php
│  ├─ ArticlesView.php
│  └─ ArticlesEdit.php
├─ Views/
│  ├─ home.blade.php
│  ├─ articles_table.blade.php
│  ├─ articles_view.blade.php
│  ├─ articles_edit.blade.php
│  ├─ menu.blade.php
│  └─ frontend_menu.blade.php
├─ Models/               Article.php, Author.php
├─ Database/             Migrations/, Seeders/
├─ config.php            layout, menu entry
├─ routes.php
└─ DemoModuleServiceProvider.php

route

routes.php


Route::get('demo/articles/edit/{article:id?}'ArticlesEdit::class)
    ->
middleware(['web'])
    ->
name('demo.articles.edit')
    ->
crumbs(function ($crumbs$article null) {
        
$article
            
$crumbs->parent('demo.articles.view'$article)->push(__('Edit Article'), route_lang('demo.articles.edit'$article))
            : 
$crumbs->parent('demo.articles')->push(__('Add Article'), route_lang('demo.articles.edit'));
    });

component

Livewire/ArticlesEdit.php


<?php

namespace App\Modules\Demo\Livewire;

use 
App\Modules\Demo\Models\Article;
use 
App\Modules\Demo\Models\Author;
use 
Livewire\Component;

class 
ArticlesEdit extends Component
{
    public 
Article $article;

    
// Fields bound with x-rpd:: components: also what survives between requests
    // on a model that is not saved yet.
    
protected $rules = [
        
'article.title'     => 'required',
        
'article.author_id' => 'required|exists:demo_authors,id',
        
'article.body'      => 'nullable',
        
'article.public'    => 'nullable|boolean',
        
'article.publication_date' => 'required|date',
    ];

    public function 
mount(?Article $article null): void
    
{
        
$this->article $article ?? new Article();
    }

    public function 
save()
    {
        
$this->validate();
        
$this->article->save();

        return 
redirect()->to(route_lang('demo.articles.view'$this->article->getKey()));
    }

    public function 
render()
    {
        return 
view('demo::articles_edit', [
            
'authors' => Author::query()->orderBy('firstname')->pluck('firstname''id')->toArray(),
        ])->
layout('layout::admin');
    }
}

view

Views/articles_edit.blade.php


<x-rpd::card>
    <
x-rpd::edit title="Article">
        <
div class="row">
            <
x-rpd::input col="col-md-6" model="article.title" label="Title" />
            <
x-rpd::select col="col-md-6" model="article.author_id" :options="$authorslabel="Author" addempty />
        </
div>
        <
div class="row">
            <
x-rpd::date col="col-md-4" model="article.publication_date" format="dd/MM/yyyy" value-format="yyyy-MM-dd" label="Publication date" />
            <
x-rpd::checkbox col="col-md-4 pt-4" model="article.public" label="Public" checkLabel="visible to everyone" />
        </
div>
        <
div class="row mb-4">
            <
x-rpd::rich-text col="col-12" model="article.body" label="Body" />
        </
div>
        <
x-slot name="actions">
            <
x-rpd::button type="submit" label="Save" />
        </
x-slot>
    </
x-rpd::edit>
</
x-rpd::card>

Support
How can I help you today?