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

Adnane Kadri

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

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

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

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

    52

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

  1. في الحقيقة، تطوير واجهات المستخدم ليس إلا مجالا من مجالات البرمجة الكثيرة، ومجال البرمجة هو نفسه تفرع من بين التفرعات الكثيرة عن علوم الحاسب. ولذلك فإن تعلم أساسيات التفكير المنطقي والخوارزميات وغيرها يفتح المجال لتعلم أي مجال برمجي ويوحد منطق تعلم أي من هاته المجالات أو أي من لغات البرمجة. عموما، نعم سيمكنك بعد الإنتهاء من دورة علوم الحاسب البرمجة عن طريق لغة JavaScript، كما و ستتعلم البرمجة بلغة Python. فالدورة تضم مسارين من أصل ثمان: أساسيات البرمجة بلغة JavaScript. البرمجة الكائنية التوجه بلغة Python.
  2. يحدث هذا بسبب أن المنفذ الذي يقوم Apache بإستعماله مستعمل بالفعل من قبل برنامج آخر. في الغالب، يكون هذا المنفذ هو المنفذ 80، وبالتالي ولحل المشكل نقوم إما بـ : تعطيل أو إغلاق أو تغيير منفذ البرنامج الذي يقوم بحجز هذا المنفذ إعداد خادم Apache ليستخدم منفذا آخرا من لوحة تحكم xampp بالقسم الخاص بـخادم apache اضغط إعداد config. من القائمة المنسدلة اختر Apache(httpd.conf) سيتم فتح الملف httpd.conf في محرر نصوص قم بالبحث عن رقم المنفذ 80 (يمكن عادة البحث في محركات النصوص عن طريق الضغط على ctrl+f وطباعة السلسلة النصية المراد البحث عنها) قم بتغييرها إلى 8080 في كامل المواضع التالية: Port 80 => Port 8080 Listen 80 => Listen 8080 servername localhost: 80 => servername localhost: 8080 يجب التأكد من حفظ الملف وإغلاقه، ثم القيام بنفس الخطوات في تغيير المنافذ 443 إلى 4433 في ملف htpd-ssl.conf: المواضع التي يجب تغييرها في الملف هي: Listen 443 => Listen 4433 <VirtualHost_default_:443> => <VirtualHost_default_:4433> يجب التأكد بعد هذا من حفظ الملف وإعادة تشغيل خادم Apache.
  3. مرحبا سلطان، يتم في دورة تطوير واجهات المستخدم شرح أساسيات تطوير الويب، إبتداءا من أساسيات HTML مرورا بأساسيات CSS ثم JavaScript ليتم بذلك الإنتقال إلى مجموعة مسارات تطبيقات عملية يتم فيها التعمق في هاته المفاهيم والتعرف عليها بشكل مفصل وعملي أكثر. أما الدورة التي يتم فيها التعرف على الخوارزميات وبنى البيانات وأنماط التصميم وغيرها هي دورة علوم الحاسوب التي ستتدرج فيها إبتداءا من مدخل إلى علوم الحاسب وأساسيات البرمجة والتفكير المنطقي والخوارزميات إلى مبادئ البرمجة مرورا بأنظمة التشغيل وقواعد البيانات. إذ أن كل هذا سيكون كفيلا بأن يجعلك تحسم خيارك بشأن المسار الذي ستأخذه في مستقبلك البرمجي. ولذلك فإنه يقترح -في حالة عدم اكتساب أي خبرة تقنية- البدء بدورة علوم الحاسوب والتأسس جيدا في مفاهيم البرمجة ,التطوير والهندسة ثم سيكون الإنتقال إلى دورة تطوير الويب أكثر سلاسة وسهولة، لأنها حجر الأساس لأي دورة أخرى من الدورات. علما أنه بمجرد تسجيلك في دورة من دورات الأكاديمية سيتم فتح أول مسار من كل دورة من الدورات التي تقدمها الأكاديمية: دورة علوم الحاسب. دورة تطوير واجهات المستخدم. دورة تطوير التطبيقات بإستخدام جافاسكربت. دورة تطوير تطبيقات الويب بإستخدام PHP. دورة تطوير التطبيقات بإستخدام تقنيات الويب. دورة تطوير تطبيقات الويب بإستخدام لغة Ruby.
  4. إن كنت تحاول إظهار مجموعة حقول بناء على الخيار الذي يحدده المستخدم من قائمة خيارات المنسدلة فهذا تلاعب في شجرة الوثيقة ومن مستحيل عمل ذلك بدون الجافاسكربت ﻷن جافاسكربت وجدت لدعم هاته التفاعليات والتلاعبات. مثال: اذا قام المستخدم بتحديد خيار جواز سفر يتم إظهار حقلي رقم جواز السفر ورقم التأشيرة. ولذلك فإن العملية نظريا وعمليا مستحيلة بالإستغناء عن جافاسكربت، وما يقوم به صاحب الشيفرة في الرابط المرفق هو ليس تلاعبا في شجرة الوثيقة بعد تحميل موارد الصفحة، بل هو ضبط شرطي للإعدادات الإفتراضية التي تكون عليها قائمة الخيارات. مثال: لنقل أن مستخدما ما يريد تعديل حالته من "صاحب شركة ناشئة" إلى "عامل حر". بعد أن يتوجه هذا المستخدم إلى صفحة التعديل نحتاج افتراضيا ضبط الخيار الافتراضي الذي قام بتحديده سابقا. وبالتالي فإننا قبل أن نضع خاصية selected على أي من الخيارات، نحتاج إضافة شرط تطابق قيمة الخيار مع حالة المستخدم: <select name="userStatus"> <option value="startup" @if($user->status == 'startup') selected @endif>شركة ناشئة</option> <option value="freelancer" @if($user->status == 'freelancer') selected @endif>عامل حر</option> </select> وهذا ببساطة إستعمال من بين العديد من الإستعمالات التي تجهمعها الشيفرة الموضحة. في حالة ما أردت القيام بذلك بـ PHP فقط فيمكنك كاقتراح عمل ثلاث صفحات تحتوي ثلاث نماذج حيث: الصفحة الأولى تحوي نموذجا يتم من عليه اختيار نوع العميل. تستقبل الصفحة الثانية خرج الصفحة الأولى وتقوم بعرض القائمة المنسدلة التالية: @foreach ($formhandler['guest_form_types[citizen]'] as $guest_type => $value) echo '<option value=' {{$guest_type}} '>' {{$value}} '</option>' @endforeach تستقبل الصفحة الثالثة خرج الصفحة الثانية وتقوم بعرض حقلي جواز السفر ورقم التأشيرة بناء على النتيجة المستقبلة.
  5. يعتبر كل من اللواحق المضافة للأوامر خيارات يتم تطبيقها أثناء تنفيذ الأمر. ومن بين الخيارات التي يقبلها الأمران: php artisan make:model ModelName الخياران policy-- و request-- حيث أن الخيار policy يقوم بإنشاء صنف سياسة policy جديد. السياسات هي تصنيفات تنظم منطق الترخيص حول نموذج أو مورد معين. على سبيل المثال، إذا كان تطبيقك عبارة عن مدونة، فقد يكون لديك نموذج منشور Post وسياسة PostPolicy مقابلة لترخيص عمليات المستخدم مثل إنشاء أو تحديث المنشورات، حيث يحوي هذا الصنف كامل عمليات الترخيص بشأن كل تابع أو كل وظيفة. مبدئيا ، يمكن إنشاء سياسة ما عن طريق الأمر: php artisan make:policy PostPolicy أو يمكن ربطها بملف النموذج عن طريق الأمر: php artisan make:policy PostPolicy --model=Post أو عن طريق إضافتها كلاحقة خيار في أمر إنشاء النموذج: php artisan make:model ModelName --policy ليقوم هذا بإنشاء صنف نموذج وصنف سياسة مقابل له. الخيار الآخر الذي يقبله أمر إنشاء النموذج هو خيار requests-- . يتم عن طريق تخصيص هذا الخيار إنشاء صنفي طلبيات Request يخصان عملية التحديث والإنشاء بداخل مجلد app\requests. أصناف الطلبيات في لارافيل هي نسخ عن الصنف Request قابلة للتخصيص تحتوي على منطق يمكن عن طريقه التحقق من سلامة الطلبيات وتوثيقها. يمكنك التعرف أكثر عن الطلبيات في: قد تحتاج مراجعة التحقق في لارافيل > التحقّق من صحّة طلب استمارة > إنشاء طلبات الاستمارة. و الترخيص في لارافيل > إنشاء السياسات.
  6. يتحكم في هذا هيكلية قواعد بياناتك بالدرجة الأولى، ولكن بشكل عام يمكنك إستعمال هاته الدالة في أي استعلام بمجرد تضمينها بشكل عادي: SELECT class, [dbo].[udf_convert_int_date](YOUR_INTEGER_COLUMN), teacher FROM teachers يمكنك إستعمالها في إستعلامات JOIN أو INSERT أو غيرها، كما يمكنك تخصيص اسم الدالة وتسميتها وفق ما يوافقك.
  7. لعلك لم تنتبه إلى أحد الأوامر المهمة في لارافيل أثناء استعراض الأوامر التي يوفرها artisan عن طريق طباعة. php artrisan هذا الأمر هو: php artisan make:request CustomRequest إذ يتيح هذا الأمر إمكانية إنشاء صنف يرث Request ويحمل صفاته الأساسية ويوفر إماكانية تغيير أشياء من مثل قواعد التحقق Validation أو غيرها. وهو أحد الأمور التي أحب العمل بها في لارافيل. يقوم الأمر php artisan make:request CustomRequest بإنشاء ملف CustomRequest.php داخل app\http\requests، يحمل افتراضا: تابعا rules يقوم بإعادة مصفوفة بكامل قواعد التحقق validation بشأن طلبية Http /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ ]; } تابعا authorize يقوم بتحديد ما ان كان من المسموح قبول هاته الطلبية: /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return false; } نقوم بتضمين هذا الصنف في أحد ملفات المتحكمات كالتالي: use App\Http\Requests\CustomRequest; ثم نقوم بإستقبال نموذج عنه في التابع المستهدف بطلبية ما، مثال: إذا كان الرابط: POST http://path.to/api/users يستهدف التابع store من المتحكم UserController بطلبية Http، فإن هذا التابع يستقبل معاملا request من الصنف CustomRequest كالتالي: public function store(CustomRequest $request){ } ثم سيمكن إستعمال أي من الخواص أو التوابع التي يقدمها الصنف مباشرة. ولنقل أننا نريد استخراج البيانات المتحقق منها من الطلب فقط: public function store(CustomRequest $request){ $data = $request->validated(); } في حين أن CustomRequest هو من سيضم قواعد التحقق كالتالي: public function rules(){ return [ 'username' => 'required|max:8', 'password' => 'required|min:10', 'extra_data' => 'nullable', ]; } أليست الفكرة أفضل من هذا الشكل: public function store(Request $request){ $data = $request->validate([ 'username' => 'required|max:8', 'password' => 'required|min:10', 'extra_data' => 'nullable', ]); } ثما ماذا لو أردنا إضافة التحقق من صلاحية المستخدم في إنشاء مورد جديد: public function store(Request $request){ if(auth()->user()->is_able_to_store_user) { $data = $request->validate([ 'username' => 'required|max:8', 'password' => 'required|min:10', 'extra_data' => 'nullable', ]); } } تخيل أن الأمر سيمتد لتصبح حتى قراءته مزعجة. فيما يلي مجموعة من الميزات التي تجعلك تنشئ أصناف طلببيات خاصة: كون الطلبيات تختلف فيما بينها يجعل الحاجة إلى معالجتها بشكل منفصل شيء مهم. يقتضي فصل الطلبيات عن المتحكمات اثنين من أهم مبادئ REST لتصميم واجهات تطبيق برمجية فعالة ومميزة. مبدأ فصل المهام الذي يقتضي فصل مكونات التطبيق عن بعضها البعض، فكل صنف أو تابع يجب أن يحوي وظيفة واحدة. وفكرة أن تابعا ما يقوم هو بعملية التحقق والتوثيق والإستعلام من قواعد البيانات والرد فكرة غير محببة كثيرة ويتطلب فصل مكوناتها.. هذا وبجانب أنه يحترم أيضا مبدأ نظام الوسطاء بتوسطه بين طلبية العميل وواجهة المتحكم وعدم تركهما يتفاعلان بصفة مباشرة. يحقق إستعمال أصناف طلبيات مخصصة الكثير من مبادئ الشيفرة النظيفة التي تجعل الشيفرة الخاصة بك قابلة للقراءة والتعديل والتخصيص على شكل واسع. يقوم إنشاء طلبيات مخصصة بإتاحة إمكانية جعل جميع الوظائف المماثلة تستند إلى نفس قواعد التحقق والتوثيق الخاصة بطلب واحد، وذلك بدلا عن إنشاء واحد لكل منها. بمعنى، أنه لو كنا نقوم بإنشاء مستخدم جديد في التابع store الخاص بالمتحكم UserController وأيضا في التابع store للمتحكم AdminController وتابع آخر في متحكم آخر، سيصبح لدينا الكثير من الشيفرة المتشابهة والمكررة في كل منها، فسنحتاج أن نكتب قواعد التحقق لكل تابع في كل متحكم، وأن نتحقق من صلاحية الطلبية في كل تابع من كل متحكم وهكذا.. هذا بجانب أن الأمر يصبح صعب التعديل لاحقا، ماذا لو قمت بإضافة عمود جديد في قواعد البيانات وأردت تعميم قاعدة التحقق الخاصة به على كامل الطلبات؟ بدلا عن كل هذا يتيح إنشاء صنف مخصص توحيد كل تفاصيل هاته الطلبيات. وبدل أن تبدوا متحكماتك كالتالي: public function update(Request $request, User $user){ if(auth()->user()->is_able_to_update_user){ $validator = Validator::make($request->all(), [ 'username' => 'required|max:8', 'password' => 'required|min:10', 'extra_data' => 'nullable', ]); if($validator->fails()) { return back()->withErrors($validator); }else{ $data = $validator->validated(); $user->update($data); return back()->with('success' ,'تم !'); } }else{ return back()->with('unauthorized' ,'غير مسموح لك !'); } } ستبدوا كـ: public function update(UpdateUserRequest $request, User $user){ $user->update( $request->validated() ); return back()->with('success' ,'تم !'); } مقسمة إلى: // UpdateUserRequest.php <?php /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return auth()->user()->is_able_to_update_user; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'username' => 'required|max:8', 'password' => 'required|min:10', 'extra_data' => 'nullable', ]; } وهذا ما تم العمل به في المقال الذي قمت بإرفاقه، وبالتالي فإن عليك بدل تضمين كامل الواجهات التي يقوم صاحب المقال بتضمينها أن تقوم بإنشاء صنف Request المخصص الخاص بك وإستدعاءه متى طلبت الحاجة. تتحدث هاته المقالة عن أفضل التطبيقات وأساسيات التحقق من المدخلات في لارافيل، يوجد من بينها طريقة إنشاء أصناف طلبيات مخصصة: كما يمكنك الإطلاع على التوثيق الرسمي لكامل ما يخص التحقق في لارافيل هنا.
  8. بشكل عام، يمكنك تحويل أعداد صحيحة كالتالي: 20100101 إلى تواريخ datetime وفق الدالة CONVERT التي تي توفرها SQL ، يكون ذلك في إستعلام SQL مثلا كالتالي : select CONVERT (datetime,20100101) كما يمكن استخدامها مع أي استعلام آخر، حيث تقبل كمعاملين: ثابت التحويل (يبقى datetime في حالة التحويل إلى تاريخ) والمعامل الثاني العدد الصحيح. بالإضافة إلى معامل ثالث يعبر عن نمط التاريخ مضبوط افتراضيا. الشكل العام للدالة: CONVERT(datetime, <string parameter>, styleFormat) سنقوم بإختيار رمز التنسيق الأبسط والأكثر شيوعا: mm/dd/yyyy المعبر عنه بالعدد 101. يمكنك توظيف هاته الدالة في استعلام SELECT آخر لجلب اسم القسم واسم المدير: CREATE FUNCTION udf_convert_int_date (@my_integer INT) RETURNS datetime AS BEGIN DECLARE @receving_date datetime SET @receving_date = CONVERT(datetime, CAST(@my_integer AS CHAR(8)), 101) RETURN @receving_date END
  9. كطريقة منظمة أكثر يمكنك إنشاء صنف مساعد بداخل مجلد تنشئه وليكن Helpers داخل App، يقوم هذا الصنف بتوفير تابع يوفر هاته الخدمة ومن ثم بإستدعاء بسيط سيمكن إستدعاءه و العمل عليه في أي مكان في تطبيقك. ليحتوي الملف الشيفرة التالية: <?php namespace App\Helpers; class CountriesHelper{ public static function get() { $filepath = 'path/to/file'; return file_get_contents($filepath); } } لنقم بتسجيل alias لهذا الصنف في ملف app.php في مصفوفة aliases كالتالي: <?php 'aliases' => [ 'Countries' => App\Helpers\CountriesHelper::class, ] يكون الإستدعاء والإستعمال كالتالي: <?php use Countries; ... public function someMethod() { $countries = Countries::get(); } أو في أحد ملفات العرض لخدمة غرضك مثلا كالتالي: <select name="nationalty" id=""> @foreach(\Countries::get() as $country) <option value="{{$country}}">{{$country}}</option> @endforeach </select>
  10. الأصح ليس تقسيم هاته العناوين أو هؤلاء الزوار على الدول، بل هو في استخراج الدول من عناوين الأيبيهات السابقة وحساب تكرار كل منها. أي أن العملية ستتبع المنطق التالي: نقوم بتحضير استعلام تحديد لعناوين أيبيهات الزوار. جلب اسم الدولة المعبر عن كل عنوان IP. تخزين الناتج في مصفوفة. حساب تكرار كل قيمة من المصفوفة (يمكنك إستعمال الدالة array_count_values في PHP). <?php $arr = ['algeria' ,'egybt' ,'ghana' ,'egybt']; print_r(array_count_values($arr)); // Array ( [algeria] => 1 [egybt] => 2 [ghana] => 1 ) تأكد من تتبع هاته الخطوات وخرج كل خطوة لربطها بالتي بعدها على نحو صحيح. توثيق الدالة array_count_values.
  11. يمكنك الاستفادة من هاته الإجابات على سؤال سابق لك
  12. العناصر التي ذكرتها لم يأت بها لارافيل أو اخترعها، بل قد كانت مجموعة مفاهيم تقنية شائعة جمعها ولخصها و جاء بها كمميزات، فلارافيل ليس إلا مجموعة شيفرات جاهزة تجعل التطوير عليه أسهل وأكثر وضوحا مما هو عليه في PHP بتوفير مجموعات من الأصناف والتوابع والمساعدات والملفات التي تخدم غرضا أو مفهوما معينا، وفيما يأتي مجموعة المفاهيم الأساسية: التهجير بشكلها العام تعرف عمليات تهجير قواعد البيانات على أنها عملية ترحيل البيانات من قاعدة بيانات مصدر واحدة أو أكثر إلى قاعدة بيانات هدف واحدة أو أكثر. فعند الانتهاء من هذا الترحيل ، تتواجد مجموعة البيانات في قواعد البيانات المصدر بالكامل على الرغم من نشاطها في القاعدة الهدف. وعلى الرغم من احتمال إعادة هيكلتها في قواعد البيانات الهدف. لارافيل هو نفسه أيضا يستعمل هذا المفهوم ويقوم بتوفير طريقة لإنشاء هياكل قاعدة بيانات مصدر وبأمر بسيط ترحيلها إلى قاعدة بيانات هدف والحفاظ على هيكلة قواعد البيانات الأساسية. تشبه عمليات التهجير في لاراففيل نظم التحكم في الإصدار لقاعدة البيانات الخاصة بك، بشكل يجعل فريق قادرا على تعديل مخطط قاعدة بيانات التطبيق ومشاركته بكل سهولة. فلو أردت مثلا بعد عام من نشاط موقعك من إضافة عمود إلى جدول المستخدمين سيمكنك إنشاء ملف تهجير جديد. النموذج Model ، العرض View و المتحكم Controller يعرف نمط الـ MVC كنمط تصميم Design Pattern، أي أنه أقرب الى أن يكون اسلوب برمجة وليس برمجة في حد ذاتها، ينطلق من مبدأ فصل المهام concerns separation ليقوم بفصل كل من: مكونات النموذج Model: تضم كل المنطق المتعلق بالبيانات الذي يعمل به المستخدم وتفاعلها معها. على سبيل المثال ، استرداد البيانات من قاعدة البيانات ، ومعالجتها وتحديثها. مكونات العرض View: وهي مجموع المكونات التي يتم فيها تمثيل البيانات وعرضها للمستخدم والتفاعل معها. مكونات المتحكم Controller: وحدات التحكم كواجهة بين مكونات النموذج والعرض لمعالجة جميع الطلبات الواردة ، توثيقها وفحصها. ومعالجة البيانات باستخدام مكون النموذج والتفاعل مع طرق العرض لتقديم الخرج النهائي، أي أنها المكون الأساسي في العملية فهي المنسق بين مكونات العرض و النماذج. لارافيل يستعمل هذا النمط في تفصيل اهتماماته أيضا، ويوفر لنا ثلاث أنواع من المكونات تتكامل فيما بينها. التوجيه Routing بشكل عام، التوجيه هو عملية تحديد المسار في شبكة أو بين شبكات متعددة أو عبرها. والتوجيه في لارافيل هو ليس إلا طريقة تسمح لك بتوجيه جميع طلبات التطبيق إلى وحدة التحكم المناسبة لكل طلب.
  13. بجانب إعطاء المعامل قيمة افتراضية في تعريفه ضمن الدالة سيكون عليك إما عدم تمريره في حالة كون ترتيب هذا المعامل الأخير وإلا فسيمكنك تمرير undefined ليتم اعتبار القيمة الافتراضية لهذا المتغير. مثال: const test = (a, b = 0, c) => { return a + b + c } الإستدعاء: const sum = test(5,undefined,10) console.log(sum) // 15 ولكن بشكل عام، يفضل لأسباب مثل المحافظة على نظافة الشيفرة وتجنب أية مشاكل يقترح جعل هاته المعاملات في آخر الترتيب مثلما أشار المدرب محمد، ولكن ان اضطررت لسبب ما لعدم ذلك فسيمكنك العمل بما تم توضيحه حول undefined. وبشكل خاص، ككتابة أفضل وإستعمال أكثر مرونة لدالة تعيد مجموع معاملات، يمكنك عن طريق بعض التتايل قبول عدد لا متناهي من المعاملات عن طريق إستعمال هاته الصيغة: function sum(...nums){} حيث سيمكن إستدعاءها كـ: sum(1,2,4) أو: sum(1,2,68,7,5,654,353,342) تستقبل الدالة sum مصفوفة من المعاملات التي يتم تمريرها عبرها. يمكننا إستعمال الدالة reduce المضمنة في جافاسكربت لإختزال هاته المعاملات في معامل واحد: function sum(...nums){ return nums.reduce((a, b) => a + b); } الناتج: sum(1,2,4) // 7 sum(1,2,68,7,5,654,353,342) // 1432 sum(1,2,68,7,5,654,353,342,63,537,3256,3561,675,647,2362) // 12533 تعرف أكثر على الدالة reduce .
  14. في الغالب، ستحتاج هيكلة هاته البيانات في صفحة HTML ومن ثم تصديرها وطباعتها بصيغة PDF مثلا. كما يمكنك تصدير هاته البيانات بصيغ أخرى مثل SQL و CSV و JSON. نذكر من بين الحزم المستعملة في ذلك في لارافيل: حزمة barryvdh/laravel-dompdf، إذ توفر هاته الحزمة إمكانية تحويل ملف عرض view بسيط إلى ملف PDF و تحميله. كما توفر حزمة datatables إمكانية تقرير وتنظيم وهيكلة هاته البيانات في جداول بيانية والإستفادة من ميزة الأزرار لتوفير إمكانية لتصدير هاته البيانات بأشكال وصيغ مختلفة (PDF ,CSV ,JSON). يتم تضمين الحزمة كالتالي: تضمين ملفات التنسيقات: <link rel="stylesheet" hre="//cdn.datatables.net/1.11.3/css/jquery.dataTables.min.css"> تضمين ملف جافاسكربت الحزمة: <script src="//cdn.datatables.net/1.11.3/js/jquery.dataTables.min.js"></script> تهيئة الحزمة وفق خيارات أزرار التصدير: $(document).ready( function () { $('#myTable').DataTable({ buttons: [ 'copy', 'excel', 'pdf' ] }); } ); لاحظ أن الحزمة تستعمل jQuery وتتطلبها، ولذلك تأكد من تضمين ملف الجافاسكربت الخاص بمكتبة jQuery.
  15. تماثل الكتابة هاته: (n === +n && n !== (n|0)) ? نفس الكتابة: if(n === +n && n !== (n|0)){ } أما عن المعاملين + و | ف: المعامل | في n|0 يستعمل بنفس غرض OR أو || ولكنه يستهدف الأعداد الصحيحة integers، فهاته الكتابة n|0 تعني قم بإعادة 0 في حالة لم يكن العدد n صحيحا integer. المعامل + في n+ فهو ليس إلا إشارة موجبة للتحقق من أن نوع n يماثل نوع n موجبا، فهاته الكتابة n+ تعني موجب n. لنقم بتجزئة الشرط حتى نقوم بفهمه جيدا: if(n === +n && n !== (n|0)) return 'double'; /*//////////////////// لشطر الأول*/ n === +n التحقق من ما ان كانت قيمة n تساوي القيمة الموجبة لـ n. فيما يعني ، أنه ان كان قيمة عددية فسيتم إعادة خطأ وإلا فإن الشرط محقق وصحيح. /*//////////////////// لشطر الثاني*/ n !== (n|0) التحقق من ما ان كان نوع n مساويا لناتج n|0 (يكون الناتج n في حالة كون n عددا صحيحا أو صفرا فيما غير ذلك). إستنتاجات: n مساو لقيمته الموجبة ===> n عدد. (مثال : 5 مساو لـ 5+ و 2.1 أيضا مساو 2.1+) n غير مساو لقيمته الموجبة ===> n ليس عددا. ("hsoub" ليس مساويا لـناتج "hsoub"+ والتي هي NaN). نوع n مساو لناتج n|0 (تذكر: n أو صفر) ===> n عدد صحيح integer. (مثال: 5 مساو لـ ناتج 0|5 والذي هو 5 لأن هذا الأخير صحيح). نوع n غير مساو لناتج n|0 (تذكر: n أو صفر) ===> n عدد عشري double. (مثال: 2.1 غير مساو لناتج 0|2.1 والذي هو 0 لأن هذا الأخير عشري).
  16. كدالة مضمنة في جافاسكربت، يمكنك الإستعانة بالدالة typeof التي تقوم بتحديد نوع البيانات الممرر إليها مباشرة، تقوم بإعادة أحد النتائج: typeof {name:'Hsoub', type:'academy'} => Object typeof new Date() => Date typeof [1,2] => Array typeof "string" => String typeof 1.21 => Number typeof true => Boolean typeof null => null typeof x => undefined أما ولخدمة غرضك بالضبط فستحتاجين بعض التخصيص. يمكنك عمل ذلك وفق المنطق التالي : نقوم بعمل دالة تقوم بـ: تحويل أي سلسلة نصية تمرر إليها إلى رقم Number. في كل ما هو ليس رقم أو معبر به عن رقم يتم إرجاع NaN. في حالة المعامل الممرر رقم : يتم التحقق ما ان كان هذا الرقم double أو integer. في حالة لم يكن المعامل الممرر رقم : يتم التحقق من نوعه عن طريق typeof. مثال عملي: function getType(data){ var n = Number(data); if(! Number.isNaN(n)){ if(n === +n && n !== (n|0)) return 'double'; if(n === +n && n === (n|0)) return 'integer'; } else{ return typeof data; } } getType(1); // integer getType("1"); // integer getType(1.5); // double getType("1.5"); // double getType("sara"); // string getType([2,4,42]); // array كتابة أكثر اختصارا: function getType(data){ var n = Number(data); return (n === +n && n !== (n|0)) ? 'double' : (n === +n && n === (n|0)) ? 'integer' : typeof data; } تعرف أكثر عن الأعداد (numbers) في جافاسكربت.
  17. في هيروكو، أي متغيرات تخص البيئة يجب إضافتها إلى قسم إعداد المتغيرات ليتم العمل بها لأن ملف البيئة env. متجاهل افتراضا من عليها. للإجابة على سؤالك الثاني بشأن تجاهل ملف التهجير يجب أولا فهم طريقة لارافيل والمنطق وراء تعقب ملفات التهجير وتطبيقات الشيفرات داخلها حتى يمكن تحديد المشكل بالضبط. تحمل ملفات التهجير في لارافيل الأسماء على النحو التالي: 2021_12_03_100000_create_users_table يتم تقطيع سلسلة الاسم النصية إلى 7 أجزاء كالتالي: 2021 12 03 100000 create users table يتم اقتطاع الأربع أجزاء الأولى الممثلة بتاريخ إنشاء ملف التهجير ليتبقى: create users table يتم إعادة تشكيل السلسة النصية و كتابة الأحرف الأولى كأحرف كبيرة كالتالي: CreateUsersTable يكون هذا هو اسم الصنف الموجود داخل ملف التهجير، ولارافيل تقوم بكل هذا عند إنشاء ملف تهجير عن طريق الأمر: php artisan make:migration create_users_table أو عند إنشاء ملف نموذج: php artisan make:model -m تحدث أحيانا مشكلة تجاهل ملف التهجير هاته عند إنشاء الملفات يدويا أو تعديل أسماءها لاحقا، ويكون ذلك عن الإخلال بترتيب أو خطأ بخصوص توافق اسم ملف التهجير مع الصنف المحتو فيه مثل: وضع تاريخ الإنشاء آخرا، وهذا في الأرجح ما حصل معك. وبالتالي يجب دوما عند إنشاء ملفات التهجير يدويا مراعاة القواعد التي يستعملها لارافيل في استخراج الأصناف المستهدفة من الملفات. [year]_[month]_[day]_[HHMMSS]_[action]_[tableName] حل آخر يقدمه لارافيل، هو في إنشاء ملفات التهجير المجهولة التي لا يتطلب اسم ملفها مراعاة لقواعد التسمية في لارافيل. إذ يمكنك تسمية هذا الملف وفق ما تشاء بشرط أن يحتوي التعريف التالي داخله: <?php use Illuminate\Database\Migrations\Migration; return new class extends Migration { // }; تعرف أكثر عن تهجير قواعد البيانات (migrations) على Laravel.
  18. لا يجب عليك النظر إلى ملفات المكتبة إلا كملفات css أو جافاسكربت عادية، وبالتالي فإنه يمكنك الإعتماد على الأنترنت في تحميل ملفات أي المكتبة أولا ومن ثم سيمكن تضمينها كأي ملف css أو جافاسكربت آخر. على سببيل المثال: قم بتحميل ملف bootstrap.min.css. قم بإنشاء مجلد ملفات داخل public وليكن libs وضع به ملفات المكتبة. يمكنك الآن بأي ملف عرض تضمينه كالتالي: <link rel="stylesheet" href="{{ asset('libs/bootstrap.min.css') }}" وبمثل الطريقة تضمين ملف الجافاسكربت وهكذا .. في حالة توفر المكتبة لمدير الحزم npm يفضل تثبيتها وفقه مثلما أشار المدرب صلاح الدين.
  19. بحسب ما يظهر من الشيفرة، يحتمل أن يكون التطبيق مبني على الـ Vue أو الـ React أو الـ Angular فالمطور هنا يقوم بعمل Rendering لمكون بعد تحميل موارد الصفحة، هذا المكون هو العنصر app-root . حيث أن ملف الجافاسكربت المرفق يقوم بضبط الصفحة بناءا عليه بعد تحميل مواردها، وفي حالة طلب تفحص لمصدر الصفحة لن يتم إظهار إلا وسم المكون مرفقا بملف الجافاسكربت، فيظهر وكأن التطبيق قد تم إخفاء مصدره. لأن عملية إخفاء مصدر صفحة عن المتصفح مستحيلة عمليا ولن يمكن ذلك بشتى الطرق، ففكرة الويب المفتوح هي في مشاركة البيانات، ومادام المتصفح يقوم بعرض الصفحة بشكل طبيعي فهذا يعني أن له وصولا عليها. أي باختصار: مصدر الصفحة ليس مخفيا، وإنما يتم تحميل مكونات الصفحة وعناصرها بعد تحميل موارد هاته الصفحة. وعلى نحو خاص جدا، هاته الفكرة شائعة في تطبيقات الويب التقدمية وتطبيقات الصفحة الواحدة SPA's ولا تقتصر على الـ Vue أو React أو Angluar. بل يمكن حتى مماثلة نفس الفكرة عن طريق الجافاسكربت أو الجيكويري بشكل بسيط. مثال عن تطبيق Vue. مثال عن تطبيق React. مثال 2 عن تطبيق React. مثال عن تطبيق Angular. التطبيق لا يفتح معي أيضا، ولكن يمكن التخمين أن هذا التطبيق تطبيق Angular، ﻷن مطوري هذا الأخير يستعملون عادة اسم أو مصطلح app-root كإسم المكون الجذر الذي يتم فيه عمل Rendering لكامل المكونات الفرعية الأخرى لتطبيق الـ angular. (قد تجد البعض الآخر يسمونه wt-root أيضا). وبالتالي فإن ذات الفكرة تنطبق عليه أيضا, فهو ليس إخفاءا وإنما تحميل لمكونات الصفحة بعد مواردها، وطلب تفحص مصدر صفحة ما ليس إلا تفحصًا لمصدرها قبل تحميل أي مورد.
  20. يمكنك مراجعة هاته الإجابة للإستفادة من ذلك:
  21. هلاّ قمت بدل ذلك بتطبيق الحل المقترح مباشرة على النسخة الغير معدلة؟ لا بأس بالإشارة إلى أي مشكلة تواجهينها في أي خطوة
  22. الأمر يلخص في ثلاث خطوات بسيطة: يفضل المحاولة أولا، ولا بأس بمشاركة الملفات لاحقا.
  23. تخبر التعليمات أنه بعد وضع ملف جافاسكربت البرنامج: <script type="text/javascript"> var CPABUILDSETTINGS={"it":2022192,"key":"a7a89"}; </script> <script src="https://d13nu0oomnx5ti.cloudfront.net/4911dc0.js"></script> يجب عليك إستدعاء أحد الدوال المتضمنة في الملفات، حيث تم إرفاق بعض الأمثلة الشائعة للإستعمال والإستدعاء: <button onclick="CPABuildLock()">Click me!</button> الآن وبعد تضمينها على نحو صحيح، سيمكنك فتح نافذة منبثقة تحتوي على رابط الأفلييت الخاص بك. لخدمة هذا الغرض، وإستبدال الروابط المخزنة في هاته الأزرار : يقترح عمل الفكرة التالية: بملف config.php قومي بإضافة المتغيرين التاليين قبل علامة الإغلاق <? : $cpa_script = '<script type="text/javascript"> var CPABUILDSETTINGS={"it":2022192,"key":"a7a89"}; </script> <script src="https://d13nu0oomnx5ti.cloudfront.net/4911dc0.js"></script>'; $event_launcher = 'onclick="CPABuildLock()"'; ?> ثم بملف movie.php قومي بإستبدال هذا الجزء من كل سطر من التالي: <a href="<?php echo $cpa_link ?>" target="_blank" class="btn btndown btn-lg btn-block mb-3 mt-3"> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ بـ : role="button" <?php echo $event_launcher; ?> لتصبح كامل العناصر المشابهة كالتالي: <a role="button" <?php echo $event_launcher; ?> target="_blank" class="btn btndown btn-lg btn-block mb-3 mt-3"><i class="fas fa-download"></i> SD Quality <b class="langflag"> - EN </b></a> تأكدي من تعميم هذا على باقي العناصر. الآن وكخطوة أخيرة، قومي بفتح ملف header.php الكائن داخل مجلد inc ، وقومي بإضافة هذا السطر قبل وسم إغلاق head كالتالي: <link href="css/main.css" rel="stylesheet"> <?php echo $cpa_script; ?> </head> تأكدي من حفظ كامل هاته الملفات، ثم قومي بتحديث الصفحة على المتصفح وجربي الضغط على أاي من الأزرار الستة و ستلاحظين تطبيق الفكرة. ففي الحقيقة، لا توفر كامل برامج التسويق بالعمولة روابط جاهزة لوضعها والإستفادة منها مباشرة، فقد تحتاج بعضها تهيئة أو تخصيصا على أزرار معينة.
  24. هل هذا مثال عن النافذة المنبثة التي تودين إظهارها؟ حيث يتضمن العنصر "أرسل رسالة الآن لتحميل لعبة غير محدودة" رابط أفلييت بالفعل! إذ ان هذا نتيجة تطبيق التعليمات الموضحة.
  25. ليس تماما، هل تم إعطاءك أي تعليمات مع كود الجافاسكربت؟
×
×
  • أضف...