PHP code example of vasilgerginski / filamentphp-text-extractor

1. Go to this page and download the library: Download vasilgerginski/filamentphp-text-extractor 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/ */

    

vasilgerginski / filamentphp-text-extractor example snippets


use VasilGerginski\FilamentTextExtractor\FilamentTextExtractorPlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        // ... other configuration
        ->plugin(FilamentTextExtractorPlugin::make());
}



namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use VasilGerginski\FilamentTextExtractor\Traits\ExtractsTranslatableText;

class BlogPost extends Model
{
    use ExtractsTranslatableText;
    
    // Define which fields should be extracted
    protected array $translatableFields = [
        'title',
        'content',
        'excerpt',
        'meta_description',
    ];
}

$blogPost = BlogPost::find(1);
$blogPost->extractTranslatableText();

use VasilGerginski\FilamentTextExtractor\Jobs\ExtractTextJob;

// Extract synchronously
ExtractTextJob::dispatchSync(BlogPost::class);

// Or dispatch to queue
ExtractTextJob::dispatch(BlogPost::class);

use VasilGerginski\FilamentTextExtractor\Casts\Translatable;

class BlogPost extends Model
{
    use ExtractsTranslatableText;
    
    protected $casts = [
        'title' => Translatable::class,
        'excerpt' => Translatable::class,
        'meta_description' => Translatable::class,
    ];
}

use VasilGerginski\FilamentTextExtractor\Casts\JsonTranslatable;

class BlogPost extends Model
{
    protected $casts = [
        'content' => JsonTranslatable::class,    // For page builder blocks
        'metadata' => JsonTranslatable::class,   // For component data
    ];
}

Builder::make('content')
    ->blocks([
        Builder\Block::make('heading')
            ->schema([
                TextInput::make('content')
                    ->label('Heading text')
            ]),
        Builder\Block::make('paragraph')
            ->schema([
                Textarea::make('content')
                    ->label('Paragraph text')
            ]),
        Builder\Block::make('image')
            ->schema([
                FileUpload::make('image'),
                TextInput::make('alt_text')
            ]),
    ])

// Original rich text content
$content = '<h1>Welcome</h1><p>This is <strong>important</strong> text.</p>';

// Extracted as
'Welcome This is important text.'

return [
    // Default locale for extracted texts
    'default_locale' => 'en',
    
    // Available locales
    'locales' => ['en', 'es', 'fr', 'de'],
    
    // Auto-generate Laravel translation files
    'auto_generate_lang_files' => true,
    
    // Translation file naming pattern
    'lang_file_pattern' => '{model_name}.php', // e.g., blog_posts.php
    
    // Queue name for extraction jobs
    'queue' => 'default',
    
    // Fields to exclude from extraction
    'excluded_fields' => ['id', 'password', 'remember_token'],
    
    // Custom field handlers
    'field_handlers' => [
        'email' => \VasilGerginski\FilamentTextExtractor\FieldHandlers\EmailHandler::class,
        'url' => \VasilGerginski\FilamentTextExtractor\FieldHandlers\UrlHandler::class,
        // Add your custom handlers here
    ],
];



namespace App\FieldHandlers;

use VasilGerginski\FilamentTextExtractor\FieldHandlers\AbstractFieldHandler;

class PhoneNumberHandler extends AbstractFieldHandler
{
    public function handle(mixed $value): ?string
    {
        // Your custom logic here
        return $this->formatPhoneNumber($value);
    }
    
    public function shouldExtract(mixed $value): bool
    {
        return !empty($value) && $this->isValidPhoneNumber($value);
    }
}

// After extraction, files are created in:
// lang/en/blog_posts.php
// lang/es/blog_posts.php
// etc.

// Example generated file content:
return [
    'post_1_title' => 'Welcome to our Blog',
    'post_1_content' => 'This is the first blog post content...',
    'post_1_excerpt' => 'A brief introduction to our blog',
    // ... more extracted texts
];

// In your Blade views
{{ __('blog_posts.post_1_title') }}

// Or create a model accessor
class BlogPost extends Model
{
    use ExtractsTranslatableText;
    
    public function getLocalizedTitleAttribute()
    {
        return __("blog_posts.post_{$this->id}_title");
    }
    
    public function getLocalizedContentAttribute()
    {
        return __("blog_posts.post_{$this->id}_content");
    }
}

// Usage
$post = BlogPost::find(1);
echo $post->localized_title; // Automatically uses current locale

use VasilGerginski\FilamentTextExtractor\Casts\Translatable;

class BlogPost extends Model
{
    protected $casts = [
        'title' => Translatable::class,
        'content' => Translatable::class,
        'excerpt' => Translatable::class,
    ];
}

// Now these fields automatically return translated values
$post = BlogPost::find(1);
echo $post->title; // Returns translated title based on current locale
bash
php artisan vendor:publish --provider="VasilGerginski\FilamentTextExtractor\FilamentTextExtractorServiceProvider"
php artisan migrate
bash
php artisan vendor:publish --tag="filament-text-extractor-config"
blade
{{-- OLD WAY (manual) --}}
{{ __('blog_post.' . $post->title) }}

{{-- NEW WAY (automatic!) --}}
{{ $post->title }}                    {{-- Automatically translated! --}}
{{ $post->excerpt }}                  {{-- Automatically translated! --}}
blade
<div class="hero">
    <h1>{{ $post->content[0]['title'] }}</h1>          {{-- Auto-translated! --}}
    <p>{{ $post->content[0]['subtitle'] }}</p>         {{-- Auto-translated! --}}
    <button>{{ $post->content[0]['button_text'] }}</button> {{-- Auto-translated! --}}
</div>
bash
# Extract and generate translation files
php artisan text-extractor:extract "App\Models\BlogPost" --generate-lang-files

# Files created:
# - lang/en/blog_posts.php
# - lang/es/blog_posts.php (if Spanish is configured)
# - lang/fr/blog_posts.php (if French is configured)