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

Example Module

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.

Routes

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);
    });

Controller

Next, we setup the controller. This looks like your typical controller:

Permissions

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'));
    }

Index View

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(),
        ];
    }
 
}