Modules
Modules are way of extending the functionality of Textstem. Typically they provide new content types - such as subscribers, shows, products and so. This section explains how to leverage Textstem to provide an admin interface
Modules are way of extending the functionality of Textstem. Typically they provide new content types - such as subscribers, shows, products and so. This section explains how to leverage Textstem to provide an admin interface
This example outlines the steps to create a 'subscriber module'. This module will have an admin interface to manage subscribers, as well as a page component for adding a form to a page.
Firstly, we will add 'web', 'auth:sanctum', 'verified' middleware to the admin routes:
Route::prefix('/textstem')
->middleware(['web', 'auth:sanctum', 'verified'])
->group(function () {
Route::resource('subscriber', SubscriberController::class);
});
Next, we setup the controller. This looks like your typical controller:
Textstem uses Spatie's Laravel-permissions package to manage permissions and roles.
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Requests\SubscriberStoreRequest;
use App\Http\Requests\SubscriberUpdateRequest;
use App\Models\Subscriber;
...
class SubscriberController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request): View
{
$this->authorize('view-any', Subscriber::class);
$search = $request->get('search', '');
$subscribers = Subscriber::search($search)
->latest()
->paginate(50)
->withQueryString();
return view('admin.subscribers.index', compact('subscribers', 'search'));
}
The index view will typically provide a searchable, sortable list of data. The page content is wrapped inside a x-textstem::app-layout component to keep a consistent look with the Textstem admin system.
<x-textstem::app-layout>
<x-slot name="header">
<h2 class="h2">
Subscribers
</h2>
</x-slot>
<x-slot name="topcontrols">
@can('create', App\Models\Subscriber::class)
<a href="{{ route('subscriber.create') }}" class="button button-primary float-right">
<x-ts::icons.add class=""/>
@lang('textstem::crud.common.create')
</a>
@endcan
</x-slot>
<livewire:admin.subscriber-table resourceName="subscriber"/>
</x-textstem::app-layout>
This example uses a livewire component to display a datatable. This table is created using Textstem's Table component.
<?php
namespace App\Livewire\Admin;
use Illuminate\Database\Eloquent\Builder;
use Medialight\Textstem\Livewire\Table;
use Medialight\Textstem\Table\Column;
use App\Models\Subscriber;
class SubscriberTable extends Table
{
public function query(): Builder
{
return Subscriber::query();
}
public function columns(): array
{
return [
Column::make('email', 'Email'),
Column::make('source', 'Source'),
Column::make('updated_at', 'Modified')->component('columns.formatters.modified'),
Column::make('', '')->component('columns.formatters.editbuttons')->notsortable(),
];
}
}