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

Adnane Kadri

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

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

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

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

    52

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

  1. سؤالك يفتقر الى التفاصيل اكثر، هل يمكنك ارفاق شيفرة ال html أيضا. هل يمكنك التقاط فيديو قصير او ارفاق مثال عملي عن السلوك الذي يحدث؟
  2. اظنك تحاول انشاء علاقة Many to Many بين جدولي doctors و projects. لفعل هذا نقوم في لارافيل بانشاء جدول وسيط مثل الذي تقوم به في phpmyadmin ثم عن طريق تعريف توابع العلاقات في ملفات النماذج المرافقة للجدولين بجلب مشاريع دكتور معين أو دكاترة مشروع معين. لنقم اولا عن طريق الامر: php artisan make:migration doctor_project لانشاء الجدول الوسيط. الآن سنحتاج تعريف طرفي العلاقة Many to Many في ملفات كل نموذج: في ملف Project.php : class Project extends Model { /** * .. */ public function doctors() { return $this->belongsToMany(Doctor::class); } } في ملف Doctor.php: class Doctor extends Model { /** * .. */ public function projects() { return $this->belongsToMany(Project::class); } } الآن تأكد من تهجير قواعد البيانات عن طريق: php artisan migrate ثم سيمكنك استدعاء ناتج اي من العلاقتين عن طريق القراءة من التابع projects او doctors: $doctor = Doctor::first(); dd($doctor->projects); $project = Project::first(); dd($project->doctors); يمكنك الاستفادة من هاته الاجابات ايضا عن ذات العلاقة.
  3. يمكنك استعمال موقع مستقل لتوظيف مطور برمجيات يمكنه العمل على مشروعك.
  4. مثلما أشار المدرب عمر، فإن رسالة التنبيه تظهر بسبب ان خاصية scroll-behavior غير مدعومة من قبل متصفحات safari. ولتجاوز هذا المشكل ومقاربة نفس سلوك الانزلاق في هاته المتصفحات التي لا تدعم هاته الخاصية نقوم بعمل ذلك عن طريق الجافاسكربت. في جيكويري مثلا يوجد الخاصية scrollTop ضمن التابع animate : $('html, body').animate({ scrollTop: $('#target-item').offset().top }, 800}) حيث يعبر : target-item على معرف id للعنصر او الحاوي المستهدف الذي نحاول الانزلاق اليه. 800 مدة هاته الحركية. او مدة الانزلاق يمكنك مثلا اضافة هاته الشيفرة ضمن وظيفة ما نربطها بحدث الضغط على رابط او زر ما يقوم بالانزلاق بنا الى عنصر آخر. <script> function smothlyScroll(target) { $('html, body').animate({ scrollTop: $(target).offset().top }, 800}) } </script> <button onclick="smothlyScroll('#about-section')">scroll to about section</button> <section id="about-section"> .. </section>
  5. يمكنك اقتصاص الكلمات التي تحتوي الجزء المبحوث عنه من السلسلة النصية الأصلية التي تعبر عن عنوان المنتج. نتبع في ذلك الخطوات التالية: تجزئة نتائج البحث او العناوين الى كلمات. التحقق من احتواء كل كلمة على الجزء المبحوث عنه ثم اضافتها الى مصفوفة نتائج طباعة مصفوفة النتائج يكون ذلك وفق منطق مشابه: $searchRslt = $stmt3->fetchAll(); // حقن نتائج البحث في متغير $search= $_GET['sentSearch']; // حقن الكلمة المفتاحية في سلسلة نصية $suggestions = []; foreach($searchRslt as $result){ $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان foreach($words as $word){ if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات } } } الآن لو حاولت طباعة المصفوفة suggestions فسترى ان كل من عناصرها يحتوي الجزء المبحوث عنه. سيمكنك بهذا تشكيل مجموعة من الكلمات المفتاحية او الوسوم. يمكنك تنظيم العملية أكثر عن طريق فصل كل جزئية كـ: $searchRslt = $stmt3->fetchAll(); // حقن نتائج البحث في متغير $search= $_GET['sentSearch']; // حقن الكلمة المفتاحية في سلسلة نصية $suggestions = []; foreach($searchRslt as $result){ $suggestions = array_merge( $suggestions , getMatchedWordsFromString($result ,$search) ); } function getMatchedWordsFromString($result ,$search) { $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان $suggestions = []; foreach($words as $word){ if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات } } return $suggestions; } لنقل مثلا أن نتائج المصفوفة searchResult كانت كـ: $searchRslt = [ 'سيارة رباعية الدفع', 'سيرورة العمل', 'ممر للسير', 'سيرة نبوية' ]; // حق وأن الكلمة المفتاحية هي: $search= 'سير'; ستكون النتيجة كـ: Array ( [0] => سيرورة [1] => للسير [2] => سيرة )
  6. ما قصدك بـ"بعض العنوان Name"؟ هل تقصد الجزء الذي يحتوي الكلمة المبحوث عنها فقط؟ هل يمكنك الاشارة الى مثال عملي؟
  7. لا يوجد في الأمر حيلة، يمكنك مباشرة وضع ملف الاكسل عن طريق سحبه ووضعه في المنطقة المشار اليها في التطبيق المرفق sqlizer
  8. للتحويل من احد صيغ Excel الى صيغة SQL يمكنك استعمال احد البرامج او تطبيقات الويب التي تختصر هذا الأمر من مثل sqlizer ، قومي اولا بتصدير الملف بأحد الصيغ المدعومة (xls , csv , xslx) ثم ارفقي الملف. ثانيا، لإستعمال الخرج بصيغة SQL في تطبيق لارافيل تأكدي من انشاء ملف تهجير ليحوي صيغة تهجير هذا الملف عن طريق طباعة الأمر: php artisan make:migration import_sql_file_migration يستعمل هذا الملف التابع unprepared من الواجهة DB كـ: \DB::unprepared( file_get_contents( "path/to/filename.sql" ) ); حيث يشير path/to/filename.sql الى مسار الملف. في حالة ما كان ملف قواعد البيانات كبيرا يمكنك تعديل المفتاح memory_limit لزيادة الحد من استهلاك الذاكرة. سيتطلب منك أخيرا تنفيذ امر التهجير: php artisan migrate:fresh يمكنك ايضا بعد تصدير ملف sql تضمينه فقط في phpMyAdmin واعداد laravel للعمل مع قاعدة البيانات المضمن فيها.
  9. يمكنك تعريف هاته الدالة ضمن كائن الوثيقة window ثم اعادة استدعاءها، يكون ذلك بشكل ديناميكي كـ: class Person { getAll() { console.log('called') } } function methodName() { // ... return "getAll"; } const firstUser = new Person(); window['target'] = new Function('firstUser.'+methodName()+'()') target(); // called نستعمل في هذا الكائن Function لإنشاء دالة جديدة.
  10. الغرض الأول من المولدات هو في كونها طريقة فعالة للتحكم في تنفيذ وتعليق شيفرة برمجية داخلها. بجانب انها لا تستهلك ذاكرة. لنقل اننا نحتاج أن نعالج منطقا معينا على أربع مستويات: function myFunc() { console.log('lvl 1 starts here') // lvl 1 code ============================ console.log('lvl 2 starts here') // lvl 2 code ============================ console.log('lvl 3 starts here') // lvl 3 code ============================ console.log('lvl 4 starts here') // lvl 4 code ============================ } استدعاء الوظيفة myFunc سيقوم بتنفيذ كامل منطق المستويات الأربع دفعة واحدة. الآن لو أردنا ان يمتلك كل مستوى خرجا معينا يمكن التعامل معه على نطاق خاص به، فإنه من الصعب تحقيقه عن طريق المنطق العادي لاحظ: function myFunc() { // تعليمات المستوى الأول ============================ return 'result after proccessed at level 1'; // =========== سيتم تجاهل كل التالي // تعليمات المستوى الثاني ============================ return 'result after proccessed at level 2'; // تعليمات المستوى الثالث ============================ return 'result after proccessed at level 3'; // تعليمات المستوى الرابع ============================ return 'result after proccessed at level 4'; } لأننا لن نصل من الأساس الى اي من المستويات الأخرى لأن return ستقوم بإيقاف تنفيذ التعليمات البرمجية عند اول مستوى وفقط. الحل هنا، هو في استعمال المولدات Generators، فبعد ان نعالج المعطيات على المستوى الاول يمكننا الاستفادة من عائد (نسميه نتيجة المولد Generator result) يميزه. وبدون الحاجة الى اعادة استدعاء فإنه سيمكنناعن طريق طلب المستوى التالي متى احتجنا المرور الى المستوى الثاني وهكذا. لاحظ المثال: function * myFunc() { // تعليمات المستوى الأول ============================ yield 'result after proccessed at level 1'; // =========== لن يتم تجاهل كل التالي // تعليمات المستوى الثاني ============================ yield 'result after proccessed at level 2'; // تعليمات المستوى الثالث ============================ yield 'result after proccessed at level 3'; // تعليمات المستوى الرابع ============================ yield 'result after proccessed at level 4'; } لاحظ أنه يتم تمييز دوال المولدات في جافاسكربت عن طريق النجمة وعائد المولد عن طريق الكلمة yield. لاحظ التطبيق العملي لها: var myGen = myFunc(); console.log(myGen.next().value) console.log(myGen.next().value) console.log(myGen.next().value) console.log(myGen.next().value) النتيجة: "result after proccessed at level 1" "result after proccessed at level 2" "result after proccessed at level 3" "result after proccessed at level 4" فالمولد هنا يحتفظ بالمستوى الذي هو عليه كل مرة نطلب فيها مستوى جديدا. الشيء الآخر المميز في المولدات هو في كونها كائنات قابلة للتكرار iterable فعلى سبيل المثال يمكنك عن طريقها انشاء تكرار لا متناهي دون ان يتوقف مفسر الشيفرة البرمجية عن العمل: function * infLoop() { let i = 0; while(true) yield i; } var inf = infLoop(); console.log(inf.next().value) console.log(inf.next().value) الآن لو احتجت استدعاء infLoop مليون مرة فستحافظ كل مرة على نطاقها الخاص الذي تستدعى ضمنه مرة واحدة.
  11. لم أواجه المشكلة التي تصادفينها، استطيع تكوين وتعطيل بروتوكول عميل واعداده لاستخدام TCP/IP بشكل عادي. يحتمل ان يكون ذلك بسبب خطأ في اعداد وتكوين SQL Server لديك. أقترح كحل للمشكلة اعادة تثبيته من جديد تماما، تأكدي فقط من تثبيت النسخة الافتراضية basic أثناء تثبيته. قد لا يتم التثبيت بشكل صحيح في حالة انقطاع الانترنت ولذلك يجب التأكد من البقاء على اتصال الى حد تحميل ملفات الاعداد وانطلاق التثبيت. في حالة تمام التثبيت يمكنك اتباع الخطوات التالية لذات الغرض السابق: فيما يلي رابط التحميل الرسمي لنسخة المطور نسخة 2019.
  12. مرحبا أحمد، يمكنك التواصل مع مركز مساعدة أكاديمية حسوب بهذا الخصوص.
  13. لتكوين عميل لاستخدام TCP/IP اتبعي الخطوات التالية: قومي بفتح SQL Server Configuration Manager. من قائمة SQL Server Native Client Configuration اضغطي بالزر الأيمن على Client Protocols ثم على Properties. من قسم Enabled protocols استعملي الاسهم لتغيير ترتيب البروتوكولات حيث ان البروتوكول الاول في الترتيب سيعتمد كافتراضي.
  14. ما هي المشكلة تحديدا؟ ان كانت تظهر رسالة خطأ ما، هل يمكنك ارفاقها ايضا؟ السؤال يفتقر الى الشرح أكثر
  15. بجانب ما اقترحه المدربون يمكنك استعمال الواجهة البرمجية لـ ReflectionClass في PHP عن طريق التابع implementsInterface: <?php interface OtherInterface { /**/ } interface IUser { /**/ } class MyClass implements IUser { /**/ } $class = new ReflectionClass('MyClass'); echo $class->implementsInterface('IUser'); // true echo $class->implementsInterface('OtherInterface'); // false مثلما يمكنك عمل نفس الشيء عن طريق الوظيفة is_subclass_of في حالة الحاجة الى التحقق من ما ان كان كائن من ما عن صنف ما يطبق واجهة: <?php interface OtherInterface { /**/ } interface IUser { /**/ } class MyClass implements IUser { /**/ } $class = new MyClass(); echo is_subclass_of($class, 'IUser'); // true echo is_subclass_of($class ,'OtherInterface'); // false للاستزادة: دوال التعامل مع الكائنات والأصناف في PHP
  16. ملفات العرض داخل مجلد view تحوي قوالب وهياكل مكتوبة بـ HTML ملفات اللغات داخل مجلد languages تحوي نصوص الترويسات والنصوص الوصفية
  17. بالطبع فانك تستطيع ، على أن هذا يفضل ان يكون بعد فهمه جيدا.
  18. أظنك تستخدم نسخة قديمة من اوبن كارت (تفاصيل الاصدار الرئيسي )، فهذا هو محتوى الصفحة الرئيسية index.php فيها يمكنك استعراضها من هنا. يستعمل opencart نمط تصميم MVCL اختصارا عن Model , View , Controller , Language ولذلك ستحتاج على الاقل معرفة بهذا النمط من التصميم للتعديل على مكونات opencart. لاحظ ضمن مجلد catalog مثلا أنه يوجد أربع مجلدات او تفرعات (او اهتمامات) كل منها يمثل مكونا مهما في هذا النمط: view: تمثل كامل ملفات العرض، من قوالب وهياكل يتم عرضها في الصفحة. language: تمثل كامل ملفات اللغات، في العادة تحوي مصفوفات ترابطية بمفتاح وقيمة يمكنك فيها ايجاد النصوص الوصفية ونصوص الترويسات وتعديلها بما يلائمك. model: وهي ملفات نماذج البيانات وهياكلها. controller : يحوي كامل ملفات المتحكمات وهي الوحدات التي تستقبل الطلبات والبيانات من ملفات العرض وتعالجها قبل تطبيقها على ملفات النماذج. سيمكنك ايجاد نفس الشيء في مجلد admin أيضا. هذا التنظيم هو المتبع في اطر عمل وانظمة ادارة بحجم OpenCart . ولهذا لن تجد كامل شيفرات الـ PHP و اللغات والـ HTML في صفحة واحدة. لا يقترح التعديل على هاته المكونات مباشرة، لأن هذا يتطلب خبرة بهذا النمط من التصميم، بجانب التعرف على OpenCart وفهم طريقة عمله. يمكنك الاستفادة من شروحات openCart في اكاديمية حسوب.
  19. بالطبع، يمكنك الوصول الى قسم توثيق الواجهة Document من هنا. سيمكنك ايجاد كل ما يمثل شجرة الوثيقة فيه.
  20. ماذا عن قسم جافاسكربت في موسوعة ويكي حسوب؟ تهدف موسوعة حسوب لتوفير توثيق عربي كامل وعالي الجودة، مدعم بالأمثلة لمختلف لغات البرمجة وتقنيات تطوير الويب والجوال. محتوى موسوعة حسوب هو محتوى مرجعي، أي هو أقرب للقاموس تبحث فيه عمّا تحتاج له عند الحاجة ان كنت تواجه أي مشاكل برمجية او تساؤلات يمكنك الاستعانة بموقع أكاديمية حسوب.
  21. بالنسبة للتحقق من عنوان البريد الالكتروني فهو صحيح نعم، سيتم التحقق من ما ان كان العنوان المرفق عنوانا صالحا او لا عن طريق الوظيفة filter_var والـ flag المرفق كـ FILTER_VALIDATE_EMAIL . يشمل هذا التحقق من انه لا يحوي مساحات بيضاء او تنقيطا فالاسم وغيرها ولا يعني هذا احتواءه على رمز @ فقط. أظنك ستحتاجين تغيير رسالة الفشل من التحقق التي تظهر الى أخرى أكثر دلالية من مثل: if(!filter_var($email,FILTER_VALIDATE_EMAIL)){ echo "enter a valid email address"; } أما عن التعبير النمطي الذي تستخدمينه في التحقق من كلمة المرور الخاصة بك، فهو غير صالح. لاحظي رسالة التنبيه التي تظهر في حالة تجربته: Warning: preg_match(): Compilation failed: quantifier does not follow a repeatable item at offset 5 in /home/user/scripts/code.php on line 4 قمت ببعض التعديلات عليه ليكون بالشكل التالي: <?php $regx = '~^(?=.*?[A-Z])(?=.*?[a-z]).{7,}$~'; echo preg_match($regx ,'ValidExample'); // true echo preg_match($regx ,'not_valid'); // false echo preg_match($regx ,'Short'); // false
  22. لا تبدوا فكرة وراثة أكثر من صنف منطقية بالنسبة للبرمجة كائنية التوجه. هل يمكن معرفة الغرض الأول من ذلك؟ ربما ستفضل استعمال السمات لاستخدام توابع متعددة من سمات متعددة. لاحظ المثال: trait A { public function method_from_a($s) { echo $s; } } trait B { public function method_from_b($s) { echo $s; } } trait C { public function method_from_c($s) { echo $s; } } class D { use A,B,C; } $d = new D; $d->method_from_a('from a'); $d->method_from_b('from b'); $d->method_from_c('from c'); بجانب ان الأمر غير مقيد، سيمكنك استعمال مالانهاية من السمات. ان كان الأمر مقيد بثلاث أصناف بالضبط فسيمكنك كفكرة تزييف هاته العملية عن طريق وراثة صنف A من صنف B ثم الاستعانة بالتابع السحري call_ لإستدعاء تابع ما ضمن صنف ثالث C. يكون ذلك بشكل مشابه: class B { public function called_from_b($str) { echo $str; } } class C { public function called_from_c($str) { echo $str; } } class A extends B { private $c; public function __construct() { $this->c = new C; } public function __call($method, $args) { $this->c->$method($args[0]); } } $a = new A; $a->called_from_b("abc"); $a->called_from_c("def"); حيث أن: A يرث B A يمتلك خاصية c هي كائن عن النموذج C في حالة استدعاء تابع غير موجود لا في B ولا في A سيتم الاستعانة بالتابع السحري call_ لارساله من C
  23. بجانب الطرق التي اقترحها المدرب سامح، يمكنك الاستفادة من طريقة النسخ المنظم أو المهيكل structured cloning عن طريق الوظيفة الجديدة structuredClone الموجودة في جافاسكربت كالتالي: var newObj = structuredClone(myObj); مثال: /*الكائن الأصلي*/ var myObj = {a: 1, b: 2, c: 3} /*نسخة عن الكائن*/ var newObj = structuredClone(myObj) /*استعراض النسخة أول الأمر*/ console.log(newObj) /*تغيير خاصية بالكائن الاصلي واعادة استعراض الكائنين*/ setTimeout(() => { myObj.a = 5 console.log(myObj , newObj) } ,2000) مثال عملي.
  24. يمكنك وضع قواعد تنسيقات CSS ضمن العنصر <style> في مستند HTML كالتالي: <style type="text/css"> p { color: red; } </style> أو عن طريق وضع التنسيقات ضمن ملف بلاحقة css، ثم تضمينه عبر العنصر <link>: <link href="style.css" rel="stylesheet" type="text/css"> نفس الأمر بالنسبة للجافاسكربت، يمكنك تضمين شيفرة JavaScript في أي مكان داخل المستند داخل عنصر <script> كما يلي: <script> // شيفرات JavaScript </script> أو عن طريق وضع هاته الشيفرات في ملف بلاحقة جافاسكربت js (وليكن اسمه script.js) ليمكن تضمينه باستخدام العنصر <script> مع الاشارة لمساره في قيمة الخاصية src كما يلي: <script src="script.js"></script>
×
×
  • أضف...