mirror of
https://github.com/lkddi/nexusphp.git
synced 2026-04-24 03:57:22 +08:00
add message template
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
use function PHPUnit\Framework\matches;
|
||||
|
||||
enum MessageTemplateNameEnum: string
|
||||
{
|
||||
case REGISTER_WELCOME = "register_welcome";
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::REGISTER_WELCOME => nexus_trans("message-template.register_welcome"),
|
||||
default => '',
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
use App\Events\MessageCreated;
|
||||
use App\Events\NewsCreated;
|
||||
use App\Events\SnatchedUpdated;
|
||||
use App\Events\TorrentCreated;
|
||||
@@ -12,6 +13,7 @@ use App\Events\UserDeleted;
|
||||
use App\Events\UserDisabled;
|
||||
use App\Events\UserEnabled;
|
||||
use App\Events\UserUpdated;
|
||||
use App\Models\Message;
|
||||
use App\Models\News;
|
||||
use App\Models\Snatch;
|
||||
use App\Models\Torrent;
|
||||
@@ -31,6 +33,7 @@ final class ModelEventEnum {
|
||||
const NEWS_CREATED = 'news_created';
|
||||
|
||||
const SNATCHED_UPDATED = 'snatched_updated';
|
||||
const MESSAGE_CREATED = 'message_created';
|
||||
|
||||
public static array $eventMaps = [
|
||||
self::TORRENT_CREATED => ['event' => TorrentCreated::class, 'model' => Torrent::class],
|
||||
@@ -46,5 +49,7 @@ final class ModelEventEnum {
|
||||
self::NEWS_CREATED => ['event' => NewsCreated::class, 'model' => News::class],
|
||||
|
||||
self::SNATCHED_UPDATED => ['event' => SnatchedUpdated::class, 'model' => Snatch::class],
|
||||
|
||||
self::MESSAGE_CREATED => ['event' => MessageCreated::class, 'model' => Message::class],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace App\Events;
|
||||
|
||||
use Illuminate\Broadcasting\Channel;
|
||||
use Illuminate\Broadcasting\InteractsWithSockets;
|
||||
use Illuminate\Broadcasting\PresenceChannel;
|
||||
use Illuminate\Broadcasting\PrivateChannel;
|
||||
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Foundation\Events\Dispatchable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class MessageCreated
|
||||
{
|
||||
use Dispatchable, InteractsWithSockets, SerializesModels;
|
||||
|
||||
public ?Model $model = null;
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Model $model)
|
||||
{
|
||||
$this->model = $model;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the channels the event should broadcast on.
|
||||
*
|
||||
* @return array<int, \Illuminate\Broadcasting\Channel>
|
||||
*/
|
||||
public function broadcastOn(): array
|
||||
{
|
||||
return [
|
||||
new PrivateChannel('channel-name'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Resources\System;
|
||||
|
||||
use App\Enums\MessageTemplateNameEnum;
|
||||
use App\Filament\Resources\System\MessageTemplateResource\Pages;
|
||||
use App\Filament\Resources\System\MessageTemplateResource\RelationManagers;
|
||||
use App\Models\Language;
|
||||
use App\Models\MessageTemplate;
|
||||
use App\Models\Setting;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Resources\Resource;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\SoftDeletingScope;
|
||||
use Illuminate\Support\HtmlString;
|
||||
|
||||
class MessageTemplateResource extends Resource
|
||||
{
|
||||
protected static ?string $model = MessageTemplate::class;
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
|
||||
|
||||
protected static ?string $navigationGroup = 'System';
|
||||
|
||||
protected static ?int $navigationSort = 2;
|
||||
|
||||
public static function getNavigationLabel(): string
|
||||
{
|
||||
return __('admin.sidebar.message_templates');
|
||||
}
|
||||
|
||||
public static function getBreadcrumb(): string
|
||||
{
|
||||
return self::getNavigationLabel();
|
||||
}
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
$languages = Language::all();
|
||||
$default = $languages->first(fn ($item) => $item->site_lang_folder == Setting::getDefaultLang());
|
||||
return $form
|
||||
->schema([
|
||||
Forms\Components\Select::make('name')
|
||||
->label(__('label.name'))
|
||||
->options(MessageTemplate::listAllNames())
|
||||
->columnSpanFull()
|
||||
->required(),
|
||||
Forms\Components\Select::make('language_id')
|
||||
->label(__('label.language'))
|
||||
->options($languages->pluck('lang_name', 'id'))
|
||||
->default($default ? $default->id : null)
|
||||
->columnSpanFull()
|
||||
->required(),
|
||||
Forms\Components\Textarea::make('content')
|
||||
->label(__('label.content'))
|
||||
->helperText(new HtmlString(__('message-template.content_help')."<br/>".__('message-template.register_welcome_content_help')))
|
||||
->columnSpanFull()
|
||||
->rows(10)
|
||||
->required(),
|
||||
|
||||
]);
|
||||
}
|
||||
|
||||
public static function table(Table $table): Table
|
||||
{
|
||||
return $table
|
||||
->columns([
|
||||
Tables\Columns\TextColumn::make('id'),
|
||||
Tables\Columns\TextColumn::make('name')
|
||||
->label(__('label.name'))
|
||||
->formatStateUsing(fn ($state) => $state->label())
|
||||
,
|
||||
Tables\Columns\TextColumn::make('language.lang_name')
|
||||
->label(__('label.language'))
|
||||
,
|
||||
Tables\Columns\TextColumn::make('updated_at')
|
||||
->label(__('label.updated_at'))
|
||||
,
|
||||
])
|
||||
->filters([
|
||||
Tables\Filters\SelectFilter::make('name')
|
||||
->label(__('label.name'))
|
||||
->options(MessageTemplate::listAllNames())
|
||||
,
|
||||
Tables\Filters\SelectFilter::make('language_id')
|
||||
->label(__('label.language'))
|
||||
->options(Language::all()->pluck('lang_name', 'id'))
|
||||
,
|
||||
])
|
||||
->actions([
|
||||
Tables\Actions\EditAction::make(),
|
||||
Tables\Actions\DeleteAction::make(),
|
||||
])
|
||||
->bulkActions([
|
||||
Tables\Actions\BulkActionGroup::make([
|
||||
Tables\Actions\DeleteBulkAction::make(),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
public static function getPages(): array
|
||||
{
|
||||
return [
|
||||
'index' => Pages\ManageMessageTemplates::route('/'),
|
||||
];
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Resources\System\MessageTemplateResource\Pages;
|
||||
|
||||
use App\Filament\PageListSingle;
|
||||
use App\Filament\Resources\System\MessageTemplateResource;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\ManageRecords;
|
||||
|
||||
class ManageMessageTemplates extends PageListSingle
|
||||
{
|
||||
protected static string $resource = MessageTemplateResource::class;
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Actions\CreateAction::make(),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Enums\ModelEventEnum;
|
||||
use Nexus\Database\NexusDB;
|
||||
|
||||
class Message extends NexusModel
|
||||
@@ -26,10 +27,12 @@ class Message extends NexusModel
|
||||
return $this->belongsTo(User::class, 'receiver');
|
||||
}
|
||||
|
||||
public static function add(array $data): bool
|
||||
public static function add(array $data): self
|
||||
{
|
||||
clear_inbox_count_cache($data["receiver"]);
|
||||
return self::query()->insert($data);
|
||||
$message = self::query()->create($data);
|
||||
fire_event(ModelEventEnum::MESSAGE_CREATED, $message);
|
||||
return $message;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Enums\MessageTemplateNameEnum;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
class MessageTemplate extends NexusModel
|
||||
{
|
||||
protected $fillable = ['name', 'content', 'language_id'];
|
||||
|
||||
public $timestamps = true;
|
||||
|
||||
protected $casts = [
|
||||
'name' => MessageTemplateNameEnum::class,
|
||||
];
|
||||
|
||||
public static function listAllNames(): array
|
||||
{
|
||||
$result = [];
|
||||
foreach (MessageTemplateNameEnum::cases() as $messageTemplate) {
|
||||
$result[$messageTemplate->value] = $messageTemplate->label();
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function language(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Language::class);
|
||||
}
|
||||
|
||||
public static function forRegisterWelcome($languageId, array $placeholders): null|string
|
||||
{
|
||||
$result = self::query()->where("language_id", $languageId)
|
||||
->where('name', MessageTemplateNameEnum::REGISTER_WELCOME->value)
|
||||
->first();
|
||||
return self::format($result, $placeholders);
|
||||
}
|
||||
|
||||
private static function format(self|null $template, array $placeholders): null|string
|
||||
{
|
||||
if ($template && $template->content) {
|
||||
$search = array_map(function ($value) {return ":$value";}, array_keys($placeholders));
|
||||
return str_replace($search, array_values($placeholders), $template->content);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -69,8 +69,13 @@ class PluginStore extends Model
|
||||
|
||||
public function hasNewVersion(): bool
|
||||
{
|
||||
return $this->installed_version
|
||||
$result = $this->installed_version
|
||||
&& version_compare($this->version, $this->installed_version, '>');
|
||||
do_log(sprintf(
|
||||
"%s, installed_version: %s, version: %s, hasNew: %s",
|
||||
$this->plugin_id, $this->installed_version, $this->version, $result
|
||||
));
|
||||
return $result;
|
||||
}
|
||||
|
||||
public static function getInfo(string $id)
|
||||
|
||||
+1
-1
@@ -299,7 +299,7 @@ class User extends Authenticatable implements FilamentUser, HasName
|
||||
$log .= ", locale from cookie: $locale";
|
||||
}
|
||||
if (!$locale) {
|
||||
$lang = $this->language->site_lang_folder;
|
||||
$lang = $this->language?->site_lang_folder ?? null;
|
||||
$locale = Locale::$languageMaps[$lang] ?? $lang;
|
||||
$log .= ", [NO_DATA_FROM_COOKIE], lang from database: $lang, locale: $locale";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user