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

لوحة المتصدرين

  1. Sam Ahw

    Sam Ahw

    الأعضاء


    • نقاط

      9

    • المساهمات

      1388


  2. بلال زيادة

    بلال زيادة

    الأعضاء


    • نقاط

      7

    • المساهمات

      4657


  3. Wael Aljamal

    Wael Aljamal

    الأعضاء


    • نقاط

      6

    • المساهمات

      6975


  4. سمير عبود

    سمير عبود

    الأعضاء


    • نقاط

      5

    • المساهمات

      3560


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 03/16/21 in أجوبة

  1. يوجد طريقتين لإتاحة الصلاحيات على المشروع: إما أن يتم منح الصلاحيات للخادم، وهي الطريقة المفضلة عند أغلب المبرمجين وأيضاً التي ينصح بها التوثيق الرسمي للارافيل. فمثلاً باعتبار www هو الخادم يمكننا منح صلاحيات الكتابة كالتالي: sudo chown -R www-data:www-data /path/to/your/laravelproject وبذلك يمتلك خادم الويب جميع الملفات ضمن مجلد المشروع، وهنا ستواجه بعض المشاكل في حال كنت تستخدم FTP من طرف المستخدم لأنه الاتصال عبر FTP سيكون مسجل دخول وبدوره لا يملك الملفات الموجودة ضمن المشروع. لذلك يجب عليك بعدها إضافة المستخدم إلى نفس المجموعة التي تحوي الخادم كالتالي: sudo usermod -a -G www-data ubuntu وبعدها يمكن إعطاء الصلاحيات على الملفات جميعها كالتالي: sudo find /path/to/your/laravelproject -type f -exec chmod 644 {} \; وصلاحيات المجلدات: sudo find /path/to/your/laravelproject -type d -exec chmod 755 {} \; أما الطريقة الثانية، فهي عن طريق منح الصلاحيات للمستخدم نفسه. والذي يسهّل آلية العمل عن طريق منح الصلاحيات مباشرةً للمستخدم. ولتنفيذ ذلك أولاً نتوجه إلى مسار مجلد المشروع: cd /var/www/html/laravelproject ثم نقوم بتنفيذ الأمر التالي: sudo chown -R $USER:www-data . ثم نقوم بإعطاء الصلاحيات للمستخدم على الملفات والمجلدات: sudo find . -type f -exec chmod 664 {} \; sudo find . -type d -exec chmod 775 {} \; وأخيراً، يجب أيضاً إعطاء الصلاحيات للقراءة والكتابة على storage و cache ضمن لارافيل كالتالي: sudo chgrp -R www-data storage bootstrap/cache sudo chmod -R ug+rwx storage bootstrap/cache
    2 نقاط
  2. يجب أولاً تحميل المكتبة عن طريق npm كالتالي: npm install vuetify إضافة السطر التالي في تروسية ملف /resources/views/app.blade.php لكي يتم التعرف على الأيقونات الخاصة ب vuetify: <link href="https://cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" rel="stylesheet"> ثم في ملف /resources/js/app.js نضيف التالي فقط: import Vuetify from 'vuetify'; import 'vuetify/dist/vuetify.min.css'; Vue.use(Vuetify) مع التأكد بإضافتهم بعد Vue الأساسية بحيث يصبح شكل الملف كالتالي: require('./bootstrap'); import Vue from 'vue'; import Vuetify from 'vuetify'; import { InertiaApp } from '@inertiajs/inertia-vue'; import { InertiaForm } from 'laravel-jetstream'; import PortalVue from 'portal-vue'; import 'vuetify/dist/vuetify.min.css'; Vue.mixin({ methods: { route } }); Vue.use(InertiaApp); Vue.use(InertiaForm); Vue.use(PortalVue); Vue.use(Vuetify) const app = document.getElementById('app'); new Vue({ vuetify: new Vuetify(), render: (h) => h(InertiaApp, { props: { initialPage: JSON.parse(app.dataset.page), resolveComponent: (name) => require(`./Pages/${name}`).default, }, }), }).$mount(app); ويجب أيضاً التأكد من ملف webpack.mix.js أنه يحوي vuetify loader كالتالي: const mix = require('laravel-mix') const VuetifyLoaderPlugin = require('vuetify-loader/lib/plugin') mix .js('resources/js/app.js', 'public/js') .webpackConfig({ plugins: [ new VuetifyLoaderPlugin() ], }) .browserSync('tb8.test');
    2 نقاط
  3. تحتاج إلى التعديل على ملف الإعدادات env. لكن أولا قم بتنفيذ الأمر: docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name_or_container_ID> سيقوم الأمر بإرجاع عنوان IP لل mysql container ستقوم بنسخه ووضعه في ملف env. DB_HOST=<ip_address_returned> بعد ذلك قم بتنفيذ امر التهجير: sail artisan migrate
    2 نقاط
  4. لا لا تقف عليك ان تواصل ما بدأته من اللارافيل حتى لا تقطع حبل افكارك و لربما عندما تعود إلى اللارافيل من جديد ستحتاج إلى أن تبدأ من الصفر لأنك حتى الان لم تقم بتثبيت ما تعلمته من خلال التطبيق العملي بصورة كافية هذا بالاضافة إلى أنه بما أنك وصلت إلى الviews فهذا يعني أنك تمتلك اساساً جيداً في لغة php ولست بحاجة إلى العودة إلى الأساسيات لذلك قم بمتابعة اللارافيل حتى النهاية ثم بعد ذلك يمكنك العودة الى التحديث الجديد.
    2 نقاط
  5. فهمونا كيف يتم العمل عبر النت .. وكيف استلام المبالغ المحصلة
    1 نقطة
  6. مشكلة في تشغيل ملفات إدارة المحتوى عند تنزيله , تطلع لي هذي الرسالة ماهي المشكلة وايش حلها بالتفصيل لان جربت بعض افادات الاخوة ولم تظبط معي , وجزاكم الله خير.
    1 نقطة
  7. كيف أستطيع تشغيل المشروع بلارافيل في حال كنت سأقوم بوضع الموقع على استضافة مشتركة؟ وبما أنه ليس لدي وصول إلى خادم الويب ولا أستطيع تشغيل الأوامر اللازمة. لقد حاولت تغيير المسار ليقوم بالقراءة من داخل ملف public وحاولت تعديل ملف .htaccess بالشكل التالي: <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule> ولكن إما لا يظهر الموقع كلياً، أو أحصل على الخطأ التالي: NotFoundHttpException in compiled.php line 7610
    1 نقطة
  8. كيف يُمكن إنشاء متغير داخل ملف Blade جربت التالي: {{ $old_section = "whatever" }} لكن هذا يقوم بطباعة whatever أنا أعلم أنه يُمكن كتابة: <?php $old_section = "whatever"; ?>
    1 نقطة
  9. في الإصدارات من 5.5 فما فوق يُمكن إستخدام التوجيه php و تعريف المتغيرات فيه أو إجراء تعلميمات php بداخله بهذا الشكل: @php $i = 1 @endphp او: @php ($i = 1) أما في الإصدارات الأقدم يُمكنك عمل التالي: {{-- */$i=0;/* --}} أو بإستخدام توجيه if بالشكل التالي: @if ($variable = 'any data') @endif ثم عند الإستخدام: {{ $variable }}
    1 نقطة
  10. يمكن تعريف متغير في Blade PHP Block بالطريقة التالية: @php $hello = "Hello World!"; @endphp وهي تشبه الطريقة التي تقوم PHP بتعريف المتغيرات فيها أي الحالة العادية General PHP Block لكن يختلف شكل الوسم وللوصل للمتغير يمكن من خلال: {{$hello}} طرق أخرى .. @set($var, 10) @set($var2, 'some string') @section('someSection') {{ $yourVar = 'Your value' }} @endsection @php($old_section = "whatever")
    1 نقطة
  11. أرغب في الحصول على قيمة من خلال SQL التالي باستخدام Eloquent ORM: SELECT COUNT(*) FROM (SELECT * FROM abc GROUP BY col1) AS a; فكرت في الطريقة التالية: $sql = Abc::from('abc AS a')->groupBy('col1')->toSql(); $num = Abc::from(\DB::raw($sql))->count(); print $num; ماهي الطريقة الصحيحة لفعل ذلك؟
    1 نقطة
  12. في الإصدارات الحديثة من 5.5 فما فوق أصبح بالإمكان عمل التالي: Abc::selectSub(function($q) { $q->select('*')->groupBy('col1'); }, 'a')->count('a.*'); أو: Abc::selectSub(Abc::select('*')->groupBy('col1'), 'a')->count('a.*');
    1 نقطة
  13. يمكننا عمل جدول فرعي يحوي الاستعلام المطلوب ثم نقوم بالاستعلام منه عن طريق الدالة mergeBindings أي يصبح الاستعلام بالشكل التالي: $count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) ->mergeBindings($sub->getQuery()) // يمكنك هنا تحديد الاستعلام ->count(); ولكن بطريقة اسهل من إصدار Laravel v5.6.12 أضيفت دالتين ()fromSub() and fromRaw لباني الاستعلامات حيث أصبح بالامكان جلب البيانات من الاستعلامات الجزئية مباشرة: DB::query()->fromSub(function ($query) { $query->from('abc')->groupBy('col1'); }, 'a')->count(); | Abc::selectSub(Abc::select('*')->groupBy('col1'), 'a')->count('a.*'); حيث أصبح هذه الطريقة الأفضل.
    1 نقطة
  14. إن السبب في ذلك هو بعض التغييرات التي طرأت على النسخة الثامنة في لارافيل. ففي النسخ السابقة من لارافيل، مزود خدمة المسارات RouteServiceProvider موضوع ضمن $namespace بشكل افتراضي، أما في نسخة لارافيل 8 فقيمتها الافتراضية هي null لكي تتيح للمبرمج من تعريف الاسماء الخاصة به. لذلك يجب عليك استخدام المسار الكامل ضمن التعريف عند عدم استخدام namespace محدد، كالتالي: use App\Http\Controllers\UserController; Route::get('/users', [UserController::class, 'index']); // أو Route::get('/users', 'App\Http\Controllers\UserController@index'); أما في حال كنت ترغب باعتماد الطريقة القديمة (الموجودة في الإصدارات السابقة من لارافيل) يجب عليك تعديل الملف App\Providers\RouteServiceProvider وإضافة namespace ضمن التابع boot كالتالي: public function boot() { Route::prefix('api') ->middleware('api') ->namespace('App\Http\Controllers') // <--------- نضيفها هنا ->group(base_path('routes/api.php')); } ولكن في حال كنت تستخدم نسخة أحدث من لارافيل 8.0.2 فأتاحت لك سهولة تنفيذ السابق عن طريق تعليق السطر التالي فقط: // protected $namespace = 'App\\Http\\Controllers'; وبذلك تعود لنفس الاستخدام كما هو في الإصدارات الأقدم من الإصدار رقم 8.
    1 نقطة
  15. يمكن تغيير اسم الملف server.php والموجود في جذر المشروع إلى الاسم index.php ثم نسخ الملف htaccess من داخل مجلد public أيضاً إلى المجلد الرئيسي (الجذر) للمشروع. ولكن هذه الطريقة ليست الأفضل كونها تسمح ببعض الخروقات الأمنية، لأنها تسمح للمخترقين بالوصول إلى معلومات حساسة مثل المعلومات الموجودة ضمن الملف .env ولها أيضاً بعض العيوب الأمنية الأخرى. بدلاً من ذلك، يمكن إنشاء ملف جديد htaccess ضمن المجلد الرئيسي للمشروع أي بجانب الملف server.php ووضع بداخله التالي: RewriteEngine On RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(.*)$ /public/$1 [L,QSA] والذي بدوره سيقوم بإعادة كتابة جميع URIs إلى المجلّد public حتى الترويسات التي يتم استقبالها على سبيل المثال authorization headers والمتغيرات الأخرى.
    1 نقطة
  16. هل هناك لغة تجمع بين تطوير مواقع الويب و برامج الجوالات ؟ وماهي اللغة الأنسب لها ؟ ومن الأسهل في التعلم من بين هذه اللغات ( جافا سكربت , بايثون , سي شارب ) ؟
    1 نقطة
  17. ربما يعود سبب هذه المشكلة لعدم حذف ملفات التخزين المؤقت cache عند رفع المشروع على الاستضافة فلا يتم التعرف على المسارات بشكل صحيح ولحل المشكلة يجب تنفيذ التعليمات التالية: php artisan composer dump-autoload php artisan config:cache php artisan config:clear php artisan cache:clear php artisan route:clear ___ php artisan optimize:clear ___ php artisan clear-compiled php artisan optimize php artisan cache:clear حسب نسخة لارافيل وفي حال عدم وجود ملف المكتبات vendor يحب تنفيذ: php artisan install ولكن ربما تكون مشكلة صلاحيات بسبب تغير الحاسوب/المستخدم فنقوم بالتالي: sudo chown -R www-data storage sudo chgrp -R www-data storage sudo chmod -R 775 storage
    1 نقطة
  18. يختلف حل هذه المشكلة تبعاً لاختلاف نظام التشغيل أو البيئة التي يتم الاتصال عبرها وتنفيذ الأوامر، ولكن من الحلول المقترحة. فقد تظهر نتيجة عدم التمكن من تحديد الاتصال ضمن ملف .env وذلك بسبب تحديد بيئة مغايرة أثناء التطوير عن البيئة الحالية وبذلك يمكن تنفيذ الأمر التالي: php artisan migrate --env=production وبذلك سيتم أخذ قيم المتغيرات بشكل صحيح من ملف .env في حال كانت للنشر production. من إحدى الحلول أيضاً هو بتغيير قيمة DB_HOST من localhost إلى 127.0.0.1 والسبب في ذلك هو أن localhost يستخدم UNIX socket، أما 127.0.0.1 يستخدم TCP وهو Transmission Control Protocol والذي يجري عبر الانترنت. في حال لم تجدِ الطرق السابقة نفعاً، يمكن أن يكون ذلك بسبب اعتماد نسخة قديمة من mysql، ولذلك يجب التأكد من الإعدادات الموجودة عن طريق الدخول إلى خادم قواعد البيانات mysql و إجراء الأمر التالي: show variables like '%sock%' ثم أخذ القيمة التالية التي ستظهر نتيجة تنفيذ الأمر: /tmp/mysql.sock ثم التوجه إلى ملف database.php في مشروع لارافيل ووضع القيمة ضمن اتصال mysql كالتالي: 'mysql' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'SchoolBoard', 'username' => 'root', 'password' => 'venturaa', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'unix_socket' => '/tmp/mysql.sock', ),
    1 نقطة
  19. تشير رسالة الخطأ إلى أنه تمت تجربة اتصال MySQL عبر Socket (وهو أمر غير مدعوم). يمكنك استخدام بيئة مختلفة و تنفيذ الأمر التالي php artisan migrate --env=production يمكنك في Laravel 5 من تغيير قيمة DB_HOST في ملف .env من localhost إلى 127.0.0.1
    1 نقطة
  20. هل يمكن ان يتعلم الشخص اللغة بايثون بدون الانجليزية
    1 نقطة
  21. لتعلم أي لغة برمجة ليس عليك أن تكون متفوق في اللغة الانجليزية, ولكن يكفي أن تعرف المصطلحات التي تستخدم في علم البرمجة, ولكن هذا لا يعني الابتعاد تماما عن تعلم اللغة الانجليزية, حيث أن تعلمها يساعد كثيرا في توسيع سوق العمل الخاص بك ويزيد من فرص حصولك على الوظائف والمشاريع في مواقع العمل الحر فمن خلالها تستطيع مخاطبة العالم بأكمله وليس دول محددة فقط, تستطيع تعلمها بالتوازي مع تعلمك لغة بايثون.
    1 نقطة
  22. الإنجليزية ليست شرطاً من شروط تعلم اي لغة من لغات البرمجة حيث أن الاكواد التي تراها ليست عبارة عن لغة إنجليزية وإنما هي مجموعة من الكلمات المحجوزة و التي هي بمثابة المصطلحات التي يتعين عليك معرفتها و معرفة طريقة كتابتها بصورة صحيحة ولكن مع ذلك فإن تعلم اللغة الإنجليزية سيكون مفيداً لك للإطلاع على اوراق العمل التي ينشر غالبها باللغة الإنجليزية او قراءة كتب البرمجة التي تكتب باللغة الإنجليزية فهي مجرد عامل مساعد وليست شرطاً لتعلم لغات البرمجة.
    1 نقطة
  23. إن كل اتصال مع قاعدة بيانات في لارافيل يلزمه الخصائص التالية ضمن ملف .env: DB_CONNECTION=mysql نوع قاعدة البيانات DB_HOST=127.0.0.1 المضيف إما محلي أو خادم خارجي DB_PORT=3306 المنفذ DB_DATABASE=database1 اسم قاعدة البيانات DB_USERNAME=root اسم المتسخدم DB_PASSWORD=pass كلمة المرور ولذلك يمكن تكرارها عند كل تعريف لقاعدة بيانات. أما بالنسبة لاستخدام الاتصال فبالإضافة لما تم شرحه في التعليق السابق، يمكنك عن طريق Eloquent المقدّمة من لارافيل تعريف الاتصال، فمثلاً في حال وجود model ترغب باستخدامه دائماً مع اتصال محدد أو قاعدة بيانات محددة، فلا داعي لتكرار ذكر عملية الاتصال في كل مرة ستقوم باستخدامه، يكفي وضع $connection في Eloquent ضمن المودل الخاص بك وذلك سيضمن إبقاء الاتصال نفسه، كالتالي: class SomeModel extends Eloquent { protected $connection = 'mysql2'; }
    1 نقطة
  24. اشتغلت معي الله يعطيك الف الف عافيه
    1 نقطة
  25. يمكنك ذلك من خلال وضع الأكواد التالية في ملف .env DB_CONNECTION_SECOND=mysql DB_HOST_SECOND=127.0.0.1 DB_PORT_SECOND=3306 DB_DATABASE_SECOND=database2 DB_USERNAME_SECOND=root DB_PASSWORD_SECOND= فلاحظ جيدا اننا قمنا بتعريف متغيرات لقاعدة بيانات أخرى, ثم في مسار config/database.php نقوم بوضع 'mysql2' => [ 'driver' => env('DB_CONNECTION_SECOND'), 'host' => env('DB_HOST_SECOND'), 'port' => env('DB_PORT_SECOND'), 'database' => env('DB_DATABASE_SECOND'), 'username' => env('DB_USERNAME_SECOND'), 'password' => env('DB_PASSWORD_SECOND'), ], تحت mysql بحيث يكون هذا يكون معلومات الاتصال بقاعدة البيانات الأخرى. يمكنك صنع جدول لقاعدة البيانات عبر Schema بحيث نعرف Schema::connection لقاعدة البيانات الأخرى مثل Schema::connection('mysql2')->create('users_two', function($table) { $table->increments('id'): }); يمكنك استخدام Query Builder بهذا الشكل $posts = DB::connection('mysql2')->select(); ايضا يمكنك توجيه Model إلى استخدام قاعدة الاتصال الثاني الخاص بقاعدة البيانات الثانية باستخدام protected $connection = 'mysql2'; ايضا يمكنك في Controller استخدام الشكل التالي : public function index() { $post = new Post; $post->setConnection('mysql2'); $something = $post->find(1); $get_posts = Post::on('mysql2')->find(1); return $get_posts; }
    1 نقطة
  26. هنا يجب استخدام inner join كي تستطيع جلب أخر رسالة لكل عضو فمثلا: SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name; طبعا inner join مقصود بها الربط الداخلي تستخدم لربط جدولين أو اكثر وذلك لتحديد بعض السجلات من الجداول المترابطة مع بعضها, ويمكن استخدامها بعدة صيغ حسب ما تريد الاستعلام عنه, ففي حالتك فلنفترض ان جدول الأعضاء اسمه users وجدول الرسائل اسمه messages فتكون إلية الربط بينهم باستخدام inner join هكذا. SELECT m.msg, u.name FROM messages m INNER JOIN users u ON m.recipient_id = u.id فلاحظ أننا استخدمنا اسماء مستعارة للجداول فجدول users قمنا بإعطائه الاسم المستعار u و جدول messages قمنا بإعطائه الاسم المستعار m و قمنا في الاستعلام السابق بجلب نص الرسالة مع اسم العضو الذي قام بارسالها وقمنا بالتعويض عن اسم الجدول باسمه المستعار.
    1 نقطة
  27. في هذا الكود ابسط طريقة وهي إذا لا تريد أحداث تغييرات في الكود يمكنك إضافة limit. <?php $stmt = $db->prepare('SELECT * FROM messages WHERE recipient_id = ? Order By id desc'); $stmt->bind_param('i', $_SESSION['id']); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ; } $stmt->close(); ?> يصبح <?php $stmt = $db->prepare('SELECT * FROM messages WHERE recipient_id = ? Order By id desc limit 1'); $stmt->bind_param('i', $_SESSION['id']); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ; } $stmt->close(); ?> في الكود الثاني ممكن تغيير الشرط بحيث يصبح OR و ليس And . ولكن يتم التحديد ومساعدتك بشكل أفضل إذا أرفقت مجلد المشروع كاملا. هنا يتم استخدام ajax لجلب البيانات بدون تحديث الصفحة. بحيث تقوم بكتابة كود PHP يرجع قيمة عدد الاشعارات بصيغة json و من ثم استخدام ajax لجلب القيمة بدون تحديث للصفحة.
    1 نقطة
  28. Attempted import error: 'initReactI18next' is not exported from 'react-i18next' هذا الخطأ يخبرك بصراحة أن initReactI18next لا يمكن استرادها من react-i18next وهذا قد يكون ناتج عن عدة أسباب منها أن المكتبة ليست مثبتة في المشروع أو أن المكتبة حدث خطأ ما عند تثبيتها و للتأكد من ذلك قم بحذف ال node_modules و package.lock.json أعد تثبيت كل المكتبات . السبب الأخر قد يكون أنهم أجرو تغيير في المكتبة وغيروا كيفية استيراد initReactI18next من react-i18next ولهذا داءما يجب التحقق من التوثيق الحديث والرسمي للمكتبة لمواكبة التغييرات. وأيضا أحيانا عند تثبيت مكتبات في مشروع react يجب ايقاف المشروع واعادة تشغيله فذلك قد يحل هذه المشكلة.
    1 نقطة
  29. مرحباً @عبد الواحد الحدادي إذا كنت تستخدم البوتستراب يمكنك عملها هكذا المهم أن تخرج العناصر خارج العنصر <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"></div> لأنه المسؤل عن إخفاء العناصر في المقاسات الصغيرة
    1 نقطة
  30. يمكن إرفاق الكود الخاص بك لمساعدتك في وضع الروابط, أو يمكنك بعد وسم <a class="navbar-brand" href="#">Navbar</a> وضع بعده الرابطين حسب ما تريد مثل <a class="navbar-brand" href="#">اطلب عرض سعر</a> <a class="navbar-brand" href="#">اطلب تطبيق فكرة</a> و من ثم في باستخدام css يمكنك التحكم في محاذاة و مكان الروابط. جميع ما بداخل كلاس collapse navbar-collapse يتم إخفاءه و يتم إظهاره في قائمة المنسدلة على شاشات الجوال عند الضغط على ايقونة البار.
    1 نقطة
  31. أعتقد أن سبب المُشكلة أنك تقوم بتشفير كلمة المرور مرتين الأولى في المُتحكم RegisterController و الثانية في الMutator او المُعدل: setPasswordAttribute و لحل المُشكل يُمكنك الإستغناء عن الMutator و إستعمال فقط التشفير في المُتحكم RegisterController : <?php protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); } // أو protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); } أما إن أردت إستخدام المُعدِل setPasswordAttribute فيُمكنك ذلك لكن يجب عدم تشفير كلمة المرور في المُتحكم RegisterController بهذا الشكل: 'password' => $data['password'], بدل: 'password' => Hash::make($data['password']), ثم في المُعدل: public function setPasswordAttribute($value) { $this->attributes['password'] = bcrypt($value); } و بهذا الشكل سيتم تشفير كلمة المرور من جهة واحدة. ملاحظة: تستخدم Laravel التشفير bcrypt إفتراضياً و تدعم الأنواع التالية: bcrypt, argon, argon2id لذلك إن لم تُغير في الإعدادات يُمكنك إستخدام الدالة المُساعدة bcrypt أما إن قمت بتغيير الإعدادات فيجب إستعمال الكلاس Hash.
    1 نقطة
  32. لديك طريقتان لتشفير كلمة المرور في Laravel. $data['password'] = bcrypt($request->password); و الطريقة الأخرى هي تخزين كلمة المرور غير مشفرة $data['password'] = $request->password; ثم تشفير كلمة المرور في Model public function setPasswordAttribute($value) { $this->attributes['password'] = bcrypt($value); } إذا قمت بذلك بهذه الطريقة ، فتأكد فقط من عدم تجزئة كلمة المرور مرتين ، لذلك يجب عليك الانتقال إلى RegisterController وبدلاً من: 'password' => Hash::make($data['password']); تضيف 'password' => $data['password'] لاحظ أيضًا أنه لا يوجد فرق بين فئة Hash والوظيفة المساعدة bcrypt (). إذا كنت تريد استخدام Hash Hash::make() وتحقق من ذلك عن طريق Hash::check()
    1 نقطة
  33. ربما سبب المشكلة بعدم تطابق كلمة السر يعود إلى عدم تشفيرها باستخدام الدالة bcrypt عند إنشاء الحساب و قبل إضافة الكلمة المشفرة لقاعدة البيانات في الدالة Create الخاصة بالنموذج. RegisterController.php الخاص بالمستخدم وفرضا هو User وتجنب تطبيق التشفير / التجزئة على كلمة المرور أكثر من مرة لأنه يعطي كلمة جديدة ولن يحدث مطابقة عند عمل الاختبار checkPassword
    1 نقطة
  34. تستخدم الدالة lockAsync لعمل lock على الشاشة بحيث لا يستطيع المستخدم دوران الفيديو. على الجانب الآخر، تستخدم unlockAsync لفك هذا القفل. في الكود المرفق، إذا أردت أن ترجع الشاشة مرة أخرى إلى الوضعية الإفتراضية، عليك استخدام lockAsync ايضاً، ولكن مع اعطائها الوضعية الجديدة (Portrait على سبيل المثال). if (fullscreenUpdate === Video.FULLSCREEN_UPDATE_PLAYER_DID_PRESENT) { await ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.LANDSCAPE); } else { // لاحظ استخدام lockAsync مرة اخرى ولكن مع الوضعية الجديدة await ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.PORTRAIT_UP); } return true;
    1 نقطة
  35. أحاول إستخدام Laravel Sail عند إنشاء مشروع لارافيل قمت بتنفيذ الأمر: curl -s https://laravel.build/sail-test | bash ثم نفذت الأمر: cd sail-test && ./vendor/bin/sail up كل شيء تم بشكل صحيح و عند تجربة المشروع من خلال http://localhost. يعمل بشكل جيد لكن عند تنفيذ أمر التهجير: sail artisan migrate:install يظهر الخطأ: Illuminate\Database\QueryException SQLSTATE[HY000] [2002] No route to host (SQL: create table `migrations` (`id` int unsigned not null auto_increment primary key, `migration` varchar(255) not null, `batch` int not null) default character set utf8mb4 collate 'utf8mb4_unicode_ci') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:678 674▕ // If an exception occurs when attempting to run a query, we'll format the error 675▕ // message to include the bindings with SQL, which will make this exception a 676▕ // lot more helpful to the developer instead of just the database's errors. 677▕ catch (Exception $e) { ➜ 678▕ throw new QueryException( 679▕ $query, $this->prepareBindings($bindings), $e 680▕ ); 681▕ } 682▕ +29 vendor frames 30 artisan:37 Illuminate\Foundation\Console\Kernel::handle() كيف يُمكن حل المُشكلة؟
    1 نقطة
  36. ربما يعود الخطأ لوجود كلمة سر في ملف env. حيث يجب وضع القيمة التالية في ملف docker-compose.yml ليتم قراءة كلمة السر.. MYSQL_ALLOW_EMPTY_PASSWORD 'no' ثم للتأكد من ربط الحاوية بشكل صحيح مع قاعدة البيانات mysql container IP يجب تنفيذ التعليمة التالية: $ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name_or_container_ID> حيث تعيد ip ثم نضيفها في env file. DB_HOST=<ip_address> ip_address المعاد من التعليمة السابقة أو DB_HOST=mysql ثم نكمل العمل : $ sail artisan migrate في حال لم تعمل يجب تسجيل الدخول login in sail إلى الحاوية عن طريق: sail shell ثم نكمل artisan migrate.
    1 نقطة
  37. يجب التوجه أولاً إلى مجلد المشروع الرئيسي وتنفيذ الأمر: sail shell بعدها سيتم تسجيل الدخول إلى المحفظة الخاصة بالمشروع ويمكنك تنفيذ أمر التهجير: sail artisan migrate يمكنك أيضاً استخدام اسم المحفظة نفسه الموجود في docker والذي تستطيع إيجاده ضمن: docker-compose.yml والذي يكون بشكل افتراضي: DB_HOST=mysql
    1 نقطة
  38. في الـ Generator Functions، أي expression على يمين yield يتم حسابه ثم يتم تسليم النتيجة للمتصل. في السطر الثاني، سيقوم التأثير all بحساب حالة الـ mode والـ theme، ولكن يجب استخدام yield قبلها هكذا: export function* appOnLoad() { const { mode, theme } = yield all({ ... }); } يمكنك التفكير في التأثيرات كتعليمات للـ middleware لإجراء بعض العمليات (مثلاً، عمل dispatch asynchronous).
    1 نقطة
  39. احتاج رايكم : انا الان في وصلت لقسم VIEWS في لارافيل هل اقف واعيد المسار الجديد في اساسيات PHP او استمر في لارافيل ؟
    1 نقطة
  40. للإضافة , ف css selectors تعمل على حسب الأولوية وتكون على الشكل التالي: - المرتبة الأولى : !important على تنسيق العنصر مثلا .className { color: "red" !important } - المرتبة الثانية : السمة style على العنصر مثلا <h1 style="color:red">Hello world</h1> - المرتبة الثالثة: التنسيق بواسطة ID #messageID{ color: "blue" } - المرتبة الرابعة التنسيق بواسطة ال class .className { color : "orange" } - المرتية الخامسة التنسيق بواسطة العنصر نفسه h1{ color: "green" } للمزيد من التفاصيل حول أولويات التحديد في css يمكنك زيارة موقع مجتمعات W3C هنا
    1 نقطة
  41. تصميم رائع لكن يوجد خطأ في الألوان ومن الممكن أن تكون لم تتمكن من فهم الزبون بشكل كافي وجزاك الله كل خير
    1 نقطة
  42. جرب <?Php echo { ?> Your code goes here <?php } ?>
    1 نقطة
  43. إضافةً لإجابات المدربين، وائل وصلاح، يمكنك أيضاً وضع الجافاسكربت في ملف منفصل، وعمل الدالة التالية بداخل PHP لإستخدامها بداخل ملف الـ PHP. <?php function enqueue_script( $src ) { return '<script src="' . $src . '"></script>'; } echo '<div class="dropdown"> <button onClick="myFunction()" class="dropbtn">Dropdown</button> <div id="myDropdown" class="dropdown-content"> <a href="#home">Home</a> <a href="#about">About</a> <a href="#contact">Contact</a> </div> </div>'; echo enqueue_script( "./index.js" );
    1 نقطة
  44. هناك عدة مواقع تقدم هذه الخدمة بدون تعب او تشتت . ايضا يمكن تحدث مشاكل بسبب عدم المهارة في دمج لغة بداخل لغة, يمكنك البحث في قوقل مثلا عن convert html or javascript to php online ستجد الكثير من المواقع تقدم هذه الخدمة. <?php echo '<div class="dropdown">'; echo '<button onClick="myFunction()" class="dropbtn">Dropdown</button>'; echo '<div id="myDropdown" class="dropdown-content">'; echo '<a href="#home">Home</a>'; echo '<a href="#about">About</a>'; echo '<a href="#contact">Contact</a>'; echo '</div>'; echo '</div>'; echo '<script>'; echo 'function myFunction() {'; echo 'document.getElementById("myDropdown").classList.toggle("show");'; echo '}'; echo 'window.onclick = function(event) {'; echo 'if (!event.target.matches('.dropbtn')) {'; echo 'var dropdowns = document.getElementsByClassName("dropdown-content");'; echo 'var i;'; echo 'for (i = 0; i < dropdowns.length; i++) {'; echo 'var openDropdown = dropdowns[i];'; echo 'if (openDropdown.classList.contains('show')) {'; echo 'openDropdown.classList.remove('show');'; echo '}'; echo '}'; echo '}'; echo '}'; echo '</script>'; ?>
    1 نقطة
  45. يجب فتح وسم php ثم طباعة هذا الكود ثم إغلاق الوسم. <?php echo ' <div class="dropdown"> <button onClick="myFunction()" class="dropbtn">Dropdown</button> <div id="myDropdown" class="dropdown-content"> <a href="#home">Home</a> <a href="#about">About</a> <a href="#contact">Contact</a> </div> </div> <script> function myFunction() { document.getElementById("myDropdown").classList.toggle("show"); } window.onclick = function(event) { if (!event.target.matches(".dropbtn")) { var dropdowns = document.getElementsByClassName("dropdown-content"); var i; for (i = 0; i < dropdowns.length; i++) { var openDropdown = dropdowns[i]; if (openDropdown.classList.contains("show")) { openDropdown.classList.remove("show"); } } } } </script> ' ?> استخدمت في عبارة echo الاقتباس الفردي ' فقمت بتغيير الاقتباس الفردي ضمن شيفرة جافاسكربت لكي لا يتم اعتبارها إغلاق لما سبق. يمكنك تجريب الكود السابق
    1 نقطة
  46. يمكنك وضعه بهذه الطريقة <?php echo '<div class="dropdown"> <button onClick="myFunction()" class="dropbtn">Dropdown</button> <div id="myDropdown" class="dropdown-content"> <a href="#home">Home</a> <a href="#about">About</a> <a href="#contact">Contact</a> </div> </div> <script> function myFunction() { document.getElementById("myDropdown").classList.toggle("show"); } window.onclick = function(event) { if (!event.target.matches('.dropbtn')) { var dropdowns = document.getElementsByClassName("dropdown-content"); var i; for (i = 0; i < dropdowns.length; i++) { var openDropdown = dropdowns[i]; if (openDropdown.classList.contains('show')) { openDropdown.classList.remove('show'); } } } } </script>'; ?>
    1 نقطة
  47. لقد ظهر هذا الخطأ لأنك تقوم بعمل GET Request في مسار لا يقبل إلا POST. في المثال الذي تفضلت به لدينا Route::post('/settings/update', 'SettingsController@update'); إدا ذهبنا إلى المسار http://localhost:8000/settings/update فسيظهر الخطأ MethodNotAllowedHttpException لأن هذا المسار لا يقبل هذا النوع من Request والحل هو إضافة مسار اخر يقبل GET Request لإظهار form تعديل الإعدادات مثلا هكدا Route::get('/settings/create', 'SettingsController@create');
    1 نقطة
  48. حسب المعايير القياسية المتبعة عالمياً, يعتبر دائماً اي request صادر من متصفح عبر كتابة الرابط او الضغط على رابط هو request من نوع GET اما الانواع الاخرى مثل POST و PATCH وغيرها فهي ناجمة عن الضغط على زر Submit ضمن HTML Forms لذلك فإما ان تكتب Route::get بدلاً من Route::post او يمكنك انشاء دالة جديدة Route::get بنفس المسار ونفس دالة الـCallback وتبقي Route::post على حالها او (الخيار الامثل) هو استخدام Route::any والذي يشير بقبول الـRequests من اي نوع سواء Post او Get او غيرها اذا كنت ترغب
    1 نقطة
×
×
  • أضف...