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

Adnane Kadri

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

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

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

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

    52

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

  1. بجانب ما اقترحه المدرب حسن يمكنك الاستعانة بالوظيفة json_decode لتحويل هاته السلسلة النصية (بمعاملتها كمصفوفة JSON) الى مصفوفة اعداد كالتالي: <?php $ages = "15,12,24"; $integerIDs = json_decode('[' . $ages . ']', true); print_r($integerIDs); الخرج: Array ( [0] => 15 [1] => 12 [2] => 24 ) توثيق الدالة json_decode()‎ في PHP.
  2. صحيح، المشكلة بسبب عدم امتلاك صلاحية الوصول او فتح الملف المشار اليه، ولذلك فإنك ستحتاج بجانب تغيير مجموعة الصلاحيات على المجلد تغيير مالك المجلد الى مستخدم خادم الويب لديك. عادة ما يكون هذا الأخير هو www-data يكون ذلك عن طريق الأمر : chown -R vagrant:www-data storage قد تحتاج أيضا تغيير صلاحيات مجلد bootstrap/cache : chmod -R 755 bootstrap/cache
  3. بجانب ما اقترحه المدرب محمد، يمكنك استعمال الوظيفة hrtime لتعيين وقتي قبل وبعد تنفيذ عملية ما، يعطى الفرق بالنانو ثانية (9-^10 ثانية) كالتالي: <?php // تخزين الوقت الابتدائي $start = hrtime(true); function example() { sleep(5); } example(); // تخزين الوقت النهائي $end = hrtime(true); // حساب الفرق $diff = $end - $start; // تحويل الفرق من النانو ثانية الى الثانية $diff = $diff / 1000000000; // طباعة الفرق echo "$diff seconds"; يمكن استعماله لمقارنة سرعة تنفيذ خوارزميات معينة.
  4. يمكنك الاستعانة بالوظيفة substr_replace لإستبدال سلسلة نصية معينة ضمن سلسلة أخرى نحددها لها، سنحتاج في هذا التلاعب ببعض الوظائف الأخرى. فيما يلي بعض الخطوات الوصفية: تخزين السلسة النصية الأصلية في متغير. تخزين السلسلة النصية الفرعية في متغير. تخزين الموضع الابتدائي للسلسلة النصية الفرعية. حساب طول السلسلة النصية الفرعية. يعطينا هذا فكرة عن احداثي هاته السلسلة في السلسلة الأم. مثال: تقع World ما بين الموضعين 7 و (موضعها الابتدائي + طولها). نسمي الموضع الأول أ والثاني ب. استبدال ما بين الموضعين أ و ب بالسلسلة النصية المرادة. مثال عملي: <?php // تعريف سلسلة نصية $str = "Hello, World!"; // تعريف السلسلة النصية الفرعية $word = "World"; // تخزين الموضع الابتدائي السلسة النصية الفرعية $pos = strpos($str, $word); // pos + length و pos استبدال ما بين الموضعين $newstr = substr_replace($str, 'My', $pos , strlen($word)); // طباعة النتيجة echo $newstr; // Hello, My! الدالة strpos()‎ في PHP الدالة substr_replace()‎ في PHP
  5. لن يأتي هذا وليد الصدفة فأنت ستحتاج الى الكثير من الاطلاع والتصفح بنظرة المصمم لكي يتكون لديك هذا الحس، هذا ما يسمى بالتغذية البصرية، فهو مجال ابداعي تتصرف فيه حرية المصمم ونظرته الفنية. هذا ويحاول المصممون دوما وصف بعض الخطوات التي تساعد في انشاء تصميم ويب عصري، نذكر من بينها: ابحث عن الإلهام، قم بتصفح المواقع والتطبيقات المشابهة لتطبيق تحاول العمل عليه، لا يعني هذا نسخها بالطبع، فأنت هنا ستحتاج تصفحها والتفاعل مع مكوناتها وأجزائها واستخلاص المهم منها. أحب تصفح موقع pinterest للحصول على أفكار للتخطيط والهيكلة بشكل عام و codepen للمكونات والأجزاء. تعلم كيف تختار الألوان بحذر، توجد فكرة في تجربة المستخدم تقول أن تراكيب الألوان في تصاميم الويب ترسل رسائل تعكس وتتحكم في مزاج المتصفح لموقعك، ولذلك فانك لن تضعها اعتباطا وفقط. قد تحتاج قراءة سيكولوجية الألوان في عالمي التسويق والعلامات التجارية و الألوان في تصميم الرسوميات ونظرية الألوان لمساعدتك على انتقاء حزمة الألوان المناسبة. تعرف على أساليب الطباعة Typography وكيفي تتعامل معها. تعامل بحذر مع المساحات البيضاء white spaces في تصميمك وتجنب ما يعرف بالمساحة السلبية Negative space، وهي بشكل بسيط الفراغات غير المتساوية بين المكونات والحاويات من نفس الجنس، فإذا كانت المساحة بين البطاقة 1 والبطاقة 2 هي 2 بكسل فلا يجب ان تكون المساحة بين البطاقة 3 والبطاقة 4 من نفس جنس 1 و 2 شيئا لا يساوي 2 بكسل بالضبط. ان كنت تبني تطبيقك مباشرة على الـ HTML و الـ CSS فقد تحتاج اتباع نصائح اضافة Lighthouse من قوقل بشأن الوصول accessibility. فقد تعطيك احيانا ملاحظات بشأن نسب تباين العناصر مع حاوياتها وغيرها من الملاحظات. حافظ على البساطة ولا تتكلف جدا.
  6. أظنك تحتاج في هذا خبرة عملية بالواجهة الخلفية، او على الأقل الاستعانة بمطور واجهات خلفية. لأن هاته البيانات التي تنوي المحافظة عليها سيتم تخزينها في الغالب على مستوى الخوادم في قواعد البيانات. فحينما يتم طلب صفحة ما، يتم بعد أو أثناء التحميل جلب البيانات وحقنها الى الصفحة وعرضها بالشكل الذي تريده. وفي الأخير، سيمكن للمتصفح ان يلتقطها ويفسرها بالشكل الذي نرى به مواقع الويب في المتصفحات. وبما ان هاته البيانات ستكون مخزنة بمكان واحد، يمكنك الوصول اليه من اي متصفح من العالم. فلن يتطلب العملاء او زوار الموقع او مستعملي هذا التطبيق امتلاك نسخة من هذا السكربت حتى يمكنهم الوصول. حيث سيمكنك عمل الية لتسجيل الدخول وتوثيق الطلبيات قبل منح اي صلاحية لاستعمال هذا التطبيق. وبالطبع فان هذا متحكم به من الواجهة الخلفية. يحدث احيانا ان يستعمل مطورو الواجهة الامامية التخزين المحلي للمتصفح لتخزين هاته البيانات واستعمالها، ولكن لا يعد هذا الخيار خيارا جيدا، ولا يعوض أبدا الواجهات الخلفية التي تعد المحرك الأول لكامل مواقع الويب.
  7. يمكنك الاستعانة بالوظيفة basename للحصول على اسم ملف ما تحدد مساره، للإشارة الى الملف الحالي يمكنك الاستعانة بـالثابت __FILE__ كالتالي: <?php $path = __FILE__; $filename = basename($path); echo $filename .'<br>'.$path; مثال عن الخرج: index.php C:\xampp\htdocs\dev\index.php تعرف اكثر عن الثوابت السحرية في PHP
  8. يمكنك تحويل المصفوفة التي لديك الى سلسلة نصية مفصول عن كل منها بفاصلة اجنبية ( , ) عن طريق الوظيفة implode . ثم بعد اسنادها الى متغير جافاسكربت ستقوم هاته الأخيرة بالتقاطها كمصفوفة ، يكون ذلك كالتالي: var js_array = [ "{{ implode('","' ,$php_array) }}" ]; مثال عملي: <?php $php_array = ['item1' ,'item2']; $str = '"'.implode('","', $php_array).'"'; ?> <script> var js_arr = [<?php echo $str ;?>]; console.log(js_arr); // ["item1","item2"] </script> خرج المصفوفة التي لديك مثلا سيكون كـ: ["1","Emad Saif","mail@gmail.com"] قد تحتاج التعرف أكثر على الوظيفة implode
  9. وعليكم السلام، يتحكم في هذا العديد من العوامل من مثل التقنيات والميزات التي تريد توظيفها في المشروع او توفرها في تطبيقك، فموقع موضوع مثلا عبارة عن مدونة متعددة المحررين، يمكنك لعملها الاستعانة بأحد نظم ادارة المحتوى من مثل وردبرس أو توظيف احد المبرمجين لبرمجة كامل جزئيات التطبيق برمجة خاصة من الصفر. على أن الثانية أفضل من ناحية عدم محدودية التعديل والقدرة عليه. يمكنك الاستعانة بموقع مستقل لتوظيف أحد الخبراء. عموما، قد تكون تكلفة موقع على الوردبرس على الأقل 100$. في حين أن البرمجة الخاصة قد تكلف بجانب ما تعطي من مميزات أكثر. ان كنت لا تعرف الفرق بين البرمجة الخاصة ووردبرس يمكنك الاستزادة بالاطلاع على إجابات ايهما افضل للمبرمج والزبون بناء موقع على wordpress او بناء موقع php تقليدي؟
  10. يمكنك الاستعانة بالوظيفة str_replace لاستبدال اي كسر للسطر line break بفراغ أو لا شيء، يعبر عنها بـ \r أو \n : <?php $bio = "string multiline string with empty lines and extra spaces"; $bio = str_replace(["\r", "\n"],'',$bio); echo $bio; الخرج: stringmultiline stringwith empty lines and extra spaces توثيق الدالة str_replace()‎ في PHP
  11. بجانب ما اقترحه المدربون يمكنك استعمال lastInsertId في حالة رغبت باستخدام insert K وهو احد توابع الواجهة DB التي تقوم بجلب آخر معرف لآخر عنصر تم ادراجه بشكل عام، يكون ذلك بعد تنفيذ الادراج: User::insert($data); $id = DB::getPdo()->lastInsertId();
  12. قد لا ترغب في نسخ كل شيفرة او محتوى نصي مرتين، ولذلك فإنك ستحتاج تخزين هاته العبارات والكلمات في مصفوفة ترابطية تحمل العبارات التي تظهر في العربية وتلك التي تظهر في الانجليزية، وبما أننا نعمل على صفحة هبوط تطلب ان تفهرسها محركات البحث فإننا سنحتاج أن تكون هاته الترجمات حاضرة عند طلب الصفحة وتفسيرها، بمعنى أنه لن يتم تحميل وترجمة القالب على المتصفح فقط، اي ان هاته المصفوفة لن تخزن على جانب العميل في مصفوفة جافاسكربت وانما على جانب الخادم في مصفوفة PHP مثلا. كما ان هاته الصفحة سيتم تكوينها على مستوى الخادم وارسالها الى المتصفح، (ان تكن لديك اي خبرة بتطوير الواجهة الخلفية فيمكنك المرور مباشرة الى الحل المقترح الثاني) فيما يلي صفحة PHP مثلا: <?php // جلب اللغة من الطلب // يمكن استعمال الجلسة او ملفات تعريف الارتباط مثلا لتخزين اللغة المفعلة $lang = $_GET['language']; // مصفوفة ترجممات $translations = [ // الكلمات العربية 'ar' => [ 'home' => 'الرئيسية' ], // الكلمات الانجليزية 'en' => [ 'home' => 'main page' ] ]; <html> <head> <title> <?php echo $translations[$lang]['home']; ?> </title> </head> <body> </body> <html> ففي حالة طلب المسار: https://domain.co?lang=ar سيصير الخادم الصفحة كـ: <html> <head> <title> الرئيسية </title> </head> <body> </body> <html> و في حالة طلب المسار: https://domain.co?lang=en سيصير الخادم الصفحة كـ: <html> <head> <title> Home </title> </head> <body> </body> <html> سيعطيك هذا امكانية التعديل على مكوناتك وصفحاتك بشكل غير مشروط او صعب، بجانب انه سيعطيك امكانية اضافة مالانهاية من اللغات والترجمات للقالب او صفحة الهبوط التي تشتغل عليها. الحل الثاني وهو بمجرد انشاء صفحتي HTML واحدة للعربية وأخرى للانجليزية index.html و index-ar.html مثلا، أين سيمكن وضع كل محتوى بلغته المرافقة.
  13. يمكنك الاستعانة بمستقل لتوظيف مبرمج يقوم بعمل ذلك لك.
  14. ان كنت تقصد انشاءها عن طريق برمجة خاصة، فنعم ولكنك ستحتاج خبرة برمجية لعمل هذا.
  15. سيكون ذلك وفق نفس الطريقة الموضحة، تأكد اولا من الحصول على الاضافة التي تريدها من متجر تطبيقات ميكروسوفوت.
  16. هل الهدف اضافة علامة مائية ام تثبيت add-in خاصة توفر ميزة اضافة علامة مائية؟
  17. آداة add-ins هي طريقة أخرى لإضافة بعض المكونات والأوامر المخصصة الى برامج office. ولتثبيتها في برامج office الحديثة قم باتباع التالي: اضغط على file من القائمة العلوية. من القائمة الجانبية اختر options. من النافذة التي تظهر اضغط على add ins. ستظهر لك قائمة بالاضافات المتوفرة، عن طريق حقل manage قم بتحديد Word add-ins ثم اضغط GO. ستظهر لك نافذة add-ins & templates يمكن من عليها تحديد الاضافة واضافتها عن طريق التصفح الى مسارها. ان كان هذا من أجل اضافة علامة مائية فلا أظن انك ستحتاج اضافة مخصصة اصلا، لأنه سيمكن عمل ذلك عن طريق ميزات يوفرها الوورد بالفعل، ويمكن ذلك كالتالي: من القائمة العلوية اضغط Design سيظهر لك خيار Watermark يمكنك من اضافة علامة مائية بخصائص معينة
  18. لن يمكنك الحصول على قيمة هذا التعريف الا بعد ارسال الطلب، لأنك نفسك تقوم بارساله ضمن Queue المعينة في الرد أي وكأنك تعلق تعيينه الى ما بعد ارسال الرد او تحضيره، ولذلك ستحتاج اما طباعتها بعد التقاطها من المتصفح في ملف العرض كـ : {{ Cookie::get('name') }} أو في الطلب التالي خارج هذا التابع من المتحكم: $value = Cookie::get('name');
  19. تعتبر كل المرفقات متغيرات تخضع للحالة العامة والتي تكون عادة كـ: ارفاق حدث النقر بالزر. تشغيل شيفرة أو وظيفة اخفاء العنصر عند استهداف هذا الحدث. ستحتاج في هذا التعامل مع نموذج كائن الوثيقة DOM عن طريق تحديد الزر المراد واضافة حدث النقر له، ويكون ذلك بشكل مشابه: var my_button = document.querySelector('#button-id'); var my_element = document.querySelector('#element-id'); my_button.addEventListener('click' ,function(){ my_element.style.display = 'none'; }) قد يمكن تطوير هذا التطبيق ليمكن اخفاء عنصر ما واظهار آخر وفق هذا الحدث، كما يمكن تشغيل شيفرة أو وظيفة الاخفاء او الاظهار في خلال مهلة او فترة زمنية، أو اي ما تخدمه حاجتك. فيما يلي: توثيق التابع querySelector. سؤال عن ما هو استعمال addEventListener.
  20. يحاول الخطأ اخبارك أنك قمت بتشغيل خادم ويب باك بإستعمال نمط غير صحيح، ويكون ذلك عادة في تعريف خاصية غير موجودة أو معرفة بشكل خاطئ، وفي الحالة التي لديك تلك الخاصية هي writeToDisk، ففي الغالب أنت تقوم بتعريفها وفق التالي: devServer: { .. writeToDisk: true, .. }, وهذا صحيح الى حد النسخة 4.0.0 - beta.0 من webpack dev-server ففي هاته النسخة وفق ما هو موضح في توثيق الحزمة قد تم نقل كل من الخواص fs index, mimeTypes, publicPath, serverSideRender, writeToDisk الى الكائن dev لتعرف وفق التالي: devServer: { dev:{ writeToDist:true, } } وبمجرد اطلاق النسخة 4.0.0 - beta.3 بزمن قصير قد تم اعادة تسمية الخاصية dev لتصبح devMiddleware وهو التعريف الذي استقرت عليه للآن. devServer: { devMiddleware:{ writeToDist:true, } } قد لا تحتاج كل هاته التفاصيل ولكنك ستحتاج حتما لتشخيص هذا الخطأ وحله معرفة أي نسخة تستعمل من webpack dev server وتعريف الخاصية بشكل صحيح وفق ما يوافقها. بجانب هذا سيكفيك ان تكون على اطلاع على الواجهة البرمجية لكائن devServer في التوثيق الرسمي.
  21. كل الوظائف موجهة لتنفيذ أوامر معينة تختلف فيما بينها من حيث أن: الوظيفة system تقوم بتنفيذ الأمر وإعادة خرج الأمر ان وجد. فهنا ستقوم أنت نفسك بالتعامل مع الخرج وفق نمط او فكرة معينة مثل تنسيقه. الوظيفة exec تقوم بتنفيذ الأمر وعرض خرج الأمر مباشرة، أي انه لن يمكن تخزينه في متغير بغرض تنسيقه أو عرضه وفق شكل معين. الوظيفة passthru تقوم بتنفيذ الأمر وعرض خرج الأمر بشكل خام (وحدات ثنائية binary) مباشرة. يجب الحذر بشأن استعمال هاته الوظائف ان كنت تستقبل أو تقوم بتخصيص هاته الاوامر وفق تعامل المستخدمين معها، ففي هجمات تزوير الطلبات عبر المواقع CSRF مثلا يمكن حقن سطر أوامر يسمح للمستهدف ܏بتنفيذ أي أوامر تخص النظام على خادم ويب. خصوصا في الخوادم الهشة مثل بعض تلك التي توفر استضافات مجانية، فهذا يعطي المهاجم تحكما كاملا بالنظام فضلا عن تحكمه بالموقع أو التطبيق. يتم كحل لهاته المشاكل تغليف وسائط الأوامر باستخدام الدالة escapeshellarg()‎ أو escapeshellcmd()‎ مما يجعلها غير قابلة للتنفيذ ومتحقق من صحة كل قيمة مدخلة. فان كنت تستقبل مثلا متغيرا path عبر الطلب GET لعرض محتويات مجلد ما لمشرف الموقع كالتالي: <pre> <?php system('ls ' . $_GET['path']); ?> </pre> فإن تعليف الأمر سيكون كـ: <pre> <?php system('ls ' . escapeshellarg($_GET['path'])); ?> </pre>
  22. يمكنك استعمال أحد توابع الكائن DateTime في PHP لعمل الفكرة، يجب أولا تمرير التاريخين الى الباني كالتالي: $first_date = new DateTime('2022-03-25 14:21:36'); $second_date = new DateTime('2022-03-26 10:15:48'); ثم سيمكن عن طريق التابع diff استخلاص الفرق بين التاريخين كالتالي: $difference = $first_date->diff($second_date); سيبدوا خرج النتيجة كائن DateInterval يبدوا كالتالي: object(DateInterval) public 'y' => int 0 public 'm' => int 0 public 'd' => int 20 public 'h' => int 6 public 'i' => int 56 public 's' => int 30 public 'invert' => int 0 public 'days' => int 20 واستخلاص الدقيقة من الخرج بشكل بسيط عن طريق قراءة الخاصية i: echo $difference->i; في حالة تجاوز الفرق لدقائق ستحتاج تحويل الساعات او الثواني او الايام الى دقائق هي الأخرى لحسابها ضمن الفرق. تعرف أكثر عن التعامل مع الوقت والتاريخ في PHP.
  23. واحدة من المميزات التي يقدمها لارافيل هي في إمكانية استعماله لاتصالات قواعد بيانات مختلفة، ولن يكون ذلك الا بإعداد كل منها في ملفات الاعداد. لاحظ أن ملف config/database.php يتوفر على مصفوفة بالمفتاح connections تحمل هاته المصفوفة تعريفات مختلفة من بينها تلك الخاصة بـ mysql و pgsql: 'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'schema' => 'public', 'sslmode' => 'prefer', ], كل نموذج Model من نماذج لارافيل يحتوي على الخاصية connection التي تكون مضبوطة على اتصال قواعد البيانات الافتراضي المعرف في ملف اعداد قواعد البيانات. يمكنك تخصيص تلك التي تعمل على اتصال قاعدة بيانات pgsql وتلك التي تعمل على اتصال mysql باسنادها كقيمة ل connection في ملف النموذج المستهدف: class Post extends Model{ protected $connection = 'pqsql'; .. } في ملف التهجير المرافق لهذا النموذج قم بضبط نفس الامر عن طريق استعمال التابع connection للواجهة Schema: Schema::connection('pqsql')->create('posts', function (Blueprint $table) { $table->id(); $table->string('title'); $table->timestamps(); }); بفرض أنك اتصالي قواعد البيانات اللذان لديك يعملان بشكل عادي، نفذ أمر التهجير php artisan migrate وستلاحظ أن كل قاعدة بيانات تهجر بها بيانات مختلفة.
  24. يحاول الخطأ اخبارك ان لديك مشكلة بوصول المستخدم dzlaboco_bt لقاعدة البيانات، يظهر هذا الخطأ في حالة عدم امتلاك المستخدم المعني لصلاحية الوصول الى موارد قواعد البيانات أو عدم وجوده من الأساس. ان كنت تشتغل على الخادم المحلي فيمكنك اصلاح المشكلة باستخدام المستخدم root بدون كلمة مرور الذي يكون معرفا بشكل افتراضيا في العادة. $conn = new mysqli("localhost", "root", "", "DB_NAME"); وإلا فإنك ستحتاج انشاء مستخدم قواعد بيانات جديد، فيما يلي خطوات إنشاء مستخدم كامل الصلاحيات في مدير قواعد البيانات PHPmyAdmin: الآن ستحتاج تعريف بيانات هذا المستخدم في ملف اعداد قواعد البيانات المرافق لمشروعك. يكون ذلك في العادة بتعديل الأسطر التالية بمكان ما: $conn = new mysqli("localhost", "USER", "USER_PASSWORD", "DB_NAME");
  25. أي صفحة تحاولين الوصول اليها؟ تشخيص الأخطاء في لارافيل سهل ولا يكون الا بإتباع موضع الخطأ وأصله. ففي هذا المثال يحاول لارافيل اخبارك ان هنالك خطأ بشأن استدعاء تابع غير موجود وهو التابع posts.. بمكان ما من ذات الصفحة، ستجدين ان نص الخطأ يشير الى موضعه بالضبط. يرجى ارفاق ذلك لمساعدتك في الوصول الى حل للمشكلة. ان كان السؤال متعلقا بأحد مسارات الدورة، فيفضل اضافة السؤال بقسم تعليقات الطلبة في الفيديو المرافق للمشكلة. تحياتي.
×
×
  • أضف...