منشن کاربرها تو Trix با Rich Text Laravel
خلاصهٔ کاملتر
تو قسمت دوم سری Rich Text Laravel، نویسنده ادامهٔ همون اپ نمونهٔ Chirper رو برمیداره که قبلاً آپلود فایل بهش اضافه شده بود و این بار سراغ بخش جدیتر Trix میره: attachmentها. هدف اینه که کاربر بتونه توی ادیتور، کاربرهای دیگه رو منشن کنه و رندر نهایی اون منشن هم کامل دست سرور باشه.
سمت کلاینت از Tribute.js استفاده میشه تا وقتی کاربر علامت @ رو تایپ میکنه، لیست پیشنهادها از مسیر GET /mentions گرفته و نشون داده بشه. یه نکتهٔ مهم اینه که متد pasteHtml تریبیوت باید override بشه، چون Trix اجازه نمیده مستقیم به عنصر [contenteditable] دست بزنی؛ اون فقط نمایش مدل سند Trix هست. بهجاش با رویداد tribute-replaced آبجکت انتخابشده گرفته و به یه attachment تبدیل میشه:
editor.insertAttachment(new Trix.Attachment(original));
editor.insertString(" ");سمت سرور، مدل User قرارداد AttachableContract رو پیاده میکنه و با trait آمادهٔ Attachable بیشتر کار انجام شدهست. فقط چندتا متد میمونه: یه content-type اختصاصی برای منشن، نسخهٔ متن ساده، و مهمتر از همه richTextRender که HTML نمایش منشن رو از یه ویوی Blade میسازه:
const ATTACHABLE_CONTENT_TYPE = 'application/vnd.chirper.user-mention+html';
public function richTextRender(array $options = []): string
{
return trim(view('rich-texts.partials.mention', ['user' => $this])->render());
}جالبترین بخش ماجرا جاییه که نویسنده توضیح میده چی واقعاً ذخیره میشه: HTML کامل attachment تو دیتابیس نمیره. فقط یه تگ کوچیک rich-text-attachment با یه sgid (شناسهٔ سراسری امضاشده که با کلید مخفی اپ امضا شده و کاربر نمیتونه دستکاریش کنه) ذخیره میشه و موقع رندر دوباره باز میشه. نتیجهش اینه که اگه اسم کاربر عوض شه یا استایل منشنها رو تغییر بدی، همهٔ سندهای قدیمی هم بهروز میشن.
آخر مقاله هم یه بخش اضافه هست: با هوکشدن روی رویداد saved مدل Chirp، منشنهای متن اسکن و توی جدول mentions سینک میشن، و رویداد created اون مدل یه نوتیفیکیشن ایمیلی صفشونده (ShouldQueue) برای کاربر منشنشده میفرسته — البته نه وقتی کاربر خودش رو منشن کرده باشه.
نکات کلیدی:
- Tribute.js تشخیص @ و لیست پیشنهاد رو میده، ولی درج نهایی باید از طریق API خود Trix انجام شه
- مدل User با AttachableContract و trait Attachable به یه attachment قابلدرج تبدیل میشه
- فقط sgid ذخیره میشه، نه HTML؛ برای همین تغییر استایل یا اسم کاربر روی سندهای قدیمی هم اثر میذاره
- موقع تغذیهٔ ادیتور باید toTrixHtml() صدا زده شه، چون خروجی ادیتور با خروجی نهایی فرق داره
- سینک منشنها و ارسال نوتیفیکیشن با هوکهای مدل و صف انجام میشه




