ربما تقصد أنه لديك وقت ما يكون بصيغة timestamp بهذا الشكل
86400
لاحظ ان الرقم السابق هو عدد الثواني في 24 ساعة ,فيمكنك برمجة دالة تقوم بهذا الأمر , لأن الدالة ستسمح لك باستخدامها في أي مكان في مشروعك فنقوم بإنشاء دالة وليكن اسمها secondsToString بهذا الشكل
function secondsToString( $seconds ){
}
لاحظ أننا مررنا لها رقم الثواني , الأن يمكننا الاستفادة من رقم الثواني هذا في تحويله إلى ثواني و دقائق و ساعات , نقوم باستخدام دالة intval لنحصل على القيمة الصحيحة للرقم
$seconds = intval( $seconds );
ثم نقوم باستخراج الساعة عن طريق تمرير عدد الثواني مقسوم على 3600 و هو عدد الثواني في الساعة الواحدة
$h = floor( $seconds / 3600 );
ثم نقوم باستخراج عدد الدقائق من خلال جلب باقي قسمة الثواني على 3600 ثم قسمة الرقم الناتج على 60
$m = floor( $seconds % 3600 / 60 );
ثم عدد الثواني من خلال جلب باقي قسمة الثواني على 60
$s = floor( $seconds % 60 );
ثم نقوم بإرجاع القيم هذه من خلال دالة return و نضع بين المتغيرات النص ":" بهذه الطريقة
return $h.":".( $m < 10 ? "0" : "" ).$m.":".( $s < 10 ? "0" : "" ).$s;
فسيكون الناتج بهذا الشكل
23:59:59
فتكون كامل الدالة
function secondsToString( $seconds ){
$seconds = intval( $seconds );
$h = floor( $seconds / 3600 );
$m = floor( $seconds % 3600 / 60 );
$s = floor( $seconds % 60 );
return $h.":".( $m < 10 ? "0" : "" ).$m.":".( $s < 10 ? "0" : "" ).$s;
}
سوف نقوم باستخدام inner join للربط بين الجدولين فيمكنك استخدام inner join بهذا الشكل
"SELECT c.*, u.* FROM `chat` as c inner join users as u WHERE u.id = c.sender_id ORDER BY `id` DESC LIMIT 50";
ففي حالة الكود الخاص بك يتم تنفيذ هذا الاستعلام
$stmt = $db->prepare("SELECT c.*, u.* FROM `chat` as c inner join users as u WHERE u.id = c.sender_id ORDER BY `ID` DESC LIMIT 50");
ومن ثم يمكنك الوصول إلى جميع الحقول بداخل الجدولين أو يمكنك تحديد مثلاً جميع حقول جدول ما و حقل من الجدول الثاني بهذا الشكل
$stmt = $db->prepare("SELECT c.*, u.name FROM `chat` as c inner join users as u WHERE u.id = c.sender_id ORDER BY `ID` DESC LIMIT 50");
يمكنك جلب امتداد الملف عن طريق تقسيم اسم الملف بهذا الشكل
$name = explode('.', $_FILES["file"]["name"]);
ثم يمكنك برمجة كود ما ليقوم بوضع اسم بشكل عشوائي ويمكن استخدام الكود الذي أرفقته أنت بهذا الشكل
$fileName = substr(md5(uniqid(rand(), true)),3,10);
ثم يمكنك استخدام دالة end لجلب أخر عنصر في المصفوفة بهذا الشكل
$end = end($name);
ثم يمكنك دمج المتغيرات ببعضها بهذا الشكل
$name = explode('.', $_FILES["file"]["name"]);
$fileName = substr(md5(uniqid(rand(), true)),3,10);
$end = end($name);
$newName = $fileName . '.' . $end;
ثم في دالة move_uploaded_file يمكنك وضع الاسم الجديد
move_uploaded_file($_FILES["file"]["tmp_name"], $newName);
يمكنك إضافة أي widget داخل Widget Stack بحيث تقوم باستخدام خاصية
Positioned.directional(),
للتحكم في إتجاه النص بداخل هذا widget باستخدام خاصية
textDirection:Directionality.of(context),
بحيث إذا كانت اللغة تبدأ من اليمين إلى اليسار , يتغير إتجاه النص من اليمين إلى اليسار , و من ثم إذا كانت اللغة تبدأ من اليسار إلى اليمين يتم تغيير إتجاه النص بناءً على ذلك .
Stack(
children: [
Image.asset(
kSettingsImage,
fit: BoxFit.cover,
height: MediaQuery.of(context).size.height / 3,
),
Positioned.directional(
textDirection:Directionality.of(context),
child: Text(
'${S.of(context).settings}',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 30.0,
),
),
bottom: 10.0,
start: 20.0,
),
],
),
أو يمكنك استخدام Widget Builder بحيث يمكنك ايضا من تغيير إتجاه الواجهة من خلال خاصية
Directionality()
builder: (context, child) {
return Directionality(
textDirection: TextDirection.rtl,
child: child,
);
},
flutter inspector: يعد فاحص أدوات flutter أداة قوية لتصوير و استكشاف أشجار عناصر واجهة flutter. يستخدم إطار عمل flutter عناصر واجهة المستخدم باعتبارها اللبنة الأساسية لأي شيء بدءاً من عناصر التحكم مثل النصوص و الأزرار و المفاتيح , إلى عناصر التخطيط و هي Center, Column, Padding, Rows , يساعدك المراقب ( flutter inspector ) على استكشاف هذه العناصر والعمل على فهم المخطط الخاص بواجهة المستخدم أو تشخيص المشكلات التي تكون في تخطيط الصفحة.
يلجأ الكثير من المبرمجين إلى استخدام هذه الأداة لحل المشكلات التي قد تكون في الواجهة مما يوفر عليه عدم مراجعة كود تخطيط الصفحة من البداية وعدم اللجوء إلى تبديل عناصر قد تكون المشكلة بسبب عناصر أخرى غيرها.
flutter Emulator: هو محاكي مثل أجهزة الموبايل android على نظام الكمبيوتر الخاص بك , بحيث يتيح لك تجربة تطبيقاتك عليه , ايضا يزود المحاكي المستخدم بعدة أجهزة ليتيح تجربة التطبيق على أكثر من جهاز موبايل بمختلف الإصدارات. يوفر هذا المحاكي عدة أمكانيات شبيهة بنظام الجوال, مثل محاكاة المكالمات الهاتفية و الرسائل الواردة و الصادرة , تحديد موقع الجهاز, أجهزة الاستشعار الأخرى, الوصول إلى متجر قوقل بلاي وغير ذلك الكثير, يعد أختبار تطبيقك على المحاكي اسرع و اسهل من أختباره على جهاز موبايل حقيقي.
يمكنك استخدام Widgets
SizedBox() , Expanded()
بحيث تقوم بإضافة الزر داخل إحدى هذه Widgets بهذا الشكل
Expanded(
child: TextButton(
child: Text("Lang"),
onPressed: (){}
),
)
أو
SizedBox(
child: TextButton(
child: Text("Lang"),
onPressed: (){}
),
)
حاول معرفة أي إصدار bootstrap تستخدمه ومن ثم قم بوضع
pagination::bootstrap-4
مع تغيير إصدار البوتستراب
{{$questions->links('pagination::bootstrap-4')}}
إذا لم يكن مجلد vendor داخل مجلد views فيمكنك استخدام الأمر التالي لتقوم بنشره داخل مجلد views
php artisan vendor:publish --tag=laravel-pagination
ومن ثم يمكنك تخصيص ملف ترقيم الصفحات بوضع أي استايل تريده عن طريق وضع الملف الجديد
{{$questions->links('myfile')}}
يمكنك إنشاء استعلام يمكنك من خلاله جلب بيانات التصنيف بهذه الطريقة
$sql = mysqli_query($connection, "SELECT * FROM category WHERE id = $category_id");
هذا استعلام عادي في PHP
أو من خلال laravel يمكنك إنشاء علاقة بين جدول posts , categorys بحيث كل تصنيف لديه عدة منشورات و تكون العلاقة في ملفي Model الخاص بالجدولين و لنفرض أن جدول posts لديه ملف Post.php و جدول categories لديه ملف Category.php فالعلاقة ستكون باسم hasMany أي كل تصنيف يملك أكثر من منشور و في ملف Category.php يمكنك إضافة العلاقة التالية
public function posts(){
return $this->hasMany(Post::class);
}
وملف Post.php يحتوي على التالي
public function category(){
return $this->belongsTo(Category::class);
}
وخلال الاستعلام يمكنك جلب هذه العلاقة بهذه الطريقة
$posts = Post::with('category')->get();
أي قمنا من خلال with جلب العلاقة category و يمكنك جلب أكثر من علاقة بهذا الشكل
$posts = Post::with('category', 'اسم العلاقة الثانية')->get();
و من ثم يمكنك إنشاء حلقة تكرار بحيث تقوم بجلب المنشورات ومن خلال العلاقة category يمكنك الوصول إلى بيانات جدول categories بهذا الشكل
@foreach($posts->category() as $category)
<h3>{{ $category->name ?? '' }}</h3>
@endforeach
باستخدام replaceOne يمكنك فقط استبدال المستند بأكمله, بينما updateOne تقوم بتحديث الحقول في المستند.
ايضا باستخدام replaceOne ستفقد الحقول الموجودة في المستند القديم غير الموجودة في المستند الجديد.
باستخدام updateOne يمكن إضافة حقول جديدة دون فقدان الحقول الموجودة في المستند القديم .
هذه أمثلة توضح الفرق باستخدام replaceOne , updateOne .
{
"id": ObjectId("123"),
"code": 123
}
باستخدام replaceOne بهذه الطريقة
replaceOne({
"id": ObjectId("123")},
{"code2": 321});
تكون نتيجة الكود كالتالي
{
"id": ObjectId("123"),
"code2": 321
}
بينما باستخدام updateOne
updateOne({
"id": ObjectId("123"),
}, {$set: {"code2": 321}})
تكون نتيجة الكود
{
"id": ObjectId("123"),
"code": 123,
"code2": 321
}
يمكنك إضافة ما يلي إلى ملف التكوين المقدم عند تشغيل
mongod --config mongod.conf
لآخر إصدار من MongoDB
storage:
mmapv1:
smallFiles:true
لإصدار 2.6
storage:
smallFiles:true
لإصدار 2.4 و الإصدارات التي أقل :
smallFiles:true
ثم قم فقط بتنفيذ mongod لقبول ملف التكوين الخاص بك , ويفترض أن يكون موقع ملف التكوين هو
/etc/mongodb.conf
أو يمكنك تشغيل mongod باستخدام الأمر التالي
mongod --dbpath /data/db --smallfiles
هل يمكنك وضع صورة للخطأ أو نص للخطأ الذي يظهر ؟, أو تأكد إسناد قيمة في خاصية value في وسم option بهذا الشكل
<select name="food">
<option value="0">الأختيار الأفتراضي</option>
@foreach ($items as $item)
@if ($loop->last)
@isset($selected)
<option value="{{$item->id ?? ''}}">{{$selected}}</option>
@endisset
@endif
@endforeach
</select>
بحيث تقوم بوضع خارج loop وسم option افتراضي وتسند له قيمة معينة و في داخل loop يمكنك تنفيذ كود جلب البيانات , و من ثم إزالة خاصية selected حتى لا يحدث خطأ في عملية أختيار option الافتراضي, و في طبيعة الحال يقوم وسم select باختيار أول option كخيار افتراضي في حالة عدم تحديد أي option كخيار افتراضي عبر خاصية selected.
علامة النسبة المئوية هي شائعة في العديد من لغات البرمجة, ليس فقط في Python , يحدد الباقي عند القسمة على رقمين , لذا في المثال يتم التحقق من الأرقام الزوجية إذا قسمت على 2, فإن الباقي يساوي 0 , فهو عدد زوجي .
if i%2==0:
تتحقق مما إذا كان الرقم زوجياً.
for i in range(1, 101):
if i%2==0:
print(i)
ونتيجة هذا الكود هي
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44
46
48
50
52
54
56
58
60
62
64
66
68
70
72
74
76
78
80
82
84
86
88
90
92
94
96
98
100
هناك عدة طرق منها , يمكنك إنشاء مسار
Route::get('/search', 'GalleryController@search')->name('search');
بحيث يكون مسؤول عن عملية redirect , وتكون دالة search مهمتها جلب القيمة التي تم إرسالها بالفورم
public function search(Request $request)
{
return redirect()->route('getData', $request->name);
}
طبعاً نعرف مسار آخر لعرض الرابط كما نريد
http://127.0.0.1:8000/search/mobile
وليكن المسار بهذا الشكل
Route::get('/search/{name}', 'GalleryController@foundData')->name('getData');
وتكون دالة foundData هي دالة عرض بيانات عن طريق القيمة التي نبحث عنها
public function foundData(Request $request, $name)
{
$books = Book::where('title', 'like', "%{$request->name}%")->paginate(12);
$title = ' عرض نتائج البحث عن: ' . $request->name;
return view('gallery', compact('books', 'title'));
}
ويكون form الإدخال بهذا الشكل
<form class="form-inline col-md-6 justify-content-center" action="{{ route('search') }}" method="GET">
<input type="text" class="form-control mx-sm-3 mb-2" name="name">
<button type="submit" class="btn btn-secondary mb-2">ابحث</button>
</form>
بحيث يكون نوع الإرسال من نوع GET و رابط التوجيه هو
{{ route('search') }}
و حقل الإدخال يحمل خاصية
name="name"
<input type="text" class="form-control mx-sm-3 mb-2" name="name">
لاحظ أن
%USERPROFILE%\
معناها هو مجلد user profile على الجهاز و هو يقصد به مجلد تعريف المستخدم الخاص بك في مجلد المستخدمين على محرك نظام windows الخاص بك , والذي يكون على معظم أجهزة الكمبيوتر على القرص C فلاحظ عندما قمت بتنفيذ هذا الأمر في cmd
cd %USERPROFILE%\
سيقوم بفتح المسار التالي
C:\Users\Bilal>
ماذا لو أردنا إنشاء مجلد في هذا المسار نقوم باستخدام الأمر التالي
mkdir %USERPROFILE%\\TestFolder
فسيقوم بإنشاء مجلد باسم TestFolder في المسار التالي على الحاسوب
C:\Users\Bilal>
عندما كنت تستخدم الأمرين
mkdir projects
> cd projects
لاحظ انه عندما تقوم بفتح cmd تلقائياً يكون المسار الموضوع هو مسار مجلد تعريف المستخدم
تحتاج يدوياً إلى تثبيت وحدات المستوى الأعلى , التي تحتوي على التبعيات
npm install findup-sync@0.1.2
أو قم بإزالة مجلد node_modules باستخدام الأمر التالي
rm -rf node_modeules/
ثم تشغيل الأمر التالي لتنظيف الكاش
npm cache clean
ثم أعد استخدام الأمر التالي
npm install
يتم إنشاء الإعدادات المحلية المفقودة باستخدام لغة locale-gen, يمكن ضبط الإعدادات المحلية (إلى en_US.UTF-8) على النحو التالي:
export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
locale-gen en_US.UTF-8
dpkg-reconfigure locales
يمكنك استخدام Route Class بهذا الشكل
retrun Illuminate\Routing\Router::toResponse($request, $response);
أو يمكنك استخدام Facade بهذا الشكل
return Route::toReqponse($request, $response);
هذا مثال محدد لِ Octane
Octane::route('GET', '/url', function($request) {
return Route::toResponse($request, view(''));
});
باستخدام هذا الأسلوب بإعادة أي شيء مثل array, model, string, redirect. إذا كنت تريد عرض معين فيمكنك استخدام
use Illuminate\Http\Response;
Octane::route('GET', '/url', function() {
return new Response(view(''));
});
lumen هي نسخة مجردة من laravel و lumen لا يحتوي على جميع مميزات laravel و ايضا هناك خصائص غير موجودة على الإطلاق, ومن المهم عند تحويل مشروع الأخذ بعين الأعتبار :
يجب ترحيل تعريفات المسار لأن Lumen يستخدم موجهًا مختلفًا
لا يستخدم lumen ملف env. لذلك قد تلجأ إلى فك تعليق السطر التالي
Dotenv::load()
في ملف
bootstrap\app.php
لا يتم ايضا تمكين الواجهات مثل DB, Mail, Queue ولتفعيلها يجب إزالة التعليق عن السطر التالي
$app->withFacades();
في ملف
bootstrap\app.php
ايضا يجب عليك تفعيل Eloquent من خلال إزالة التعليق عن السطر التالي
$app->withEloquent();
في ملف
bootstrap\app.php
في بيئة العمل المحلية الخاصة بك , يجب التحقق من ملف composer.json و التحقق من أي عنصر في require يجب أن يكون ضمن require-dev و قم بنقله .
ثم أحذف ملف composer.lock و من ثم إعادة التحديث
composer update -vvv
ومن ثم قم بأختبار مشروعك محلياً , وإذا كل شيء يعمل يمكنك نقل composer.lock الخاص بك إلى نظام التحكم في الإصدار الخاص بك وإعادة نشر التطبيق على Forge
ربما يجب عليك تحديث نسخة laravel lumen التي تعمل عليها و التأكد مرة أخرى من المشكلة , أو يمكنك إنشاء Mail Provider جديد ليتم استعماله بدلاً من Provider الأقتراضي في المسار التالي
app\Providers
وليكن باسم MailServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Mail\Mailer;
use Illuminate\Mail\MailServiceProvider as BaseProvider;
class MailServiceProvider extends BaseProvider
{
protected function registerIlluminateMailer()
{
$this->app->singleton('mailer', function ($app) {
$config = $app->make('config')->get('mail');
$mailer = new Mailer(
$app['view'], $app['swift.mailer'], $app['events']
);
$mailer->setQueue($app['queue']);
foreach (['from', 'reply_to', 'to'] as $type) {
$this->setGlobalAddress($mailer, $config, $type);
}
return $mailer;
});
$this->app->configure('mail');
$this->app->alias('mailer', \Illuminate\Contracts\Mail\Mailer::class);
}
}
ثم عليك بتسجيل هذه Provider في ملف app.php الموجود بداخل مجلد bootstrap عن طريق إضافة السطر التالي
$app->register('\App\Providers\MailServiceProvider::class');
تمام , يمكن إنشاء هذا الريكويست الذي يفحص إذا كان الرقم موجود أو لا من خلال الاستعلام التالي
$findNumber = Number::where('phone', 'like', '%' . $number . '%')->first();
$findNumber = Number::where('phone', 'like', '%' . $number . '%')->get();
لماذا تريد عمل validation للموقع ؟ , بما أنك تقوم بأخذ lat, long يمكنك التأكد من أن الحقلين الذين تضع بهما lat, long غير فارغين , إذا أردت التأكد من أن lat, long صحيحين يمكنك استخدام حزمة geolocator بحيث عندما تقوم بتمرير lat, long إلى دالة LatLng بحيث تتأكد أنها ترجع position ولا لا , صراحة اول مرة أواجه مثل هذا الأمر بأن أقوم بعمل validation للموقع .
setState((){
currentPosition = LatLng(lat, long);
});