PHP code example of cactus-galaxy / filament-astrotomic
1. Go to this page and download the library: Download cactus-galaxy/filament-astrotomic library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
cactus-galaxy / filament-astrotomic example snippets
'locales' => [
'uk',
'en',
],
use CactusGalaxy\FilamentAstrotomic\FilamentAstrotomicTranslatablePlugin;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->plugins([
FilamentAstrotomicTranslatablePlugin::make(),
]);
}
use CactusGalaxy\FilamentAstrotomic\Resources\Concerns\ResourceTranslatable;
use Filament\Resources\Resource;
class ProductResource extends Resource
{
use ResourceTranslatable;
// ...
}
use CactusGalaxy\FilamentAstrotomic\Resources\Pages\Record\ListTranslatable;
use Filament\Resources\Pages\ListRecords;
class ListProducts extends ListRecords
{
use ListTranslatable;
// ...
}
use CactusGalaxy\FilamentAstrotomic\Resources\Pages\Record\CreateTranslatable;
use Filament\Resources\Pages\CreateRecord;
class CreateProduct extends CreateRecord
{
use CreateTranslatable;
// ...
}
use CactusGalaxy\FilamentAstrotomic\Resources\Pages\Record\EditTranslatable;
use Filament\Resources\Pages\EditRecord;
class EditProduct extends EditRecord
{
use EditTranslatable;
// ...
}
use CactusGalaxy\FilamentAstrotomic\Resources\Pages\Record\ViewTranslatable;
use Filament\Resources\Pages\ViewRecord;
class ViewProduct extends ViewRecord
{
use ViewTranslatable;
// ...
}
use CactusGalaxy\FilamentAstrotomic\Resources\Concerns\ResourceTranslatable;
use Filament\Resources\Resource;
class ProductResource extends Resource
{
use ResourceTranslatable;
// ...
public static function getTranslatableLocales(): array
{
return ['uk', 'en'];
}
}
use CactusGalaxy\FilamentAstrotomic\Forms\Components\TranslatableTabs;
use CactusGalaxy\FilamentAstrotomic\Resources\Concerns\ResourceTranslatable;
use CactusGalaxy\FilamentAstrotomic\TranslatableTab;
use Filament\Forms\Form;
use Filament\Resources\Resource;
class ProductResource extends Resource
{
use ResourceTranslatable;
// ...
public static function form(Form $form): Form
{
return $form->columns(1)->schema([
Forms\Components\TextInput::make('slug')
->unique(ignoreRecord: true)
->m based on the main locale
->live(onBlur: true)
->afterStateUpdated(function (Forms\Set $set, Forms\Get $get, $state) use ($tab) {
if ($tab->isMainLocale()) {
$set('slug', Str::slug($state));
}
}),
]),
// ...
]);
}
// ...
}
TranslatableTabs::make()
// plain syntax
->makeNameUsing(fn (string $name, string $locale) => "{$name}:{$locale}")
// or use an alias
->makeNameUsingPlainSyntax()
// ..
use Filament\Forms\Components\Tabs\Tab;
TranslatableTabs::make()
->localeTabSchema(fn (TranslatableTab $tab) => [
// ...
])
->prependTabs([
Tab::make('Tab before localized')
->schema([
// ...
])
// ...
])
->appendTabs(fn () => [ // you also can pass a callback or array
Tab::make('Tab after localized')
->schema([
// ...
])
// ...
])
use App\Models\Product;
use CactusGalaxy\FilamentAstrotomic\Forms\Components\TranslatableTabs;
use CactusGalaxy\FilamentAstrotomic\Resources\Concerns\ResourceTranslatable;
use Filament\Forms\Form;
use Filament\Tables;
use Filament\Tables\Table;
class ProductResource extends Resource
{
use ResourceTranslatable;
// ...
public static function form(Form $form): Form
{
// ... form with `TranslatableTabs`
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('translation.name'),
// ...
])
// ...
->actions([
Tables\Actions\EditAction::make()->mutateRecordDataUsing(function (Product $record, array $data) {
return self::mutateTranslatableData($record, $data);
})->mutateFormDataUsing(function (Product $record, array $data) {
$record->unsetRelation('translation');
return $data;
}),
// ...
]);
}
public static function getPages(): array
{
return [
'index' => Pages\ListProducts::route('/'),
// edit route is missing
];
}
use CactusGalaxy\FilamentAstrotomic\Forms\Components\TranslatableTabs;
use CactusGalaxy\FilamentAstrotomic\Resources\Concerns\ResourceTranslatable;
use CactusGalaxy\FilamentAstrotomic\TranslatableTab;
use Filament\Forms;
use Filament\Forms\Form;
class CategoryResource extends Resource
{
use ResourceTranslatable;
// ...
public static function form(Form $form): Form
{
return $form
->schema([
TranslatableTabs::make()
->localeTabSchema(fn (TranslatableTab $tab) => [
Forms\Components\TextInput::make($tab->makeName('name'))
->
use Astrotomic\Translatable\Translatable;
use Astrotomic\Translatable\Contracts\Translatable as TranslatableContract;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
// in `boot` method
TextColumn::configureUsing(function (TextColumn $column): void {
// match `translations.title` or `translation.title`
if (Str::match('@^translations?\.(\w+)$@', $column->getName())) {
$column
->searchable(query: function (Builder $query, string $search) use ($column): Builder {
$columnName = Str::after($column->getName(), '.');
if ($query->hasNamedScope('whereTranslationLike')) {
/* @var Translatable|TranslatableContract $query */
return $query->whereTranslationLike($columnName, "%{$search}%");
}
return $query->where($columnName, 'like', "%{$search}%");
});
}
});