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

بلال زيادة

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

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

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

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

    30

كل منشورات العضو بلال زيادة

  1. في المسار التالي config/app.php , يجب وضع Laravel\Socialite\SocialiteServiceProvider::class في مصفوفة providers, و وضع التالي 'Socialite' => Laravel\Socialite\Facades\Socialite::class في مصفوفة aliases . ولأستخدامها في ملفات Controllers نضع use Socialite; ايضا يمكنك تشغيل الأمر التالي php artisan config:clear
  2. يجب استدعاء الأمر التالي php artisan passport:install سيُنشئ هذا الأمر مفاتيح التشفير اللازمة لإنشاء رموز وصول آمنة.
  3. يمكنك مراسلة الدعم الفني من هنا و طلب تقديم الأختبار وسيقدمون لك التعليمات الكاملة لتنفيذ الاختبار
  4. يمكنك شراء شهادة اسمها SSL وتقوم بتركيبها على موقعك هناك مواقع عديدة تقوم ببيع هذه الشهادة باسعار متفاوتة. ايضا هناك مواقع تقوم بإعطاء سنة مجانية للذي يشتري الشهادة لتشجيعه على الاستمرار في شراء الشهادة من خلال هذا الموقع. لو بحث في محرك بحث قوقل ستجد الكثير من المواقع يقدم خدمة بيع هذه الشهادة, بعد شرائك للشهادة تقوم بتركيبها على موقعك من خلال cpanel.
  5. ممكن ترفق ملفات المشروع كاملاً؟ وتأكد من <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="[ADMOB_APP_ID]"/> داخل ملف AndroidManifest.xml بحيث أنه [ADMOB_APP_ID] هو معرف التطبيق على أدموب. لتجريب المشروع والتأكد من أنك قمت بالخطوات كاملاً يرجى إرفاق ملفات المشروع للمساعدة في حل المشكلة.
  6. يمكنك في المسار التالي maiproject\app صنع مجلد جديد وليكن باسم Helpers ثم في داخل المجلد هذا نضع ملف اسمه helpers.php. ومن ثم فليكن الملف بداخله هكذا <?php if (! function_exists('create_option')) { function create_option($table = '',$value = '',$show = '',$selected = '', $where = null) { if($where != null){ $results = DB::table($table)->where($where)->orderBy('id','DESC')->get(); }else{ $results = DB::table($table)->orderBy('id','DESC')->get(); } $option = ''; foreach ($results as $data) { if($data->$value == $selected){ $option .= '<option value="' . $data->$value . '" selected>' . (isset(unserialize($data->$show)[get_option('language')]) ? unserialize($data->$show)[get_option('language')] : '') . '</option>'; }else{ $option .= '<option value="' . $data->$value . '">' . (isset(unserialize($data->$show)[get_option('language')]) ? unserialize($data->$show)[get_option('language')] : '') . '</option>'; } } echo $option; } } if ( ! function_exists('get_row')){ function get_row($table, $where = null , $order = 'ASC') { if($where != null){ $row = DB::table($table)->where($where)->orderBy('id', $order)->first(); }else{ $row = DB::table($table)->orderBy('id', $order)->first(); } return $row; } } if ( ! function_exists('get_table')){ function get_table($table, $where = null , $order = 'DESC') { if($where != null){ $results = DB::table($table)->where($where)->orderBy('id', $order)->get(); }else{ $results = DB::table($table)->orderBy('id', $order)->get(); } return $results; } } if ( ! function_exists('get_logo')){ function get_logo() { $logo = get_option("logo"); if($logo == ''){ return asset("public/uploads/images/default-logo.png"); } return asset("public/uploads/images/$logo"); } } if ( ! function_exists('get_icon')){ function get_icon($name) { return asset("public/images/icons/".$name); } } if ( ! function_exists('month_number_to_name')){ function month_number_to_name($month_number) { $month_name = date("F", mktime(0, 0, 0, $month_number, 10)); return $month_name; } } if ( ! function_exists('sql_escape')){ function sql_escape($unsafe_str) { if (get_magic_quotes_gpc()) { $unsafe_str = stripslashes($unsafe_str); } return $escaped_str = str_replace("'", "", $unsafe_str); } } if ( ! function_exists('get_option')){ function get_option($name, $optional = '') { $setting = DB::table('settings')->where('meta_key', $name)->get(); if ( ! $setting->isEmpty() ) { return $setting[0]->meta_value; } return $optional; } } if ( ! function_exists('timezone_list')) { function timezone_list() { $zones_array = array(); $timestamp = time(); foreach(timezone_identifiers_list() as $key => $zone) { date_default_timezone_set($zone); $zones_array[$key]['ZONE'] = $zone; $zones_array[$key]['GMT'] = 'UTC/GMT ' . date('P', $timestamp); } return $zones_array; } } if ( ! function_exists('create_timezone_option')) { function create_timezone_option($old="") { $option = ""; $timestamp = time(); foreach(timezone_identifiers_list() as $key => $zone) { date_default_timezone_set($zone); $selected = $old == $zone ? "selected" : ""; $option .= '<option value="'. $zone .'"'.$selected.'>'. 'GMT ' . date('P', $timestamp) .' '.$zone.'</option>'; } echo $option; } } if ( ! function_exists( 'get_country_list' )) { function get_country_list($selected = '') { if( $selected == "" ){ echo file_get_contents( app_path().'/Helpers/country.txt' ); }else{ $pattern = '<option value="'.$selected.'">'; $replace = '<option value="'.$selected.'" selected="selected">'; $country_list = file_get_contents( app_path().'/Helpers/country.txt' ); $country_list = str_replace($pattern, $replace, $country_list); echo $country_list; } } } if( !function_exists('load_language') ){ function load_language($active=''){ $path = resource_path() . "/_lang"; $files = scandir($path); $options = ""; foreach($files as $file){ $name = pathinfo($file, PATHINFO_FILENAME); if($name == "." || $name == "" || $name == "language"){ continue; } $selected = ""; if($active == $name){ $selected = "selected"; }else{ $selected = ""; } $options .= "<option value='$name' $selected>".ucwords($name)."</option>"; } echo $options; } } if( !function_exists('get_language_list') ){ function get_language_list(){ $path = resource_path() . "/_lang"; $files = scandir($path); $array = array(); $default = get_option('language'); $array[] = $default; foreach($files as $file){ $name = pathinfo($file, PATHINFO_FILENAME); if($name == "." || $name == "" || $name == "language" || $name == $default){ continue; } $array[] = $name; } return $array; } } if ( ! function_exists('counter')){ function counter($table, $where = null) { if($where != null){ $results = DB::table($table)->where($where)->count(); }else{ $results = DB::table($table)->count(); } return $results; } } if ( ! function_exists('count_inbox')){ function count_inbox() { $inbox = App\ContactMessage::where('status', 0)->count(); return $inbox; } } if (! function_exists('is_site_installed')) { function is_site_installed() { return is_file(public_path('install.txt')); } } ملاحظة هذا الكود مجرد مثال. ثم في ملف composer.json نضع بداخل السطر التالي "autoload": { "psr-4": { "App\\": "app/" }, "classmap": [ "database/seeds", "database/factories" ] }, فيكون "autoload": { "psr-4": { "App\\": "app/" }, "files": [ "app/Helpers/helpers.php" ], "classmap": [ "database/seeds", "database/factories" ] }, ثم نقوم بتنفيذ هذا الامر داخل terminal composer dump-autoload وهكذا نكون قد أضفنا هذا الملف للمشروع بكل سهولة.
  7. تنتشر في فلسطين مكاتب عديدة تقوم بالسحب لك من خلال موقع مستقل أو خمسات, ولكن الأمر المزعج في هذه المكاتب هي العمولة المقتطعة من قبل أصحاب المكاتب و هي كبيرة نوعا ما. يمكنك البحث عن هذه المكاتب والتواصل معها والتفاوض على نسبة العمولة إذا أردت السحب من خلال المكتب. هناك أيضا اشخاص يقومون بالسحب لك ولكن لا أنصح بهم إطلاقاً. هذه المكاتب ممكن أن تقوم بالدفع نقداً أو التحويل إلى حسابك البنكي بعد ما يقومون باستلام الأرباح على حساب paypal الخاص بهم.
  8. يمكنك فتح تذكرة للدعم الفني من هنا و طرح مشكلتك عليهم و سوف يقومون بمساعدتك بحلها
  9. react تستخدم لإنشاء صفحات ويب أحادية الصفحة (SPA) أي صفحات تعمل على المتصفحات, اما react native تستخدم لبرمجة تطبيقات موبايل أي تطبيقات تعمل على الجوال أو التابلت. react native ليست نسخة تختلف عن react, بل هي تطوير ل react, وهي تستخدم مكونات النيتف native لبرمجة تطبيقات تعمل على الموبايل. اما react تستخدم مكونات Web لبرمجة صفحات تعمل على الويب. ولتعلم react native يجب أولاً تعلم react حتى تكون على دراية بالمفاهيم الأساسية مثل Props, State, Components. هناك شركات كبرى تستخدم react , react native في مشاريعها, مع العلم أن شركة فيسبوك هي من قامت بتطوير إطار العمل react.
  10. لا يمكنك تجربة الإعلانات على جهاز وهمي او emulator فقط على جهاز جوال حقيقي ستظهر. يمكنك تجربة ذلك واخباري, أيضا إذا استمريت بفتح الإعلانات من الجهاز الأفتراضي أو الوهمي سيتم حظر حسابك في أدموب أو تعليقه.
  11. يمكنك استخدام الكود كاملا, لقد قمت بتجربته و التأكد من عمله <?php $DATABASE_HOST = 'localhost'; $DATABASE_USER = 'root'; $DATABASE_PASS = ''; $DATABASE_NAME = 'phplogin'; $db = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME); if ($stmt = $db->prepare('SELECT id, password FROM accounts WHERE username = ?')) { $stmt->bind_param('s', $_POST['username']); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows > 0) { echo 'Username exists, please choose another!'; }else { $sql = "INSERT INTO accounts (username, password, email) VALUES (?, ?, ?)"; if($stmt = mysqli_prepare($db, $sql)) { mysqli_stmt_bind_param($stmt, "sss", $username, $password, $email); $username = $_REQUEST['username']; $password = password_hash($_POST['password'], PASSWORD_DEFAULT); $email = $_REQUEST['email']; if(mysqli_stmt_execute($stmt)) { echo "Records inserted successfully."; } } } } $stmt->close(); $db->close(); ?> بحيث أنه في الكود الثاني الذي قمت أنت بإرفاقه تقوم بالتحقق من وجود اسم المستخدم ام لا لذلك يوجد في الكود شرط ويمكن استخدام هذا الشرط بحيث أنه إذا تحقق وكان اسم المستخدم موجود لا نقوم بإدخال البيانات إلى قاعدة البيانات, وإذا كان اسم المستخدم غير موجود نضيف البيانات إلى قاعدة البيانات. وهذا هو الشرط if ($stmt->num_rows > 0) { echo 'Username exists, please choose another!'; } نضيف إليه else بحيث يصبح هكذا مع إضافة كود الإدخال إلى قاعدة البيانات. if ($stmt->num_rows > 0) { echo 'Username exists, please choose another!'; }else { $sql = "INSERT INTO accounts (username, password, email) VALUES (?, ?, ?)"; if($stmt = mysqli_prepare($db, $sql)) { mysqli_stmt_bind_param($stmt, "sss", $username, $password, $email); $username = $_REQUEST['username']; $password = password_hash($_POST['password'], PASSWORD_DEFAULT); $email = $_REQUEST['email']; if(mysqli_stmt_execute($stmt)) { echo "Records inserted successfully."; } } }
  12. يمكنك برمجة ثيم كامل لوردبريس عن طريق الشروحات المقدمة من موقع ووردبريس يمكنك زيارة التوثيق كاملا من هنا . هناك عدة شروط لتنفيذ وبرمجة أي قالب للوردبريس من خلالها يمكنك تنفيذ أي فكرة تريدها وهي: ملف header.php وهو الملف المسؤول عن رأسية الموقع. ملف footer.php وهو الملف المسؤول عن تذييل و أخر الموقع. ملف sidebar.php وهو الملف المسؤول عن الشريط الجانبي للموقع. ملف style.css لوضع تنسيقات الثيم بداخله. ملف rtl.css لوضع تنسيقات الثيم ليدعم الاتجاه من اليمين لليسار. ملف index.php هو الملف الرئيسي للقالب. ملف home.php , front-page.php إذا تم وضع أي منهن يكون الملف هو الواجهة الرئيسية للموقع. ملف comments.php الملف المسؤول عن التعليقات. وهناك الكثير من الأمور التي يجب الأخذ بعين الاعتبار من تنفيذها يمكنك زيارة التوثيق الرسمي و متابعته بشكل جيد لتفهم ذلك جيداً. أيضا توفر ووردبريس دوال للمساعدة في برمجة القالب مثل: دالة get_header(); هذه الدالة تقوم بإستدعاء header الخاص بالموقع. get_footer(); هذه الدالة تقوم بإستدعاء footer الخاص بالموقع. get_sidebar(); هذه الدالة تقوم بإستدعاء sidebar الخاص بالموقع. get_search_form(); هذه الدالة تقوم بإستدعاء فورم البحث الخاص بالموقع. get_template_part('template_name'); هذه الدالة تقوم بإستدعاء أي ملفات تريد وضعها بالثيم. هناك الكثير من الدوال وتوفر ووردبريس مرجع كامل للدوال يمكنك النظر إليه.
  13. مرحبا هل ممكن ترفق ملفات المشروع, أريد فحص المشروع لحل المشكلة.
  14. HTML 5 ما هي إلا تحديث لِ HTML و تم إضافة العديد من الوسوم في HTML 5 وهذه بعض الوسوم: <article> <aside> <audio> <bdi> <canvas> <data> <datalist> <dialog> <details> <embed> <figcaption> <figure> <footer> <header> <hgroup> <keygen> <main> <mark> <menuitem> <meter> <nav> وايضا أدخلت HTML5 عدة أنواع على حقل الإدخال مثل color date datetime email month url week time tel search وهناك أيضا عدة أنواع أخرى. وليست منفصلتان بل نفس اللغة ولكن جرى تحديث على HTML و أصبحت HTML5.
  15. طبعا يوجد فرق في السعر لو شاهده كاملا يحسب السعر كاملا للإعلان ولو تم غلقه ممكن أن يتم احتساب جزء من الربح و ممكن أيضا لا يتم حساب أي جزء من الأرباح. وايضا يرجع ذلك حسب الإعلان المعروض فكل فئة إعلان تختلف الأسعار لها من أي فئة أخرى, مثل إعلانات التواصل والمعرفة تختلف باسعارها عن إعلانات السياسة والدين.
  16. هناك عدة طرق مستخدمة. ممكن تحفظ القيمة عن طريق SharedPrefrence وتجلب قيمة المفتاح. يمكن عن طريق LocalStorage و أيضا يمكن جلب القيمة من المفتاح المخزن. أو عن طريق تنفيذ Setter , Getter ويمكن عن طريق الكود التالي. يمكن تعريف getter int get coinsValue { return coins; } أو بشكل مختصر int get coinsValue => coins; ويمكن أن يكون الكود الخاص بك هكذا import 'package:firebase_admob/firebase_admob.dart'; import 'helper.dart'; //const String testDevice = 'YOUR_DEVICE_ID'; class AdsRewardedVideoAd { static bool _loaded = false; static int coins = 0; int get coinsValue => coins; static RewardedVideoAd videoAd = RewardedVideoAd.instance; static void initialize() { FirebaseAdMob.instance.initialize(appId: AdManager.appId); } static MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo( keywords: <String>['flutterio', 'beautiful apps'], testDevices: <String>[], // Android emulators are considered test devices ); static RewardedVideoAd createRewardedVideoAd() { videoAd.load(adUnitId: AdManager.rewardedAdUnitId, targetingInfo: targetingInfo); RewardedVideoAd.instance.listener = (RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) { if(event == RewardedVideoAdEvent.rewarded) { coins+=rewardAmount; print('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx $coins'); } }; } static void showRewardedVideoAd() { if (videoAd == null) videoAd = createRewardedVideoAd(); videoAd .show().catchError((e) => print("error in showing ad: ${e.toString()}")); } } ويمكن جلبها عن طريق الكلاس AdsRewardedVideoAd.coinsValue بحيث getter => coinsValue يأخذ قيمة coins عندما تتحدث في أي وقت. لقد أجبتك امس هنا, هل قمت بتجربتها. ارجوا إضافة ملفات المشروع هنا كاملاً للمساعدة في حل المشكلة.
  17. هناك عدة طرق مستخدمة. ممكن تحفظ القيمة عن طريق SharedPrefrence وتجلب قيمة المفتاح. يمكن عن طريق LocalStorage و أيضا يمكن جلب القيمة من المفتاح المخزن. أو عن طريق تنفيذ Setter , Getter ويمكن عن طريق الكود التالي. يمكن تعريف getter int get coinsValue { return coins; } أو بشكل مختصر int get coinsValue => coins; ويمكن جلبها عن طريق الكلاس AdsRewardedVideoAd.coinsValue
  18. مرحبا يمكن اضافة الكود على موقعك و تجربته انه يقوم باضافة الصور الى قاعدة البيانات ومن ثم عرضها, ويمكنك استخدام جزئية جلب الصور و عرضها من قاعدة البيانات في أي مكان بملفاتك.
  19. هل ممكن تزودني بلقطات شاشة من التطبيقات ؟ ايضا هذه الاعلانات من الممكن تكون من صاحب التطبيق و ليست خدمة مشترك فيها مثل ادموب.
  20. يمكنك إضافة الحزمة التالية إلى مشروع flutter الخاص بك وهي firebase_admob من خلال pub.dev او تجد الرابط هنا في ملف pubspec.yaml قم بوضع الحزمة مع إصدارها firebase_admob: ^0.11.0+1 ومن ثم تنفيذ الأمر التالي في terminal flutter pub get ثم في المسار التالي android/app/src/main/AndroidManifest.xml قم بوضع <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3940256099942544~3347511713"/> حيث ca-app-pub-3940256099942544~3347511713 هو id التطبيق على admob. في المسار التالي ios/Runner/Info.plis الخاص ب iOS ضع <key>GADApplicationIdentifier</key> <string>ca-app-pub-3940256099942544~1458002511</string> يمكنك إنشاء ملف في المسار التالي lib/helper.dart ووضع الكود التالي فيه import 'dart:io'; class AdManager { static String get appId { if (Platform.isAndroid) { return "<YOUR_ANDROID_ADMOB_APP_ID>"; } else if (Platform.isIOS) { return "<YOUR_IOS_ADMOB_APP_ID>"; } else { throw new UnsupportedError("Unsupported platform"); } } static String get bannerAdUnitId { if (Platform.isAndroid) { return "<YOUR_ANDROID_BANNER_AD_UNIT_ID"; } else if (Platform.isIOS) { return "<YOUR_IOS_BANNER_AD_UNIT_ID>"; } else { throw new UnsupportedError("Unsupported platform"); } } static String get interstitialAdUnitId { if (Platform.isAndroid) { return "<YOUR_ANDROID_INTERSTITIAL_AD_UNIT_ID>"; } else if (Platform.isIOS) { return "<YOUR_IOS_INTERSTITIAL_AD_UNIT_ID>"; } else { throw new UnsupportedError("Unsupported platform"); } } static String get rewardedAdUnitId { if (Platform.isAndroid) { return "<YOUR_ANDROID_REWARDED_AD_UNIT_ID>"; } else if (Platform.isIOS) { return "<YOUR_IOS_REWARDED_AD_UNIT_ID>"; } else { throw new UnsupportedError("Unsupported platform"); } } } مع تغيير كل id لفئة الإعلان الخاص سواء بانر أو Interstitial. ومن ثم في الملف الذي تود عرض الإعلانات فيه تضع لتفعيل الإعلانات Future<void> _initAdMob() { ///Initialize AdMob SDK return FirebaseAdMob.instance.initialize(appId: AdManager.appId); } يمكن استخدام لتفعيل إعلانات البانر BannerAd _bannerAd; void _loadBannerAd() { _bannerAd ..load() ..show(anchorType: AnchorType.top); } و ثم في دالة initState نضع @override void initState() { _bannerAd = BannerAd( adUnitId: AdManager.bannerAdUnitId, size: AdSize.banner, ); _loadBannerAd(); } لتشغيل الإعلانات في التطبيق, يمكنك مراجعة التوثيق الخاص بالحزمة ستجد تفاصيل أكثر عن كيفية استخدام كل نوع من الإعلانات و كيفية تنفيذها في تطبيقك هنا يجب استخدام إعلانات من فئة interstitial ,وتسمى هذه الإعلانات البينية , بحيث هذه الإعلانات تظهر عند الأنتقال من واجهة لواجهة أو عند تنفيذ حدث معين في التطبيق. بما أنك تستخدم إعلانات من قوقل أدموب فجميع فئات الإعلانات يمكن للمستخدم تخطيها او إغلاقها حسب رغبة المستخدم.
  21. دائما تأكد من logs عن طريق المسار التالي storage/logs تجد ملفات logs بتاريخ اليوم أو ملف كامل لجميع logs ويمكنك فتح الملفات و النظر بسبب المشكلة ممكن ان تكون قد أخطأت في كتابة اسم الcontroller في ملف المخصص للمسارات مثل Route::get('/home', 'HomeController@index')->name('home'); ممكن أن تكون قد أخطأت في كتابة اسم المسار مثل /home أو أخطأت في كتابة اسم controller مثل HomeController. أو ايضا تفقد الدالة name التي تعطي اسم المسار و في حالة الكود أعلاه تفقد اسم المسار و طريقة التوجيه المستخدمة فمثلا ممكن ان نوجه صفحة عن طريق <a href="{{ route('home') }}">الصفحة الرئيسية</a> واخيرا قم بتنفيذ php artisan cache:clear php artisan route:clear php artisan config:clear php artisan view:clear أو يمكنك عن طريق المتصفح بحذف الكاش بوضع Route::get('/cache-clear', function() { Artisan::call('cache:clear'); }); في ملف web.php ومن ثم في المتصفح قم بفتح المسار /cache-clear
  22. Mass Assignment هي عندما ترسل مصفوفة إلى إنشاء النموذج, بشكل أساسي تقوم بتعيين مجموعة من الحقول على النموذج دفعة واحدة, بدلاً من واحد تلو الأخر. مثل. $post = new Post(request()->all()); يمكن استخدام fillabel لوضع حماية على جميع جميع الحقول التي تريد الإضافة لها إو تحديثها. protected $fillable = ['name', 'email']; ويمكن استخدام $guarded بهذا الشكل لمنع أي حقل من التخصيص الجماعي. protected $guarded = []; protected $guarded = ['age']; أو يمكن استخدام protected $guarded = ['*']; لمنع التخصيص الجماعي للحقول كافة. يمكنك إضافة @csrf للنموذج بهذا الشكل وهذا يحدث اما بسبب التصاريح المطبقة على المجلد أو بسبب انتهاء الجلسة. <form action="" method="post"> @csrf <div class="box-body"> @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <div class="form-group"> <label for="name">الأسم بالكامل</label> <input type="text" name="name" class="form-control" id="name" placeholder="اسم المستخدم" value="{{ old('name') }}"> </div> <div class="box-footer"> <button type="submit" class="btn btn-primary">حفظ</button> </div> </form> لو استمرت المشكلة تأكد من التصاريح لمجلد storage يمكنك من التأكد أنه يحمل التصريح 770 أو 777.
  23. يمكنك استخدام حزمة spatie/laravel-backup والموقع الرسمي لها هنا بحيث يمكنك استخدام الأمر التالي لاستدعاء الحزمة composer require spatie/laravel-backup ومن ثم بعد استدعاء الحزمة نريد إضافة ملف backup.php إلى مجلد config عن طريق الأمر التالي php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider" ويمكنك من ملف app/Console/Kernel.php وضع امر لأخذ نسخة احتياطية بشكل تلقائي عن طريق إضافة protected function schedule(Schedule $schedule) { $schedule->command('backup:clean')->daily()->at('01:00'); $schedule->command('backup:run')->daily()->at('01:30'); } ومن ثم تشغيل الأمر التالي php artisan backup:run ويمكنك انشاء Controller لحفظ و تنزيل نسخة احتياطية عن طريق مثلا لوحة التحكم فيكون شكل الcontroller هكذا <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Alert; use App\Http\Requests; use Artisan; use Log; use Storage; use Spatie\Backup\Helpers\Format; class BackupController extends Controller { public function index() { $disk = Storage::disk(config('backup.backup.destination.disks')[0]); //$disk = storage_path('app'); //dd(storage_path('app') . DIRECTORY_SEPARATOR . config('backup.backup.name')); //$disk = Storage::disk(config('backup.backup.name')[0]); //dd(config('backup.name')); //dd(config('backup.name.backup.destination.disks')[0]); //echo (config('CropFix.backup.destination.disks')[0]); $files = $disk->files(config('backup.backup.name')); //$files = storage_path('app') . DIRECTORY_SEPARATOR . config('backup.backup.name'); $backups = []; // make an array of backup files, with their filesize and creation date foreach ($files as $k => $f) { // only take the zip files into account if (substr($f, -4) == '.zip' && $disk->exists($f)) { $backups[] = [ 'file_path' => $f, 'file_name' => str_replace(config('backup.backup.name') . '/', '', $f), 'file_size' => Format::humanReadableSize($disk->size($f)), 'last_modified' => date('m/d/Y H:i:s', $disk->lastModified($f)), ]; } } // reverse the backups, so the newest one would be on top $backups = array_reverse($backups); return view("admin.backups.index")->with(compact('backups')); } public function create() { try { // start the backup process //Artisan::call('backup:run'); $parameters = []; $outputBuffer = null; Artisan::call('backup:run', $parameters, $outputBuffer); //Artisan::call('backup:run'); $output = Artisan::output(); //dd(Artisan::output()); // log the results //Log::info("Backpack\BackupManager -- new backup started from admin interface \r\n" . $output); // return the results as a response to the ajax call //Alert::success('New backup created'); return redirect()->back(); } catch (Exception $e) { Flash::error($e->getMessage()); return redirect()->back(); } } /** * Downloads a backup zip file. * * TODO: make it work no matter the flysystem driver (S3 Bucket, etc). */ public function download($file_name) { //$file = config('backup.backup.name') . '/' . $file_name; $file = config('backup.backup.name') . '/' . $file_name; $disk = Storage::disk(config('backup.backup.destination.disks')[0]); if ($disk->exists($file)) { $fs = Storage::disk(config('backup.backup.destination.disks')[0])->getDriver(); $stream = $fs->readStream($file); return \Response::stream(function () use ($stream) { fpassthru($stream); }, 200, [ "Content-Type" => $fs->getMimetype($file), "Content-Length" => $fs->getSize($file), "Content-disposition" => "attachment; filename=\"" . basename($file) . "\"", ]); } else { abort(404, "The backup file doesn't exist."); } } /** * Deletes a backup file. */ public function delete($file_name) { $disk = Storage::disk(config('backup.backup.destination.disks')[0]); if ($disk->exists(config('backup.backup.name') . '/' . $file_name)) { $disk->delete(config('backup.backup.name') . '/' . $file_name); return redirect()->back(); } else { abort(404, "The backup file doesn't exist."); } } function humanFilesize($size, $precision = 2) { $units = array('B','kB','MB','GB','TB','PB','EB','ZB','YB'); $step = 1024; $i = 0; while (($size / $step) > 0.9) { $size = $size / $step; $i++; } return round($size, $precision).$units[$i]; } } و ملف view الخاص controller يكون بالشكل التالي @extends('admin.layout.app') @section('content_header') <h1>النسخ الاحتياطية</h1> <ol class="breadcrumb"> <li><a href="{{ route('dashboard') }}"><i class="fa fa-dashboard"></i> لوحة التجكم</a></li> <li><a href="{{ route('users.index') }}">أدارة النسخ الاحتياطية</a></li> <li class="active">النسخ الاحتياطية</li> </ol> @endsection @section('content') <div class="row"> <div class="col-md-12"> <div class="box"> <div class="box-header with-border"> <a href="{{ route('backups.create') }}" class="btn btn-danger float-left" style="width: 200px; float: left;">أنشاء نسخة أحتياطية</a> </div><!-- /.box-header --> <div class="box-body"> @if (count($backups)) <table class="table table-bordered"> <tbody> <tr> <th>الملف</th> <th>الحجم</th> <th>التاريخ</th> <th>المدة</th> <th></th> </tr> @foreach($backups as $backup) <tr> <td>{{ $backup['file_name'] }}</td> <td>{{ ($backup['file_size']) }}</td> <td> {{ ($backup['last_modified']) }} </td> <td> {{ ($backup['last_modified']) }} </td> <td class="text-right"> <a class="btn btn-xs btn-default" href="{{ route('backups.download', $backup['file_name']) }}"><i class="fa fa-cloud-download"></i> تحميل</a> <a class="btn btn-xs btn-danger" data-button-type="delete" href="{{ route('backups.delete', $backup['file_name']) }}"><i class="fa fa-trash-o"></i> حذف</a> </td> </tr> @endforeach @else <tr> <td colspan="4">لا توجد نسخ احتياطية</td> </tr> @endif </tbody> </table> </div><!-- /.box-body --> </div><!-- /.box --> </div><!-- /.col --> </div> @endsection طبعا هذه الأكواد عبارة عن أمثلة. يمكنك زيارة التوثيق الرسمي للحزمة و متابعة جميع المميزات التي تقدمها الحزمة أيضا.
  24. يمكنك استخدام الموقع التالي quicktype و تحويل ما تريد من أي شكل من أشكال josn إلى أي لغة تريدها, فمثلا يمكنك تحويل شكل json المرفق من قبلك وهو [ { "id": 1, "name": "Leanne Graham", "username": "Bret", "email": "Sincere@april.biz", "address": { "street": "Kulas Light", "suite": "Apt. 556", "city": "Gwenborough", "zipcode": "92998-3874", "geo": { "lat": "-37.3159", "lng": "81.1496" } }, "phone": "1-770-736-8031 x56442", "website": "hildegard.org", "company": { "name": "Romaguera-Crona", "catchPhrase": "Multi-layered client-server neural-net", "bs": "harness real-time e-markets" } }, { "id": 2, "name": "Ervin Howell", "username": "Antonette", "email": "Shanna@melissa.tv", "address": { "street": "Victor Plains", "suite": "Suite 879", "city": "Wisokyburgh", "zipcode": "90566-7771", "geo": { "lat": "-43.9509", "lng": "-34.4618" } }, "phone": "010-692-6593 x09125", "website": "anastasia.net", "company": { "name": "Deckow-Crist", "catchPhrase": "Proactive didactic contingency", "bs": "synergize scalable supply-chains" } }, { "id": 3, "name": "Clementine Bauch", "username": "Samantha", "email": "Nathan@yesenia.net", "address": { "street": "Douglas Extension", "suite": "Suite 847", "city": "McKenziehaven", "zipcode": "59590-4157", "geo": { "lat": "-68.6102", "lng": "-47.0653" } }, "phone": "1-463-123-4447", "website": "ramiro.info", "company": { "name": "Romaguera-Jacobson", "catchPhrase": "Face to face bifurcated interface", "bs": "e-enable strategic applications" } } ] إلى جافا و يمكن تحويل شكل الجيسون إلى عدة لغات. // Converter.java // To use this code, add the following Maven dependency to your project: // // // com.fasterxml.jackson.core : jackson-databind : 2.9.0 // com.fasterxml.jackson.datatype : jackson-datatype-jsr310 : 2.9.0 // // Import this package: // // import io.quicktype.Converter; // // Then you can deserialize a JSON string with // // Welcome[] data = Converter.fromJsonString(jsonString); package io.quicktype; import java.io.IOException; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import java.util.*; import java.time.LocalDate; import java.time.OffsetDateTime; import java.time.OffsetTime; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoField; public class Converter { // Date-time helpers private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder() .appendOptional(DateTimeFormatter.ISO_DATE_TIME) .appendOptional(DateTimeFormatter.ISO_OFFSET_DATE_TIME) .appendOptional(DateTimeFormatter.ISO_INSTANT) .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SX")) .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssX")) .appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) .toFormatter() .withZone(ZoneOffset.UTC); public static OffsetDateTime parseDateTimeString(String str) { return ZonedDateTime.from(Converter.DATE_TIME_FORMATTER.parse(str)).toOffsetDateTime(); } private static final DateTimeFormatter TIME_FORMATTER = new DateTimeFormatterBuilder() .appendOptional(DateTimeFormatter.ISO_TIME) .appendOptional(DateTimeFormatter.ISO_OFFSET_TIME) .parseDefaulting(ChronoField.YEAR, 2020) .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1) .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) .toFormatter() .withZone(ZoneOffset.UTC); public static OffsetTime parseTimeString(String str) { return ZonedDateTime.from(Converter.TIME_FORMATTER.parse(str)).toOffsetDateTime().toOffsetTime(); } // Serialize/deserialize helpers public static Welcome[] fromJsonString(String json) throws IOException { return getObjectReader().readValue(json); } public static String toJsonString(Welcome[] obj) throws JsonProcessingException { return getObjectWriter().writeValueAsString(obj); } private static ObjectReader reader; private static ObjectWriter writer; private static void instantiateMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.findAndRegisterModules(); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); SimpleModule module = new SimpleModule(); module.addDeserializer(OffsetDateTime.class, new JsonDeserializer<OffsetDateTime>() { @Override public OffsetDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { String value = jsonParser.getText(); return Converter.parseDateTimeString(value); } }); mapper.registerModule(module); reader = mapper.readerFor(Welcome[].class); writer = mapper.writerFor(Welcome[].class); } private static ObjectReader getObjectReader() { if (reader == null) instantiateMapper(); return reader; } private static ObjectWriter getObjectWriter() { if (writer == null) instantiateMapper(); return writer; } } // Welcome.java package io.quicktype; import com.fasterxml.jackson.annotation.*; public class Welcome { private long id; private String name; private String username; private String email; private Address address; private String phone; private String website; private Company company; @JsonProperty("id") public long getID() { return id; } @JsonProperty("id") public void setID(long value) { this.id = value; } @JsonProperty("name") public String getName() { return name; } @JsonProperty("name") public void setName(String value) { this.name = value; } @JsonProperty("username") public String getUsername() { return username; } @JsonProperty("username") public void setUsername(String value) { this.username = value; } @JsonProperty("email") public String getEmail() { return email; } @JsonProperty("email") public void setEmail(String value) { this.email = value; } @JsonProperty("address") public Address getAddress() { return address; } @JsonProperty("address") public void setAddress(Address value) { this.address = value; } @JsonProperty("phone") public String getPhone() { return phone; } @JsonProperty("phone") public void setPhone(String value) { this.phone = value; } @JsonProperty("website") public String getWebsite() { return website; } @JsonProperty("website") public void setWebsite(String value) { this.website = value; } @JsonProperty("company") public Company getCompany() { return company; } @JsonProperty("company") public void setCompany(Company value) { this.company = value; } } // Address.java package io.quicktype; import com.fasterxml.jackson.annotation.*; public class Address { private String street; private String suite; private String city; private String zipcode; private Geo geo; @JsonProperty("street") public String getStreet() { return street; } @JsonProperty("street") public void setStreet(String value) { this.street = value; } @JsonProperty("suite") public String getSuite() { return suite; } @JsonProperty("suite") public void setSuite(String value) { this.suite = value; } @JsonProperty("city") public String getCity() { return city; } @JsonProperty("city") public void setCity(String value) { this.city = value; } @JsonProperty("zipcode") public String getZipcode() { return zipcode; } @JsonProperty("zipcode") public void setZipcode(String value) { this.zipcode = value; } @JsonProperty("geo") public Geo getGeo() { return geo; } @JsonProperty("geo") public void setGeo(Geo value) { this.geo = value; } } // Geo.java package io.quicktype; import com.fasterxml.jackson.annotation.*; public class Geo { private String lat; private String lng; @JsonProperty("lat") public String getLat() { return lat; } @JsonProperty("lat") public void setLat(String value) { this.lat = value; } @JsonProperty("lng") public String getLng() { return lng; } @JsonProperty("lng") public void setLng(String value) { this.lng = value; } } // Company.java package io.quicktype; import com.fasterxml.jackson.annotation.*; public class Company { private String name; private String catchPhrase; private String bs; @JsonProperty("name") public String getName() { return name; } @JsonProperty("name") public void setName(String value) { this.name = value; } @JsonProperty("catchPhrase") public String getCatchPhrase() { return catchPhrase; } @JsonProperty("catchPhrase") public void setCatchPhrase(String value) { this.catchPhrase = value; } @JsonProperty("bs") public String getBs() { return bs; } @JsonProperty("bs") public void setBs(String value) { this.bs = value; } } في الصورة المرفقة التالية يتم وضع اسم الكلاس. يتم وضع شكل الجيسون في المكان المخصص. ملف بعد التحويل إلى أي لغة. 5. 6. هنا ممكن تتحكم بالأعدادات التي تريدها وتريد استخراج الكلاس بأي إعدادات.
  25. يمكنك القيام بذلك عن طريق الأستعلام select في mysql و إرجاع اسم الصورة من الحقل الذي تم تخزين اسم الصورة فيها فمثلاً قممنا ببرمجة فورم لرفع الصورة وحفظها داخل قاعدة البيانات <form name="newad" method="post" enctype="multipart/form-data" action="bas.php"> <table> <tr><td><input type="file" name="image"></td></tr> <input type="hidden" name="MAX_FILE_SIZE" value="90000" /> <tr><td><input name="Submit" type="submit" value="Upload image"></td></tr> </table> </form> <?php $con = mysqli_connect("localhost", "root", "") or die ("فشل في الإتصال بقاعدة لبينات "); $db=mysqli_select_db($con, 'tc'); define ("MAX_SIZE","10"); // this function to get extension of files................. function getExtension($str) { $i = strrpos($str,"."); if (!$i) { return ""; } $l = strlen($str) - $i; $ext = substr($str,$i+1,$l); return $ext; } $errors=0; if(isset($_POST['Submit'])) { $image=$_FILES['image']['name']; if ($image) { $filename = stripslashes($_FILES['image']['name']); $extension = getExtension($filename); $extension = strtolower($extension); if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")) { echo '<h1>Unknown extension!</h1>'; $errors=1; } else { $size=filesize($_FILES['image']['name']); if ($size > MAX_SIZE*1024) { echo '<h1>You have exceeded the size limit!</h1>'; $errors=1; } $image_name=time().'.'.$extension; $newname="upload/".$image_name; //$copied = copy($_FILES['image']['tmp_name'], $newname); $copied = move_uploaded_file($_FILES["image"]["tmp_name"], $newname); if (!$copied) { echo '<h1>Copy unsuccessfull!</h1>'; $errors=1; }}}} if(isset($_POST['Submit']) && !$errors) { echo "<h1>File Uploaded Successfully! Try again!</h1>"; // echo "<img src=$newname>"; // ------------------------------------------- To Save Path of Image in DataBase and show it on Browser... // table name $result = @mysqli_query($con, "INSERT INTO `news` VALUES ('', '$newname')"); if($result) { echo "file added"; } else { echo "error"; } $gotten = @mysqli_query($con, "Select * From news"); while($row = @mysqli_fetch_array($gotten)) { $pic=$row['path']; $id=$row['id']; // echo "<img src=$pic>"; // Here to Display Image on Browser and In Blank Browser if you like..... echo " <a href='$pic' target='_blank'> <img border='0' src=$pic alt=$pic> </a> "; } } ?> ومثلا هذا جدول قاعدة البيانات CREATE TABLE `news` ( `id` int(11) NOT NULL, `path` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; فلو تلاحظ في الكود التالي قمنا برفع صورة و من ثم حفظ الصورة داخل حقل path في جدول قاعدة البيانات news, ومن ثم قمنا بجلب الصور المخزنة عن طريق الاستعلام التالي داخل الكود المرفق إعلاه كاملا. // table name $result = @mysqli_query($con, "INSERT INTO `news` VALUES ('', '$newname')"); if($result) { echo "file added"; } else { echo "error"; } $gotten = @mysqli_query($con, "Select * From news"); while($row = @mysqli_fetch_array($gotten)) { $pic=$row['path']; $id=$row['id']; // echo "<img src=$pic>"; // Here to Display Image on Browser and In Blank Browser if you like..... echo " <a href='$pic' target='_blank'> <img border='0' src=$pic alt=$pic> </a> "; }
×
×
  • أضف...