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

بلال زيادة

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

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

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

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

    30

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

  1. يمكنك برمجة ثيم كامل لوردبريس عن طريق الشروحات المقدمة من موقع ووردبريس يمكنك زيارة التوثيق كاملا من هنا . هناك عدة شروط لتنفيذ وبرمجة أي قالب للوردبريس من خلالها يمكنك تنفيذ أي فكرة تريدها وهي: ملف 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'); هذه الدالة تقوم بإستدعاء أي ملفات تريد وضعها بالثيم. هناك الكثير من الدوال وتوفر ووردبريس مرجع كامل للدوال يمكنك النظر إليه.
  2. مرحبا هل ممكن ترفق ملفات المشروع, أريد فحص المشروع لحل المشكلة.
  3. 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.
  4. طبعا يوجد فرق في السعر لو شاهده كاملا يحسب السعر كاملا للإعلان ولو تم غلقه ممكن أن يتم احتساب جزء من الربح و ممكن أيضا لا يتم حساب أي جزء من الأرباح. وايضا يرجع ذلك حسب الإعلان المعروض فكل فئة إعلان تختلف الأسعار لها من أي فئة أخرى, مثل إعلانات التواصل والمعرفة تختلف باسعارها عن إعلانات السياسة والدين.
  5. هناك عدة طرق مستخدمة. ممكن تحفظ القيمة عن طريق 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 عندما تتحدث في أي وقت. لقد أجبتك امس هنا, هل قمت بتجربتها. ارجوا إضافة ملفات المشروع هنا كاملاً للمساعدة في حل المشكلة.
  6. هناك عدة طرق مستخدمة. ممكن تحفظ القيمة عن طريق SharedPrefrence وتجلب قيمة المفتاح. يمكن عن طريق LocalStorage و أيضا يمكن جلب القيمة من المفتاح المخزن. أو عن طريق تنفيذ Setter , Getter ويمكن عن طريق الكود التالي. يمكن تعريف getter int get coinsValue { return coins; } أو بشكل مختصر int get coinsValue => coins; ويمكن جلبها عن طريق الكلاس AdsRewardedVideoAd.coinsValue
  7. مرحبا يمكن اضافة الكود على موقعك و تجربته انه يقوم باضافة الصور الى قاعدة البيانات ومن ثم عرضها, ويمكنك استخدام جزئية جلب الصور و عرضها من قاعدة البيانات في أي مكان بملفاتك.
  8. هل ممكن تزودني بلقطات شاشة من التطبيقات ؟ ايضا هذه الاعلانات من الممكن تكون من صاحب التطبيق و ليست خدمة مشترك فيها مثل ادموب.
  9. يمكنك إضافة الحزمة التالية إلى مشروع 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 ,وتسمى هذه الإعلانات البينية , بحيث هذه الإعلانات تظهر عند الأنتقال من واجهة لواجهة أو عند تنفيذ حدث معين في التطبيق. بما أنك تستخدم إعلانات من قوقل أدموب فجميع فئات الإعلانات يمكن للمستخدم تخطيها او إغلاقها حسب رغبة المستخدم.
  10. دائما تأكد من 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
  11. 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.
  12. يمكنك استخدام حزمة 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 طبعا هذه الأكواد عبارة عن أمثلة. يمكنك زيارة التوثيق الرسمي للحزمة و متابعة جميع المميزات التي تقدمها الحزمة أيضا.
  13. يمكنك استخدام الموقع التالي 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. هنا ممكن تتحكم بالأعدادات التي تريدها وتريد استخراج الكلاس بأي إعدادات.
  14. يمكنك القيام بذلك عن طريق الأستعلام 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> "; }
  15. يمكن تكرار الاستعلام مرة داخل controller الخاص ب admin panel و مرة في الcontroller الخاص بالموقع. يجوز تكرار نفس الاستعلام داخل أي controller تريدين.
  16. أخي يبدو أن هناك أجزاء من gradle لم يتم تحميلها بشكل صحيح. لذلك هناك عدة حلول وهي يمكن استدعاء هذه الحزمة مرة أخرى cloud_firestore و العمل على تثبيتها في مشروعك بشكل صحيح ممكن تقرأ أكثر عنها هنا , ومن ثم تشغيل الأمر flutter clean , و من ثم الأمر flutter run, ومن ثم الأمر flutter build apk. ممكن أن تقوم بصنع مشروع جديد و من ثم نقل الملفات إليه و المحاولة مرة أخرى. ومن ثم تشغيل الأمر flutter build apk. التأكد من الحزم التي تم استخدامها في المشروع و التأكد من أنها ثبتت بشكل صحيح و هناك بعض الحزم مثل cloud_firestore تحتاج إلى إضافة بعض الأوامر إلى الملفات. تشغيل الأمر flutter doctor وفحص النتيجة و العمل على حل جميع المشاكل.
  17. هل موجود في ملف gradle.properties هذه الأوامر org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true android.enableR8=true ممكن لقطة شاشة من ملف gradle.properties؟
  18. أخي يمكن للحل المرفق مسبقاً إعلاه أن يفيدك لقد واجهني خطأ مثل هذا قبل ذلك وقمت بحله بنفس طريقة الجواب الذي أرفقته لك هل ممكن أن تقوم بتجربة ذلك واخباري بالنتيجة.
  19. يمكنك صنع مجلد جديد داخل المسار التالي app\Http\Controllers وليكن Admin و من ثم في هذا المجلد نخزن أي controller خاص بالادمن أو عن طريق الأمر التالي نستطيع تخزين الcontroller في أي مجلد نريده php artisan make:controller Admin\PostsController --resource لو لاحظتي جيدا أننا قمنا بتوجيه تخزين الcontroller إلى المجلد Admin كما في الأمر إعلاه. طبعا لوحة التحكم ستكون مختلفة التصميم و الأوامر عن تصميم الموقع فينصح بفصل controllers الخاصة بالموقع عن لوحة التحكم , أيضا نادراُ ما يتم استخدام نفس الcontroller لكل من اللوحة أو الموقع. و أيضا يمكن في ملف web.php الخاص ب routes تمييز لكل من اللوحة و الموقع عن طريق Route::group ففي المثال التي حددنا مسارات لوحة التحكم داخل Route::group Route::group(['prefix' => 'admin', 'as' => 'admin.'], function () { Route::get('/login', 'Admin\Auth\LoginController@showLoginForm')->name('adminlogin'); Route::post('/login', 'Admin\Auth\LoginController@login')->name('adminloginsubmit'); Route::get('/logout', 'Admin\Auth\LoginController@logout')->name('adminlogout'); Route::post('/logout', 'Admin\Auth\LoginController@logout')->name('adminlogout'); }); كلما كانت طريقة تنظيم المشروع ممتازة وجيدة فيسهل مستقبلا التطوير على المشروع و أيضا هذا قد يساعدكي في مشروعات أخرى من الأستفادة من العناصر المشتركة في مشاريع مستقبلية.
  20. يمكنك إنشاء مشروع مخصص للأندرويد باستخدام flutter عن طريق الأمر التالي flutter create -i objc -a java nameProject بحيث nameProject هي اسم المشروع الجديد المخصص للأندرويد. ثم إنشاء Channel مخصصة باستخدام الخاصية MethodChannel, طبعا يرتبط client و host المضيف للقناة من خلال اسم القناة الذي تم تمريره في منشئ القناة. و هنا يجب أن يكون جميع اسماء القنوات المستخدمة في تطبيق واحد فريدة أي لا تتكرر. import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; ... class _MyHomePageState extends State<MyHomePage> { static const platform = const MethodChannel('flutter.native/helperchannel'); } ومن ثم يتم استداعاء القناة String res = ""; try { final String result = await platform.invokeMethod('nativeCode'); res = result; } on PlatformException catch (e) { } و من ثم في مجلد android نجد ملف MainActivity.java و من ثم إنشاء MethodChannel بنفس الاسم الذي أنشأناه في تطبيق flutter. private static final String CHANNEL = "flutter.native/helperchannel"; ومن ثم في دالة OnCreate علينا أنشاء MethodCallHandler new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler( new MethodChannel.MethodCallHandler() { @Override public void onMethodCall(MethodCall call, MethodChannel.Result result) { if (call.method.equals("nativeCode")) { String myCode = myCode(); result.success(myCode); } }}); و أيضا ننشىء الدالة myCode في نفس الملف private String myCode() { return "print my Code"; } } ومن ثم في Flutter نستطيع استدعاء أي دالة في MainActivity.java الخاصة بالاندرويد عن طريق القناة المعرفة مسبقا كما ذكرنا سلفاً. كود main.dart كاملا import 'package:flutter/material.dart'; import 'dart:async'; import 'package:flutter/services.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( home: new HomePage(), ); } } class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: const Text('Native Code from Dart'), ), body: new MyHomePage(), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => new _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { static const platform = const MethodChannel('flutter.native/helperchannel'); String responseCode = ''; Future<void> responseMyCode() async { String res = ""; try { final String result = await platform.invokeMethod('nativeCode'); res = result; } on PlatformException catch (e) { } setState(() { responseCode = res; }); } @override Widget build(BuildContext context) { return Material( child: Center( child: Column( children: [ RaisedButton( child: Text('get My Code'), onPressed: responseMyCode, ), Text(responseCode), ], ), ), ); } } MainActivity.java import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; public class MainActivity extends FlutterActivity { private static final String CHANNEL = "flutter.native/helperchannel"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler( new MethodChannel.MethodCallHandler() { @Override public void onMethodCall(MethodCall call, MethodChannel.Result result) { if (call.method.equals("nativeCode")) { String myCode = myCode(); result.success(myCode); } }}); } private String myCode() { return "print my Code"; } }
  21. دائما يجب فحص logs لانه ممكن ان يكون هناك شرط قد وضعتيه انه اذا لم يتحقق أن يقوم بالذهاب الى الصفحة الرئيسية للمشروع, وهذا الشرط ممكن أن يكون موضوع عند تشغيل الموقع أي من البداية فعند لا تحقق الشرط يستمر بالذهاب إلى الصفحة الرئيسية مما يسبب المشكلة الذي تم حلها. مثال بسيط <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class IndexController extends Controller { /** * Show the application dashboard. * * @return \Illuminate\Contracts\Support\Renderable */ public function index() { $c = 1 if($c != 0){ return redirect()->route("/index"); } return view('home'); } } هذا الكود لو لاحظتي جيدا أنه عند تشغيل المشروع إذا لم يتحقق الشرط سيكرر الذهاب إلى الصفحة الرئيسية مما يسبب المشكلة الي حصلت عندك.
  22. صحيح , لاحظت هو عدم وجود متغير about وهو مسبب المشكلة ممكن ترفقي اول جزء من الملف هنا أو التأكد من متغير about في ملف FrontController.php
  23. ممكن تشوفي المسار التالي storage\logs وفحص مشاكل logs ستجدين عدة ملفات كل ملف مسمى بتاريخ اليوم إذا حصلت المشكلة اليوم سوف تجدين ملف بتاريخ اليوم ممكن تشوفي المشكلة المسببة لذلك أو وضع المشكلة هنا لنساعدك بها.
  24. ممكن يكون عدة أسباب لذلك, قد تكون مش مفعل multiDexEnabled true defaultConfig { multiDexEnabled true } في المسار التالي أو ناسي وضعها android > app > build.gradle, ومن ثم في defaultConfig بدك ترقي gradle في ملف android/build.gradle classpath 'com.android.tools.build:gradle:3.3.1' طبعا مع تغيير 3.3.1 إلى أخر أصدار gradle, ومن ثم في المسار التالي android/app/gradle.properties ستضع التالي android.useAndroidX=true android.enableJetifier=true و من ثم تشغيل الأمر التالي flutter clean
  25. أول شيء إصدارات PHP أوقفت التعامل مع mysql و استبدلتها ب mysqli أو PDO. هناك عدة دوال لحماية المدخلات ومنها mysql_real_escape_string: تقوم بحماية المدخلات المضافة إلى قاعدة البيانات. strip_tags: تمنع إضافة أكواد HTML , PHP داخل قاعدة البيانات. htmlspecialchars: يمكنك مراجعة توثيق موسوعة حسوب بالدالة لفهمها أكثر من هنا $name = strip_tags($_POST['name']); $name = htmlspecialchars($_POST['name']); $name = mysql_real_escape_string($_POST['name']); ويمكن صنع دالة حماية واستخدامها مع كل مدخل مثل function filterThis($string) { return mysql_real_escape_string($string); } function filterThis($string) { return strip_tags($string); } function filterThis($string) { return htmlspecialchars($string); } فلو أردنا تطبيق هذه الدوال على الكود الخاص بك يصبح هكذا <?PHP $name = strip_tags($_POST['name']); $phone = strip_tags($_POST['phone']); $email = strip_tags($_POST['email']); $db = mysql_connect('localhost', 'root', '', 'info'); $query = "insert into user values('".$name."','".$phone."','".$email."')"; $insert =$db->query($query); ?> <form method="post" action=""> <p><input name="name" type="text"></p> <p><input name="phone" type="text"></p> <p><input name="email" type="text"></p> <p><input type="submit"></p> </form>
×
×
  • أضف...