diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..cd8eb86 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +; This file is for unifying the coding style for different editors and IDEs. +; More information at http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..bb6265e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +# Path-based git attributes +# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html + +# Ignore all test and documentation with "export-ignore". +/.gitattributes export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/phpunit.xml.dist export-ignore +/.scrutinizer.yml export-ignore +/tests export-ignore +/.editorconfig export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..896e906 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +build +composer.lock +docs +vendor +coverage +.phpunit.result.cache diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..336e752 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) amir alizadeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..154afc8 --- /dev/null +++ b/README.md @@ -0,0 +1,451 @@ +# پکیج لاراول مخصوص توسعه دهندگان ایرانی +من همیشه یه سری کد داشتم که هر بار پروژه جدید ایجاد میکردم هر بار از اول کپی میکردم تو پروژه جدیده.بعد تصمیم گرفتم این رو به صورت یه پکیج در بیارم تا هم خودم و هم همکارام به راحتی بتونیم ازشون استفاده کنیم. +حالا اگه شما هم فکر میکنین این پکیج میتونه روند توسعه نرم افزار هاتون رو سریع کنه شما هم استفاده کنین. اگه فکر میکنین چیز خاصی هست که مخصوص توسعه دهنده های ایرانی هست اما در این پکیج موجود نیست حتما یه + +forkو pull request + +مهمون کنین :). + +امکانات: +* ذخیره و بازیابی تاریخ شمسی در الوکوئنت +* دسترسی به ای پی آی سایت آپارات مستقیما از مدل +* تابع اسلاگ فارسی +* میدلویر برای تعمیر حروف ک و ی عربی و اعداد فارسی و عربی +* تابع تهیه اسلاگ فارسی +* امکانات اضافه شده به فیکر از جمله لینک ویدیو آپارات +* ولیدیتور شماره همراه و شماره تماس ثابت +* دیتابیس شهر ها و استان های ایران به همراه روت بایندینگ ها +* پیدا کردن بانک از روی شماره کارت + +- [پکیج لاراول مخصوص توسعه دهندگان ایرانی](#%d9%be%da%a9%db%8c%d8%ac-%d9%84%d8%a7%d8%b1%d8%a7%d9%88%d9%84-%d9%85%d8%ae%d8%b5%d9%88%d8%b5-%d8%aa%d9%88%d8%b3%d8%b9%d9%87-%d8%af%d9%87%d9%86%d8%af%da%af%d8%a7%d9%86-%d8%a7%db%8c%d8%b1%d8%a7%d9%86%db%8c) + - [نصب](#%d9%86%d8%b5%d8%a8) + - [کانفیگ](#%da%a9%d8%a7%d9%86%d9%81%db%8c%da%af) + - [ذخیره و بازیابی تاریخ شمسی](#%d8%b0%d8%ae%db%8c%d8%b1%d9%87-%d9%88-%d8%a8%d8%a7%d8%b2%db%8c%d8%a7%d8%a8%db%8c-%d8%aa%d8%a7%d8%b1%db%8c%d8%ae-%d8%b4%d9%85%d8%b3%db%8c) + - [استفاده از اتریبیوت های دلخواه](#%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-%d8%a7%d8%aa%d8%b1%db%8c%d8%a8%db%8c%d9%88%d8%aa-%d9%87%d8%a7%db%8c-%d8%af%d9%84%d8%ae%d9%88%d8%a7%d9%87) + - [مشخصات ویدیو آپارات](#%d9%85%d8%b4%d8%ae%d8%b5%d8%a7%d8%aa-%d9%88%db%8c%d8%af%db%8c%d9%88-%d8%a2%d9%be%d8%a7%d8%b1%d8%a7%d8%aa) + - [نکته بسیار مهم](#%d9%86%da%a9%d8%aa%d9%87-%d8%a8%d8%b3%db%8c%d8%a7%d8%b1-%d9%85%d9%87%d9%85) + - [میدلویر](#%d9%85%db%8c%d8%af%d9%84%d9%88%db%8c%d8%b1) + - [ولیدیشن](#%d9%88%d9%84%db%8c%d8%af%db%8c%d8%b4%d9%86) + - [فیکر](#%d9%81%db%8c%da%a9%d8%b1) + - [استان ها و شهرها](#%d8%a7%d8%b3%d8%aa%d8%a7%d9%86-%d9%87%d8%a7-%d9%88-%d8%b4%d9%87%d8%b1%d9%87%d8%a7) + - [روت بایندینگ](#%d8%b1%d9%88%d8%aa-%d8%a8%d8%a7%db%8c%d9%86%d8%af%db%8c%d9%86%da%af) + - [اسلاگ](#%d8%a7%d8%b3%d9%84%d8%a7%da%af) + - [استفاده با پکیج Eloquent Sluggable](#%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a8%d8%a7-%d9%be%da%a9%db%8c%d8%ac-eloquent-sluggable) + - [پیداکردن بانک از روی شماره کارت](#%d9%be%db%8c%d8%af%d8%a7%da%a9%d8%b1%d8%af%d9%86-%d8%a8%d8%a7%d9%86%da%a9-%d8%a7%d8%b2-%d8%b1%d9%88%db%8c-%d8%b4%d9%85%d8%a7%d8%b1%d9%87-%da%a9%d8%a7%d8%b1%d8%aa) + - [ساخته شده با کمک](#%d8%b3%d8%a7%d8%ae%d8%aa%d9%87-%d8%b4%d8%af%d9%87-%d8%a8%d8%a7-%da%a9%d9%85%da%a9) + +## نصب +برای نصب شما به لاراول نسخه 6 یا بالاتر نیاز دارید. با استفاده از کومپوزر در پروژه لاراولی خود این پکیج رو نصب کنید. +```bash +composer require sanjabteam/helpers +``` + +بعد هم با این کامند فایل کانفیگ رو بسازین + +```bash +php artisan vendor:publish --provider=SanjabHelpers\\SanjabHelpersServiceProvider +``` + +## کانفیگ +در فایل +``` +config/sanjab_helpers.php +``` +میتونین کانفیگ رو تغییر بدین. + +`geo`: +اگه نمیخاین از قابلیت استان و شهر استفاده کنین مقدار این قسمت رو برابر + +`false` + +قرار بدید تا جداولش ایجاد نشه. + +`aparat`: +اگه نمیخاین از قابلیت آپارات استفاده کنین مقدار این قسمت رو برابر + +`false` + +قرار بدید تا جداولش ایجاد نشه. + +## ذخیره و بازیابی تاریخ شمسی +این پکیج این امکان رو به شما میده تا به راحتی تاریخ های موجود در مدل لاراول رو به راحتی به کلاس [ورتا](https://github.com/hekmatinasser/verta) تبدیل کنید. +برای شروع + +trait + +`SanjabHelpers\EloquentHelper` + +رو به مدلی که میخاین اضافه کنین. + +```php +use SanjabHelpers\EloquentHelper; + +class User extends Model +{ + use EloquentHelper; // trait +} +``` +بعد به راحتی میتونین به صورت شمسی به مشخصات دسترسی داشته باشین. فقط کافیه به فیلد مورد نظرتون پسوند + +`_fa` + +اضافه کنید. +```php +$user = User::where(...)->first(); +$user->created_at_fa // به صورت کلاس Hekmatinasser\Verta\Verta +$user->created_at_fa_f // 1390/1/1 +$user->created_at_fa_ft // 1390/1/1 12:00 +$user->created_at_fa_ftt // 1390/1/1 12:00:00 +$user->updated_at_fa->format("%B %d %Y") // فروردین 01 1390 +``` +برای مدیریت بهتر میتونین به مستندات +[ورتا](https://github.com/hekmatinasser/verta) +.مراجعه کنین +همچنین با تنظیم کردن تاریخ هم از همین روش استفاده کنین. +```php +$user->created_at_fa = Verta::createJalaliDate(1390, 1, 1); +dd($user->created_at); // Illuminate\Support\Carbon { date: 2011-03-21 } +$user->created_at_fa = "1392/1/1"; +dd($user->created_at); // Illuminate\Support\Carbon { date: 2013-03-21 } +$user->created_at_fa = "1395/1/1 14:22:11"; +dd($user->created_at); // Illuminate\Support\Carbon { date: 2016-03-20 14:22:11 } +``` +### استفاده از اتریبیوت های دلخواه +اگه میخاین یه فیلد دلخواه به جز + +created_at, updated_at + +داشته باشین که از همین قابلیت پشتیبانی کنه کافیه اون رو به تاریخ [کست](https://laravel.com/docs/6.x/eloquent-mutators#date-casting) کنین. +```php +use SanjabHelpers\EloquentHelper; + +class User extends Model +{ + use EloquentHelper; + + protected $casts = [ + 'birth_date' => 'date', + // یا + 'released_at' => 'datetime' + ]; +} +``` +و بازم هم به همون روش میتونین بهش دسترسی داشته باشین. +```php +$user->birth_date_fa; // Hekmatinasser\Verta\Verta +``` + +## مشخصات ویدیو آپارات +این پکیج این امکان رو به شما میده تا به راحتی مشخصات یه فیلم رو از [ای پی آی آپارات](https://aparat.com/api) از طریق آدرس فیلم دریافت کنین. +برای شروع + +trait + +`SanjabHelpers\EloquentHelper` + +رو به مدلی که میخاین اضافه کنین. + +```php +use SanjabHelpers\EloquentHelper; + +class Post extends Model +{ + use EloquentHelper; // trait +} +``` +بعد فقط کافیه که آدرس فیلم رو درون یه فیلد ذخیره کنین. بعد با پسوند + +`_aparat` + +به مشخصاتش دسترسی پیدا کنین. + +```php +$post = Post::first(); +$post->video = "https://www.aparat.com/v/O4qSP"; +dd($post->video_aparat); // SanjabHelpers\Models\AparatVideo +dd($post->video_aparat->title); // ایستگاه جوانمرد راستگو +dd($post->video_aparat->username); // ding.dong +dd($post->video_aparat->sender_name); //دینگ دانگ +``` + +اگه میخاین مستقیم و بدون مدل به مشخصات دسترسی داشته باشین از این تابع استفاده کنین. + +```php +aparat_info(["https://www.aparat.com/v/O4qSP"]); +``` +مشخصات کامل: [AparatVideo](./src/Models/AparatVideo.php) + + +### نکته بسیار مهم +آپارات اگه طی یه زمان از حدی بیشتر بهش درخواست بفرسین یه ارور + +429 Too Many Requests + +بهتون تحویل میده و حسابی دردسر درست میکنه براتون برای همین من مشخصات فیلم ها داخل دیتابیس ذخیره میکنم بنابراین مشخصات فیلم تا زمانی که خودتون نخواید تغییری نمیکنه. یه سری چیز ها مثل تعداد بازدید و تعداد لایک خیلی سریع تغییر میکنن اما به نظرم ارزش اینو ندارن که عاقبتتون 429 بشه. +برای بروز کردن مشخصات فیلم کافیه که از این روش استفاده کنین. +```php +$post->video_aparat->visit_cnt; // 26550 +$post->video_aparat->reload(); +$post->video_aparat->visit_cnt; // 26812 +``` + +## میدلویر +یکی از مشکلاتی که تو پروژه ها سر و کله میزنم باهاشون یکی اعداد فارسی هست. مثلا طرف میاد موقع ثبت نام رمز عبورش رو با عدد فارسی میزنه بعد موقع ورود با عدد انگلیسی بعد این وسط میگه رمز عبورش اشتباهه درصورتی که اینطوری نیست. +مشکل دوم اینه که مثلا ادمین یه چیزی با ک و ی فارسی وارد میکنه اما یه کاربری تو سایت کیبوردش عربی و با ك,ي عربی سرچ میکنه و این وسط موقع سرچ چیزی پیدا نمیکنه در صورتی که اینطور نیستش. +برای حل این مشکل کافیه در فایل + +`app/Http/Kernel.php` + +کلاس + +```php +\SanjabHelpers\Middleware\FixRequestInputs +``` + +به آرایه + +middleware + +اضافه کنین + +```php +protected $middleware = [ + ... + \SanjabHelpers\Middleware\FixRequestInputs::class, +]; +``` + +به همین راحتی برای همیشه هم با مشکل اعداد فارسی و هم مشکل حروف عربی خداحافظی کنین. + + +## ولیدیشن +iran_phone: +برای وارد کردن شماره های ثابت ایرانی + +iran_mobile: +برای ولیدیشن شماره موبایل های ایرانی + +برای استفاده: +```php +public function test(Request $request) +{ + $request->validate([ + 'test1' => 'required|iran_mobile', + 'test2' => 'required|iran_phone', + ]); +} +``` + +> این قسمت نیاز به بهبود دارد + +## فیکر +برای فیکر یه سری بهبود ها انجام شده برای مثال +paragraph +فارسی سازی شده. + +CustomImage: + +```php +customImage($path, $width, $height, $prefix) +``` + +این فیکر عکس از سایت + +https://picsum.photos + +براتون فراهم میکنه. + +$path: پوشه محل ذخیره +$width: طول عکس +$height: عرض عکس +$prefix: به طور پیشفرض فقط نام عکس بهتون داده میشه با کمک این میتونین یه پیشوند به اسم عکس اضافه کنین + +نمونه: +```php +'image' => $faker->customImage(public_path('uploads/fake'), 640, 480, 'fake/') +``` +همچنین اگه میخاین یه آرایه از عکس داشته باشین + +```php +$faker->customImages(public_path('uploads/fake'), 640, 480, $faker->numberBetween(1, 3), 'fake/') +``` +چهارمین پارامتر تعداد عکس هایی که لازم دارین رو ازتون دریافت میکنه. + +iranMobile: + +یه شماره موبایل ایرانی براتون میسازه + +```php +$faker->iranMobile +``` + +iranPhone: + +یه شماره موبایل ایرانی براتون میسازه + +```php +$faker->iranPhone +``` + +aparatVideo: + +آدرس یه فیلم در آپارات به فراهم میکنه. + +```php +$faker->aparatVideo +``` + +اگه آرایه ای از فیلم ها میخاید. + +```php +$faker->aparatVideos($faker->numberBetween(1, 3)) +``` +پارامتر تعداد فیلم هایی که لازم دارین رو ازتون دریافت میکنه. + +## استان ها و شهرها +برای شروع در + +`DatabaseSeeder.php` + +این قسمت رو اضافه کنید. + +```php +public function run() +{ + $this->call(\SanjabHelpers\Database\CitiesTableSeeder::class); // سیدر شهر ها و استان ها +} +``` + +سپس بعد از میگریت سید رو انجام بدین. +```bash +php artisan migrate --seed +``` +حالا جداول شما از شهر ها و استان ها پر شده برای استفاده از دو مدل پایین میتونین استفاده کنین. + +`SanjabHelpers\Models\Province`:مدل استان + +`SanjabHelpers\Models\City`:مدل شهر + +نمونه: +```php +use anjabHelpers\Models\City; + +City::where('name', 'آمل')->first() +``` + +### روت بایندینگ +اگه میخاین از استان و شهر در آدرس ها استفاده کنین از این روش استفاده کنین. + +```php +use SanjabHelpers\Models\Province; +use anjabHelpers\Models\City; + +Route::get('test/{province}/{city}', function (Province $province, City $city) { + abort_if($city->province_id != $province->id, 404); + // ... +}); +``` +و سپس آدرس زیر رو باز کنید. + +`/test/27/1068` + +حالا به استان و شهر دسترسی دارین. + +اگه میخاین آدرستون + +seo freindly + +باشه از + +slug + +موجود در شهر ها و استان ها استفاده کنین. +این اسلاگ ها به کمک + +[Eloquent Sluggable](https://github.com/cviebrock/eloquent-sluggable) + +تهیه شدن. +بنابراین آدرس رو به این شکل باز کنین. + +`/test/مازندران/آمل`. + +اگه فقط میخاین با آی دی باز باشه یا فقط اسلاگ و هر دو حالت رو قبول نکنه در اون صورت از این ها به جای + +`province`, `city` + +استفاده کنین. + +`city_by_id`: شهر با آی دی + +`city_by_slug`: شهر با اسلاگ + +`province_by_id`: استان با آی دی + +`province_by_slug`: استان با اسلاگ + + +استان: [Province](./src/Models/Province.php) + +شهر: [City](./src/Models/City.php) + +## اسلاگ +همونطور که میدونین در لاراول با تابع + +```php +Str::slug('test test') +``` +میشه یه اسلاگ برای آدرس دهی درست کرد اما اگه فارسی به این تابع بدین +```php +Str::slug('خونه ی مادربزرگه') +``` +خروجی + +`"khonh-i-madrbzrgh"` + +میده که یه جورایی سعی کرده به فینگلیش تبدیلش کنه اما با تابع +`str_to_slug` +این پکیج به راحتی حروف فارسی رو هم مدیریت میکنه +```php +str_to_slug('خونه ی مادربزرگه') +``` +`"خونه-ی-مادربزرگه"` + +### استفاده با پکیج Eloquent Sluggable +کافیه در فایل + +`config/sluggable.php` + +قسمت + +method + +رو این شکلی بنویسین. + +```php +'method' => 'str_to_slug', +``` + +## پیداکردن بانک از روی شماره کارت +برای پیدا کردن بانک از روی شماره کارت از این تابع استفاده کنین. + +```php +find_bank_by_card_number("6037697531") +``` +خروجی: +```php +[ + "class" => "bsi", + "name" => "بانک صادرات ایران", + "card_prefix" => "603769", +] +``` +کلاس, نام کلاس بر اساس [این پکیج](https://github.com/webdesigniran/IranianBankLogos) هست. + + + +## ساخته شده با کمک + +- [Eloquent Sluggable](https://github.com/cviebrock/eloquent-sluggable) +- [ّIran Cities](https://github.com/ahmadazizi/iran-cities) +- [TestBench](https://github.com/orchestral/testbench) +- [Verta](https://github.com/hekmatinasser/verta) diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..a6ade0d --- /dev/null +++ b/composer.json @@ -0,0 +1,58 @@ +{ + "name": "sanjabteam/helpers", + "description": "Helpers", + "keywords": [ + "sanjabteam", + "helpers" + ], + "homepage": "https://github.com/sanjabteam/helpers", + "license": "MIT", + "type": "library", + "authors": [ + { + "name": "amir alizadeh", + "email": "amiralizadeh9480@gmail.com" + } + ], + "require": { + "php": "^7.1", + "hekmatinasser/verta": "^1.10", + "illuminate/support": "^6.0", + "cviebrock/eloquent-sluggable": "^6.0" + }, + "require-dev": { + "orchestra/testbench": "^4.0", + "phpunit/phpunit": "^8.0" + }, + "autoload": { + "psr-4": { + "SanjabHelpers\\": "src" + }, + "classmap": [ + "database/seeds" + ], + "files": [ + "src/helpers.php" + ] + }, + "autoload-dev": { + "psr-4": { + "SanjabHelpers\\Tests\\": "tests" + } + }, + "scripts": { + "test": "vendor/bin/phpunit", + "test-coverage": "vendor/bin/phpunit --coverage-html coverage" + + }, + "config": { + "sort-packages": true + }, + "extra": { + "laravel": { + "providers": [ + "SanjabHelpers\\SanjabHelpersServiceProvider" + ] + } + } +} diff --git a/config/config.php b/config/config.php new file mode 100644 index 0000000..6510ec2 --- /dev/null +++ b/config/config.php @@ -0,0 +1,17 @@ + true, + + /* + |-------------------------------------------------------------------------- + | فعال سازی قابلیت ارتباط با ای پی آی آپارات + |-------------------------------------------------------------------------- + */ + 'aparat' => true, +]; diff --git a/database/migrations/2014_10_11_000000_create_provinces_table.php b/database/migrations/2014_10_11_000000_create_provinces_table.php new file mode 100755 index 0000000..d96b43c --- /dev/null +++ b/database/migrations/2014_10_11_000000_create_provinces_table.php @@ -0,0 +1,33 @@ +bigIncrements('id'); + $table->string('name'); + $table->string('slug')->unique()->index(); + $table->text('description')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('provinces'); + } +} diff --git a/database/migrations/2014_10_11_000001_create_cities_table.php b/database/migrations/2014_10_11_000001_create_cities_table.php new file mode 100755 index 0000000..4d28ebf --- /dev/null +++ b/database/migrations/2014_10_11_000001_create_cities_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->string('name'); + $table->string('slug')->unique()->index(); + $table->text('description')->nullable(); + $table->unsignedBigInteger('province_id'); + + $table->foreign('province_id')->references('id')->on('provinces')->onDelete('cascade')->onUpdate('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('cities'); + } +} diff --git a/database/migrations/2014_10_11_000002_create_aparat_videos_table.php b/database/migrations/2014_10_11_000002_create_aparat_videos_table.php new file mode 100755 index 0000000..3176e85 --- /dev/null +++ b/database/migrations/2014_10_11_000002_create_aparat_videos_table.php @@ -0,0 +1,56 @@ +bigIncrements('id'); + $table->string('title'); + $table->string('username'); + $table->unsignedBigInteger('userid'); + $table->unsignedBigInteger('visit_cnt')->default(0); + $table->string('uid')->index()->unique(); + $table->string('process'); + $table->string('sender_name'); + $table->string('big_poster'); + $table->string('small_poster'); + $table->string('profilePhoto'); + $table->unsignedBigInteger('duration'); + $table->string('sdate'); + $table->string('frame'); + $table->string('official'); + $table->text('tags'); + $table->string('description')->nullable(); + $table->unsignedBigInteger('cat_id'); + $table->string('cat_name'); + $table->boolean('autoplay'); + $table->boolean('is_360d'); + $table->string('has_comment'); + $table->string('has_comment_txt'); + $table->unsignedBigInteger('size'); + $table->boolean('can_download'); + $table->unsignedBigInteger('like_cnt'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('aparat_videos'); + } +} diff --git a/database/seeds/CitiesTableSeeder.php b/database/seeds/CitiesTableSeeder.php new file mode 100755 index 0000000..327baf9 --- /dev/null +++ b/database/seeds/CitiesTableSeeder.php @@ -0,0 +1,34 @@ + $province['id'], 'name' => trim($province['name'])]); + City::insert(array_map(function ($city) use ($tempModel, &$insertedSlugs) { + $slug = str_to_slug(trim($city)); + while (in_array($slug, $insertedSlugs)) { + $slug .= '-'; + } + $insertedSlugs[] = $slug; + return ['province_id' => $tempModel->id,'name' => trim($city), 'slug' => $slug]; + }, $province['cities'])); + } + } +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..0a1fd96 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,38 @@ + + + + + tests + + + + + src/ + + + + + + + + + + + + + + + + + + + diff --git a/src/EloquentHelper.php b/src/EloquentHelper.php new file mode 100644 index 0000000..808c916 --- /dev/null +++ b/src/EloquentHelper.php @@ -0,0 +1,55 @@ +isDateAttribute($matches[1])) { + $attributeValue = Verta::instance($this->getAttribute($matches[1])); + if ($matches[2] == '_f') { + return $attributeValue->formatJalaliDate(); + } elseif ($matches[2] == '_ft') { + return $attributeValue->format("Y/n/j H:i"); + } elseif ($matches[2] == '_ftt') { + return $attributeValue->formatJalaliDatetime(); + } + return $attributeValue; + } + } + + if ($key && preg_match('/^([A-Za-z0-9_]+)_aparat$/', $key, $matches)) { + $attributeValue = $this->getAttribute($matches[1]); + if (is_string($attributeValue) && $info = Arr::first(aparat_info([$attributeValue]))) { + return $info; + } elseif (is_array($attributeValue) && count($info = aparat_info($attributeValue))) { + return $info; + } + } + return parent::getAttribute($key); + } + + public function setAttribute($key, $value) + { + if ($key && $value && preg_match('/^([A-Za-z0-9_]+)_fa(|_f|_ft|_ftt)$/', $key, $matches)) { + if ($this->isDateAttribute($matches[1])) { + if (! ($value instanceof Verta)) { + try { + $value = Verta::parse($value); + } catch (Exception $exception) { + } + } + if ($value instanceof Verta) { + return $this->setAttribute($matches[1], $value->DateTime()); + } + } + } + return parent::setAttribute($key, $value); + } +} diff --git a/src/Middleware/FixRequestInputs.php b/src/Middleware/FixRequestInputs.php new file mode 100644 index 0000000..e14baf5 --- /dev/null +++ b/src/Middleware/FixRequestInputs.php @@ -0,0 +1,65 @@ +all(); + $allInputs = $this->removeArabicCharacters($allInputs); + $allInputs = $this->removePersianNumbers($allInputs); + $request->replace($allInputs); + return $next($request); + } + + /** + * Convert arabic (ك), (ي) to persian (ک),(ی) + * + * @param array $inputs + * @return array + */ + protected function removeArabicCharacters(array $inputs) + { + foreach ($inputs as $key => $value) { + if (is_array($value)) { + $inputs[$key] = $this->removeArabicCharacters($value); + } elseif (!($value instanceof UploadedFile) && is_string($value)) { + $inputs[$key] = str_replace( + ['ي', 'ك'], + ['ی', 'ک'], + $value + ); + } + } + return $inputs; + } + + /** + * Convert Persian numbers to english numbers + * + * @param array $inputs + * @return array + */ + protected function removePersianNumbers(array $inputs) + { + foreach ($inputs as $key => $value) { + if (is_array($value)) { + $inputs[$key] = $this->removePersianNumbers($value); + } elseif (!($value instanceof UploadedFile) && is_string($value)) { + $inputs[$key] = fa_to_en($value); + } + } + return $inputs; + } +} diff --git a/src/Models/AparatVideo.php b/src/Models/AparatVideo.php new file mode 100644 index 0000000..6b729ab --- /dev/null +++ b/src/Models/AparatVideo.php @@ -0,0 +1,91 @@ + 'array', + 'userid' => 'int', + 'visit_cnt' => 'int', + 'cat_id' => 'int', + 'autoplay' => 'bool', + 'is_360d' => 'bool', + 'size' => 'int', + 'can_download' => 'bool', + 'like_cnt' => 'int', + ]; + + /** + * بازخوانی مجدد اطلاعات از سرور آپارات + * + * @return self + */ + public function reload() + { + $data = Arr::first(aparat_info(['https://www.aparat.com/v/'.$this->uid], false)); + if ($data) { + $this->fill($data); + $this->save(); + } + return $this; + } +} diff --git a/src/Models/City.php b/src/Models/City.php new file mode 100755 index 0000000..584d1d9 --- /dev/null +++ b/src/Models/City.php @@ -0,0 +1,46 @@ +belongsTo(Province::class); + } + + /** + * Sluggable config. + * + * @return array + */ + public function sluggable() + { + return ['slug' => ['source' => 'name']]; + } +} diff --git a/src/Models/Province.php b/src/Models/Province.php new file mode 100755 index 0000000..1b02a5c --- /dev/null +++ b/src/Models/Province.php @@ -0,0 +1,43 @@ +hasMany(City::class); + } + + /** + * Sluggable config. + * + * @return array + */ + public function sluggable() + { + return ['slug' => ['source' => 'name']]; + } +} diff --git a/src/SanjabFakerProvider.php b/src/SanjabFakerProvider.php new file mode 100755 index 0000000..90e1534 --- /dev/null +++ b/src/SanjabFakerProvider.php @@ -0,0 +1,106 @@ + 0) { + foreach (range(1, $count) as $c) { + $out[] = $this->customImage($path, $width, $height, $prefix); + } + } + return $out; + } + + public function iranMobile() + { + return '09'.rand(10, 39).rand(1000000, 9999999); + } + + public function iranPhone() + { + return '0'.rand(11, 20).rand(1000000, 9999999); + } + + public function aparatVideo() + { + $videos = \Cache::rememberForEver('sanjab_helpers_aparat_videos', function () { + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => 'https://www.aparat.com/etc/api/categoryVideos/cat/7/perpage/50', + CURLOPT_RETURNTRANSFER => true, + ]); + $responseBody = curl_exec($curl); + if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200 && is_string($responseBody)) { + $responseBody = json_decode($responseBody, true); + if (is_array($responseBody)) { + $responseBody = $responseBody['categoryvideos']; + if (is_array($responseBody)) { + curl_close($curl); + return array_map(function ($videoDetail) { + if (!isset($videoDetail['uid'])) { + dd($videoDetail); + } + return $videoDetail['uid']; + }, $responseBody); + } + } + } + curl_close($curl); + }); + if (is_array($videos)) { + return "https://www.aparat.com/v/".array_random($videos); + } + return "https://www.aparat.com/v/".array_random(["IAN6z","xrAb8","w7NMS","0fFhg","uCgQd","hK5fF","arsHC","43aZ8","syI7N","XaN3o","YJpM1","TSAz1","sQBq4","Y7AZF","dNn3M","uR7DI","TZ63C","8T3hA","NdqEn","xCFnE","mL21e","ZkGp8","MV9RW","jicTW","Ikan1","Ylj9x","3Qmhd","jWqud","6VeK8","fic92","fdQXx","UQ2jS","RrctN","EutTQ","evc7o","CugP3","1T08s","eTFxk","UF8xV","Qn8CF","xtKbg","hTWBg","wWBU7","zt90l","fjyRd","VPvu3","iaCV3","4r9IK","m1gxT","XonZx","rUC8l","6yoBO","aoE2p","slKDV","2Dun4","L4J1F","dwWTy","a6PqK","bDaPX","pRPSt"]); + } + + public function aparatVideos($count) + { + $out = []; + foreach (range(1, $count) as $c) { + $out[] = $this->aparatVideo(); + } + return $out; + } + + public function word() + { + return array_random(explode(' ', $this->generator->realText())); + } + + public function sentence() + { + return $this->generator->realText(); + } + + public function paragraph() + { + return $this->generator->realText().' '.$this->generator->realText(); + } +} diff --git a/src/SanjabHelpersServiceProvider.php b/src/SanjabHelpersServiceProvider.php new file mode 100644 index 0000000..fbd2a41 --- /dev/null +++ b/src/SanjabHelpersServiceProvider.php @@ -0,0 +1,62 @@ +loadMigrationsFrom([ + realpath(__DIR__.'/../database/migrations/2014_10_11_000000_create_provinces_table.php'), + realpath(__DIR__.'/../database/migrations/2014_10_11_000001_create_cities_table.php') + ]); + } + if (config('sanjab_helpers.aparat')) { + $this->loadMigrationsFrom([ + realpath(__DIR__.'/../database/migrations/2014_10_11_000002_create_aparat_videos_table.php') + ]); + } + + $this->publishes([ + __DIR__.'/../config/config.php' => config_path('sanjab_helpers.php'), + ], 'config'); + + Validator::resolver(function ($translator, $data, $rules, $messages = [], $customAttributes = []) { + return new SanjabValidator($translator, $data, $rules, $messages, $customAttributes); + }); + + if (config('sanjab_helpers.geo')) { + foreach (['city' => City::class, 'province' => Province::class] as $key => $model) { + Route::bind($key, function ($value) use ($model) { + return $model::where('slug', $value)->orWhere('id', $value)->firstOrFail(); + }); + Route::bind($key.'_by_slug', function ($value) use ($model) { + return $model::where('slug', $value)->firstOrFail(); + }); + Route::bind($key.'_by_id', function ($value) use ($model) { + return $model::where('id', $value)->firstOrFail(); + }); + } + } + } + + /** + * Register the application services. + */ + public function register() + { + $this->mergeConfigFrom(__DIR__.'/../config/config.php', 'sanjab_helpers'); + app(\Faker\Generator::class)->addProvider(new SanjabFakerProvider(app(\Faker\Generator::class))); + } +} diff --git a/src/SanjabValidator.php b/src/SanjabValidator.php new file mode 100644 index 0000000..f20389b --- /dev/null +++ b/src/SanjabValidator.php @@ -0,0 +1,59 @@ + ':attribute'.' تاریخ شمسی معتبر نمی باشد.', + 'jdate_equal' => ':attribute'.' تاریخ شمسی برابر '.':fa-date'.' نمی باشد.', + 'jdate_not_equal' => ':attribute'.' تاریخ شمسی نامساوی '.':fa-date'.' نمی باشد.', + 'jdatetime' => ':attribute'.' تاریخ و زمان شمسی معتبر نمی باشد.', + 'jdatetime_equal' => ':attribute'.' تاریخ و زمان شمسی مساوی '.':fa-date'.' نمی باشد.', + 'jdatetime_not_equal' => ':attribute'.' تاریخ و زمان شمسی نامساوی '.':fa-date'.' نمی باشد.', + 'jdate_after' => ':attribute'.' تاریخ شمسی باید بعد از '.':fa-date'.' باشد.', + 'jdate_after_equal' => ':attribute'.' تاریخ شمسی باید بعد یا برابر از '.':fa-date'.' باشد.', + 'jdatetime_after' => ':attribute'.' تاریخ و زمان شمسی باید بعد از '.':fa-date'.' باشد.', + 'jdatetime_after_equal' => ':attribute'.' تاریخ و زمان شمسی باید بعد یا برابر از '.':fa-date'.' باشد.', + 'jdate_before' => ':attribute'.' تاریخ شمسی باید قبل از '.':fa-date'.' باشد.', + 'jdate_before_equal' => ':attribute'.' تاریخ شمسی باید قبل یا برابر از '.':fa-date'.' باشد.', + 'jdatetime_before' => ':attribute'.' تاریخ و زمان شمسی باید قبل از '.':fa-date'.' باشد.', + 'jdatetime_before_equal' => ':attribute'.' تاریخ و زمان شمسی باید قبل یا برابر از '.':fa-date'.' باشد.', + 'iran_phone' => ':attribute یک شماره تلفن معتبر نیست.', + 'iran_mobile' => ':attribute یک شماره همراه معتبر نیست.', + ]; + + public function __construct($translator, $data, $rules, $messages = [], $customAttributes = []) + { + parent::__construct($translator, $data, $rules, $messages, $customAttributes); + $this->setCustomMessages($this->validationMessages); + } + + /** + * Validate iran mobile. + * + * @param string $attribute + * @param string $value + * @param array $parameters + * @param \Illuminate\Validation\Validator $validator + */ + public function validateIranMobile($attribute, $value, $parameters, $validator) + { + return preg_match("/^09[0-3]\d{8}$/", $value); + } + + /** + * Validate iran phone. + * + * @param string $attribute + * @param string $value + * @param array $parameters + * @param \Illuminate\Validation\Validator $validator + */ + public function validateIranPhone($attribute, $value, $parameters, $validator) + { + return preg_match("/^0[1-8]\d{9}$/", $value); + } +} diff --git a/src/helpers.php b/src/helpers.php new file mode 100644 index 0000000..526e5a4 --- /dev/null +++ b/src/helpers.php @@ -0,0 +1,121 @@ +first(); + + if ($aparatVideo == null || $cache == false) { + try { + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => 'https://www.aparat.com/etc/api/video/videohash/' . $matches[1][0], + CURLOPT_RETURNTRANSFER => true, + ]); + $responseBody = curl_exec($curl); + if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200 && is_string($responseBody)) { + $responseBody = json_decode($responseBody, true)['video']; + if (isset($responseBody['duration'])) { + $responseBody['is_360d'] = $responseBody['360d']; + if (is_array($responseBody['tags'])) { + $responseBody['tags'] = array_map(function ($tag) { + return $tag['name']; + }, $responseBody['tags']); + } + if ($cache) { + $videoInfos[] = \SanjabHelpers\Models\AparatVideo::create($responseBody); + } else { + find_bank_by_card_number $videoInfos[] = $responseBody; + } + } + } + curl_close($curl); + } catch (\Exception $e) { + } + } else { + $videoInfos[] = $aparatVideo; + } + } + } + return $videoInfos; + } +} + +if (! function_exists("find_bank_by_card_number")) { + + /** + * Find bank info from card number. + * + * @param string $card + * @return array + */ + function find_bank_by_card_number($card) + { + static $banks = null; + if (!$banks) { + $banks = json_decode(file_get_contents(__DIR__."/../storage/banks.json"), true); + } + return Arr::first(array_filter($banks, function ($bankInfo) use ($card) { + return preg_match("/^".$bankInfo['card_prefix']."\\d*/", $card); + })); + } +} diff --git a/storage/banks.json b/storage/banks.json new file mode 100644 index 0000000..97c34b7 --- /dev/null +++ b/storage/banks.json @@ -0,0 +1,137 @@ +[ + { + "class": "bsi", + "name": "بانک صادرات ایران", + "card_prefix": "603769" + }, + { + "class": "mellat", + "name": "بانک ملت", + "card_prefix": "610433" + }, + { + "class": "tejarat", + "name": "بانک تجارت", + "card_prefix": "627353" + }, + { + "class": "bmi", + "name": "بانک ملی ایران", + "card_prefix": "603799" + }, + { + "class": "sepah", + "name": "بانک سپه", + "card_prefix": "589210" + }, + { + "class": "bki", + "name": "بانک کشاورزی", + "card_prefix": "603770" + }, + { + "class": "parsian", + "name": "بانک پارسیان", + "card_prefix": "622106" + }, + { + "class": "maskan", + "name": "بانک مسکن", + "card_prefix": "628023" + }, + { + "class": "rb", + "name": "بانک رفاه کارگران", + "card_prefix": "589463" + }, + { + "class": "en", + "name": "بانک اقتصاد نوین", + "card_prefix": "627412" + }, + { + "class": "ansar", + "name": "بانک انصار", + "card_prefix": "627381" + }, + { + "class": "bpi", + "name": "بانک پاسارگاد", + "card_prefix": "502229" + }, + { + "class": "sb", + "name": "بانک سامان", + "card_prefix": "621986" + }, + { + "class": "sina", + "name": "بانک سینا", + "card_prefix": "639346" + }, + { + "class": "post", + "name": "پست بانک ایران", + "card_prefix": "627760" + }, + { + "class": "ghbi", + "name": "بانک قوامین", + "card_prefix": "639599" + }, + { + "class": "tt", + "name": "بانک توسعه تعاون", + "card_prefix": "502908" + }, + { + "class": "shahr", + "name": "بانک شهر", + "card_prefix": "502806" + }, + { + "class": "ba", + "name": "بانک آینده", + "card_prefix": "636214" + }, + { + "class": "sarmayeh", + "name": "بانک سرمایه", + "card_prefix": "639607" + }, + { + "class": "day", + "name": "بانک دی", + "card_prefix": "502938" + }, + { + "class": "hi", + "name": "بانک حکمت ایرانیان", + "card_prefix": "636949" + }, + { + "class": "iz", + "name": "بانک ایران زمین", + "card_prefix": "505785" + }, + { + "class": "kar", + "name": "بانک کارآفرین", + "card_prefix": "627488" + }, + { + "class": "tourism", + "name": "بانک گردشگری", + "card_prefix": "505416" + }, + { + "class": "bim", + "name": "بانک صنعت و معدن", + "card_prefix": "627961" + }, + { + "class": "edbi", + "name": "بانک توسعه صادرات ایران", + "card_prefix": "627648" + } +] diff --git a/storage/cities.json b/storage/cities.json new file mode 100755 index 0000000..40bc431 --- /dev/null +++ b/storage/cities.json @@ -0,0 +1,1433 @@ +[ + { + "id": "1", + "name": "آذربایجان شرقی", + "cities": [ + "آذرشهر", + "تیمورلو", + "گوگان", + "ممقان", + "اسکو", + "ایلخچی", + "سهند", + "اهر", + "هوراند", + "بستان آباد", + "تیکمه داش", + "بناب", + "باسمنج", + "تبریز", + "خسروشاه", + "سردرود", + "جلفا", + "سیه رود", + "هادیشهر", + "قره آغاج", + "خمارلو", + "دوزدوزان", + "سراب", + "شربیان", + "مهربان", + "تسوج", + "خامنه", + "سیس", + "شبستر", + "شرفخانه", + "شندآباد", + "صوفیان", + "کوزه کنان", + "وایقان", + "جوان قلعه", + "عجب شیر", + "آبش احمد", + "کلیبر", + "خداجو(خراجو)", + "مراغه", + "بناب مرند", + "زنوز", + "کشکسرای", + "مرند", + "یامچی", + "لیلان", + "مبارک شهر", + "ملکان", + "آقکند", + "اچاچی", + "ترک", + "ترکمانچای", + "میانه", + "خاروانا", + "ورزقان", + "بخشایش", + "خواجه", + "زرنق", + "کلوانق", + "هریس", + "نظرکهریزی", + "هشترود" + ] + }, + { + "id": "2", + "name": "آذربایجان غربی", + "cities": [ + "ارومیه", + "سرو", + "سیلوانه", + "قوشچی", + "نوشین", + "اشنویه", + "نالوس", + "بوکان", + "سیمینه", + "پلدشت", + "نازک علیا", + "پیرانشهر", + "گردکشانه", + "تکاب", + "آواجیق", + "سیه چشمه", + "قره ضیاءالدین", + "ایواوغلی", + "خوی", + "دیزج دیز", + "زرآباد", + "فیرورق", + "قطور", + "ربط", + "سردشت", + "میرآباد", + "تازه شهر", + "سلماس", + "شاهین دژ", + "کشاورز", + "محمودآباد", + "شوط", + "مرگنلر", + "بازرگان", + "ماکو", + "خلیفان", + "مهاباد", + "باروق", + "چهاربرج", + "میاندوآب", + "محمدیار", + "نقده" + ] + }, + { + "id": "3", + "name": "اردبیل", + "cities": [ + "اردبیل", + "هیر", + "بیله سوار", + "جعفرآباد", + "اسلام اباد", + "اصلاندوز", + "پارس آباد", + "تازه کند", + "خلخال", + "کلور", + "هشتجین", + "سرعین", + "گیوی", + "تازه کندانگوت", + "گرمی", + "رضی", + "فخراباد", + "قصابه", + "لاهرود", + "مرادلو", + "مشگین شهر", + "آبی بیگلو", + "عنبران", + "نمین", + "کوراییم", + "نیر" + ] + }, + { + "id": "4", + "name": "اصفهان", + "cities": [ + "آران وبیدگل", + "ابوزیدآباد", + "سفیدشهر", + "نوش آباد", + "اردستان", + "زواره", + "مهاباد", + "اژیه", + "اصفهان", + "بهارستان", + "تودشک", + "حسن اباد", + "زیار", + "سجزی", + "قهجاورستان", + "کوهپایه", + "محمدآباد", + "نصرآباد", + "نیک آباد", + "ورزنه", + "هرند", + "حبیب آباد", + "خورزوق", + "دستگرد", + "دولت آباد", + "سین", + "شاپورآباد", + "کمشچه", + "افوس", + "بویین ومیاندشت", + "تیران", + "رضوانشهر", + "عسگران", + "چادگان", + "رزوه", + "اصغرآباد", + "خمینی شهر", + "درچه", + "کوشک", + "خوانسار", + "جندق", + "خور", + "فرخی", + "دهاقان", + "گلشن", + "حنا", + "سمیرم", + "کمه", + "ونک", + "شاهین شهر", + "گرگاب", + "گزبرخوار", + "لای بید", + "میمه", + "وزوان", + "شهرضا", + "منظریه", + "داران", + "دامنه", + "برف انبار", + "فریدونشهر", + "ابریشم", + "ایمانشهر", + "بهاران شهر", + "پیربکران", + "زازران", + "فلاورجان", + "قهدریجان", + "کلیشادوسودرجان", + "برزک", + "جوشقان قالی", + "قمصر", + "کاشان", + "کامو و چوگان", + "مشکات", + "نیاسر", + "گلپایگان", + "گلشهر", + "گوگد", + "باغ بهادران", + "باغشاد", + "چرمهین", + "چمگردان", + "زاینده رود", + "زرین شهر", + "سده لنجان", + "فولادشهر", + "ورنامخواست", + "دیزیچه", + "زیباشهر", + "طالخونچه", + "کرکوند", + "مبارکه", + "مجلسی", + "انارک", + "بافران", + "نایین", + "جوزدان", + "دهق", + "علویجه", + "کهریزسنگ", + "گلدشت", + "نجف آباد", + "بادرود", + "خالدآباد", + "طرق رود", + "نطنز" + ] + }, + { + "id": "5", + "name": "البرز", + "cities": [ + "اشتهارد", + "چهارباغ", + "شهرجدیدهشتگرد", + "کوهسار", + "گلسار", + "هشتگرد", + "طالقان", + "فردیس", + "مشکین دشت", + "آسارا", + "کرج", + "کمال شهر", + "گرمدره", + "ماهدشت", + "محمدشهر", + "تنکمان", + "نظرآباد" + ] + }, + { + "id": "6", + "name": "ایلام", + "cities": [ + "آبدانان", + "سراب باغ", + "مورموری", + "ایلام", + "چوار", + "ایوان", + "زرنه", + "بدره", + "آسمان آباد", + "بلاوه", + "توحید", + "سرابله", + "شباب", + "دره شهر", + "ماژین", + "پهله", + "دهلران", + "موسیان", + "میمه", + "لومار", + "ارکواز", + "دلگشا", + "مهر", + "صالح آباد", + "مهران" + ] + }, + { + "id": "7", + "name": "بوشهر", + "cities": [ + "بوشهر", + "چغادک", + "خارک", + "عالی شهر", + "آباد", + "اهرم", + "دلوار", + "انارستان", + "جم", + "ریز", + "آب پخش", + "برازجان", + "بوشکان", + "تنگ ارم", + "دالکی", + "سعد آباد", + "شبانکاره", + "کلمه", + "وحدتیه", + "بادوله", + "خورموج", + "شنبه", + "کاکی", + "آبدان", + "بردخون", + "بردستان", + "بندردیر", + "دوراهک", + "امام حسن", + "بندردیلم", + "عسلویه", + "نخل تقی", + "بندرکنگان", + "بنک", + "سیراف", + "بندرریگ", + "بندرگناوه" + ] + }, + { + "id": "8", + "name": "تهران", + "cities": [ + "احمد آباد مستوفی", + "اسلامشهر", + "چهاردانگه", + "صالحیه", + "گلستان", + "نسیم شهر", + "پاکدشت", + "شریف آباد", + "فرون اباد", + "بومهن", + "پردیس", + "پیشوا", + "تهران", + "آبسرد", + "آبعلی", + "دماوند", + "رودهن", + "کیلان", + "پرند", + "رباطکریم", + "نصیرشهر", + "باقرشهر", + "حسن آباد", + "ری", + "کهریزک", + "تجریش", + "شمشک", + "فشم", + "لواسان", + "اندیشه", + "باغستان", + "شاهدشهر", + "شهریار", + "صباشهر", + "فردوسیه", + "وحیدیه", + "ارجمند", + "فیروزکوه", + "قدس", + "قرچک", + "صفادشت", + "ملارد", + "جوادآباد", + "ورامین" + ] + }, + { + "id": "9", + "name": "چهارمحال وبختیاری", + "cities": [ + "اردل", + "دشتک", + "سرخون", + "کاج", + "بروجن", + "بلداجی", + "سفیددشت", + "فرادبنه", + "گندمان", + "نقنه", + "بن", + "وردنجان", + "سامان", + "سودجان", + "سورشجان", + "شهرکرد", + "طاقانک", + "فرخ شهر", + "کیان", + "نافچ", + "هارونی", + "هفشجان", + "باباحیدر", + "پردنجان", + "جونقان", + "چلیچه", + "فارسان", + "گوجان", + "بازفت", + "چلگرد", + "صمصامی", + "دستنا", + "شلمزار", + "گهرو", + "ناغان", + "آلونی", + "سردشت", + "لردگان", + "مال خلیفه", + "منج" + ] + }, + { + "id": "10", + "name": "خراسان جنوبی", + "cities": [ + "ارسک", + "بشرویه", + "بیرجند", + "خوسف", + "محمدشهر", + "اسدیه", + "طبس مسینا", + "قهستان", + "گزیک", + "حاجی آباد", + "زهان", + "آیسک", + "سرایان", + "سه قلعه", + "سربیشه", + "مود", + "دیهوک", + "طبس", + "عشق آباد", + "اسلامیه", + "فردوس", + "آرین شهر", + "اسفدن", + "خضری دشت بیاض", + "قاین", + "نیمبلوک", + "شوسف", + "نهبندان" + ] + }, + { + "id": "11", + "name": "خراسان رضوی", + "cities": [ + "باخرز", + "بجستان", + "یونسی", + "انابد", + "بردسکن", + "شهراباد", + "شاندیز", + "طرقبه", + "تایباد", + "کاریز", + "مشهدریزه", + "احمدابادصولت", + "تربت جام", + "صالح آباد", + "نصرآباد", + "نیل شهر", + "بایک", + "تربت حیدریه", + "رباط سنگ", + "کدکن", + "جغتای", + "نقاب", + "چناران", + "گلبهار", + "گلمکان", + "خلیل آباد", + "کندر", + "خواف", + "سلامی", + "سنگان", + "قاسم آباد", + "نشتیفان", + "سلطان آباد", + "داورزن", + "چاپشلو", + "درگز", + "لطف آباد", + "نوخندان", + "جنگل", + "رشتخوار", + "دولت آباد", + "روداب", + "سبزوار", + "ششتمد", + "سرخس", + "مزدآوند", + "سفیدسنگ", + "فرهادگرد", + "فریمان", + "قلندرآباد", + "فیروزه", + "همت آباد", + "باجگیران", + "قوچان", + "ریوش", + "کاشمر", + "شهرزو", + "کلات", + "بیدخت", + "کاخک", + "گناباد", + "رضویه", + "مشهد", + "مشهد ثامن", + "ملک آباد", + "شادمهر", + "فیض آباد", + "بار", + "چکنه", + "خرو", + "درود", + "عشق آباد", + "قدمگاه", + "نیشابور" + ] + }, + { + "id": "12", + "name": "خراسان شمالی", + "cities": [ + "اسفراین", + "صفی آباد", + "بجنورد", + "چناران شهر", + "حصارگرمخان", + "جاجرم", + "سنخواست", + "شوقان", + "راز", + "زیارت", + "شیروان", + "قوشخانه", + "لوجلی", + "تیتکانلو", + "فاروج", + "ایور", + "درق", + "گرمه", + "آشخانه", + "آوا", + "پیش قلعه", + "قاضی" + ] + }, + { + "id": "13", + "name": "خوزستان", + "cities": [ + "آبادان", + "اروندکنار", + "چویبده", + "آغاجاری", + "امیدیه", + "جایزان", + "آبژدان", + "قلعه خواجه", + "آزادی", + "اندیمشک", + "بیدروبه", + "چم گلک", + "حسینیه", + "الهایی", + "اهواز", + "ایذه", + "دهدز", + "باغ ملک", + "صیدون", + "قلعه تل", + "میداود", + "شیبان", + "ملاثانی", + "ویس", + "بندرامام خمینی", + "بندرماهشهر", + "چمران", + "بهبهان", + "تشان", + "سردشت", + "منصوریه", + "حمیدیه", + "خرمشهر", + "مقاومت", + "مینوشهر", + "چغامیش", + "حمزه", + "دزفول", + "سالند", + "سیاه منصور", + "شمس آباد", + "شهر امام", + "صفی آباد", + "میانرود", + "ابوحمیظه", + "بستان", + "سوسنگرد", + "کوت سیدنعیم", + "رامشیر", + "مشراگه", + "رامهرمز", + "خنافره", + "دارخوین", + "شادگان", + "الوان", + "حر", + "شاوور", + "شوش", + "فتح المبین", + "سرداران", + "شرافت", + "شوشتر", + "گوریه", + "کوت عبداله", + "ترکالکی", + "جنت مکان", + "سماله", + "صالح شهر", + "گتوند", + "لالی", + "گلگیر", + "مسجدسلیمان", + "هفتگل", + "زهره", + "هندیجان", + "رفیع", + "هویزه" + ] + }, + { + "id": "14", + "name": "زنجان", + "cities": [ + "ابهر", + "صایین قلعه", + "هیدج", + "حلب", + "زرین آباد", + "زرین رود", + "سجاس", + "سهرورد", + "قیدار", + "کرسف", + "گرماب", + "نوربهار", + "خرمدره", + "ارمغانخانه", + "زنجان", + "نیک پی", + "سلطانیه", + "آب بر", + "چورزق", + "دندی", + "ماه نشان" + ] + }, + { + "id": "15", + "name": "سمنان", + "cities": [ + "آرادان", + "کهن آباد", + "امیریه", + "دامغان", + "دیباج", + "کلاته", + "سرخه", + "سمنان", + "بسطام", + "بیارجمند", + "رودیان", + "شاهرود", + "کلاته خیج", + "مجن", + "ایوانکی", + "گرمسار", + "درجزین", + "شهمیرزاد", + "مهدی شهر", + "میامی" + ] + }, + { + "id": "16", + "name": "سیستان وبلوچستان", + "cities": [ + "ایرانشهر", + "بزمان", + "بمپور", + "محمدان", + "چابهار", + "نگور", + "خاش", + "نوک آباد", + "گلمورتی", + "بنجار", + "زابل", + "زاهدان", + "نصرت آباد", + "زهک", + "جالق", + "سراوان", + "سیرکان", + "گشت", + "محمدی", + "پیشین", + "راسک", + "سرباز", + "سوران", + "هیدوچ", + "فنوج", + "قصرقند", + "زرآباد", + "کنارک", + "مهرستان", + "میرجاوه", + "اسپکه", + "بنت", + "نیک شهر", + "ادیمی", + "شهرک علی اکبر", + "محمدآباد", + "دوست محمد" + ] + }, + { + "id": "17", + "name": "فارس", + "cities": [ + "آباده", + "ایزدخواست", + "بهمن", + "سورمق", + "صغاد", + "ارسنجان", + "استهبان", + "ایج", + "رونیز", + "اقلید", + "حسن اباد", + "دژکرد", + "سده", + "بوانات", + "حسامی", + "کره ای", + "مزایجان", + "سعادت شهر", + "مادرسلیمان", + "باب انار", + "جهرم", + "خاوران", + "دوزه", + "قطب آباد", + "خرامه", + "سلطان شهر", + "صفاشهر", + "قادراباد", + "خنج", + "جنت شهر", + "داراب", + "دوبرجی", + "فدامی", + "کوپن", + "مصیری", + "حاجی آباد", + "دبیران", + "شهرپیر", + "اردکان", + "بیضا", + "هماشهر", + "سروستان", + "کوهنجان", + "خانه زنیان", + "داریان", + "زرقان", + "شهرصدرا", + "شیراز", + "لپویی", + "دهرم", + "فراشبند", + "نوجین", + "زاهدشهر", + "ششده", + "فسا", + "قره بلاغ", + "میانشهر", + "نوبندگان", + "فیروزآباد", + "میمند", + "افزر", + "امام شهر", + "قیر", + "کارزین (فتح آباد)", + "مبارک آباددیز", + "بالاده", + "خشت", + "قایمیه", + "کازرون", + "کنارتخته", + "نودان", + "کوار", + "گراش", + "اوز", + "بنارویه", + "بیرم", + "جویم", + "خور", + "عمادده", + "لار", + "لطیفی", + "اشکنان", + "اهل", + "علامرودشت", + "لامرد", + "خانیمن", + "رامجرد", + "سیدان", + "کامفیروز", + "مرودشت", + "بابامنیر", + "خومه زار", + "نورآباد", + "اسیر", + "خوزی", + "گله دار", + "مهر", + "وراوی", + "آباده طشک", + "قطرویه", + "مشکان", + "نی ریز" + ] + }, + { + "id": "18", + "name": "قزوین", + "cities": [ + "آبیک", + "خاکعلی", + "آبگرم", + "آوج", + "الوند", + "بیدستان", + "شریفیه", + "محمدیه", + "ارداق", + "بویین زهرا", + "دانسفهان", + "سگزآباد", + "شال", + "اسفرورین", + "تاکستان", + "خرمدشت", + "ضیاڈآباد", + "نرجه", + "اقبالیه", + "رازمیان", + "سیردان", + "قزوین", + "کوهین", + "محمودآبادنمونه", + "معلم کلایه" + ] + }, + { + "id": "19", + "name": "قم", + "cities": [ + "جعفریه", + "دستجرد", + "سلفچگان", + "قم", + "قنوات", + "کهک" + ] + }, + { + "id": "20", + "name": "کردستان", + "cities": [ + "آرمرده", + "بانه", + "بویین سفلی", + "کانی سور", + "بابارشانی", + "بیجار", + "پیرتاج", + "توپ آغاج", + "یاسوکند", + "بلبان آباد", + "دهگلان", + "دیواندره", + "زرینه", + "اورامان تخت", + "سروآباد", + "سقز", + "صاحب", + "سنندج", + "شویشه", + "دزج", + "دلبران", + "سریش آباد", + "قروه", + "کامیاران", + "موچش", + "برده رشه", + "چناره", + "کانی دینار", + "مریوان" + ] + }, + { + "id": "21", + "name": "کرمان", + "cities": [ + "ارزوییه", + "امین شهر", + "انار", + "بافت", + "بزنجان", + "بردسیر", + "دشتکار", + "گلزار", + "لاله زار", + "نگار", + "بروات", + "بم", + "بلوک", + "جبالبارز", + "جیرفت", + "درب بهشت", + "رابر", + "هنزا", + "راور", + "هجدک", + "بهرمان", + "رفسنجان", + "صفاییه", + "کشکوییه", + "مس سرچشمه", + "رودبار", + "زهکلوت", + "گنبکی", + "محمدآباد", + "خانوک", + "ریحان", + "زرند", + "یزدان شهر", + "بلورد", + "پاریز", + "خواجو شهر", + "زیدآباد", + "سیرجان", + "نجف شهر", + "هماشهر", + "جوزم", + "خاتون اباد", + "خورسند", + "دهج", + "شهربابک", + "دوساری", + "عنبرآباد", + "مردهک", + "فاریاب", + "فهرج", + "قلعه گنج", + "اختیارآباد", + "اندوهجرد", + "باغین", + "جوپار", + "چترود", + "راین", + "زنگی آباد", + "شهداد", + "کاظم آباد", + "کرمان", + "گلباف", + "ماهان", + "محی آباد", + "کوهبنان", + "کیانشهر", + "کهنوج", + "منوجان", + "نودژ", + "نرماشیر", + "نظام شهر" + ] + }, + { + "id": "22", + "name": "کرمانشاه", + "cities": [ + "اسلام آبادغرب", + "حمیل", + "بانوره", + "باینگان", + "پاوه", + "نودشه", + "نوسود", + "ازگله", + "تازه آباد", + "جوانرود", + "ریجاب", + "کرند", + "گهواره", + "روانسر", + "شاهو", + "سرپل ذهاب", + "سطر", + "سنقر", + "صحنه", + "میان راهان", + "سومار", + "قصرشیرین", + "رباط", + "کرمانشاه", + "کوزران", + "هلشی", + "کنگاور", + "گودین", + "سرمست", + "گیلانغرب", + "بیستون", + "هرسین" + ] + }, + { + "id": "23", + "name": "کهگیلویه وبویراحمد", + "cities": [ + "باشت", + "چیتاب", + "گراب سفلی", + "مادوان", + "مارگون", + "یاسوج", + "لیکک", + "چرام", + "سرفاریاب", + "پاتاوه", + "سی سخت", + "دهدشت", + "دیشموک", + "سوق", + "قلعه رییسی", + "دوگنبدان", + "لنده" + ] + }, + { + "id": "24", + "name": "گلستان", + "cities": [ + "آزادشهر", + "نگین شهر", + "نوده خاندوز", + "آق قلا", + "انبارآلوم", + "بندرگز", + "نوکنده", + "بندرترکمن", + "تاتارعلیا", + "خان ببین", + "دلند", + "رامیان", + "سنگدوین", + "علی اباد", + "فاضل آباد", + "مزرعه", + "کردکوی", + "فراغی", + "کلاله", + "گالیکش", + "جلین", + "سرخنکلاته", + "گرگان", + "سیمین شهر", + "گمیش تپه", + "اینچه برون", + "گنبدکاووس", + "مراوه", + "مینودشت" + ] + }, + { + "id": "25", + "name": "گیلان", + "cities": [ + "آستارا", + "لوندویل", + "آستانه اشرفیه", + "کیاشهر", + "املش", + "رانکوه", + "بندرانزلی", + "خشکبیجار", + "خمام", + "رشت", + "سنگر", + "کوچصفهان", + "لشت نشاء", + "لولمان", + "پره سر", + "رضوانشهر", + "بره سر", + "توتکابن", + "جیرنده", + "رستم آباد", + "رودبار", + "لوشان", + "منجیل", + "چابکسر", + "رحیم آباد", + "رودسر", + "کلاچای", + "واجارگاه", + "دیلمان", + "سیاهکل", + "احمدسرگوراب", + "شفت", + "صومعه سرا", + "گوراب زرمیخ", + "مرجقل", + "اسالم", + "چوبر", + "حویق", + "لیسار", + "هشتپر (تالش)", + "فومن", + "ماسوله", + "ماکلوان", + "رودبنه", + "لاهیجان", + "اطاقور", + "چاف و چمخاله", + "شلمان", + "کومله", + "لنگرود", + "بازار جمعه", + "ماسال" + ] + }, + { + "id": "26", + "name": "لرستان", + "cities": [ + "ازنا", + "مومن آباد", + "الیگودرز", + "شول آباد", + "اشترینان", + "بروجرد", + "پلدختر", + "معمولان", + "بیران شهر", + "خرم آباد", + "زاغه", + "سپیددشت", + "نورآباد", + "هفت چشمه", + "چالانچولان", + "دورود", + "سراب دوره", + "ویسیان", + "چقابل", + "الشتر", + "فیروزآباد", + "درب گنبد", + "کوهدشت", + "کوهنانی", + "گراب" + ] + }, + { + "id": "27", + "name": "مازندران", + "cities": [ + "آمل", + "امامزاده عبدالله", + "دابودشت", + "رینه", + "گزنک", + "امیرکلا", + "بابل", + "خوش رودپی", + "زرگرمحله", + "گتاب", + "مرزیکلا", + "بابلسر", + "بهنمیر", + "هادی شهر", + "بهشهر", + "خلیل شهر", + "رستمکلا", + "تنکابن", + "خرم آباد", + "شیرود", + "نشتارود", + "جویبار", + "کوهی خیل", + "چالوس", + "مرزن آباد", + "هچیرود", + "رامسر", + "کتالم وسادات شهر", + "پایین هولار", + "ساری", + "فریم", + "کیاسر", + "آلاشت", + "پل سفید", + "زیرآب", + "شیرگاه", + "کیاکلا", + "سلمان شهر", + "عباس اباد", + "کلارآباد", + "فریدونکنار", + "ارطه", + "قائم شهر", + "کلاردشت", + "گلوگاه", + "سرخرود", + "محمودآباد", + "سورک", + "نکا", + "ایزدشهر", + "بلده", + "چمستان", + "رویان", + "نور", + "پول", + "کجور", + "نوشهر" + ] + }, + { + "id": "28", + "name": "مرکزی", + "cities": [ + "آشتیان", + "اراک", + "داودآباد", + "ساروق", + "کارچان", + "تفرش", + "خمین", + "قورچی باشی", + "جاورسیان", + "خنداب", + "دلیجان", + "نراق", + "پرندک", + "خشکرود", + "رازقان", + "زاویه", + "مامونیه", + "آوه", + "ساوه", + "غرق آباد", + "نوبران", + "آستانه", + "توره", + "شازند", + "شهباز", + "مهاجران", + "هندودر", + "خنجین", + "فرمهین", + "کمیجان", + "میلاجرد", + "محلات", + "نیمور" + ] + }, + { + "id": "29", + "name": "هرمزگان", + "cities": [ + "ابوموسی", + "بستک", + "جناح", + "سردشت", + "گوهران", + "بندرعباس", + "تازیان پایین", + "تخت", + "فین", + "قلعه قاضی", + "بندرلنگه", + "چارک", + "کنگ", + "کیش", + "لمزان", + "پارسیان", + "دشتی", + "کوشکنار", + "بندرجاسک", + "حاجی اباد", + "سرگز", + "فارغان", + "خمیر", + "رویدر", + "بیکاء", + "دهبارز", + "زیارتعلی", + "سیریک", + "کوهستک", + "گروک", + "درگهان", + "سوزا", + "قشم", + "هرمز", + "تیرور", + "سندرک", + "میناب", + "هشتبندی" + ] + }, + { + "id": "30", + "name": "همدان", + "cities": [ + "آجین", + "اسدآباد", + "بهار", + "صالح آباد", + "لالجین", + "مهاجران", + "تویسرکان", + "سرکان", + "فرسفج", + "دمق", + "رزن", + "قروه درجزین", + "فامنین", + "شیرین سو", + "کبودرآهنگ", + "گل تپه", + "ازندریان", + "جوکار", + "زنگنه", + "سامن", + "ملایر", + "برزول", + "فیروزان", + "گیان", + "نهاوند", + "جورقان", + "قهاوند", + "مریانج", + "همدان" + ] + }, + { + "id": "31", + "name": "یزد", + "cities": [ + "ابرکوه", + "مهردشت", + "احمدآباد", + "اردکان", + "عقدا", + "اشکذر", + "خضرآباد", + "بافق", + "بهاباد", + "تفت", + "نیر", + "مروست", + "هرات", + "مهریز", + "بفروییه", + "میبد", + "ندوشن", + "حمیدیا", + "زارچ", + "شاهدیه", + "یزد" + ] + } + ] diff --git a/tests/BasicTest.php b/tests/BasicTest.php new file mode 100644 index 0000000..8c990da --- /dev/null +++ b/tests/BasicTest.php @@ -0,0 +1,100 @@ +assertEquals(en_to_fa('1234567890'), '۱۲۳۴۵۶۷۸۹۰'); + } + + public function testFaToEn() + { + $this->assertEquals('۱۲۳۴۵۶۷۸۹۰', en_to_fa('1234567890')); + } + + public function testMiddleware() + { + $request = new Request(); + + $request->merge([ + 'test_fa' => '۱۲۳۴۵۶۷۸۹۰', + 'test_arabic' => 'ك,ي', + 'arr' => [ + 'test_fa' => '۱۲۳۴۵۶۷۸۹۰', + 'test_arabic' => 'ك,ي', + 'arr2' => [ + 'test_fa' => '۱۲۳۴۵۶۷۸۹۰', + 'test_arabic' => 'ك,ي' + ] + ] + ]); + + $middleware = new \SanjabHelpers\Middleware\FixRequestInputs; + + $middleware->handle($request, function ($req) { + $this->assertEquals($req['test_fa'], '1234567890'); + $this->assertEquals($req['test_arabic'], 'ک,ی'); + $this->assertEquals($req['arr']['test_fa'], '1234567890'); + $this->assertEquals($req['arr']['test_arabic'], 'ک,ی'); + $this->assertEquals($req['arr']['arr2']['test_fa'], '1234567890'); + $this->assertEquals($req['arr']['arr2']['test_arabic'], 'ک,ی'); + }); + } + + public function testStrToSlug() + { + $this->assertEquals('helloworld', str_to_slug('helloworld')); + $this->assertEquals('hello-world', str_to_slug('hello world')); + $this->assertEquals('hello-world', str_to_slug('hello world ')); + $this->assertEquals('hello-world', str_to_slug(' hello world')); + $this->assertEquals('سلام', str_to_slug(' سلام')); + $this->assertEquals('سلام-دنیا', str_to_slug(' سلام دنیا')); + } + + public function testFindBankByCardNumber() + { + $this->assertEquals('bsi', find_bank_by_card_number('6037697531')['class']); + $this->assertEquals(null, find_bank_by_card_number('12345678')); + } + + public function testEloquentHelper() + { + Artisan::call('migrate'); + $model = new class extends Model { + use EloquentHelper; + + protected $casts = [ + 'birth_date' => 'date' + ]; + }; + $model->setDateFormat('Y/j/d'); + // getter + $model->birth_date = Carbon::createFromDate(2001, 12, 11); + $this->assertEquals(verta($model->birth_date)->formatJalaliDate(), $model->birth_date_fa_f); + $this->assertEquals(verta($model->birth_date)->format("Y/n/j H:i"), $model->birth_date_fa_ft); + $this->assertEquals(verta($model->birth_date)->formatJalaliDateTime(), $model->birth_date_fa_ftt); + + // setter + $model->birth_date_fa = "1370/1/1"; + $this->assertEquals($model->birth_date->format("Y-m-d"), "1991-10-21"); + + // aparat + $model->video = "https://www.aparat.com/v/O4qSP"; + $this->assertInstanceOf(\SanjabHelpers\Models\AparatVideo::class, $model->video_aparat); + $this->assertEquals("ایستگاه جوانمرد راستگو", $model->video_aparat->title); + } + + protected function getPackageProviders($app) + { + return [\SanjabHelpers\SanjabHelpersServiceProvider::class]; + } +}