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

Adnane Kadri

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

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

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

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

    51

إجابات الأسئلة

  1. إجابة Adnane Kadri سؤال في مشكلة بضبط اتجاه عارض شرائح slick carousel كانت الإجابة المقبولة   
    ان كانت المشكلة في اتجاه المكون فقط، فيمكنك استثناء اتجاه عارض الشرائح وضبطه باتجاهه الافتراضي الذي كان عليه دون باقي الصفحة.
    بما أنك تستعمل حزمة slick carousel فيمكنك الاستعانة بالخاصية rtl لضبط اتجاه عارض الشرائح على true او false (التي تكون مضبوطة افتراضا):
    $('.testimonial-slider').slick({ .. rtl:true, ايضا قد تحتاج تحديد الخاصية dir للعنصر testimonial-slider بما يوافق هذا التعديل.
  2. إجابة Adnane Kadri سؤال في إضافة لغة لموقع laravel يحتوي على العديد من الموجهات كانت الإجابة المقبولة   
    نعم يمكنك تغييرها ديناميكيا عن طريق الواجهة App. وهو ما قصدته بـ:
    كمقاربة عملية، اقوم في تطبيقات لارافيل التي تتطلب أكثر عن من لغة بإنشاء طبقة وسيطة Middleware لتعيين اللغة كل مرة يتم طلب مسار جديد.
    فلو قمت مثلا بطلب المسار /home سيتم قبل اي شيء، اعداد اللغة المرادة ثم اكمال الطلب مثل عرض الصفحة. كمكان جيد يتم فيه تخزين اللغة التي يريدها المستخدم نستخدم الجلسات Session. 
    يكون ملف الطبقة الوسيطة على نحو: 
    class SetLanguageMiddleware { public function handle(Request $request, Closure $next) { if(Session::has('locale')){ App::setLocale(Session::get('locale')); } else{ App::setLocale('ar'); } return $next($request); } } تقوم هاته الطبقة بالبحث في الجلسة عن اي قيمة مخزنة لـ locale. فان كانت موجودة قامت بتعيين القيمة الموجودة كلغة للتطبيق.
    وفي حال عدم وجود اي قيمة، سنقوم بتعيين لغة افتراضية مثل طرف الشرط else
    الآن سنحتاج تسجيل هاته الطبقة الوسيطة ضمن مصفوفة الطبقات الوسيطة web في ملف app/Kernel.php :
    'web' => [ .. \App\Http\Middleware\SetLanguageMiddleware::class, لأننا نحتاج هاته المقاربة في كامل مسارات تطبيق الويب الذي لدينا ولا نريد ان يحصل ذلك في مسارات معينة فقط.
    الآن نحن نحتاج الى طريقة ما لتبديل قيمة المفتاح locale في الجلسة وفقط، لأننا نعلم ان الطبقة الوسيطة المنشئة حديثا ستتعامل معه بشكل منفصل. يمكنك انشاء متحكم ما لذلك يحوي منطقا مشابها لـ:
    public function switchLaguage($locale) { if(in_array($locale ,['en' ,'ar'])) { App::setLocale($locale); Session::put('locale' ,$locale); } return back(); } نتحقق هنا من ما ان كان القيمة التي يطلبها المستخدم ضمن اللغات المتوفرة ar , en . بعد هذا نقوم بتعيين قيمة جديدة لقيمة المفتاح locale في الجلسة. ثم نعيد المستخدم الى الصفحة التي كان فيها. ما بين الإعادة والعرض ستشتغل الطبقة الوسيطة وتعين لك المفتاح في الجلسة.
  3. إجابة Adnane Kadri سؤال في كيف يمكن استعمال حزمة AOS بشكل صحيح في webpack كانت الإجابة المقبولة   
    هل تظهر اي رسالة خطأ في نافذة الطرفية؟ هل يتم اخبارك AOS غير معرف؟
    Uncaught ReferenceError: AOS is not defined أظنك نسيت تضمين المكتبة في ملف index.js أو app.js أو ما يقابله لديك على نحو:
    import AOS from 'aos' سيكون عليك اعادة تشغيل npm run dev او npm run build واعادة استعراض المشروع.
  4. إجابة Adnane Kadri سؤال في ماهي افضل لغة برمجة للمواقع ؟ كانت الإجابة المقبولة   
    كل لغات الواجهة الخلفية قادرة على تحقيق ذلك.أما فيما يخص الواجهة الامامية فهي الأخرى تكتب وتبنى بـ HTML و CSS و جافاسكربت ولا يوجد أدوات او لغات أخرى يمكن المفاضلة بينها. توفر قوقل واجهة برمجية للتعامل مع خرائطها بأي لغة كانت، لذا لا يجب عليك القلق كثيرا بشأن الآداة التي يمكنها القيام بذلك. ان كانت مواقعك ثابتة غير ديناميكية، فسيمكنك تحقيق ذلك عن طريق أدوات الواجهة الأمامية فقط، وقد لا تحتاج أصلا لواجهة خلفية إلا لأغراض أخرى.
    أظن أن أسئلة من مثل "ما افضل لغة" و "ما افضل اطار" لا يصل فيها السائل الى جواب مقنع، لتضارب واختلاف الاجوبة فيما بينها. تعرف على المجال أكثر وجزء السؤال إلى أسئلة أكثر دقة وعلمية وسيمكنك شق طريقك فيه.
    قد تستفيد من الاجابات على هذا السؤال: ماهي افضل لغة لتطوير الويب .؟
  5. إجابة Adnane Kadri سؤال في ما هو Vite؟ وما الجديد بشأن تحزيم الأصول في لارافيل؟ ما الذي يعنيه التخلي عن webpack و laravel mix والانتقال الى Vite؟ كانت الإجابة المقبولة   
    webpack في الاصل هو مجمع ملفات او بشكل ادق مجمع وحدات module bundler تقوم بتجميع عدد من ملفات الجافاسكربت، الـ HTML والcss لتجعلها في ملف واحد، وبهذا المنطق تتيح الكثير من الميزات الأخرى على سبيل:
    امكانية تقسيم الشيفرات وتجزئتها. استخدام المحملات لتحميل وتفسير انواع معينة من الملفات مثل sass. فصل بيئة التطوير عن بيئة الانتاج. وغيرها الكثير..
    عيب هاته الطريقة انها قد تأخذ الكثير من الوقت أثناء عملية التطوير. لنقل مثلا أنك تستخدم 2000 وحدة نمطية في تطبيق كبير لديك. الآن عملية بناء او تجميع او تحزيم هاته الوحدات قد ياخذ وقتا طويلا جدا بادئ الأمر. ثم ستكون عملية الاستماع الى التغييرات هي الأخرى بطيئة (رغم التخزين المؤقت) لأن ويب باك تقوم كل مرة بإعادة تجميع كامل الملفات واخراجها في ملف واحد كل مرة ولا تستثني الملفات الغير معدلة، هذا بجانب تشغيل كامل المحملات والوحدات الاخرى.
    ويتم تقديم laravel-mix كآداة توفر واجهة تطبيقات برمجية للعمل بـ webpack بشكل أكثر فعالية في تطبيقات لارافيل لذات الغرض السابق.
    يأتي Vite هنا لتقديم حل استثنائي لتحسين تجربة التطوير وتسريعها، فالفكرة الاساسية منه هو تحويل وتقديم جزء من شيفرة التطبيق الخاص بك عندما يطلب المتصفح ذلك وفقط. فعند بداية عملية التطوير سيقوم Vite بتقسيم وحدات جافاسكربت الخاصة بك الى فئتين: 
    dependency modules أو وحدات التبعية، وهي الوحدات التي يتم تحميلها وطلبها من node_modules. يتم ذلك عن طريق مجمع يدعى esbuild هو مكتوب بلغة Go ويعد اسرع بـ 10 الى 100 مرة من ويب باك. application modules او وحدات التطبيق، وهي الوحدات التي تشتغل عليها او بالأحرى هي ملفات تطبيقك. ويبباك تقوم بتجميع كل ما ينتمي لكليهما واخراجهما في ملف واحد كل مرة تطلبه. يدعى هذا بـ bundler-based workflow او سير العمل القائم على التحزيم.
    Vite تقوم فقط بتجميع وحدات التبعية الخاصة بك، في حين ان وحدات التطبيق تقدم فقط حينما يتم طلبها او في لحظة ما تكون مستعملة من طرف صفحة ما او مكون ما. تسمي Vite هذا بـ  vite ESM-based dev build أو سير العمل القائم على وحدات ES.
    بمعنى أنه قادر على معالجة التطوير الخاص بك بشكل أسرع كثيرا من Webpack. وقد لا تلحظ هذا مع تطبيقات عادية، ولكن ستزداد الحاجة الى تجميع اسرع مع ازدياد حاجيات التطبيق وتوسعه. وبما أنه يخدم مفهوم التوسع scalability أكثر من ويب باك فإن لارافيل ضمته إليها هذا الاسبوع فقط ليزيد من حظ وقدرة لارافيل في بناء تطبيقات بأحجام عملاقة، بجانب المحافظة على تجربة تطوير جيدة الى ممتازة. 
    يتفائل الكثير من المطورون باستعمال لارافيل له، ويرون أنه الجيل الجديد من ادوات بناء جافاسكربت بخدمته لمفهوم الوحدات في المتصفح، وهو مفهوم لم يكن شائعا قبله.
    وكتجربة شخصية، عملت بـ Vite في تطبيق واجهة أمامية بـ VueJS وكانت تجربة التطوير رائعة مقارنة بالتطبيقات التي اعتمدت على ويب باك فيها. وبما أن Vite مقدم من مطوري VueJS أنفسهم فأظن أنه سيكون هنالك تقارب أكثر بين VueJS و Laravel في المستقبل.
  6. إجابة Adnane Kadri سؤال في هل سيكون علي أيضا بعد تعلم لارافيل تعلم jetstram و inertia.js و fotify؟ كانت الإجابة المقبولة   
    وعليكم السلام، 
    أظن أن قراءة توثيق آداة او اضافة ما لن تكون بنفس الجهد الذهني الذي يتخذه المتعلم مثلا في تعلم لارافيل أو PHP. فالاطلاع الجيد على الادوات والتقنيات لن يكون بذات الدافع مثل التعرض الى نمط تفكير وهندسة جديد، او شيء جديد عليك كليا. وتجربة قراءة التوثيق نفسها لن تكون بحجم تجربة دخول المجال اول مرة وتعلم اول تقنية أو لغة مثلا.
    فالهدف سيكون فقط لمعرفة: ما الذي تفعله هاته التقنية تحديدا؟ أو كيف ستساعدني او تحل مشكلا ما لدي؟ وعليه، فإنه لن يكون عليك إلا فهم تعليمات التثبيت مثلا، طريقة الاستخدام او افضل الطرق لذلك. أو ربما متابعة نقاش جار حول مشكلة واجهتها بشأنه على github مثلا.
    وصحيح، أنه قد تنجر وراء أشياء أخرى وانت تحاول تعلم شيء ما، رغم هذا، يجب تنظيم عملية الاطلاع او القراءة وتصنيف ما الذي تحاول الاطلاع عليه مثلا كـ " مهم جدا " " مهم " " عادي ". لكنه لا يمكن ايقاف هاته العملية او تعطيلها. فهذا ما تفرضه طبيعة المجال المتغيرة والمتشعبة نفسه، فأنت ستضل تقرأ وتعرف عن المزيد من الأدوات. 
    بجانب هذا، لن يجب عليك الاطلاع على JetStream أو Breeze أو fotify أو غيرها لتعلم لارافيل، فهو نفسه يقدمها ضمن مجموعة البدء الخاصة starter kits ويجعل العمل بها اختياريا ومنفصلا عن لارافيل نفسه. فكل منها هو اصلا تطبيقات عملية عن ميزات يأتي بها بالفعل. ولذلك فإن تعلم لارافيل والاطلاع اكثر عنه نفسه سيكفيك عن تعلمها في الوقت الحالي. ثم سيأتي الوقت الذي تجد فيه نفسك مندفعا الى تعلما بغرض تجنب تكرار نظم او افكار في تطبيقات لارافيل لديك.
    ما بين VueJS و Livewire كنت لأختار VueJS، رغم انك لست مرغما اصلا على الاختيار والتخلي عن احدهما مقابل الآخر. وقد يمكن فعليا استعمال كليهما في ذات المشروع. لأنهما مختلفان كليا، ف livewire اطار عمل لارافيل أما VueJS فهو اطار عمل الواجهة الأمامية. فلكل منهما استعماله وسياقه الخاص.
  7. إجابة Adnane Kadri سؤال في [php] إلزام المستخدم بإدخال روابط لمواقع محددة فقط كانت الإجابة المقبولة   
    يمكنك التحقق من ما ان كان العنوان المدخل رابطا نسبيا يحوي داخله أحد النطاقات المقبولة، بهاته الطريقة سيمكنك قبول الروابط المتفرعة عن هذا الاصل:
    <?php /** * التحقق من ما ان كان رابط ما * نطاقا فرعيا عن احد النطاقات * المقبولة * @param string $target_url * @return boolean */ function is_valid_url($target_url) { $White_List = array("https://drive.google.com/", "https://1drv.ms/"); //Add Allowed Website list Here foreach($White_List as $url) { if(str_contains($target_url ,$url)) { return true; } } return false; } $user_url = "https://drive.google.com/path/to/target/drive"; echo is_valid_url($user_url); لاحظ ان الوظيفة str_contains موجودة فقط في PHP8، ان كنت تستخدم نسخا دون هاته النسخة. يمكنك عمل ذات الفكرة عن طريق strpos مثلا: 
    if(strpos($target_url ,$url) !== false) { return true; } أو stripos ايضا:
    if(stripos($target_url ,$url) !== false) { return true; } الدالة strpos()‎ في PHP الدالة stripos()‎ في PHP
  8. إجابة Adnane Kadri سؤال في قواعد البيانات والاندرويد كانت الإجابة المقبولة   
    بالطبع فإنه يجب في حالة ما كنت تنوين بناء تطبيقات أندرويد ديناميكية متغيرة المحتوى. على سبيل المثال: تطبيق لكتابة ملاحظات شخصية. هاته الملاحظات مثلا سيجب تخزينها في سجلات قواعد بيانات يتطلب التعامل معها معرفة بها.
    في أندرويد، يلجئ الكثير الى استعمال SQLite كقاعدة بيانات، وذلك لأن النظام يأتي معها. وهو نظام علائقي لإدارة قواعد البيانات. فـ SQLite تخزن بياناتها في ملف نصي يسهل الوصول إليه والقراءة منه. 
    يكون استعمالها عمليا في حالة تخزين البيانات محليا فقط، أما في حالة رغبتك في مشاركة البيانات بين المستخدمين فهذا بالطبع سيتطلب خادم ويب وواجهة خلفية للتطبيق وواجهة برمجية. رغم أنه سيمكنك أيضا استعمال SQLite بشكل ما في تطوير هاته الواجهة إلا أنه لن تكون بذات المنطق. 
    يمكنك الاستزادة بقراءة مقال: كيف ومتى نستخدم SQLite
    ان كنت تشتركين بدورة علوم الحاسوب فسيمكنك التعرض أكثر لمفهوم قواعد البيانات، بما في ذلك التعرف على قواعد البيانات بمختلف أنواعها والتعمق بمختلف جوانب لغة الاستعلام SQL، وتطبيقها عمليًا خطوةً بخطوة على قواعد بيانات SQLite.
     
  9. إجابة Adnane Kadri سؤال في كيف يمكن انشاء برمجية لاقتراح مجموعة كلمات مخزنة في قاعدة البيانات يحتوي كل منها سلسلة نصية يتم البحث عنها في PHP؟ كانت الإجابة المقبولة   
    يمكنك اقتصاص الكلمات التي تحتوي الجزء المبحوث عنه من السلسلة النصية الأصلية التي تعبر عن عنوان المنتج. نتبع في ذلك الخطوات التالية:
    تجزئة نتائج البحث او العناوين الى كلمات.  التحقق من احتواء كل كلمة على الجزء المبحوث عنه ثم اضافتها الى مصفوفة نتائج طباعة مصفوفة النتائج يكون ذلك وفق منطق مشابه: 
    $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] => سيرة )  
  10. إجابة Adnane Kadri سؤال في ما هو افضل مرجع للشروحات النصية للغة جافاسكربت باللغة العربية؟ كانت الإجابة المقبولة   
    ماذا عن قسم جافاسكربت في موسوعة ويكي حسوب؟
    تهدف موسوعة حسوب لتوفير توثيق عربي كامل وعالي الجودة، مدعم بالأمثلة لمختلف لغات البرمجة وتقنيات تطوير الويب والجوال. محتوى موسوعة حسوب هو محتوى مرجعي، أي هو أقرب للقاموس تبحث فيه عمّا تحتاج له عند الحاجة ان كنت تواجه أي مشاكل برمجية او تساؤلات يمكنك الاستعانة بموقع أكاديمية حسوب.
  11. إجابة Adnane Kadri سؤال في هل يمكن الوراثة من أكثر من صنف واحد في PHP؟ كانت الإجابة المقبولة   
    لا تبدوا فكرة وراثة أكثر من صنف منطقية بالنسبة للبرمجة كائنية التوجه. هل يمكن معرفة الغرض الأول من ذلك؟ ربما ستفضل استعمال السمات لاستخدام توابع متعددة من سمات متعددة. لاحظ المثال:
    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
  12. إجابة Adnane Kadri سؤال في ما الفرق بين إستعمال this و prototype في جافاسكريبت JavaScript؟ كانت الإجابة المقبولة   
    بالطبع فإنه يوجد فرق، 
    عملية الـنمذجة ترجمة عن prototyping في هي نمط تصميم يخص إنشاء الكائنات Objects يندرج تحت الفئة creational design patterns أو انماط التصميم الإنشائية.
    وفي جافاسكربت وهو ببساطة أشبه بالاشارة الى النموذج الأولي للكائن وهو ما كالتالي: 
    function User () { }; User.prototype.save = function () { //do something }; فهاهنا نحن نقوم بتهيئة طريقة او تابع او وظيفة للصنف User يستعمله هو نفسه كامل الكائنات المنشئة عن طريق User وليكن الكائنين Ali و Ossama. وذلك لأن كل كائن مرتبط بكائن النموذج الأولي (لنتخيله كالقالب الأولي).
    في حين ان استعمال this سيشير الى الكائن المنشَئ وليس للصنف، بمعنى انه سيشير الى Ali وحده والى Ossama وحده. فكل كائن منهما سيمتلك نسخته الخاصة من save.
    تعتبر الطريقة الأولى أو النمذجة أسرع نسبيا وأقل استعمالا للذاكرة (لأن التابع سيكون متوفرا عند كل النسخ عن الصنف عند استعمال this في حين انه سيكون متوفرا في النموذج الاولي فقط في حالة استعمال prototype) أما الطريقة الثانية فهي تخدم مفهوم التغليف Encapsulation أكثر فالتوابع المعرفة داخل الكائن بالاشارة بـ this يمكنها التعامل مع متغيرات الكائن الداخلية الخاصة.
    في الحقيقة لا يوجد هذان النمطين فقط في جافاسكربت فيما يخص الكائنات، يوجد أنماط عديدة أخرى يتعلق بعضها بتهئية الكائنات وإنشاءها، بأشكالها وكيفية عملها، بسلوكها وكيفية تواصلها وغيرها.
  13. إجابة Adnane Kadri سؤال في هل يمكن عمل interface في جافاسكريبت JavaScript؟ كانت الإجابة المقبولة   
    لا أظن أنه يوجد ميزات مبنية في جافاسكربت تدعم تطبيق الواجهات وتعريفها، ولكن يمكن تطبيق مفهوم قريب منه عن طريق تعريف توابع الواجهة اللازمة محقون فيها رسائل او تنبيهات خطأ في حالة استدعاءها دون اعادة الكتابة عليها. يفرض هذا وراثة الأصناف extending وليس تطبيق الواجهات implementing مثلما هو شائع مع الواجهات. لاحظ المثال: 
    class MyInterface { // تابع اجباري example(a, b) { this._WARNING('sum(a, b)'); // يتم رمي هذا الخطأ في حالة عدم اعادة تعريفه } // مولد خطأ مخصص _WARNING(fName='unknown method') { console.warn( 'WARNING! Function "' +fName+ '" is not overridden in '+ this.constructor.name); } } class MyCorrectUsedClass extends MyInterface { /** اعادة تعريف التابع */ example(a, b) { return a+b; } } class MyIncorrectUsedClass extends MyInterface { // عدم اعادة التعريف } let correct = new MyCorrectUsedClass(); let incorrect = new MyIncorrectUsedClass(); console.log('correct.sum(1, 2) =', correct.example(1, 2)); console.log('incorrect.sum(1, 2) =', incorrect.example(1, 2)); سيعطي هذا رسالة خطأ مخصصة تخبرنا أننا يجب ان نعيد تعريف التابع example قبل استعماله، وهو بشكل ما أشبه بتطبيق واجهات.
    مثال عن خرج النتيجتين: 
    "correct.sum(1, 2) =", 3 "WARNING! Function \&quot;sum(a, b)\&quot; is not overridden in MyIncorrectUsedClass" "incorrect.sum(1, 2) =", undefined  
  14. إجابة Adnane Kadri سؤال في كيف يمكن التحقق من قيمة المدخلات في PHP؟ كانت الإجابة المقبولة   
    أظنك تقصدين ان يكون المدخل سلسلة نصية string، يمكنك لهذا كتابة قاعدة مخصصة كـ:
    <?php $name_input = $_POST['name']; if (! is_string($name_input)) { exit('Invalid name'); } ونفس الأمر بالنسبة لشرط العمر: 
    <?php $age_input = $_POST['age']; if (! is_numeric($age_input) && $age_input >= 0) { exit('Invalid age'); } توثيق الدالة is_string توثيق الدالة is_numeric
  15. إجابة Adnane Kadri سؤال في كيف ممكن عمل برمجية بلغة php لأستخراج كود html لاي عنوان ويب على الانترنت كانت الإجابة المقبولة   
    يستعمل البعض مكتبة simple_html_dom لتجريف صفحات الويب وتحليل بياناتها.
    في ما يلي مثال عملي عن الاستعمال: 
    $html = file_get_html('https://www.some_website.com/'); $imgs = $html->find('img'); $hrefs = $html->find('a'); توفر هاته المكتبة الوظيفة file_get_html. التي يمكن عن طريقها استعمال محددات الـ css العادية لجلب أي عنصر أو مجموعة عناصر ضمن الصفحة. 
    يرجى الاشارة ايضا الى ان هاته المكتبة قد لا تعمل بشكل صحيح ان كان المحتوى يتم عرضه بعد تحميل موارد الصفحة بما في ذلك ملفات جافاسكربت (مثل حالات تطبيقات الصفحة الواحدة SPA أو أي تطبيق يتم تصيير الصفحة فيه على مستوى العميل client side rendering). لا أظن أن هنالك برمجية مبنية على الـ PHP تخدم هذا الاحتمال -على أن مثل هاته التطبيقات قليلة مقارنة بالعادية- ، على عكس مكتبات من مثل scrapy أو selenium موجودة في بايثون. أظن أن بايثون أفضل في هذا الجانب.
    (يرجى الانتباه جيدا الى الجانب القانوني في الموضوع، قد يؤدي استعمالها الى حظرك من بعض المواقع أو حتى الى اجراءات أخرى في بعض الاحيان).
    فيما يلي توثيق المكتبة المشار اليها simplehtmldom.
  16. إجابة Adnane Kadri سؤال في تغيير لون الصفحة عند المرور بالمؤشر على عنصر ضمن الصفحة في CSS كانت الإجابة المقبولة   
    يمكنك أيضا توظيف الحدثين onmouseover و onmouseout لخدمة نفس الغرض: 
    <h1 onmouseover="document.body.style.backgroundColor = 'red';" onmouseout="document.body.style.backgroundColor = '';">اضغط</h1> مثال تجريبي.
    يمكنك الاطلاع على فهم الأحداث المتعلقة بتحريك الفأرة والتعامل معها في جافاسكربت
  17. إجابة Adnane Kadri سؤال في ما سبب الخطأ "Uncaught SyntaxError: Unexpected token o in JSON at position 1" كانت الإجابة المقبولة   
    يظهر الخطأ لأن هنالك مشكلة بإنشاء واستدعاء كائن JSON. فقبل اسناد قيمة الكائن ستحتاج أولا تحويله الى سلسلة نصية اولا كـ:
    window.localStorage.user = JSON.stringify({ // لاحظ name : 'mohammed', age : 14 }); ثم سيمكنك استدعاءه او طباعته بشكل عادي: 
    console.log(typeof JSON.parse(localStorage.user)); الناتج: 
    object كيف تستخدم JSON في JavaScript.
  18. إجابة Adnane Kadri سؤال في ماهو help of supervisor و كيفية تشغيل web sockets laravel في الإستضافة كانت الإجابة المقبولة   
    supervisor هو أحد برامج مراقبة الاجراءات أو الـ proccess monitors. وهي برامج تتيح لمستخدميها مراقبة عدد من العمليات والتحكم فيها على أنظمة تشغيل شبيهة بـ UNIX أو Unix like OS. يقترن هذا المفهوم احيانا بلارافيل عندما نحاول تشغيل طوابير الانتظار Queues أو الـويب سوكيتس او حتى عند العمل على جدولة المهام Task Sheduling أحيانا ويكون هذا في بيئة انتاجية. أي لن يتاح لنا تشغيل أوامر اعتيادية من مثل queue:work أو shedule:run أو websocket:serve عن طريق الطرفية بشكل دائم. فبمجرد اغلاقك للطرفية Terminal سيتوقف الاجراء الذي تقوم به. وهو بالطبع ما لا تريده. supervisor هو ما يجنبنا هذا الشيء.
    ولتثبيت supervisor كمراقب اجراءي proccess monitor في استضافتك ستحتاج بداية وصولا كـ root وهو الامر الذي لا يكون متاحا في استضافات الويب المشتركة، وانما في استضافات VPS فقط. عدى ذلك، تثبيته واعداده يعدان أمرين سهلين. إذ ان تثبيته يكون عن طريق أوامر من مثل: 
    sudo apt-get install supervisor ثم ان ملفات اعداه لن تكون الا كـ:
    [program:websocket-start] process_name=%(program_name)s_%(process_num)02d command=php /var/www/laravel-example/artisan websockets:serve --port=6006 autostart=true autorestart=true user=forge numprocs=2 redirect_stderr=true stdout_logfile=/var/www/laravel-example//storage/logs/supervisord.log يمكن الوصول الى هذا الملف عن طريق المسار ( /etc/supervisor/conf.d) في انظمة لينكس.
    رغم هذا إلا ان هذا يتعذر في حالة استضافات الويب المشتركة، ولذلك فإننا نلجئ أحيانا إلى افكار أخرى قد توفي أو تخدمنا في حاجات معينة.
    عن نفسي، استعمل وانصح باستعمال أحد هاته الطرق حسب الحاجة، 
    تشغيل الأمر يدويا عن طريق الواجهة Artisan في مسار ما من مثل:  Artisan::call('queue:work --once') ولكن هذا لا يعد عمليا كثيرا، لأن تشغيل الأمر لن يكون متاحا لأي كان، وإنما لمشرفي الموقع او بعض من يمتلكون صلاحية الوصول الى المتحكم الذي يشغل هذا الامر. تعد هاته الطريقة عملية في حالة عدم الحاجة الى تشغيل الامر بشكل دائم أين يكون مقيدا بعملية ما.
    على سبيل المثال: بعد أن ينتهي مشرف الموقع من القيام بتعديلات على المكتب الخلفي يصل بطريقة ما الى المسار الذي يمكنه من تشغيل يتم فيه ارسال رسائل تنبيهات الى المستهدفين من محررين او موظفين آخرين بالموقع.
    تشغيل الأمر دوريا عن طريق جدولته كـ Cron job: وهو الأمر الآخر الذي يمكننا من تشغيل الأمر بشكل دوري دون الحاجة الى ان يكون الامر مقيدا بعملية ما، على سبيل المثال: يتم تجميع جديد مقالات الموقع كل نهاية اسبوع وارسالها الى المشتركين بالقائمة البريدية. هاته الفكرة أيضا قد لا تكون متاحة في أغلب خطط الاستضافة المشتركة إلا أن بعضها يتوفر على عدد لا بأس به من المهمات التي يمكن جدولتها (هوستنجر مثلا يتيح امكانية جدولة 100 مهمة). وهو الأمر الآخر السهل التعامل معه (نرفق فقط الامر الذي نريد جدولته بجانب المدة في استمارات تقدمها خطة الاستضافة).
    تشغيل الأمر من على الطرفية عن طريق ما يعرف بمتغيرات تقييد الوصول POSIX أين يمكنك اضافة السابقة nohup الى الامر الذي تود تشغيله من على الطرفية Terminal، ويشير هذا الى عدم ايقاف تشغيل البرنامج حتى بعد اغلاق الطرفية (بالطبع فإن هذا لا يشمل اعادة تشغيل الامر حتى بعد تعطله مثل ما تتيحه برامج مراقبة الاجراءات مثل supervisor ولذلك فإنك ستكون مسؤولا عن اعادة تشغيل الامر في حالة تعطله). فبدل طباعة الأمر:  php artisan websockets:serve --port=6006 ستحتاج فقط اضافة السابقة nohup: 
    nohup php artisan websockets:serve --port=6006 وسيمكنك اغلاق الطرفية بشكل عادي. (جرب تشغيل الامر واختبر ما ان كان استعمالها متاحا). 
    يمكنك للاستزادة بالتعمق في هاته المفاهيم من خلال الاطلاع على فصول كتاب أنظمة التشغيل للمبرمجين ترجمة عن Think OS المنشورة ككتاب وكسلسلة مقالات في أكاديمية حسوب. وهو كتاب غني عن التعريف في المجال يتناول مثل هاته المفاهيم على مستوى عميق.
  19. إجابة Adnane Kadri سؤال في خطأ Only variables should be passed by reference في PHP؟ كانت الإجابة المقبولة   
    هذا ليس خطأ، فهو إشعار. 
    ويتم اخراج هذا الإشعار لأن الوظيفة end () تتوقع مرجعًا reference لشيء تريد تغييره والذي يتوقع ان يكون متغيرا، في حين انك تقوم بإسناد التعريف مباشرة. أي انه لن يمكنك تمرير نتيجة explode مباشرة اليها دون حفظها في متغير اولا واستدعاءها بمرجعية هذا المتغير. ففي المثال الذي لديك هي متواجدة في الذاكرة ولا يشير اليها أي متغير وبطبيعة الحال فإنه لن يمكنك انشاء اشارة اليها. 
    ولذلك فإن الحل الأول هو انشاء مرجع، او بمعنى آخر تخزين الخرج في متغير وتمريره كمعامل للوظيفة end. 
    كحل آخر، يمكنك تجاهل هذا الإشعار والتغاضي عما يخرجه مباشرة ويكون ذلك عن طريق استخدام عامل التجاهل:
    $file_name = @end(explode('/', $file_path));  
  20. إجابة Adnane Kadri سؤال في لماذا يجب أن أستخدم isset و empty للتحقق من قيمة متغير ما في PHP؟ كانت الإجابة المقبولة   
    تعتبر الوظيفة empty طريقة للتحقق من ما ان كان متغير ما يحمل قيمة فارغة، القيم الفارغة المعتبرة هي: 
    "" سلسلة نصية فارغة.  0 كعدد. 0.0 كعدد عشري. "0" كسلسلة نصية. Null كقيمة فاضية  false كقيمة بوليانية [] كمصفوفة فارغة يقتضي هذا ان يكون المتغير معرفا بالفعل، ولكنه يحمل احد القيم المعتبرة فارغة. 
    في حين ان الذي تقوم به الوظيفة isset هو التحقق من ما ان كان هذا المتغير معرفا أول الأمر أم لا، 
    لاحظ المثالين: 
    <?php $emptyVar = ''; $emptyVar2 = []; $notEmpty = 'Hsoub'; echo empty($emptyVar); // true echo empty($emptyVar2); // true echo empty($notEmpty); // false echo isset($unsetVar); // false وبالتالي، المثال الذي لديك يتحقق من ما ان كان المتغير معرفا، ولا يحمل قيمة فارغة. 
    كطريقة اقصر يمكنك مباشرة استعمال الوظيفة empty وحدها، وذلك لأن هاته الأخيرة تقوم بإعادة قيمة بوليانية false في حالة عدم تعريف المتغير، فبدل: 
    if ( isset($myArr[1]) AND !empty($myArr[1]) ) { // do something } يمكنك مباشرة استعمال: 
    if ( !empty($myArr[1]) ) { // do something } الدالة empty()‎ في PHP الدالة isset()‎ في PHP
  21. إجابة Adnane Kadri سؤال في ما الفرق بين yield و section في قوالب Blade في لارافيل Laravel؟ كانت الإجابة المقبولة   
    بالمفهوم البسيط، يستعمل الموجه ‎@section لتعريف قسم أو جزء لإضافة المحتوى، بينما تعرض التعليمة ‎@yield وتعرف محتوى قسم معيّن.
    على سبيل المثال: 
    نقوم بتحديد عنوان الصفحة في العنصر الابن عن طريق حقنه الى المعامل الثاني لـلموجه section @section('title', 'Page Title') نقوم بتحديد المكان الذي سيتم فيه حقن أي محتوى يسند الى التعليمة section : <head> <title>App Name - @yield('title')</title> </head>  
    أي: 
    تستعمل yield لتحديد موضع حقن العناصر والمحتويات في ملف العرض الأب. تستعمل section لتعريف قسم معين في ملف العرض الابن. 
  22. إجابة Adnane Kadri سؤال في ما هي فائدة yield في PHP؟ كانت الإجابة المقبولة   
    ينبغي أولا فهم ما الذي تقوم به الدوال المولدة generators قبل التطرق لـ yield نفسها، فالأولى تقتضي استعمال الأخيرة. 
    تعد المولدات في PHP تقدم طريقة أسرع وأسهل لإستخدام المكررات Iterators، فبدل السياق التالي لإضافة 100 الى كل عنصر من مصفوفة عددية: 
    function myFunct($items) { $result = []; foreach ($items as $item) { $result[] = $item + 100; } return $result; } يتم كتابة صيغة المولد كـ: 
    function myFunct($items) { foreach ($items as $item) { yield $item + 100; } } ففي الأولى:
    يتم انشاء مصفوفة جديدة. نقوم تباعا باستعمال تكرارة foreach بالإضافة الى المصفوفة الجديدة كل عنصر من عناصر المصفوفة القديمة مضافا اليه 100. وفي الأخير نقوم بإعادة المصفوفة الجديدة كخرج.  أما في الثانية:
    فنحن نقوم مباشرة بإضافة الـ 100 الى كل عنصر من عناصر المصفوفة القديمة. وكل هذا يكون دون الحاجة حتى الى اعادة خرج أو اعادة تعيين مصفوفة جديدة لإعادتها كخرج لاحقا.
    و yield هنا هي أساس عمل هاته الدالة المولدة، فهي تعمل بشكل مشابه لـ return سوى أن هاته الأخيرة توقف تنفيذ الشيفرة. و yield تواصل تنفيذها الى القيمة التي ما بعدها. بمعنى: لو استقبلت الدالة المولدة المصفوفة [1,2] فهي لن تعيد 1 وتوقف تنفيذ الشيفرة عند اول تكرارة، بل ستقوم بإعادة تعيين 1 بالقيمة المسندة الى yield وتواصل العملية الى 2 وهكذا. 
     
    بجانب فرق السرعة والضغط على الخادم الذي يكون في صالح المولدات لما يكون الأمر متعلق بالمكررات، يختلف العائد في كل من الأولى والثانية قليلا. فعند استدعاء الدالة المولِّدة للمرة الأولى تعيد الدالة كائنًا من الصنف Generator.ولو قمت بتفحص عائد الدالة المولدة سترى ذلك: 
    function myFunct($items) { foreach ($items as $item) { yield $item + 100; } } print_r(myFunct([0 ,1 , 2])); الخرج: 
    Generator Object ( ) في حين ان خرج الدالة العادية الأولى سيكون عاديا: 
    [100 ,101 , 102] هذا الكائن المعاد يطبق واجهة المكرر Iterator يمكن الوصول الى قيمها التي تعرف كخصائص كالتالي: 
    function myFunc($items) { foreach ($items as $item) { yield $item + 100; } } foreach(myFunc([1,2,3]) as $i){ echo $i.'/'; } // => 101/102/103/ قد تحتاج الاستزادة بالتعرف على المولدات في PHP و PHP Object Iteration.
  23. إجابة Adnane Kadri سؤال في كيفية حل خطأ laravel.log could not be opened في لارافيل Laravel؟ كانت الإجابة المقبولة   
    صحيح، المشكلة بسبب عدم امتلاك صلاحية الوصول او فتح الملف المشار اليه، ولذلك فإنك ستحتاج بجانب تغيير مجموعة الصلاحيات على المجلد تغيير مالك المجلد الى مستخدم خادم الويب لديك. عادة ما يكون هذا الأخير هو www-data يكون ذلك عن طريق الأمر :
    chown -R vagrant:www-data storage قد تحتاج أيضا تغيير صلاحيات مجلد bootstrap/cache :
    chmod -R 755 bootstrap/cache  
  24. إجابة Adnane Kadri سؤال في كيفية معرفة اسم ومسار ملف PHP الذي يعمل حاليًا؟ كانت الإجابة المقبولة   
    يمكنك الاستعانة بالوظيفة basename للحصول على اسم ملف ما تحدد مساره، للإشارة الى الملف الحالي يمكنك الاستعانة بـالثابت __FILE__ كالتالي: 
    <?php $path = __FILE__; $filename = basename($path); echo $filename .'<br>'.$path; مثال عن الخرج: 
    index.php C:\xampp\htdocs\dev\index.php تعرف اكثر عن الثوابت السحرية في PHP
  25. إجابة Adnane Kadri سؤال في ما الفرق بين الدوال exec و system و passthru في PHP؟ كانت الإجابة المقبولة   
    كل الوظائف موجهة لتنفيذ أوامر معينة تختلف فيما بينها من حيث أن: 
    الوظيفة system تقوم بتنفيذ الأمر وإعادة خرج الأمر ان وجد. فهنا ستقوم أنت نفسك بالتعامل مع الخرج وفق نمط او فكرة معينة مثل تنسيقه. الوظيفة exec تقوم بتنفيذ الأمر وعرض خرج الأمر مباشرة، أي انه لن يمكن تخزينه في متغير بغرض تنسيقه أو عرضه وفق شكل معين.  الوظيفة passthru تقوم بتنفيذ الأمر وعرض خرج الأمر  بشكل خام (وحدات ثنائية binary) مباشرة. يجب الحذر بشأن استعمال هاته الوظائف ان كنت تستقبل أو تقوم بتخصيص هاته الاوامر وفق تعامل المستخدمين معها، ففي هجمات تزوير الطلبات عبر المواقع CSRF مثلا يمكن حقن سطر أوامر يسمح للمستهدف ܏بتنفيذ أي أوامر تخص النظام على خادم ويب. خصوصا في الخوادم الهشة مثل بعض تلك التي توفر استضافات مجانية، فهذا يعطي المهاجم تحكما كاملا بالنظام فضلا عن تحكمه بالموقع أو التطبيق. يتم كحل لهاته المشاكل تغليف وسائط الأوامر باستخدام الدالة escapeshellarg()‎ أو escapeshellcmd()‎ مما يجعلها غير قابلة للتنفيذ ومتحقق من صحة كل قيمة مدخلة. 
    فان كنت تستقبل مثلا متغيرا path عبر الطلب GET لعرض محتويات مجلد ما لمشرف الموقع كالتالي: 
    <pre> <?php system('ls ' . $_GET['path']); ?> </pre> فإن تعليف الأمر سيكون كـ: 
    <pre> <?php system('ls ' . escapeshellarg($_GET['path'])); ?> </pre>  
×
×
  • أضف...