سلام و عرض ادب
من 2 تا مشکل جالب توی ارسال ایمیل notification توی لاراول دارم که توضیح میدم اگر کسی بلد بود لطفا راهنمایی کنه
مشکل اول :
وقتی notify را به یک view پاس میدم و توی اون view یک فایل blade مثلا با نام vars.blade.php را include میکنم در زمان ارسال ایمیل اصلا این فایل vars.blade.php را نمیتونه بخونه.
مشکل دوم :
من سیستم ارسال ایمیل را کاملا برای ادمین داینامیک نوشتم و متون تمامی notification ها از طریق پنل مدیریت قابل تغییر هست و اومدم یکسری شورتکد تعریف کردم مثلا %time% که اگر ادمین این شورتکد را توی متن ایمیل بزاره، در زمان ارسال ایمیل مثلا تاریخ اون لحظه را توی متن چاپ میکنه و میفرسته که با str_replace تنظیمش کردم.
خب تا اینجا همه چیز اوکیه
$text = str_replace(['%time%'],[\Hekmatinasser\Verta\Facades\Verta::instance(now())],$text);
@component('mail::message')
{!! $text !!}
@component('mail::button', ['url' => url('/')])
ورود به سایت
@endcomponent
@endcomponent
حالا مشکل اینجاست که وقتی ادمین شورتکد %user_name% را توی متن میزاره ((که کارش چاپ کردن نام کاربر موردنظر هست )) و در صورتی که به notification مربوطه بگم implements ShouldQueue کن و توی صف ارسال کن اون موقع موقع ارسال خظا میده و میگه که مثلا undefined name property در صورتی که کد زیر به درستی نام کاربر را باید برگردونه ولی متاسفانه خطا میده
$text = str_replace(['%user_name%'],[\Illuminate\Support\Facades\Auth::user()->name],$text);
حالا من اومدم و توی کنترلر یه روش دیگه زدم و گفتم موقعی که میخوای notify کنی یه session put کن و نام کاربر را بریز تو session و اینجوری هم نوشتم بازم نشد
$text = str_replace(['%user_name%'],[session('u_iname')],$text);
کلا این کار ظاهرا با مقادیر user خصومت داره انگار 😂😂😂
راه حلی برای این مورد به نظرتون میرسه ؟؟؟؟؟؟؟
@ali.bayat @hesammousavi @mhyeganeh
سلام دوستان
میشه لطفا مشکل منو بخونین و اگر امکانش هست جواب بدین ؟
سپاس
درود خطاهات به نحوی نیست که بتونم راهنمایی کنم با dd دقیق بفهم خطا از کجاست.
هر کاری که میخای بکنی توی تابع انجام بده فقط یک سری متغیر پاس بده به فایل blade (هرچند که فایل blade هم یک فایل php و هیچ فرقی نداره
خط کد str_replace ات باید اجرا بشه،پس بزارش توی این علامت
{!! !}
سلام کد نویسی شما یه جورایی نا مفهوم هست.
لاراول برای ارسال ایمیل متد خاص خودش رو داره که اگه بر اساس اون متد پیش برید خیلی ساده می تونید ایمیل ارسال کنید.
شما ابتدا با استفاده از دستور زیر یک کلاس ایمیل بسازید
php artisan make:mail
بعد داخل پوشه view ها در پوشه email یک view بسازید و از کلاسی که ساخته شده اطلاعات مورد نیاز را به آن پاس دهید.
اگر هم که می خواهید اطلاعات را با پر کردن یک فورم ارسال کنید کافی هست که در پنل مدیریت یک route بسازید با یک controller و اطلاعات را از طریق آن با فراخوانی کلاس mail ارسال کنید.
@yk5742g
سلام عزیز
منم با متدهای لاراول میرم جلو ولی من چون متون ایمیل را برای ادمین سایت کاملا پویا کردم و با شورتکدهایی که تعریف کردم براش میتونه هرجوری دوست داره متون ایمیل ها را تغییر بده
کد من کاملا درست کار میکنه ولی زمانی که ShouldQueue را به کلاس مربوطه پاس میدم اونوقت دیگه نام کاربر را نمیگیره
من الان همه ی کدهامو به ترتیب میزارم ببینین
کلاس ارسال ایمیل برای زمانی که کاربر سطح دسترسیش تغییر میکنه
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class user_change_type extends Notification implements ShouldQueue
{
use Queueable;
public $user;
public function __construct($user)
{
// to put order data from controller to mailable
$this->user = $user;
}
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
return (new MailMessage)
->subject('asdasd')
->markdown('mails.user_accept_panel',['user' => $this->user]);
}
public function toArray($notifiable)
{
return [
//
];
}
}
کنترلر مربوطه هنگام پاس دادن مقادیر
class userController extends Controller
{
public function update(Request $request, User $user)
{
if ($user->role != $request->role) {
$user->notify(new user_change_type(['user'=>$user]));
}
}
}
فایل مربوطه برای تمپلیت ارسال ایمیل
@php
$text = $setting['user_change_type'];
@endphp
@php
$text = str_replace(['%time%'],[\Hekmatinasser\Verta\Facades\Verta::instance(now())],$text);
$text = str_replace(['%date%'],[\Hekmatinasser\Verta\Facades\Verta::format('Y-n-j')],$text);
$text = str_replace(['%dates%'],[\Hekmatinasser\Verta\Facades\Verta::format('%d %B %Y')],$text);
$text = str_replace(['%just_time%'],[\Hekmatinasser\Verta\Facades\Verta::formatTime()],$text);
$text = str_replace(['%ip%'],[\Illuminate\Support\Facades\Request::getClientIp(true)],$text);
$text = str_replace(['%name%'],[$user['name']],$text);
$text = str_replace(['%title%'],[$setting['title']],$text);
@endphp
@component('mail::message')
{!! $text !!}
@component('mail::button', ['url' => url('/')])
Login to website
@endcomponent
@endcomponent
ببینین توی این فایل الان من اومدم گفتم زمانی که توی متنی که ادمین مینویسه اگر %name% بود بیاد از متغیر $user['name'] نام کاربر را بگیره و توی ایمیل بزاره و ارسال کنه ولی هیچی نمیزاره
حالا من قبلا هم چندین حالت تست کردم که کد زیر در صورتی جواب میده که من به کلاس ایمیل ShouldQueue را پاس ندم و وقتی ShouldQueue را پاس میدم دیگه نام را چاپ نمیکنه
$text = str_replace(['%name%'],[\Illuminate\Support\Facades\Auth::user()->name],$text);
درایور Queue هم توی env روی database تنظیم کردم.
امیدوارم خوب توضیح داده باشم
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟