اذهب إلى المحتوى

السؤال

نشر

اقوم باستخدام هذه المكتبة لحفظ الصور ولجعلها تتحول تلقائيا لنسختين webp , avif   ولكن هناك مشكلة ان الصور يتم حفظها مباشرة 

في المجلد Public يتم انشاء ملف باسم الid  ويتم الحفظ بداخله النسخة الاساسية ومجلد به النسختين المحولتين كالصورة الموضحة ادناه 

image.png.99efc36d1a11b1238f51bfcb91092250.png

على الرغم من انه يجب حفظهن داخل المسار التالي : C:\laragon\www\inspro\storage\app\public\categories  ولكنه فارغ لا يتم حفظ شيء بداخله 

هذا الكود الذي استخدمه في الموديل 

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;

class Category extends Model implements HasMedia
{
    use HasFactory, InteractsWithMedia;

    protected $fillable = ['name', 'description', 'photo'];

    // تسجيل مجموعة الوسائط
            public function registerMediaCollections(): void
                {
                    $this->addMediaCollection('categories') // تحديد اسم المجموعة 'categories'
                        ->singleFile();  // لضمان حفظ صورة واحدة فقط
                }

    // تسجيل التحويلات
    public function registerMediaConversions(Media $media = null): void
    {
        $this->addMediaConversion('webp')
             ->format('webp')
             ->quality(90)
             ->performOnCollections('categories');

        $this->addMediaConversion('avif')
             ->format('avif')
             ->quality(90)
             ->performOnCollections('categories');
    }

    // علاقة مع النموذج الفرعي SubCategory
    public function subCategories()
    {
        return $this->hasMany(SubCategory::class);
    }
}

وهذا التابع store  داخل الكونترولر 

   public function store(Request $request)
     {
         $validatedData = $request->validate([
             'name' => 'required|string|max:255',
             'description' => 'nullable|string',
             'photo' => 'nullable|image|mimes:jpg,png,jpeg|max:2048',
         ]);
     
         // إنشاء الفئة في قاعدة البيانات
         $category = Category::create([
             'name' => $validatedData['name'],
             'description' => $validatedData['description'] ?? null,
         ]);
     
         // التحقق مما إذا كان هناك صورة مرفوعة
        // رفع الصورة إلى Media Library
        if ($request->hasFile('photo')) {
            $pathToFile = $request->file('photo')->getPathname(); // الحصول على المسار الفعلي للصورة
            $category->addMedia($pathToFile)->toMediaCollection('categories'); // إضافة الصورة إلى Media Collection
        }
     
         // إعادة التوجيه مع رسالة نجاح
         return redirect()->route('categories.index')->with('success', 'Category created successfully!');
     }
     

 

Recommended Posts

  • 0
نشر

هل تكوين ملف config/filesystems.php هو كالتالي؟

'disks' => [
    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
    ],
],

وتأكدي من تنفيذ أمر التهجير:

php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="migrations"

ثم:

php artisan migrate

أيضًأ ملف config/media-library.php في حال لم يكن موجوداً، عليكِ نشره باستخدام الأمر:

php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="config"

ثم تعديل نموذج Category  كالتالي:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;

class Category extends Model implements HasMedia
{
    use HasFactory, InteractsWithMedia;

    protected $fillable = ['name', 'description', 'photo'];

    public function registerMediaCollections(): void
    {
        $this->addMediaCollection('categories')
            ->singleFile()
            ->useDisk('public') // تحديد القرص المستخدم
            ->storedIn('categories'); // تحديد المجلد داخل القرص
    }

    public function registerMediaConversions(Media $media = null): void
    {
        $this->addMediaConversion('webp')
             ->format('webp')
             ->quality(90)
             ->performOnCollections('categories');

        $this->addMediaConversion('avif')
             ->format('avif')
             ->quality(90)
             ->performOnCollections('categories');
    }

    public function subCategories()
    {
        return $this->hasMany(SubCategory::class);
    }
}

ثم تعديل دالة store في الكونترولر في الجزء الخاص بـ $request->hasFile:

    if ($request->hasFile('photo')) {
        $category->addMediaFromRequest('photo')
            ->toMediaCollection('categories');
    }

وتنفيذ الأمر التالي لإنشاء الرابط الرمزي للتخزين:

php artisan storage:link

ثم حذف الملفات والإعدادات المؤقتة:

php artisan optimize:clear

ومن المفترض أن يتم حفظ الصور في المسار storage/app/public/categories.

 

  • 0
نشر

يجب عليكي تحديد مكان المجلد الذي تريدن حفظ الصور فيه .

أولا يجب عليكي البحث في ملف config\filesystems.php بداخل المصفوفة disks والبحث عن المكان المناسب لكي أو حتي إنشاء مكان جديد :

'disks' => [
	'local' => [
      'driver' => 'local',
      'root' => storage_path('app'),
      'throw' => false,
	],
    'public' => [
      'driver' => 'local',
      'root' => storage_path('app/public'),
      'url' => env('APP_URL').'/storage',
      'visibility' => 'public',
      'throw' => false,
    ],

فمثلا في الكود السابق يوجد disk يسمى local وستجدين أن المسار الموجود في الخاصية root هو مجلد app الذي بداخل storage.

وال disk الذي يسمى public يتم تخزين الملفات بداخل المجلد app/public الموجود بداخل stroage . 

لهذا يجب عليكى البحث عن نفس ال root الذي هو storage_path('app/public') . وإذا لم يوجد يمكنكي إنشاء كائن جديد بداخل disks .

بعد ذلك في ملف الموديل في الدالة registerMediaCollections يجب وضع useDisk مع إسم ال disk المناسب في config\filesystems.php لتصبح الدالة كالتالي :

public function registerMediaCollections(): void
                {
                    $this->addMediaCollection('categories') // تحديد اسم المجموعة 'categories'
                        ->singleFile()
						->useDisk('public');  // لضمان حفظ صورة واحدة فقط
                }

 

  • 0
نشر (معدل)

@Mustafa Suleiman

ظهر هذا الخطأ عند محاولة ارسال البيانات 

Method Spatie\MediaLibrary\MediaCollections\MediaCollection::storedIn does not exist.

ويتم تحديد ان الخطأ بهذه السطر 

->storedIn('categories'); // تحديد المجلد داخل القرص

 

@محمد عاطف17

انه هكذا الضبط داخل الfilesystem لم اقم بتغيير اي شيء هذه الاعدادات الافتراضية 

    'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
            'throw' => false,
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
            'throw' => false,
        ],

وقمت باستخدام الكود الذي اعطيتني اياهومازالت ذات المشكلة يحفظهن بالخارج 

تم التعديل في بواسطة ريماس الياس
  • 0
نشر
بتاريخ 3 دقائق مضت قال ريماس الياس:

وقمت باستخدام الكود الذي اعطيتني اياهومازالت ذات المشكلة يحفظهن بالخارج 

هل يمكنكي توضيح أين المسار الذي يتم إنشاء الملفات به ؟ يبدوا أنني قد فهمت المشكلة بشكل خاطئ . هل يتم حفظهم في المجلد public الخارجي الموجود في جذر المشروع أم ماذا ؟

  • 0
نشر
بتاريخ 4 دقائق مضت قال ريماس الياس:

@Mustafa Suleiman

ظهر هذا الخطأ عند محاولة ارسال البيانات 

Method Spatie\MediaLibrary\MediaCollections\MediaCollection::storedIn does not exist.

ويتم تحديد ان الخطأ بهذه السطر 

->storedIn('categories'); // تحديد المجلد داخل القرص

 

من الأفضل إرفاق مجلد المشروع بشكل كامل لتسهيل الأمر

  • 0
نشر
بتاريخ الآن قال محمد عاطف17:

هل يمكنكي توضيح أين المسار الذي يتم إنشاء الملفات به ؟ يبدوا أنني قد فهمت المشكلة بشكل خاطئ . هل يتم حفظهم في المجلد public الخارجي الموجود في جذر المشروع أم ماذا ؟

يتم حفظهن في المجلد public مباشرة مثلا ضفت صنف جديد وكان رقمه 6 يتم حفظ الصورة الاساسية في المسار التالي 

C:\laragon\www\inspro\storage\app\public\6

والصور المعدلة في المسار التالي 

C:\laragon\www\inspro\storage\app\public\6\conversions

بينما من المفروض ان يتم حفظهن في المسار التالي 

C:\laragon\www\inspro\storage\app\public\categories
  • 0
نشر
بتاريخ منذ ساعة مضت قال ريماس الياس:

يتم حفظهن في المجلد public مباشرة مثلا ضفت صنف جديد وكان رقمه 6 يتم حفظ الصورة الاساسية في المسار التالي 

C:\laragon\www\inspro\storage\app\public\6
 

والصور المعدلة في المسار التالي 

C:\laragon\www\inspro\storage\app\public\6\conversions
 

بينما من المفروض ان يتم حفظهن في المسار التالي 

C:\laragon\www\inspro\storage\app\public\categories
 

يرجى إستخدام الكود التالي في ال model :

public function registerMediaCollections(): void
{
$this->addMediaCollection('categories') // تحديد اسم المجموعة 'categories'
->singleFile() // لضمان حفظ صورة واحدة فقط
->useDisk('public') 
->prefix('categories'); // حفظ الملفات داخل مجلد 'categories'
}

يجب أن يتم حفظ الملفات بداخل مجلد categories .

  • 0
نشر
بتاريخ 36 دقائق مضت قال ريماس الياس:

@محمد عاطف17

ايضا هناك مشكلة اخرى المتغير incomes قمت بمشاركته بجميع الصفحات عم طريق مجلد appserviceprovider ولكنه لا يتم التعرف عليه عند الدخول للمسار التالي في المشروع 

http://127.0.0.1:8000/admin/subcategories

i.rar 134.74 MB · 4 تنزيلات

بخصوص مشكلة حفظ الصور في مجلد categories . إذا كان مقصدك هو حفظ المجلدات بداخل مجلد categories لتصبح المسارات هكذا :

C:\laragon\www\inspro\storage\app\public\categories\6

والصور المعدلة في المسار التالي 

C:\laragon\www\inspro\storage\app\public\categories\6\conversions

فيرجى إضافة الكود التالي بداخل ملف config\filesystems.php في disks :

        'media' => [
            'driver' => 'local',
            'root' => storage_path('app/public/categories'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
            'throw' => false,
        ],

وفي ملف app\Models\Category.php يرجى إستبدال الدالة registerMediaCollections بالتالي :

public function registerMediaCollections(): void
    {
        $this->addMediaCollection('categories') // تحديد اسم المجموعة 'categories'
        ->singleFile() // لضمان حفظ صورة واحدة فقط
        ->useDisk('media'); // حفظ الملفات داخل مجلد 'categories'
    }

وسيتم حفظ الصور كما في المسارات السابقة. ولقد قمت بإرفاق الملفين بعد التعديل.

أما إذا أردتي تغير المسارات الأساسية للملفات المعدلة والأساسية مثل تغير رقم ال id فيرجى قراءة التوثيق الرسمي مع مشاهدة الفيديو الموجود به وإنشاء مثل ما تم في الشرح :

 

Category.php filesystems.php

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...