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

Adnane Kadri

الأعضاء
  • المساهمات

    5129
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    51

كل منشورات العضو Adnane Kadri

  1. لا أظن أنه يوجد لوحة مدمجة و مدعومة من مطوري إطار العمل ضمن كل مشروع جديد , لكن هذا لا يمنع من تثبيت حزمة لوحة تحكم كاملة عن طريق مدير الحزم composer أو عن طريق تنزيلها و ضمها للمشروع أو ربما استعمال باني لذلك . أمثلة : لوحة تحكم من مجموعة spatie . ORCHID . SB Admin . laraadmin . يمكنك أيضا استعمال voyager لذلك , أو ربما بناء وتخصيص لوحة تحكم كاملة عن طريق backpack .
  2. لا يوجد أي تضارب بين النسخ الموصوفة . قد يحدث مشكل في حالة خطأ في تثبيت الحزم , في إضافتها للبوتستراب أو في ترتيب ملفات السكربتات ( الـ cdn ) مثل ما أشارت المدربة@Nuhla Almasri . وكونك قد استعملت webpack لتثبيت الحزم يجدر بك التأكد من أنك قد قمت بإضافة jQuery و Popper كـ peerDependencies بملف package.json . كما يمكنك ذلك عن طريق الأمر : npm install --save jquery popper.js بعد ذلك يمكنك تنزيل الـ bootstrap الذي يعتمد عليهما بشكل طبيعي عن طريق مدير الحزم npm . أما ان كنت قد قمت بتنزيل الحزمتين بشكل منفصل فيجب عليك طبعا إضافة هاته الأدوات إلى مصفوفة الـ plugins على هذا النحو : plugins: [ // ... new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', 'window.jQuery': 'jquery', Popper: ['popper.js', 'default'] }) // ... ] بحيث أن هذا سيقوم بتضمين الدوال و التوابع المصدرة عن ملفات Popper و jQuery و تعريفها بشكل عام , و بالتالي فسيتم إستعمالها من طرف البوتستراب بشكل عادي . كما يمكنك أيضا , وهو المقترح عمله طبقا للتوثيق الرسمي لبوتستراب , الإستعانة بهاته الحزمة في استيراد المكونات الإضافية بشكل فردي و منفصل . إن استمرت مشكلتك بالظهور يمكنك إرفاق ملفات المشروع حتى نقوم بمساعدتك بشكل أفضل .
  3. يحدث هذا لأنك تكتب الأمر بشكل خاطئ فالأمر .phar غير معرف ضمن composer . يمكنك تحديد اسم الحزمة و تثبيتها مباشرة : composer require intervention/image ستحتاج بعض الخطوات الإضافية لتثبت الحزمة بشكل صحيح و تام . 1 . تحتاج إلى إضافة موفر الخدمة ServiceProvider إلى مصفوفة الـ providers على هذا النحو : <?php 'providers' => [ Intervention\Image\ImageServiceProvider::class ], 2. تحتاج إضافة إختصار للواجهة Image على هذا النحو : <?php 'aliases' => [ 'Image' => Intervention\Image\Facades\Image::class ], 3. و لإستكمال تثبيت الحزمة ستحتاج نشر ملف الإعداد وفق الأمر التالي : php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravelRecent" ثم يمكنك إستعمال الحزمة بشكل عادي .
  4. عموما الكود نظيف , قد ينقصك تقسيم بعض المكونات الكبيرة إلى أخرى أصغر و تضمينها في كل دورة من الدور حتى تتجنب بعض المشاكل التي قد وقعت فيها , من مثل هاته : لاحظ أنك تقوم ببداية دور ثم تقوم بإنهاءه قبل إغلاق الوسوم داخل الدور : <?php while ($row = $result1->fetch_assoc()) { # بداية الدور ?> <!-- Starting form --> <div class="main-card mb-3 card"> <div class="card-body"> <h3 class="card-title"></h3> <div class="form-row"> <!-- خانة اسم القماش --> <!-- نهاية خانة اسم القماش --> <?php } # نهاية الدور ?> <div class="col"> </div> <div class="col"> </div> <div class="col-12"> </div> <div class="col-12"> </div> </div> </div> </div> سيبب لك هذا مشاكل عرض أو تداخلات في حالة عدم إرجاع الإستعلام لأي نتائج من قاعدة البيانات . عوضا عن هذا يمكنك عممل ذلك على هذا النحو : <?php while ($row = $result1->fetch_assoc()) { # بداية الدور ?> <!-- Starting form --> <div class="main-card mb-3 card"> <div class="card-body"> <h3 class="card-title"></h3> <div class="form-row"> <!-- خانة اسم القماش --> <!-- نهاية خانة اسم القماش --> <div class="col"> </div> <div class="col"> </div> <div class="col-12"> </div> <div class="col-12"> </div> </div> </div> </div> <?php } # نهاية الدور ?> ثم سيسهل التحكم في المكون بالصف main-card و تكراره كذا مرة . كما أنه يمكن كتابة هاته الأسطر : <select class="form-control s-des" required> <?php while ($row = $result2->fetch_assoc()) { echo '<option selected disabled value="' . $row['commName'] . '">' . $row['commName'] . '</option>'; } while ($row = $result3->fetch_assoc()) { echo '<option value="' . $row['id'] . '">' . $row['name'] . '</option>'; } ?> </select> على نحو أفضل : <select class="form-control s-des" required> <?php while ($row = $result2->fetch_assoc()) { ?> <option selected disabled value="<?php echo $row['commName']; ?>"> <?php echo $row['commName']; ?> </option> <?php } ?> <?php while ($row = $result3->fetch_assoc()) { ?> <option value="<?php echo $row['id'] ?>"> <?php echo $row['name']; ?> </option> <?php }; ?> ?> </select> (يمكنك إنشاء دالة عامة بسيطة تحمل اسما مختصرا (ليكن __ مثلا ) تقوم بطباعة البارمتر الممرر عبرها عوض كتابة echo كل مرة ) . لاحظ أيضا أن لديك وسم مفتوح في الأسطر الأخيرة : <div class="main-card mb-3 card"> <div class="card-body"> </div> <!-- زر الحفظ --> <div class="main-card mb-3 card"> </div> <!-- هنا --> و هنا أيضا : <div class="app-container app-theme-white body-tabs-shadow fixed-sidebar fixed-header"> <div class="app-main"> <div class="app-main__outer"> <div class="app-main__inner"> <div class="app-page-title"> </div> <!-- هنا --> <!-- هنا --> <!-- هنا --> <!-- هنا --> و قد لحظت نفس هذا الخطأ في أسئلتك السابقة أيضا , تأكد أن تقوم بإصلاحه في باقي الصفحات . كما أنه يمكنك التخلص من وسم الإغلاق هذا ﻷنه غير واضح و قد لا تتذكر لماذا وضعته بعد مدة : <?php // Modal color piker include("includes/commonfabric/color_piker_modal.html"); include("includes/footer.php"); require("js/commonfabric-js.php"); ?> </div> <?php include("includes/js.php"); بالتوفيق .
  5. ليكن في العلم أنه بعد ضم الجدولين عن طريق JOIN فأنت تقوم بضم كل سطر من الجدول 1 إلى السطر المرافق من الجدول 2 , بحيث أنه سيتم تحديد الترافق هذا عن طريق تساوي المفاتيح من الجدولين . الان و بعد عمل الضم على هذا النحو : SELECT common_cloth_composition.id AS CID, common_cloth_composition.ready AS readyId, commercial_description.id AS commID, commercial_description.name AS commName FROM common_cloth_composition INNER JOIN commercial_description ON common_cloth_composition.ready = commercial_description.id لاحظ أن هذا الإستعلام سيقوم بجلب كل الأسطر من الجدولين التي تتساوى فيها المفاتيح , يمكنك الان تصفية النتائج و إضافة شرط التساوي عن طريق WHERE : SELECT common_cloth_composition.id AS CID, common_cloth_composition.ready AS readyId, commercial_description.id AS commID, commercial_description.name AS commName FROM common_cloth_composition INNER JOIN commercial_description ON common_cloth_composition.ready = commercial_description.id WHERE common_cloth_composition.ready='127'
  6. لاحظ أنك تقوم بوصف فضاء الإسم namespace على نحو خاطئ : Route::apiResource('books', 'API\LibraryController'); و بطبيعة الحال فسيؤدي هذا إلى عدم التعرف على الصف . فالمفروض أن يكون كالتالي : <?php Route::apiResource('books', 'App\Http\Controllers\API\LibraryController'); كما يمكنك إستعمال هذا السياق : <?php use App\Http\Controllers\API\LibraryController; Route::apiResource('books', LibraryController::class);
  7. يحدث هذا لأن faker غير معرف أساسا كمتغير و من المفروض إستخدامه كنسخة من الكائن Faker . و للعلم فإنه قد تم تعريفه كخاصية في النسخ الأخيرة من لارافل و قد تم ضمه إلى الكائن Factory الذي ترث منه , فما عليك إلا إستعمال هاته الخاصية مباشرة عن طريق الكلمة المفتاحية $this على هذا النحو : $this->faker->numberBetween(1,50); كا أنه لا داعي من هذا السطر : \App\Models\Book::factory()->define; فأنت تقوم بالفعل بإرفاق المودل المرافق عن طريق الخاصية المحمية model . فيكون الكود كاملا : <?php namespace Database\Factories; use App\Models\Book; use Illuminate\Database\Eloquent\Factory; class BookFactory extends Factory { protected $model = Book::class; public function definition(){ return [ 'book_id' => $this->faker->numberBetween(1,50), 'title' => $this->faker->word ]; } }
  8. هل يمكنك ذكر اللغة او إطار العمل المراد بها إنشاء الدالة ؟
  9. يمكنك عمل ذلك عن طريق الخاصية overflow-x , تمكنك هاته الخاصية من التحكم في العناصر المتجاوزة على المحور الأفقي , فلإخفاءها على سبيل المثال يمكنك إعطاءها القيمة hidden لعنصر البودي على هذا النحو : body{ overflow-x: hidden; } سيقوم هذا بإخفاء كل الأجزاء من العناصر المتجاوزة على المحور الأفقي , شاملة تلك التي يزيد عرضها عن عرض الشاشة وهو السبب الأرجح في ظهور السكرول من بدايته.
  10. هل يمكنك توضيح سؤالك أكثر عن طريق إرفاق صورة عن الوضعية الموصوفة ؟
  11. هل يمكن رؤية ملف web.php لديك ؟ يبدوا أن المشكلة في تمرير أو ربما تسمية المتغيرات فقط
  12. كل الملفات سليمة . المشكلة في إستدعاء التابع factory في هذا السطر : Post::factory() ليكن في العلم أن هاته الدالة يتم توفيرها من قبل السمة HasFactory . تأكد فقط أن تضيفها إلى مودل المنشور Post على هذا النحو : <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; class Post extends Model { use HasFactory; // some code }
  13. يبدوا أن لديك خطأ في تسمية و إستدعاء أحد الـ Factories لاحظ أنه لا يوجد أي factory باسم PostFactory في حين أنه يوجد باسم PostfactoryFatory . للتخلص من المشكلة يرجى إصلاح التسمية و الإستدعاء من داخل الـ seeder على نحو صحيح . قم بإعادة تسمية الملف PostfactoryFatory إلى PostFactory و طبعا لا تنسى تغيير اسم الكلاس بالملف : <?php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; class PostFactory extends Factory { ... }
  14. تحميل صور بروفايل مخصصة في مكتبة jetstream في لارافل يحتاج منك تمكين هاته الميزة في ملف الإعداد config / jetstream.php الخاص بتطبيقك. لتمكين الميزة ، قم ببساطة بإلغاء تعليق الميزة profilePhotos من مصفوفة الميزات على هذا النحو : <?php use Laravel\Jetstream\Features; 'features' => [ Features::profilePhotos(), Features::api(), Features::teams(), ], بعد ذلك تحتاج إنشاء الرابط الرمزي للتخزين من جديد : php artisan storage:link و لا تنس محو التخزين المؤقت و إعادة تخزين ملف الإعداد : php artisan cache:clear php artisan config:cache
  15. يمكنك تخزين التوكن في التخزين المحلي بإستعمال التابع setItem ضمن localStorage لإستعماله في عمليات المصادقة , على هذا النحو : window.localStorage.setItem(key, value); كما يمكنك قراءته متى احتجت على هذا النحو : window.localStorage.getItem(key); مثال عن ذلك : const [Data, setData] = useState([]); const loginStudent = () => { axios .post('https://carna-test-app234/api/v2/login', { type: 3, method_type: 'email', email: 'student@app321.com', password: '123456', }) .then(res => { console.log(res.data); setData(res.data); // تخزين التوكن if(!! res.data.access_token) { window.localStorage.setItem('token', res.data.access_token); } }) .catch(err => console.log(err)); };
  16. هل تستعمل أي ملفات تنسيقات خارجية ضمن وسم الـ head ؟ قمت بمحاكاة الكود على جهازي ولم أواجه أي مشكلة . كما أنه يجب عليك تنظيف الكود و إعتماد كتابة أنظف أكثر حتى تتجنب أي التباس , قد يساعد هذا قراءة الكود و إتضاح المشاكل , كما أنه سيصبح من السهل التطوير و الإضافة عليه و في حالة الأخطاء سيتم تضييق الإحتماليات على عدد أقل بكثير . أمثلة : تقسيم بنية الملفات إلى css و js و تضمينها بالملف الرئيسي . تقسيم المكونات الكبيرة إلى مكونات أصغر يسهل تضمينها و التعامل معها و تطويرها . (من مثل : صف المورد في الجدول ) .
  17. لا حاجة لإستعمال المساعد asset في هاته الحالة , فعمل هذا المساعد يتلخص في إضافة المسار الكامل المرافق لملفات الـ assets بداخل مجلد الـ public و بطبيعة الحال فإن هذا لا يتضمن أي روابط خارجية أو cdn . لحل المشكلة و ظهور ملفات التنسيقات بشكل صحيح قم بتمرير الرابط ككل على هذا النحو : <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"> أو يمكنك تحميل الملف و وضعه بداخل مجلد public ثم إستدعاءه عن طريق المساعد asset على هذا النحو : <link href="{{ asset('font-awesome.min.css') }}" rel="stylesheet"> بحيث أن هذا سيتم ترجمته إلى هذا : <link href="http://your_domain.com/font-awesome.min.css" rel="stylesheet">
  18. لا علاقة لهذا الخطأ بمتغيرات البيئة , يحدث هذا عادة بسبب نسيان تمرير csrf ضمن طلبات الـ POST . يمكنك تمرير المتغير عن طريق إضافة الحقل ضمن نموذج المدخلات على هذا النحو : <form action="path/to/action" method="POST"> @csrf </form> أو : <form action="path/to/action" method="POST"> <input type="hidden" name="_token" value="{{ csrf_token() }}" /> </form>
  19. مرحبا أخي وعليكم السلام . أرجوا التدقيق جيدا فيما قلت سابقا . فالمشكلة أساسا ليست في غلق الوسوم و إنما هي في إمتلاك الحاويات للمودل للوضعية الثابتة أو النسبية . أما بالنسبة لحالة عدم غلق الوسم هي في أنها سيتم إعتبار الوسم المفتوح حاويا لما بعده و بالتالي ستقوم وضعيته الثابتة أو النسبية بالتأثير على ظهور الموديل. صحيح أنك تقوم بغلق الوسوم بالفعل و لكن يحدث ذلك بعد إحتواءها لعنصر المودل نفسه و هذا ما يعطل ظهورها بشكل طبيعي و يجلعها تتخذ السلوك السابق . فالحل هو إما إخراجها من العناصر التي تمتلك وضعية ثابتة أو نسبية . أو إزالة الوضعية الثابتة أو النسبية في العناصر الحاوية . العنصر الحاوي المقصود : <div class="app-container app-theme-white body-tabs-shadow fixed-sidebar fixed-header">
  20. و ذلك لأنه لا يوجد إلا مودل واحد و العديد من الأزرار التي تقوم بإظهار هذا المودل . يمكنك إنشاء مودل خاص بكل مورد عن طريق إدخال عنصر الـ modal داخل الدور while و تكراره كذا مرة . ليس هذا فقط , بل تحتاج أيضا تعريف كل مودل بمعرف id فريد و ربطه بالزر المرافق حتى تتم التفاعلية وفق المطلوب , قد نحتاج للـ id الخاص بالمورد القادم من قاعدة البيانات حتى نقوم بإنشاء معرف فريد خاص بكل مودل . و سيكون ذلك كفيلا بحل المشكل . مثال عملي : <?php //الاستعلام $result = $conn->query("SELECT * FROM supplier ORDER BY id DESC"); // تعريف المتغيرات while ($row = $result->fetch_assoc()) { //تعريف بنود التوريد $id = $row['id']; $factory = $row['facory']; $supplying_data = ' <select class="form-select form-select-lg mb-3" aria-label="بنود التوريد"> <option selected>افتح لمشاهدة بنود التوريد</option>'; if ($row['sFabric'] == "true") $supplying_data .= '<option>قماش</option> '; if ($row['sAcc'] == "true") $supplying_data .= '<option>اكسسوارات</option>'; if ($row['sCarton'] == "true") $supplying_data .= '<option>كرتون</option>'; if ($row['sLine'] == "true") $supplying_data .= '<option>خيوط</option>'; if ($row['sNeedle'] == "true") $supplying_data .= '<option>إبر حياكة</option>'; if ($row['sMac'] == "true") $supplying_data .= '<option>مكن</option>'; if ($row['sBag'] == "true") $supplying_data .= '<option>أكياس</option>'; $supplying_data .= '</select>'; //نهاية تعريف بنود التوريد //الجدول echo' <tr class="table-light" align="center"> <th scope="row">' . $row['id'] . '</th> <td >' . $row['facory'] . '</td> <td>' . $supplying_data . '</td> <td align="center"> <button class="btn btn-outline-primary m-auto mt-2 more" data-toggle="modal" data-target="#more_'.$row['id'].'">عرض المزيد</button> <!-- قم بوضع المودل هنا --> <div class="modal fade" id="more_'.$row['id'].'" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> </div> <!-- زر التعديل --> <a href="edit_supplier.php?id=' . $row['id'] . '" target="_blank"></a> <button type="button" class="btn btn-primary">تعديل</button> <!-- زر الحذف --> <button type="button" class="btn btn-danger">حذف</button> </td> </tr>'; } ?> و عوضا عن طباعة العناصر بإستعمال echo يمكنك كتابتها مباشرة كعناصر HTML هكذا : <?php //الاستعلام $result = $conn->query("SELECT * FROM supplier ORDER BY id DESC"); # بداية الدور while ($row = $result->fetch_assoc()) { $id = $row['id']; $factory = $row['facory']; //تعريف بنود التوريد $supplying_data = ' <select class="form-select form-select-lg mb-3" aria-label="بنود التوريد"> <option selected>افتح لمشاهدة بنود التوريد</option>'; if ($row['sFabric'] == "true") $supplying_data .= '<option>قماش</option> '; if ($row['sAcc'] == "true") $supplying_data .= '<option>اكسسوارات</option>'; if ($row['sCarton'] == "true") $supplying_data .= '<option>كرتون</option>'; if ($row['sLine'] == "true") $supplying_data .= '<option>خيوط</option>'; if ($row['sNeedle'] == "true") $supplying_data .= '<option>إبر حياكة</option>'; if ($row['sMac'] == "true") $supplying_data .= '<option>مكن</option>'; if ($row['sBag'] == "true") $supplying_data .= '<option>أكياس</option>'; $supplying_data .= '</select>'; //نهاية تعريف بنود التوريد //الجدول ?> <tr class="table-light" align="center"> <th scope="row"> <?php echo $row['id']; ?></th> <td ><?php echo $row['facory']; ?></td> <td> <?php echo $supplying_data; ?></td> <td align="center"> <button class="btn btn-outline-primary m-auto mt-2 more" data-toggle="modal" data-target="#more_<?php echo $row['id']; ?>"> عرض المزيد </button> <!-- قم بوضع المودل هنا --> <div class="modal fade" id="more_<?php echo $row['id']; ?>" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> </div> <!-- زر التعديل --> <a href="edit_supplier.php?id=<?php $row['id']; ?>" target="_blank"></a> <button type="button" class="btn btn-primary">تعديل</button> <!-- زر الحذف --> <button type="button" class="btn btn-danger">حذف</button> </td> </tr> <?php } # نهاية الدور ?> كما يمكنك إنشاء ملف خارجي بإسم supplier_row و تضمينه في الدور ليتم إنشاءه كذا مرة وفق البيانات المعطاة على هذا النحو : سيحمل الملف supplier_row المحتويات التالية : <?php $id = $row['id']; $factory = $row['facory']; //تعريف بنود التوريد $supplying_data = ' <select class="form-select form-select-lg mb-3" aria-label="بنود التوريد"> <option selected>افتح لمشاهدة بنود التوريد</option>'; if ($row['sFabric'] == "true") $supplying_data .= '<option>قماش</option> '; if ($row['sAcc'] == "true") $supplying_data .= '<option>اكسسوارات</option>'; if ($row['sCarton'] == "true") $supplying_data .= '<option>كرتون</option>'; if ($row['sLine'] == "true") $supplying_data .= '<option>خيوط</option>'; if ($row['sNeedle'] == "true") $supplying_data .= '<option>إبر حياكة</option>'; if ($row['sMac'] == "true") $supplying_data .= '<option>مكن</option>'; if ($row['sBag'] == "true") $supplying_data .= '<option>أكياس</option>'; $supplying_data .= '</select>'; //نهاية تعريف بنود التوريد ?> <tr class="table-light" align="center"> <th scope="row"> <?php echo $row['id']; ?></th> <td ><?php echo $row['facory']; ?></td> <td> <?php echo $supplying_data; ?></td> <td align="center"> <button class="btn btn-outline-primary m-auto mt-2 more" data-toggle="modal" data-target="#more_<?php echo $row['id']; ?>"> عرض المزيد </button> <!-- قم بوضع المودل هنا --> <div class="modal fade" id="more_<?php echo $row['id']; ?>" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> </div> <!-- زر التعديل --> <a href="edit_supplier.php?id=<?php $row['id']; ?>" target="_blank"></a> <button type="button" class="btn btn-primary">تعديل</button> <!-- زر الحذف --> <button type="button" class="btn btn-danger">حذف</button> </td> </tr> ثم تضمين الملف بالملف الرئيسي على هذا النحو : <?php $result = $conn->query("SELECT * FROM supplier ORDER BY id DESC"); while ($row = $result->fetch_assoc()) { include('supplier_row.php'); } ?> تحديث : قد يحدث بعض التداخل كونك تستعمل الدور داخل جدول بالفعل من جهة و تستعمل وسوم جداول من مثل tbody و theader داخل عنصر المودل , للتخلص من هذا التداخل قم بإستبدال الوسوم الخاصة بالجدول داخل المودل بوسوم تقسيمات عادية div , ولا بأس بترك الكلاسات مثل ما هي حتى لا تخسر التنسيق أو تضطر إلى إعادته .
  21. الظاهر أن خلفية المودل modal-backdrop تظهر فوق المودل modal نفسه . يحدث هذا السلوك عادة بسبب إمتلاك الحاوي لعنصر المودل الوضعية الثابتة fixed أو النسبية relative لذلك ينصح دوما بوضع المودل قبل وسم إغلاق الـ body مباشرة لتجنب هاته المشكلة أو التأكد من إمتلاك كل الحاويات لعنصر المودل الوضعية الإفتراضية . لكن في هاته الحالة ألحظ أنه يوجد بعض الوسوم المفتوحة التي لم يتم إغلاقها . في هاته الحالة تم إعتبارها كحاويات لما بعدها من عناصر مفتوحة أو مغلقة متضمنة المودل نفسه . لاحظ : <div class="app-container app-theme-white body-tabs-shadow fixed-sidebar fixed-header"> <div class="app-main"> <div class="app-main__outer"> <div class="app-main__inner"> <div class="app-page-title"> </div> # < < < من المفروض وجود وسم إغلاق # < < < من المفروض وجود وسم إغلاق # < < < من المفروض وجود وسم إغلاق # < < < من المفروض وجود وسم إغلاق <table class="table table-primary table-bordered" dir="rtl"> ... </table> لاحظ أيضا أن الحاوي الأول (عدم إغلاقه سيجعله حاويا لكل الوسوم المغلقة أو المفتوحة بعده) يملك الوضعية الثابتة بسبب الصفوف fixed-header و fixed-sidebar و هذا غالبا ما أدى إلى ظهور المشكلة . فحل المشكلة ببساطة هو في إغلاق الوسوم المفتوحة . إذ لم يكن هذا كفيلا بحل المشكلة يمكنك إعادة ترتيب العناصر على المحور Z عن طريق الخاصية z-index . فعندما تتداخل العناصر يمكن عن طريق تحديد قيمة هذه الخاصية تحديد ما هو العنصر الذي سيظهر أعلى بقية العناصر . يمكنك إعطاء العنصر بالصف modal-backdrop قيمة أقل : .modal-backdrop { z-index: -1; }
  22. أفهم أنك تريد إعادة إعداد الترتيب التلقائي بعد حذف أي صف في قواعد البيانات . مثلا : | id | name | | -- | ---- | | 1 | jhon | | 2 | hsoub| | 3 | ahmed| | 4 | ola | | 5 | walid| ثم قمت بحذف الصفين باﻷسماء jhon و hsoub تكون الصفوف مرتبة كالتالي : | id | name | | -- | ---- | | 1 | ahmed| | 2 | ola | | 3 | walid| طبعا يمكنك إعادة الترتيب بعد كل حذف على هذا النحو : ALTER TABLE products AUTO_INCREMENT=1; غير أن هذا اﻷمر أو أي تعديل ثان على صف المعرف غير مقترح عمله ﻷن أي تعديل بالمعرف الخاص بالصف سيؤدي إلى خرب علاقاته مع الجداول الأخرى ,كما أن هذا لن يقوم بترتيب الصفوف اعتبارا للصفوف التي تم حذفها , وإنما يقوم بتجنيبك مشكلة إدراج صفوف جديدة بترتيبات قد تم حذفها بالفعل (مثال : قمت بحذف الصف الأخير بالترتيب 6 , أريد من الصف التالي أن يأخذ الترتيب 6 لا 7 ) . عوضا عن ذلك يمكنك قراءة البيانات بشكل عادي من قاعدة البيانات دون أي تعديل عليها , ثم على مستوى الـ PHP سيتم إضافة عمود ترتيبي لقراءة الصفوف مرتبة بدون المساس بالمعرف id أو أي صف ثان . سيكون الأمر مشابها للتالي : نقوم بجلب كل المنتجات (مثلا) من قواعد البيانات و نضيف لكل صف رقما مميزا مرتبا على هذا النحو : <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "db"; // إنشاء إتصال $conn = new mysqli($servername, $username, $password, $dbname); // التحقق من الإتصال if ($conn->connect_error) { die("فشل الإتصال :" . $conn->connect_error); } // إنشاء إستعلام $sql = "SELECT * FROM products"; // تنفيذ الإستعلام $result = $conn->query($sql); $products = []; if ($result->num_rows > 0) { // إضافة عمود مرتب لكل صف $i = 1; while($row = $result->fetch_assoc()) { $row['special_number'] = $i; array_push($products ,$row); $i++; } } // => return $products // إغلاق الإتصال $conn->close(); ?> لاحظ أن العملية مرنة أكثر من تعديلك لصف معين بقاعدة البيانات بعد كل تعديل على أي صف . فيمكنك تعديل بداية الترتيب و التحكم فيه , كما أنه أيضا يمكنك التحكم في ترتيب الصفوف التي جلبها من قاعدة البيانات عن طريق الإستعلام ORDER BY .
  23. مرونة لارافل , و البرمجة الخاصة بشكل أعم , تجعل طرق تحقيق نفس غرض الـ shortcodes مثل ما في الوردبرس كثيرة و شاسعة , و لعل من أبسط الطرق : عن طريق تخصيص توابع الـ blade أو كما تسمى الـ blade directives ( في حالة الإستعمال في ملفات blade فقط ): نقوم بتعريف التوابع بملف BladeServiceProvider.php بداخل مجلد App/Providers بداخل الدالة boot على هذا النحو : (قد تحتاج لإنشاء Provider بنفس الإسم إن لم يكن الملف موجودا . يمكنك ذلك عن طريق الأمر : php artisan make:provider BladeServiceProvider ) . <?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class BladeServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return string */ public function boot() { // video Blade::directive('video', function ($expression) { return '<video width="320" height="240" controls> <source src="'.$expression.'" type="video/mp4"> </video>'; }); // audio Blade::directive('audio', function ($expression) { return '<audio controls> <source src="'.$expression.'" type="audio/ogg"> </audio>'; }); } /** * Register any application services. * * @return void */ public function register() { // } } ثم يمكن إستعمال أي لاحقة أو أي shortcode بملفات الـ blade عن طريق : @video('path/to/video.mp4') @audio('path/to/audio.mp3') 2. عن طريق تعريف واجهة تحمل الدوال المسؤولة عن اختصار الكود : نقوم بإنشاء مجلد واجهات Facades بداخل مجلد App و ننشئ به ملف Shortcodes.php ليحمل المحتوى التالي : <?php namespace App\Facades; class Shortcodes { /** * create video from a given source. * * @return string */ public static function video($source) { return '<video width="320" height="240" controls> <source src="'.$source.'" type="video/mp4"> </video>'; } /** * create audio from a given source. * * @return string */ public static function audio($source) { return '<audio controls> <source src="'.$source.'" type="audio/ogg"> </audio>'; } } ثم يمكن إستدعاءه من أي مكان في التطبيق عن طريق : <?php echo App\Facades\Shortcodes::video('path/to/video.mp4'); echo App\Facades\Shortcodes::audio('path/to/audio.mp3'); كما يمكنك تعريف مكافئ بملف app.php لإستدعاء أنظف : <?php 'aliases' => [ ........ 'Shortcode'=> App\Facades\Shortcodes:class, ] ثم يتم الإستدعاء هكذا : <?php echo \Shortcode::video('path/to/video.mp4'); echo \Shortcode::audio('path/to/audio.mp3'); 3. إن كانت حاجتك للـ shortcodes حاجة لتلخيص أكواد الـ html فقط فيمكن تعريفها كملفات blade و تضمينها كمكونات . على سبيل المثال : نقوم بإنشاء مجلد components بداخل مجلد views . نقوم بإنشاء ملف video.blade.php و يكون محتواه كالتالي : <video width="320" height="240" controls> <source src="{{ $source }}" type="video/mp4"> </video> ثم نقوم بإستدعاءه من ملفات الـ blade الأخرى عن طريق تضمينه وتمرير المتغير source معه : @include('components/video' ,['source' => 'path/to/video.mp4']) أو يمكن أيضا تعريفها عن طريق مساعد helper بشكل globally و إستعماله بأي مكان من أجزاء التطبيق مثل ما اقترح المدرب@محمد أبو عواد. فكل الطرق تحقق نفس الغرض و تقوم بمثل عمل الـ shortcodes بالوردبرس . و بنفس الطريقة يمكنك أيضا معاملة الـ shortcodes الأخرى الخاصة بالوردبرس من مثل embed , gallery , playlist و caption بنفس المنطق و إنشاء دوال مكافئة تختصر عملها و يسهل إستدعاءها من أي مكان من التطبيق , و لعلها فكرة جميلة تجعل الكود أنظف و أسهل من ناحية التحكم .
  24. يوجد الكثير من الإستضافات التي تقدم خدمة الإستضافة المجانية بمميزات مختلفة نذكر من بينها : إستضافة Firebase من Google : بجانب Google Cloud تقدم غوغل خدمة Firebase للإستضافات , لعل من أفضل ميزاتها أنها تسمح لك بإضافة بحجز نطاق مدفوع و ربطه مع موقعك , كما أنها دائمة و ليست مؤقتة كبعض الإستضافات المجانية الأخرى , قد تكون أفضل خيار لك في حالة ما احتجت رفع الـ API الخاص بموقعك. إستضافة 00webhost , تابعة لمنصة hostinger . رغم مميزاتها العديدة إلا أني لا أفضلها على غيرها . فهي تقوم بوضع علامة الإستضافة على كل صفحات الموقع و هو شيء ليس بالإحترافي في حالة عرض العمل بمعرض الأعمال . إستضافة Heroku , و لعلها الأفضل على الإطلاق . بحيث توفر cli يسهل به إدارة ملفات الموقع كما توفر نظام إدارة نسخ version control system أي أنك تستطيع التحكم بموقعك عن طريق أوامر الـ git , و هي جد مناسبة في حالة تطبيقات اللارافل فهي توفر الكثير من الـ add-ons التي تناسب تطبيقك .كما أنه يمكن ربط موقعك بمستودع على الغيت هب و تفعيل التحديث التلقائي عليها . وهذا بجانب أنك تستطيع إضافة نطاقك الخاص و ربطه مع الموقع . إستضافة infinity free , و رغم أني لا أحبذ إستعمالها إلا أنها واحدة من أفضل الإستضافات . إستضافة Free hosting , بحيث تقوم بتوفير خطط إستضافة مجانية تتضمن مساحة 10GB و هو شيء لا تقدمه الإستضافات الأخرى , رغم أنها تطلب إمتلاك نطاق مدفوع مسبقا . أما و الشيء الأسوء على الإطلاق هو اقتطاع الاستضافة من حسابك في حالة تجاوزك للحد الشهري المطلوب و هذا دون مراجعتك بهذا الأمر .
×
×
  • أضف...