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

Adnane Kadri

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

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

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

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

    52

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

  1. يبدوا أن المشكلة فقط في تعريفك للـ Routes فلو كانت المشكلة في إظهار الview فسيتم رمي exception عن طريق ViewException من داخل المتحكم . فهذا يعني أن الطلب لا يصل أصلا إلى المتحكم و المشكلة فقط هي في سطر واحد . Route::get('user/profile', [UserConroller::class, 'edit']); وبالفعل فأنت تستخدم تعريفا من النسخة 8 من لارافل في حين أنك تستخدم لارافل 5 و تقوم بإستعمال سياق غير مدعم بعد (PHP callable syntax) على هذا النحو : <?php use App\Http\Controllers\UserController; .. Route::get('user/profile', [UserController::class, 'edit']); // غير مدعوم بعد في حين أنه في النسخ ما قبل 8.x يجب عليك تعريف الراوت على هذا النحو (string syntax) : <?php Route::get('user/profile', 'UserController@edit'); و ستحل المشكلة بهذا . ملاحظات : مثل ما شرح الزملاء فإنه يوجد لديك بعض الأخطاء يجب إصلاحها و ذلك في UserConroller تصبح UserController و في oute تصبح Route و هذا : <?php public function edit() { # $user = User::find(auth()->user()->id); عوضا عن هذا $user = auth()->user(); # هذا /* * ولا داعي لتمرير المتغير يوزر أصلا * بحيث يمكنك استعمال هذا المساعد * auth() * بداخل ملفات الblade */ return view('auth.profile',compact('user')); } بعد ذلك , وكخطوات إضافية , تأكد أن تقوم بمحو الكاش عن طريق : php artisan route:clear ثم تأكد أن الراوت موجود عن طريق : php artisan route:list و أخير يمكنك التصفح إلى http://127.0.0.1:8000/user/profile كعضو مسجل و استعراض الصفحة .
  2. هل يمكنك إرفاق ملفات المشروع أو على الأقل معلومات أكثر عن المشكلة ؟
  3. إن كنت تعتمد على تخزين محلي فقط يمكنك تخزين الملفات إما في الـ public_path أو الـ storage_path . في الحالة الأولى ستكون جميع الملفات و الصور المخزنة ظاهرة للعامة و يمكن الوصول إليها ببساطة . تخزن الملفات في : public > your-folder و يكون التخزين على هذا النحو : <?php .. $request->file('image')->move(public_path('your-folder'), $name); في الحالة الثانية لن يمكن إستدعاء الصور و الملفات إلا عن طريق إنشاء رابط symlink و هاته الطريقة أكثر أمانا و حفظا للخصوصية في حالة ما كانت الملفات و الصور المخزنة حساسة أو خاصة . افتراضيا يتم تخزين هاته الصور و الملفات في : storage > app > public > your-folder و التخزين على هذا النحو : <?php .. $request->file('image')->move(storage_path('your-folder'), $name); علما أنه يمكنك إدارة و إنشاء ديسكات التخزين بملف config/filesystems.php : <?php ... 'disks' => [ ... 'storage-path' => [ 'driver' => 'local', 'root' => storage_path('app').'/uploads', ], 'public-path' => [ 'driver' => 'local', 'root' => public_path().'/uploads', 'url' => env('APP_URL').'/public_files', 'visibility' => 'public', ] ... ], ملاحظة : يمكنك إنشاء الsymlink عن طريق طباعة الأمر : php artisan storage:link
  4. بداية , لا يمكنك تخزين أي ملفات بقاعدة البيانات Sql , عوضا عن ذلك يمكنك إستخدام الfile systems لتخزين الصورة أو الملف و تخزين باث الصورة أو الملف في قاعدة البيانات . يتم إستقبال الطلب من قبل اللارافل و معالجته على هذا النحو : <?php public function uploadImg(Request $request) { // التحقق إن كان الطلب يحمل ملف باسم image if($request->hasFile('image')) { // انشاء اسم بلاحقة للملف $name = time()."_".$request->file('image')->getClientOriginalName(); // تخزين الملف بالpublic path $request->file('image')->move(public_path('images'), $name); } // return response()->json([ asset("images/$name"), // باث الصورة 201, // كود الحالة 'message' => asset("images/$name") ? 'تم حفظ الصورة' : 'failed' ]); }
  5. يمكنك الإستعانة بهاته الحزمة لتحقيق الغرض. بداية قم بتثبيت الحزمة عن طريق مدير الحزم : npm install react-ga --save 2. تضمين الموديلات اللازمة بملف App.js : import ReactGA from "react-ga"; 3. مصادقة غوغل انالتكس مع الحزمة , أيضا قم بتعريف ثابت بشكل globally (سنأتي لإستعماله في الخطوة التالية): ReactGA.initialize("TRACKING-ID"); const history= createHistory(window); 4. بداخل وسم LocationProvider بالراوتر قم بتعريف الخاصية history و قم بإرفاقها بالثابت الذي تم تعريفه على هذا النحو : <LocationProvider history={history}> <Router> .. </Router> </LocationProvider> الان يتم رصد أي تغيير يخص الكائن window . ينبغي الان فقط الإستماع لهاته التغيرات و التصرف بناءا عليها . مثال : history.listen( window => { ReactGA.pageview(window.location.pathname + window.location.search); }); و هذا جواب سؤالك :
  6. يمكنك ذلك عن طريق تقسيم النص إلى عناصر مصفوفة و من ثم عمل دور على كل عنصر من المصفوفة لتحويل الحرف الأول إلى capitialized . سيكون الكود مشابه لعمل التالي : let str = "today,-i'm-here-to-learn-java-script-with-the-hsoub-family"; function camelize(str) { var splitted = str.split('-'); var splitted_capitialzied = []; splitted.forEach(element => { var sub = element .charAt(0) .toUpperCase() + element.slice(1); splitted_capitialzied.push(sub); }); return splitted_capitialzied.join(""); } camelize(str);
  7. يبدوا أن المشكلة تنحصر فقط في مصادقة بياناتك مع حسابك على الGithub , قد تحدث مشكلة المصادقة بسبب تغيير أو انتهاء صلاحية البيانات . و ذلك غالبا بسبب كاش credentials أو تخزينها بشكل globally بملف .git/config . يمكنك حل المشكلة بمسحها و من ثم إدخالها مع كل أمر push جديد . يمكنك فعل ذلك عن طريق الأمرين : git config --global --unset credential.helper git config credential.helper store و الان بعد كل : git push origin -u main سيطلب منك إدخال بيانات المصادقة الخاصة بالحساب صاحب المستودع , أي اسم المستخدم و كلمة المرور . تأكدي من إدخال البيانات بشكل صحيح و سيتم حل المشكلة بشكل عادي. طريقة ثانية لحذف أو تعديل بيانات المصادقة المسببة للمشكلة : بقائمة البدأ قومي بالبحث عن Credential Manager ثم قومي بفتح Windows Credentials Manager . قومي بالضغط على Windows Credentials . بالقائمة بعنوان Generic credentials قومي بالضغط على تلك الخاصة بالGIT. قومي بإزالتها أو تعديلها بما بتطلب .
  8. قد تظهر المشكلة أحيانا في تارمنل الvs code كونه معتبر كthird party بالنسبة للgithub .تأكدي أن تقومي بالخطوة الأخيرة من 2 فال command line لا بتارمنل الvs code . git push -u origin main
  9. على كل يمكنك إعادة العملية من جديد و التأكد من سلامة كل خطوة . 1 - قومي بإنشاء مستودع جديد على الGITHUB . 2 - فتح الـ CMD على روت البروجكت و طباعة الأمور : git init ثم إضافة كل البروجكت: git add -A ثم : git commit -m "initial commit" ثم إنشاء Branch : git branch -M main ثم : git remote add origin https://github.com/github-username/repo-name.git ثم أخيرا : git push -u origin main .. في حالة ظهور أي خطأ في أي مرحلة من المراحل السابقة يجب الإشارة إليها و للخطأ . تحديث : قد تحتاجين عمل undo ﻷي git init سابق قبل إعادة العملية من جديد , يمكنك ذلك عن طريق طباعة الأمر : rm -rf .git
  10. يمكنك عمل ذلك عن طريق تمرير عدة نقاط وصول لملفات scss الخاصة بك عن طريق : module.exports = { entry: { 'about': ['./src/css/about.scss'], 'contact': ['./src/css/contact.scss'], 'index': ['./src/css/index.scss'] }, plugins: [ new MiniCssExtractPlugin( { filename: "./css/[name].css" } ), ] } الwebpack ستقوم بقراءة مفاتيح المدخلات و تقوم بإستبدالها بالوسم name داخل الfilename فتكون المخرجات على هذا النحو : dist css about.min.css contact.min.css index.min.css ثم بملفات الHTML يمكنك تضمين كل ملف css داخل dist/css حسب الحاجة أو حسب صفحة الHTML الحالية. ملاحظة : تأكد أن تقوم بتضمين الminifier على نحو صحيح : const MiniCssExtractPlugin = require('mini-css-extract-plugin'); و في حالة ظهور أي أخطاء على هاته الشاكلة : could not resolve module mini-css-extract-plugin تأكد أن تقوم بتثبيت الـ Plugin : npm install --save-dev mini-css-extract-plugin
  11. إضافة إلى ما تفضل الأخ @Wael Aljamalبشرحه . طبقا للتوثيق الرسمي فإن الخاصية query عبارة عن كائن يحتوي كل الخصائص لكل بارمتر ممرر في الروات . و في حالة تعطيل الquery-parser فإن الخاصية query ستقوم بإعادة كائن فارغ و بطبيعة الحال فإن أي قراءة لخاصية عن طريق query ستقوم بإعادة undefined , ويخص بالقول طلبيات الـ GET فقط أي أنه معطل في ما غير ذلك . فحل المشكلة هو إما بتغيير الطريقة إلى GET فيكون : <form id="login" action="userlogin" method="GET"> <div> <label for="email">Email: </label> <input type="text" id="email" name="email"></input> </div> <input type="submit" value="Submit"></input> </form> أو بالقراءة من الPOST . قد تحتاج تسطيب body parser في نسخ متقدمة من Express (+4.16) و من ثم استعماله على هذا النحو : قم بتسطيب الحزمة : npm install --save body-parser ثم استعمالها بشكل Globally : var bodyParser = require('body-parser') app.use( bodyParser.json() ); // لدعم تشفير الجيسون في البودي app.use(bodyParser.urlencoded({ // لدعم تشفير اليو ار ال في البودي extended: true })); أما ان كنت تستخدم نسخ أقل من 4.16 فتستطيع مباشرة : app.use(express.json()); // دعم تشفير الجيسون في البودي app.use(express.urlencoded()); // دعم تشفير اليو ار ال في البودي ومن ثم القراءة على هذا النحو : app.post('/your-end-point', function(req, res) { var email = req.body.email; });
  12. لأنك نفسك تقوم بتعطيل الـ Input بإضافة الخاصية disabled في حالة الإختبار منجز . عوضا عن ذلك يمكنك إستعمال الخاصية checked على هذا النحو : <form action="/projects/{{$project->id}}/tasks/{{$task->id}}" method="POST" class="w3-bar-item w3-left w3-large" style="display:inline;padding:0;margin:0;"> @method('PATCH') @csrf <input type="checkbox" name="done"class="w3-check cnsb-bor-green w3-border-left" {{$task->done ? 'checked':''}} onchange="this.form.submit()"> </form>
  13. الرجاء تحديد اللغة المراد كتابة البرنامج بها أخي الكريم
  14. بداية تأكد أن تقوم بتحديث الflutter plugin في الأندرويد ستوديو عن طريق : > File > Settings > Plugin > Updates و قد تتعطل الاقتراحات تلقائيا بمجرد تفعيلك لوضع حفظ الطاقة , فإن كان كذلك تأكد أن تقوم بإلغاء التفعيل عن طريق : > File > Power Save Mode إن لم تختف المشكلة قم بالتأكد أنك غير معطل لإقتراحات المحرر عن طريق : > File > Settings > Editor > General > Code Completion إن لم تختف المشكلة بعد هاته المراحل تأكد أن تقوم بمسح الملفات المؤقتة وإعادة التشغيل عن طريق : File Invalidate caches / Restart Invalidate and Restart
  15. يمكنك تسجيل serviceProvider الخاص بالحزمة لأشخاص معينين فقط , وجعل عملية تسجيله ديناميكية عن طريق التعديل بملف AppServiceProvider.php : <?php namespace App\Providers; use Barryvdh\Debugbar\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { } public function register(){ if(auth()->user() && in_array(auth()->id(), [1,2,3])) { $this->app->register(new Barryvdh\Debugbar\ServiceProvider()); } }
  16. هل يمكنك إرفاق رابط الموقع ؟
  17. لتحليل هاته الخوارزمية قمت بالعمل التالي : 1 - إيجاد كل المصفوفات الفرعية التي يمكن تشكيلها من عنصر فأكثر من عناصر المصفوفة الأصلية . 2 - حساب مجموع أعداد كل مصفوفة فرعية . و أيضا لا يجب أن ننسى مجموع كل المجموعات الفرعية التي يمكن تشكيلها من هاته المجموعة الفرعية (قد تبدوا الفكرة معقدة لكن ينبغي تبسيطها و فهم أيضا أنه يمكن معاملة المجموعة الفرعية على أنها مجموعة أصلية غير محسوب مجموعها بعد و قد يحتوي مجموع إحداها على المجموع المطلوب فلا ينبغي أبدا إغفالها ). 3 - في كل دورة لحساب المجاميع يتم تسجيل هذا المجموع , و لا داعي لتسجيله إن كان محصلا بالفعل من عدد n عناصر من قبل . 3 - الان و قد تم حساب كل المجاميع الممكنة , يجب أخذ أكبرها قيمة و فقط . الان و قد تم فهم الخوارزمية يمكن تطبيقها عن طريق عملية متكررة للعثور على مجموع أعداد كل مصفوفة فرعية يمكن تشكيلها عن طريق مصفوفة . بالنسبة للكود سيكون مشابها لما يطبق نفس المنطق , و قد قمت بكتابته على هذا النحو : إنشاء دالة تتولى الخطوة 2 و 1 معا , بحيث تقوم بإيجاد المصفوفات الفرعية و المصفوفات الفرعية الممكن تشكيلها من هاته المصفوفة الفرعية و هكذا . و كل مرة يتم تشكيل مصفوفة فرعية يتم تسجيل مجموع عناصرها : var sums = []; // تحضير مصفوفة مجاميع فارغة function getAllPossibleSums(group, sub_group) { // if( group.length == arr.length || (group.length <= arr.length && sub_group.length == 0) ){ // لا حاجة لتسجيل مجموع في بداية الدور وفي حال عدم وجود أي مصفوفة if( group.length > 0 ){ // حساب المجموع var total = group.reduce(function(a,b){return a+b;},0); // لا حاجة لتسجيل المجموع إلا إن كان غير مسجل if(sums.indexOf(total) == -1){ sums.push(total); } } } // بداية التكرار تكون هنا else{ // ايجاد و تسجيل مجموع كل العناصر getAllPossibleSums(group.concat(sub_group[0]),sub_group.slice(1)); // ايجاد وتسجيل مجموع كل العناصر الممكن تشكيلها من المصفوفة الفرعية getAllPossibleSums(group,sub_group.slice(1)); } // إعادة المجاميع return sums; } 2. عمل دالة تقوم بالخطوة رقم 3 : function getMaxNumInArray(arr){ let i; // البدء بالعنصر الأول let max = arr[0]; // اجتياز العناصر بعد الاندكس المختار ومقارنة كل عنصر مع العنصر المختار for (i = 1; i < arr.length; i++) { // في حالة وجود قيمة أكبر سجلها if (arr[i] > max){ max = arr[i]; } } // إعادة أكبر عنصر return max; } 3. عمل دالة تلخص عمل الماضيتين : function getMaxSubSum(arr) { var all = getAllPossibleSums([],arr); return getMaxNumInArr(all); } ثم أخيرا دمج الأكواد على هذا النحو : function getMaxSubSum(arr) { var all = getAllPossibleSums([],arr); return getMaxNumInArr(all); } var sums = []; /** * هاته الدالة تقوم بتلخيص منطق العملية * @param arr : array */ function getMaxSubSum(arr) { var all = getAllPossibleSums([],arr); return getMaxNum(all); } /** * هاته الدالة تقوم بتسجيل أي مجموع يمكن تشيكله من المصفوفة * @param group : array , sub_group: array */ function getAllPossibleSums(group, sub_group) { if( group.length == arr.length || (group.length <= arr.length && sub_group.length == 0) ){ if( group.length > 0 ){ var total = group.reduce(function(a,b){return a+b;},0); if(sums.indexOf(total) == -1){ sums.push(total); } } } else{ getAllPossibleSums(group.concat(sub_group[0]),sub_group.slice(1)); getAllPossibleSums(group,sub_group.slice(1)); } return sums; } /** * إيجاد العدد اﻷكبر قيمة في قائمة أعداد * @param arr : array */ function getMaxNumInArr(arr){ let i; let max = arr[0]; for (i = 1; i < arr.length; i++) { if (arr[i] > max){ max = arr[i]; } } return max; } و من ثم إستدعاء الدالة على هذا النحو : var arr = [ 1, -2, 3, 4, -9, 6]; console.log(getMaxSubSum(arr)); // 14
  18. يمكنك تحقيق الغرض كالتالي : <?php $output = ''; while($row = mysqli_fetch_array($result)) { $output .= substr($row['message'], 0, 35); } echo $output; ?>
  19. بالفعل هي مثل ما قلت ، وقد تم تصليح الأخطاء الإملائية التي وردت بارك الله فيك و وفقك الله لما يحبه و يرضاه.
  20. يمكنك تخصيص نوع البيانات في البارمتر الممرر في الراوت عن طريق التابع where , الذي يقبل البارمترز على الترتيب : param : معبرة عن اسم البارمتر الذي تقوم بتمريره . regex : تعبر عن Regular Expression تخص المقبول في هذا البارمتر فقط . و يتم تعريف التابع where التابع للinstance الذي اسمه Route في مثالك عن طريق : <? Route::get('news/edit/{id}', 'YourController@your_method')->where('id', '$[0-9]+^'); غير أن هاته الطريقة لن تحقق الغرض و سيتم رمي Exception Not Found 404 في حالة ما كان البارمتر id لا يماثل العبارة [0-9]+ , أي أنه ليس integer . أما في حالة ما أردت عمل Redirect لصفحة تريدها من داخل الController فيمكنك عمل validation بسيط للـ ID الممرر بهذا الشكل : <?php use Illuminate\Support\Facades\Validator; // لا تنسى تضمين الواجهات الللازمة class MyController extends Controller{ public function myMethod(Request $request){ $validator = Validator::make($request->all() , ['id' => 'integer']); if($validator->fails()){ // قم باعادة التوجيه } } }
  21. ﻷن السطر الأخير يقوم بطباعة المتغير friends قبل حدوث الـxhr أصلا أي قبل أن تطرأ عليه أي تغيرات , على عكس ما داخل التابع then الذي هو مرتبط بما بعد حدوث الطلب . و لحل المشكلة يمكنك فقط إنشاء ميثود تقوم بإستعمال المتغير بمنطق معين من ضمن المكون يتم استدعاءها داخل التابع then , و هذا هو الأصح عمله على هذا النحو : var friends = {} axios.get('http://localhost:8080/api/people') .then(function (response) { friends = response.data[0] // استدعاء الدالة بعد عمل تغيرات على المتغير useFriends(); }) .catch(function (error) { console.log(error) }) function useFriends(){ console.log(friends); }
  22. بملف index.js قم بتضمين الجيكويري على نحو صحيح : import '@laylazi/bootstrap-rtl/dist/css/bootstrap-rtl.min.css'; import '@laylazi/bootstrap-rtl/dist/js/bootstrap.min.js'; // import 'jquery/dist/jquery.min.js' عوضا عن هذا import $ from 'jquery'; // هذا import 'popper.js/dist/popper.min.js'; import '../sass/style.scss'; import '@fortawesome/fontawesome-free/js/all'; $(document).ready(function(){ console.log('جي كويري الان تعمل!'); }); أما عن المشكلة الثانية فلم أواجهها و تم الدخول عن طريق الرابط التشعبي بشكل عادي . و مثل ما أشار الأخ @سامح أشرف قد تكون لديك مشكلة في الملفات المؤقتة الخاصة بالمتصفح ،قم بتجربة متصفح آخر أو حذف الملفات المؤقتة.
  23. طبعا هذا ستحدده حاجتك لتعلم جافاسكربت من الأساس , فيمكن تعلم JS كلغة برمجة فقط مثلها أي لغة أخرى , أي يمكن تعلمها بمعزل تماما عن الـ Document Object Models API الذي هو المسؤول عن عمليات التلاعب بعناصر صفحة الويب . فإن كان هدفك تصميم و برمجة المواقع فستحتاج لهما بشكل كبير لتحسين تعاملك و تحكمك بعناصر الموقع , أما من جانب الجافاسكربت فأنت ستحتاج التعامل مع ما الـ Browser Object Models و الDocument Object Models (اختصارهما DOM , BOM) و الأساليب التي ستواجهها هناك ستهتم بشكل أساسي بتحديد العناصر والتلاعب بمظهرها ومحتواها . و للقيام بذلك ، ستحتاج إما إلى معالجتها مباشرة عبر محددات تشبه CSS ، أو عن طريق شجرة عناصر . و كلاهما يتطلب أن يكون تعاملك مألوفًا مع الـ Html و الـ css . أما إن كنت تريد تعلمها لعمل تطبيقات الهاتف فلن تحتاج التوغل فيهما حد الإحتراف و سيكفيك فيهما مستوى متوسط و هذا طبعا ﻷنك ستحتاج التعامل مع DOM افتراضية تتبع نفس منطق الDOM الفعلية . خلاصة الأمر أنك ستحتاج تعلمهما للتعامل مع جافاسكربت بشكل أمتع و أكثر حيوية و أكثر اختصارا للوقت و المفاهيم و ستخير بين تعلمهما إن قمت بإتخاذ مسار اخر غير تصميم و تطوير المواقع .
  24. طبعا العملية ستصبح سهلة مع التعود على مواجهة الأخطاء و حلها , لكن هذا لا يمنع من جعلها منهجية و منظمة لغرض إختصار الوقت و تنظيم العمل أكثر فحل مشكلة ما ,برأيي, يتطلب : مشكلة ! فبالطبع يجب أن تكون لديك مشكلة و من الواجب قراءتها و التأني في ذلك . إعادة إنتاج المشكلة و عزل كود مصدر المشكلة : أحب عادة حذف الأسطر التي تكون مسؤولة عن المشكلة , فإختفاء الخطأ يعني ثبوتها . ثم أقوم بإعادة انتاج المشكلة من جديد . هذا يجعلك تقوم بعزل كود المصدر المسؤول و وضع نظرتك على نطاق أضيق و أدق , فالتركيز في ثلاث أسطر أو أربع أفضل من التركيز في مشروع كامل أو ملف كامل. قم بوصف المشكلة : كأن تحاول الحصول على أكبر عدد من المعلومات عن هاته المشكلة . (مثال عن ذلك : الزر يشتغل و يستدعي دالة بالفعل لكن الـ console يقول أن هاته الدالة غير معرفة , و أرى أني قد عرفتها بالفعل في ملف index.js) بناءا على ذلك حاول الإجتهاد في حل المشكلة مما جمعت من وصف للمشكلة و تحديد لكود المصدر المسؤول , و لا بأس ببحث على الانترنت عن مشاكل إما مشابهة في الخطأ الظاهر أو في الوصف و الطرح أو السياق أو كود مصدر المشكلة . و ستصبح العملية سهلة و أبسط مع مرور الوقت و التعود على الأخطاء و على حلها . و قد يقودك إنتقال المشاكل من بسيطة , إلى معقدة إلى معقدة جدا , إلى تعلم الخوارزميات و الproblem solving التي ستنقل الأمر إلى مستوى اخر من التنظيم و المنهجية.
×
×
  • أضف...