آرشیو دستورات گیت – git

در این مطلب قصد دارم به مرور دستورات گیت  و … را آرشیو کنم تا در مواقع ضروری از آن استفاده کنم 🙂

گیت چیست ؟!

گیت یک ورژن کنترل است!

گیت (به انگلیسی: Git) یک نرم‌افزار کنترل نسخه و از مدل نرم‌افزارهای آزاد و متن‌باز برای بازنگری کد منبع توزیع شده و مدیریت منبع کد است که برای دنبال کردن تغییر فایلهای کامپیوتری و دنبال کردن کردن کارهای انجام شده روی آنها توسط افراد مختلف است. هدف اولیه این نرم‌افزار برای استفاده در پروژه‌های نرم‌افزاری بوده است ولی می‌توان از آن تنها برای دنبال کردن تغییر فایل‌ها هم استفاده کرد. [ ویکی پدیا ]

نصب و فعال سازی گیت :

برای نصب و دانلود گیت به وب سایت git-scm.com مراجعه کنید و مراحل نصبش را طی کنید و برای نصب گیت هاب هم در صورتیکه وارد وبسایت گیت هاب شوید می توانید نرم افزار مربوط به گیت هاب را دانلود کنید و به راحتی ریپازیتوری هایی که ایجاد میکنید را مدیریت کنید.

با توجه به اینکه برای پروژه ها بیشتر از گیت لب استفاده میکنم بیشتر در این رابطه صحبت میکنم هرچند دستورات و کامندهای گیت هاب هم شبیه به گیت لب است و تفاوت زیادی ندارد.

ایجاد SSH key برای گیت لب

برای دسترسی به پروژه ها باید یک کلید SSH در پروفایل خود ایجاد کنید که مدیریت و بررسی دسترسی شما به پروژه برای استفاده از گیت است، مطابق تصویر زیر وقتی وارد پروفایل گیت لب خود می شوید لینک Generate برای ایجاد کلید اختصاصی گیت لب برای پروفایل شما نمایش داده می شود که با کلیک روی آن و طی مراحل آن به راحتی کلید را ایجاد میکنید و در کادر مربوطه در پروفایل خود قرار می دهید.

profile settings ssh keys gitlab

گیت لب ( GitLab )

دستورات گیت لب به صورت زیر هستند :

git status
-----------------
git add .
-----------------
git commit -m "Description "
-----------------
git push origin master
-----------------
git pull origin master

با نوشتن کد زیر می توانیم بفهمیم الان در کدام branch هستیم و کدها را در کدام branch تغییر و یا دریافت میکنیم :

git branch

در صورتیکه در Branchی هستیم و میخواهیم تغییر branch دهیم، اگر branch را جدیدا ایجاد کرده باشیم باید کد زیر را وارد کنیم تا branch ها شناسایی شوند.

git fetch --all

با نوشتن کد زیر لیست همه branch ها را نمایش می دهیم

git branch --all

برای تغییر branch مثلا به شاخه Develope

git checkout Develope

 

افزونه های کاربردی گوگل کروم

در این مقاله میخوام پلاگین های کاربردی که روی مرورگر کروم و یا بقیه نصب میشن رو معرفی کنم که خودم ازشون استفاده میکنم.

اکستنشن های کاربردی و مهم گوگل کروم :

۱ – infinity new tab

این افزونه قابلیت های بسیارجالب و دلپذیری رو به کروم اضافه میکند، بکگراوندهای متنوع و جذابی به مرورگر میدهد.

  • جستجوی اینترنتی را برای موتورهای جستجوی مختلف تنظیم می کند.

search engin

  • مرتب سازی لیست بوکمارکها و هیستوری ها

infinity new tab bookmark

  • قابلیت تعریف تسک های روزانه به صورت to do list

دانلود و نصب اکستنشن 

۲ – ColorZilla

این پلاگین ویژگی انتخاب کد رنگ را در وبسایت های مختلف به شما می دهد، مثلا در وبسایتی هستید ورنگ بکگراوند قسمتی از وبسایت مورد پسندتان است کافی است با استفاده از این پلاگین روی آن کلیک کنید تا کد رنگ آن بخش در فرمت های رنگی مختلف به شما داده شود.

 

colorZilla

colorZilla - color format rgb

colorZilla

دانلود و نصب اکستنشن بر روی گوگل کروم 

۳ – Alexa Traffic Rank

با استفاده از این ابزار میتوانید رنک تقریبی وبسایتی که از ان بازدید می کنید را ببینید و همچنین وبسایت های مشابه این وبسایت را نیز به شما معرفی میکند، لازم است تاکید کنم این پلاگین به صورت تقریبی آمار ارائه میکند و اصلا ملاک دقیقی برای تخمین رتبه واقعی یک وبسایت نیست چراکه بسیاری از افراد با ترفندهایی این رنک را افزایش میدهند در حالیکه در میان جستجوی گوگل ارزشی ندارند.

الکسا

دانلود و نصب الکسا بر روی کروم

۴ – Google Calendar – by Google

این پلاگین وقتی به مرورگر کروم اضافه میشود امکانی به شما می دهد که به راحتی ایونت ها و رویدادهایی که میخواهید را سریع به تقویم زمانی گوگل اضافه کنید تا در زمان مناسب به شما یادآوری کنید.

google calendar

google calendar

دانلود و نصب نصب پلاگین

۵ – JSON Formatter

در صورتیکه با فایل های JSON آشنایی کامل داشته باشید هنگام برنامه نویسی برای دریافت خروجی از json استفاده میکنیم و خیلی وقت ها برای تست فیلدهای فرم ارسالی مخصوصا هنگام کار با لاراول ، نیاز است خروجی مورد نظر را در فرمت json ببینیم، این پلاگین به سبکی زیبا و خوانا خروجی json را نمایش می دهد.

JSON Formatter

صفحه گیت هاب اکستنشن 

دانلود و نصب پلاگین بر روی گوگل کروم

۶ –  HTML5 Outliner

این پلاگین برای من خیلی جذاب بود چراکه ساختار وبسایت رو بهم نمایش میده و اگر قصد دارید ساختار وبسایت از لحاظ تگ های هدینگ درست و منظم باشه میتونید با این پلاگین بررسیش کنید که بر اساس تگ های h1 تا h6 ساختار وبسایت رو نمایش میدهد که قطعا برای سئو مناسبتر خواهد بود.

html5 outliner - SEO

دانلود و نصب پلاگین

۷ – Instant Wireframe

این پلاگین هم خیلی جذابه به طوریکه ساختار وبسایت هایی که طراحی میکنید و یا وجود دارند را به صورت وایرفریم به شما نمایش میدهد که میتوانید در برخی جاها ازش استفاده کنید.

وایرفریم - wireframe wireframe - instant wireframr

دانلود و نصب اکستنشن

۸ – Magicword Translator

اگر مطالب انگلیسی مطالعه میکنید و قصد دارید در زمان سریعی متن رو بخونید و برخی کلمات رو باید از دیکشنری یا گوگل ترنسلیت ترجمه کنید با استفاده از این پلاگین میتونید کلمه رو انتخاب کنید و همونجا معنی فارسی رو بهتون میده. این پلاگین رو واژه یاب پیاده سازی کرده است.

 Magicword Translator Magicword-Translator

دانلود و نصب پلاگین 

۹ –  Wappalyzer

با استفاده از این پلاگین میتونید تشخیص دهید که وبسایتهایی که مشاهده میکنید با استفاده از چه فریم ورک، سیستم مدیریت محتوا و یا تکنولوژی پیاده سازی شده اند.

دانلود و نصب پلاگین 

۱۰ – Web Developer

میشه گفت این پلاگین رو هر دولوپری روی مرورگرش نصب شده دارد!

Web Developer tools

Web developer tools

دانلود و نصب پلاگین 

سفارشی کردن محیط sublime text

چند ماه قبل بود که این ویدئو رو ضبط کردم ولی به دلایلی فرصت انتشار آن پیدا نشد، تصمیم گرفتم منتشرش کنم شاید برای یکی مفید باشه و بتونه روی بازدهی و سرعت برنامه نویسیش تاثیر بذاره.

در این ویدیوی کوتاه تجربیاتم و مواردی که خودم ازش استفاده میکنم را سعی کردم واضح و شفاف با دوستان به اشتراک بذارم.
در رابطه با sublime text و نصب پکیج های اون و package control صحبت کردم و همچنین چگونه کلیدهای میانبر(short keys) برای خودمون ایجاد کنیم.

در نهایت محیط ترمینال iTerm رو کاستومایز کردم.

لینک ویدئوی آموزشی کاستومایز کردن محیط برنامه نویسی در آپارات :

 

لینک ویدئوی آموزشی کاستومایز کردن محیط برنامه نویسی در یوتیوب :

 

آرشیو اول : دستورات و نکات مهم لاراول

همانطور که در اولین مطلب وبلاگم اشاره کردم بسیاری از مطالبی که در وبلاگم منتشر میکنم برای آرشیو کردن آن ها برای خودم است و امیدوارم  برای  برخی از دوستان هم کاربرد داشته باشه.

( لاراول ۵.۴ )

در این مطلب در رابطه با مواردی که در لاراول لازم میشه اشاره میکنم :

۱- ایجاد ارتباط بین فیلدهای جداول دیتابیس در migration :

وقتی فیلدی داریم که قصد داریم به عنوان کلید خارجی هم ازش استفاده کنیم، مثلا مقالاتی برای وبلاگ داریم که افرادی آنها را منتشر میکنند، پس برای هر مقاله فیلدی به نام user_id ذخیره میکنیم که شناسه کاربری که مقاله را منتشر کرده است در جدول مقالات ذخیره شود.

پس در migration مربوط به مقالات که نام مقاله و slug ، …. وجود داره یک فیلد به نام user_id وجود داره که به فیلد id موجود در جدول users اشاره میکنه. ( جدول users مشخصات کاربران را ذخیره میکند )

پس داخل فایل migration مربوط به مقالات به این صورت می نویسیم :

$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');

۲ –  گروه بندی مسیریابی Rout در فایل web.php

همانطور که میدونید برای اینکه مثلا لیست مقالات مربوط به وبسایت رو نمایش بدیم باید در فایل web.php که در فولدر rout است مسیردهی مورد نظر و کنترلر و تابع اون رو مشخص کنیم، برای مثال اگر قرار باشه با مسیر mekaeil.me/admin/articles لیست تمام مقالات را نمایش دهیم مسیردهی در فایل web.php به صورت زیر خواهد بود :

Route::get('/admin/articles', 'Admin\[email protected]')->name('admin.article.list');

که در اینجا با فراخوانی آدرس /admin/articles بعد از نام دامنه، کنترلر ArticlesController که در مسیر Http > Controllers > Admin > ArticlesController وجود دارد فراخوانی میشود و تابع list موجود در این فایل مدیریت نمایش لیست مقالات و ارسال اطلاعات به view را انجام خواهد داد.

نکته اینجاست که ما اگر کلی مسیردهی داشته باشیم برای آدرس های مختلف باید به تعداد آنها مسیریابی را داخل فایل web.php ایجاد کنیم، برای راحتی کار و خلاصه شدن کار میتوانیم از حالت گروه بندی استفاده کنیم به صورت زیر :

Route::namespace('Admin')->prefix('admin')->group(function(){

$this->get('/articles', '[email protected]')->name('admin.article.list');

// Another rout here ...
});

۳ – ایجاد کنترلرها و متدهای مربوط به آن ( CRUD )

هنگام ایجاد اپلیکیشن ها و برنامه ها، متدهای Create , Read, Update, Delete , Store  در کنترلرهای مربوط به مدیریت برنامه استفاده میشود، برای ایجاد کنترلر و متدهای مربوط به آن، بعد از اینکه مدل مورد نظر را ایجاد کردیم میتوانیم با استفاده از دستور زیر به صورت Resource کنترلر موردنظر را ایجاد کنیم در حالتی که شامل متدهای مورد نظر هستند‌:

php artisan make:controller PhotoController -r

CRUD

در حالت فوق متدهای show , edit و … مقداری به نام $id را به عنوان ورودی متد دریافت میکنند تا عملیات مورد نظر انجام شود :‌

Rout model binding in laravel

حالا با تغییر دستور ترمینال به صورت زیر، میتوان با استفاده از rout model binding دسترسی و ارتباط میان کنترلرها و مدلها را برقرار کرد :

 php artisan make:controller ArticleController -r --model=Article

۴ –  insert داده های اولیه ( پیشفرض ) به جداول دیتابیس

من برای پروژه ای که داشتم باید هنگام راه اندازی پروژه یکسری داده ها به صورت پیشفرض به جداول دیتابیس اضافه میشد تا بتوانن هنگام برنامه نویسی هم از آنها استفاده کرد. برای مثال دسته بندی به نام “پیشفرض” به جداول دسته بندی ها اضافه کردم تا وقتی اگر یک مقاله ای آپلود و منتشر شد در صورتیکه دسته بندیی وجود نداشت و یا انتخاب نشد به صورت اتوماتیک این دسته بندی انتخاب شود و یا اگر یک دسته بندی حذف شد، تمام مقالات مربوط به آن دسته بندی به جای حذف به آن دسته بندی نسبت داده شوند.

برای ایجاد این داده های پیشفرض، من داخل فایل migration مربوط به جدول مورد نظر داده ها را اضافه کردم به صورت زیر :

    public function up()
    {
        Schema::create('articlecats', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('slug')->nullable();
            $table->timestamps();
        });

        // Insert Default Data
        DB::table('articlecats')->insert(
            array(
                'id'            => '1',
                'name'      => 'پیشفرض',
                'slug'          => 'default',
                'created_at'    => '1991-07-14',
                'updated_at'    => '1991-07-14'
            )
        );    
    }

۵ – افزودن کاربر به دیتابیس به صورت دستی

گاهی وقت ها هنگام ایجاد پروژه در بخش هایی که هنوز به بخش سطوح دسترسی و احزارهویت کاربران نرسیدیم و لازم است یکسری دیتا را ایجاد کنیم، برای ایجاد این دیتاها از سمت برنامه باید کاربر لاگین کرده باشد و برای لاگین بودن کاربر باید کاربری وجود داشته باشد! پس به صورت دستی یا از سمت phpmyadmin کاربری را ایجاد میکنیم و یا با استفاده از کدنویسی و قراردادن در یکی از فانکشن های کنترلر کاربر را ایجاد میکنیم و سپس کد را حذف میکنیم، که من شخصا راه دوم رو با استفاده از کد زیر انجام میدم.

return User::create([
'name' => 'Mekaeil Andisheh',
'level' => 'admin',
'email'=> '[email protected]',
'password'  => bcrypt('123456')
 ]);  

 

رفع مشکل Migration , Doctrine DBAL

یکی از جذابترین قسمت های لاراول مدیریت دیتابیس و migration ها است. وقتی بخواهیم فیلدهای دیتابیس را تغییر دهیم و در کل برای ایجاد هر تغییر در دیتابیس لازمه که یک migration ایجاد بشه که دیتاهای قبلی که در طول پروژه وارد شدند حفظ بشن و از طرفی وقتی به صورت تیمی کاری انجام میشه هم اعضای تیم در جریان روند تغییرات باشند و هم در هنگام استفاده از گیت ، اگر لازم شد rollback کنیم به تغییرات قبلی، اینکار انجام شدنی و راحت باشه.

برای یکی از فیلدها مجبور شدم که type فیلد رو از string به text تغییر بدم که migration را به صورت زیر ایجاد کردم :

    public function up()
    {
        Schema::table('articles', function (Blueprint $table) {
            $table->text('FeatureImage')->nullable()->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('articles', function (Blueprint $table) {
            $table->string('FeatureImage')->nullable()->change();
        });
    }

بعد از اینکه با اجرای دستور php artisan migrate با خطای زیر مواجه شدم :

doctrine/dbal laravel5.4

برای رفع مشکل نیاز داریم که با استفاده از composer موارد لازم را نصب کنیم :

composer require doctrine/dbal

با اجرای دستور فوق ( به احتمال خیلی زیاد باید فیلترشکن فعال باشه تا بتونید نصب کنید ) مشکل رفع میشه و مجددا عملیات migrate را انجام دهیم به خوبی کار انجام میشه :

update and install composer

( لاراول ۵.۴ )

دستورات اولیه و مهم لاراول

در این مقاله قصد دارم دستورات مهم و کاربردی که در محیط ترمینال و controller , route و Model کاربرد دارند و معمولا باید بدونیم رو بنویسم که به صورت یک مطلب روی وبلاگم داشته باشم.

( لاراول ۵.۴ )

۱ – رفع باگ migration در لاراول ۵.۴

وقتی لاراول رو نصب میکنیم و فیلدهای دیتابیس رو از طریق migration ایجاد میکنیم، بعد از اینکه migrate کنیم با خطایی روبرو میشیم که تصویر خطا رو به صورت زیر میبینیم :

syntax-error-laravel

که برای رفع این مشکل در فایل AppServiceProvider.php در مسیر app > providers کد زیر را اضافه می کنیم :

public function boot()
{
Schema::defaultStringLength(191);
}

۲ – نمایش لیست Route های موجود پروژه در ترمینال

برای نمایش لیست Route های موجود در پروژه و جزئیات آنها از دستور زیر در ترمینال استفاده میکنیم

php artisan route:list

route-list

۳ –  اعتبارسنجی فرم ها و ایجاد Request

برای اعتبارسنجی فرم ها هم میتوان بعد از ارسال مقدار فیلدها، داخل متد کنترلر اعتبارسنجی رو انجام داد و هم اینکه با استفاده از محیط ترمینال یک Request برای فرم مورد نظر ایجاد کرد و اعتبارسنجی همه فرم های پروژه رو داخل فایلهای مربوط به هر فرم ایجاد نمود. برای ایجاد Request داخل ترمینال دستور زیر را وارد میکنیم :

php artisan make:request ArticleValidate

بعد از اینکار وارد فولدر Http > Request میشیم و فایل ArticleValidate را میبینیم که میتوانیم موارد مربوط به اعتبارسنجی را داخل آن وارد کنیم، اولین کار اینه که متد authorize() را از حالت false به true تغییر دهیم و سپس داخل متد rules() اعتبارسنجی را انجام دهیم.

    public function rules()
    {
        return [
            'ArticleTitle'      => 'required',
            'MetaDescriptions'  => 'required',
            'body'              => 'required'
        ];
    }

بعد از نوشتن فیلدهایی که باید اعتبار سنجی شوند باید داخل متد کنترلر که فرم به آن ارسال میشود نام این request را به عنوان آرگومان ورودی ارسال کنیم.

  public function saveArticle(ArticleValidate $request){
 //....
 }

که برای نمایش Error ها، داخل فایلی که فرم ارسال میشود میتوان آنها را نمایش داد.

۴ – فارسی سازی خطاهای نمایش داده شده به کاربر

برای فارسی سازی خطاهایی که مثلا هنگام ارسال فرم نمایش داده میشود، وارد فولدر resource > lang میشیم، در این فولدر یک فولدر به نام en وجود دارد که یک کپی از آن میگیریم و به fa تغییرش میدیم و وارد فایلهای فولدر میشیم و به فارسی تغییر میدیم ( البته فایل فارسی شده آن توسط بقیه دوستان برای دانلود روی گیت هاب وجود داره ) سپس وارد فولدر config و فایل app.php میشیم و کد ‘locale’ => ‘en’  را به ‘locale’ => ‘fa’ تغییر می دهیم.

Locale-laravel-to-farsi

۵ – تغییر مکان قرارگیری فایلهای مدل و کنترلر و مرتب سازی آنها

وقتی پروژه خود را با لاراول استارت میزنید، به صورت اتوماتیک یکسری از کنترلرها و مدلها ساخته میشود، من شخصا برای پروژه دوست دارم که فایلهای کنترلر و مدل را تفکیک کنم مثلا همه مدل ها را داخل فولدری به نام Models قرار دهم که با اینکار باید namespace و مسیر دسترسی به مدل را داخل کنترلر ادیت کنم. همچنین مدل User.php را نیز به فولدر Models انتقال میدم که با خطای زیر مواجه میشم :

Fatal error access model user in laravel

برای رفع این خطا و دسترسی کنترلر به مدل وارد فایل config/auth.php میشم و مسیر دسترسی به مدل را ویرایش میکنم :

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],

همچنین داخل مدل User قسمت namespace را نیز به App\Models تغییر میدم.

۶ –  رفع خطای Mass Assignment در لاراول

وقتی میخواهیم با استفاده از متدهایی همچون create مقاله ای ، …  را اضافه کنیم و نیاز داریم که فیلدهای دیتابیس را تغییر دهیم با اجرای متد با خطایی به نام Mass Assignment روبرو میشیم که اجازه تغییر فیلدها دیتابیس را به کاربر نمیده، برای اینکار در فایل مدل مربوطه باید مشخص کنیم که کاربر اجازه تغییر کدام یک از فیلدها را خواهد داشت، که برای اینکار مثلا برای مقالات ما اگر بخواهیم فقط اجازه تغییر مقادیر تایتل و متن توضیحات رو به کاربر بدیم به صورت زیر اقدام میکنیم :

    protected $fillable = ['title' , 'body' ];

و اگر بخواهیم به همه فیلدها به جز یک فیلد یا تعداد کمتری اجازه تغییر دهیم، به جای ذکر همه فیلدها با استفاده از متد فوق میتوان به صورت زیر عمل کرد : ( اگر به همه فیلدها اجازه تغییر دهیم برای حالت زیر یک آرایه خالی قرار میدهیم )

  protected $guarded = ['price'];

۷ – رفع مشکل composer autoload

گاهی وقت ها مجبور میشیم که فایل کنترلر را حذف و مجددا بسازیم که در این حالت به دلیل باقی ماندن فایل در دایرکتوری composer با خطای زیر مواجه میشیم :

composer autoload

با اجرای کد زیر در ترمینال میتوان مشکل مورد نظر را حل و کنترلر را ایجاد کرد.

composer dumpautoload

 

معرفی پکیج sluggable برای لاراول

( لاراول ۵.۴ )

برای هر محتوا یا بخشی از پروژه لاراول قطعا یکی از بخش های مهم لینک همان بخش است که جنریت می شود تا لینک درست و مناسبی تولید شود، برای مثال همین مقاله ای که الان مشاهده میکنید اگر دقت کنید بین کلماتی که فاصله وجود دارد خط تیره گذاشته میشود تا لینک خواناتر و قابل فهم تر باشد.

برای مثال به جای اینکه لینک به صورت زیر باشد :

http://example.com/post/My+Dinner+With+Andr%C3%A9+%26+Fran%C3%A7ois

به صورت زیر نمایش داده می شود :

http://example.com/post/my-dinner-with-andre-francois

برای مدیریت این موضوع در لاراول پکیج های مختلفی تولید شده اند که بهترینشون تا به امروز پکیج Eloquent-Sluggable است که خیلی عالی لینک ها رو مدیریت و تولید میکنه.

برای نصب کافیه وارد مسیر پروژه بشید و به صورت زیر اقدام نمائید :

قدم اول : نصب پکیج با استفاده از کامپوزر :

 composer require cviebrock/eloquent-sluggable

قدم دوم : وارد فایل config/app.php میشیم و کد زیر را به providers اضافه میکنیم :

'providers' => [
      Cviebrock\EloquentSluggable\ServiceProvider::class     
];

قدم سوم : کد زیر را داخل ترمینال اجرا میکنیم :

php artisan vendor:publish

با اجرای این کد، فایلهایی که مورد نیاز است داخل پروژه قرار داده می شوند که مهمترینشون فایل sluggable.php داخل فولدر config است که میتوان تنظیمات slug را تغییر داد.

قدم چهارم :  وارد فایل مدل می شویم و پکیج را use میکنیم و کد زیر را بهش اضافه میکنیم :

use Cviebrock\EloquentSluggable\Sluggable;
    use Sluggable;

    /**
     * Return the sluggable configuration array for this model.
     *
     * @return array
     */
    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title'
            ]
        ];
    }

تا به اینجای کار پکیج نصب شده و قابل استفاده ست فقط باید دقت کنیم که فیلدی که داخل دیتابیس داریم باید هم اسم فیلدی باشد که با استفاده از پکیج لینک جنریت میشود و داخل آن ذخیره می شود (slug).

اگر بخواهیم بگیم چطور قابل استفاده است با کد نمونه زیر در زمانی که پست ایجاد میشود قابل درک است :

$post = new Post([
    'title' => 'My Awesome Blog Post',
]);

$post->save();
// $post->slug is "my-awesome-blog-post"

اگر احیانا مقاله جدیدی با لینک یکی از مقالات یکی باشد اعدادی را به ترتیب به آخر لینک اضافه میکند و در واقع مقدار slug یونیک است.
$newPost = $post->replicate();
// $newPost->slug is "my-awesome-blog-post-1"

برای اینکه بخواهیم یکسری تغییرات دیگه ایجاد کنیم و یا تنظیمات بیشتری را روی پکیج اعمال کنیم توصیه میکنم لینک مربوط به پکیج را که در بالا اشاره شد مطالعه نمایید.

اگر بخواهیم لینک های دیگری ( مثلا برای نویسنده های مقالات ) تولید کنیم میتوانیم به صورت زیر کد فوق را که به مدل اضافه کردیم توسعه دهیم :

public function sluggable()
{
    return [
        'title-slug' => [
            'source' => 'title'
        ],
        'author-slug' => [
            'source' => ['author.firstname', 'author.lastname']
        ],
    ];
}

این پلاگین حروف فارسی را پشتیبانی نمیکنه برای اینکه این پشتیبانی صورت بگیره لازمه وارد فولدر config و فایل sluggable بشید و تابع زیر را برای method قرار دهید :

    'method' => function($string, $separator = '-') {
        $_transliteration = ["/ö|œ/" => "e",
            "/ü/" => "e",
            "/Ä/" => "e",
            "/Ü/" => "e",
            "/Ö/" => "e",
            "/À|Á|Â|Ã|Å|Ǻ|Ā|Ă|Ą|Ǎ/" => "",
            "/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/" => "",
            "/Ç|Ć|Ĉ|Ċ|Č/" => "",
            "/ç|ć|ĉ|ċ|č/" => "",
            "/Ð|Ď|Đ/" => "",
            "/ð|ď|đ/" => "",
            "/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/" => "",
            "/è|é|ê|ë|ē|ĕ|ė|ę|ě/" => "",
            "/Ĝ|Ğ|Ġ|Ģ/" => "",
            "/ĝ|ğ|ġ|ģ/" => "",
            "/Ĥ|Ħ/" => "",
            "/ĥ|ħ/" => "",
            "/Ì|Í|Î|Ï|Ĩ|Ī| Ĭ|Ǐ|Į|İ/" => "",
            "/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/" => "",
            "/Ĵ/" => "",
            "/ĵ/" => "",
            "/Ķ/" => "",
            "/ķ/" => "",
            "/Ĺ|Ļ|Ľ|Ŀ|Ł/" => "",
            "/ĺ|ļ|ľ|ŀ|ł/" => "",
            "/Ñ|Ń|Ņ|Ň/" => "",
            "/ñ|ń|ņ|ň|ʼn/" => "",
            "/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/" => "",
            "/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/" => "",
            "/Ŕ|Ŗ|Ř/" => "",
            "/ŕ|ŗ|ř/" => "",
            "/Ś|Ŝ|Ş|Ș|Š/" => "",
            "/ś|ŝ|ş|ș|š|ſ/" => "",
            "/Ţ|Ț|Ť|Ŧ/" => "",
            "/ţ|ț|ť|ŧ/" => "",
            "/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/" => "",
            "/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/" => "",
            "/Ý|Ÿ|Ŷ/" => "",
            "/ý|ÿ|ŷ/" => "",
            "/Ŵ/" => "",
            "/ŵ/" => "",
            "/Ź|Ż|Ž/" => "",
            "/ź|ż|ž/" => "",
            "/Æ|Ǽ/" => "E",
            "/ß/" => "s",
            "/IJ/" => "J",
            "/ij/" => "j",
            "/Œ/" => "E",
            "/ƒ/" => ""];
        $quotedReplacement = preg_quote($separator, '/');
        $merge = [
            '/[^\s\p{Zs}\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu' => ' ',
            '/[\s\p{Zs}]+/mu' => $separator,
            sprintf('/^[%s]+|[%s]+$/', $quotedReplacement, $quotedReplacement) => '',
        ];
        $map = $_transliteration + $merge;
        unset($_transliteration);
        return preg_replace(array_keys($map), array_values($map), $string);
    },

که خروجی و نتیجه به صورت زیر خواهد بود :

sluggable farsi

پ. ن :‌این تابع رو از وب سایت  morilog.ir برداشتم 🙂

پکیج تاریخ شمسی برای لاراول ۵

یکی از نیازهای برنامه‌نویسای ایرانی هنگام توسعه وب‌سایت‌ها و اپلیکیشن‌ها، تبدیل تاریخ میلادی و شمسی و بالعکسه… که مرتضی پروینی عزیز پکیجی رو برای این کار نوشته که در گیت هاب شخصی ایشون میتونید جزئیاتش رو ببینید و نصب و استفاده نمائید. ( همچنین در سایت packalyst میتوانید پکیج های مختلفی رو برای اینکار پیدا کنید که بازخوبترینش همین پکیجه تا به امروز. )

پ.ن : در نهایت تاکید میکنم که این مقالاتی که توی وبلاگم منتشر میکنم صرفا برای آرشیو کردن تجربیات خودم برای خودم است که در آینده نیز شاید دوباره برایم کاربرد داشته باشه اگر برای دوستان نیز کاربرد داشت که خوشحال خواهم شد.

شاد و موفق باشید.

معرفی فونت های فارسی رایگان

از آن زمانی که همه وب سایتها فونت های پیشفرض تاهوما رو استفاده میکردند زمان تقریبا زیادی میگذره و خوشبختانه امروز بیشتر وبسایتهای فارسی از فونتهای استاندارد و مناسب استفاده می کنند تا قابلیت خوانایی وب سایتشون بیشتر بشه و کاربر مطالب را راحتتر مطالعه کنه، بعضی از دوستان در این حوزه فعالیت های بسیار مثبتی داشتن و حتی بدون هیچ چشم داشتی این فونتها را به صورت رایگان در فضای مجازی منتشر کردند و واقعا هدفشون خدمت به وب فارسی و افزایش خوانی وب سایتهای فارسی و زیبا شدن این وبسایتهاست که باید ازشون تقدیر کرد.

قراردادن فونت مناسب و خوانا یعنی احترام به کاربران مراجعه کننده و اهمیت قائل شدن برای این موضوع که کاربران به راحتی بتوانند وبسایت ما رو مطالعه کنند.

در اینجا یکسری از فونت ها رو به شما دوستان عزیز معرفی میکنم :

۱ – یکسری از فونت های فارسی رایگان را آقای صابر راستی کردار واقعا سخاوتمندانه منتشر کردند و اگر مایل بودید می تونید حمایت مالی داوطلبانه هم بکنید.

فونت های ساحل، وزیر، صمیم، تنها، شبنم، گندم و پرستو از پروژه هایی هستند که ایشان به صورت رایگان منتشر کردند که میتوانید دانلود و استفاده نمائید.

۲ – آقای صالح سوزنچی شخص دیگری هستند که در زمینه فونت های فارسی خدمات شایانی رو ارائه دادند و به نظر من به حمایت تک تک ما نیاز دارند تا این مسیر رو بتونند ادامه دهند. در حال حاضر فونت هایی که ایشان به صورت پروژه های آزاد تعریف کردند و از همه کاربران درخواست حمایت مالی کردند در صفحه خانه فونت فارسی در دسترس است که میتوانید مشاهده نمائید.

۳ – آقای مسلم ابراهیمی هم یکی دیگر از اشخاصی هستند که در حوزه ی فونت فارسی فعالیتهای گسترده ای دارند و میتوانید از طریق وبسایت رسمی ایشان فونت های مورد نیاز خود را تهیه نمائید.

در نهایت لازمه تاکید کنم همه این عزیزانی که برای فونت فارسی زحمات زیادی کشیدند، وقت و هزینه خودشون رو صرف اینکار کردند و رعایت حق کپی رایت این محصولات نه تنها باعث رشد وب فارسی میشه بلکه باعث میشه این فرهنگ زیبای رعایت حق الناس و احترام به دیگران در ایران جا بیوفته، مهم نیست بقیه چطور فکر میکنند و یا چیکار میکنند، از خودمون شروع میکنیم.

شاد و موفق باشید.

مشکلات به وجود می آیند تا به ما قدرت ببخشند!

نمیدونم اصلا اسمش رو میشه مشکل گذاشت یا چالش و یا زمینه ساز بودن رشد و پیشرفت، من شخصا دوست دارم اسمش رو بذارم چالش رشد!

مدتی قبل پروژه ای که حدودا ۵،۶ ماهی روی آن فعالیت داشتیم ، با مشکلی روبرو شد به طوریکه تمام فکرم رو درگیر کرد و باید مشکل حل میشد!

طبیعتا استرس خیلی زیادی داشتم چون مسئولیت این بخش کامل به عهده من بود ولی از طرفی وجود بک آپ یک ماه قبل کمی مساله رو قابل تحمل تر میکرد، مساله این بود نصب یک ماژول باعث بروز مشکل و از کار افتادن بخش بزرگی از پروژه شده بود و با انواع روش درگیر این موضوع شدیم که حلش کنیم…

حالا تمرکزم رو از چالش برمیدارم و به نکات بسیار مهمتر اشاره میکنم که باعث رفع مشکل شد :

اولین اتفاقی که بعد از به وجود آمدن مشکل پیش اومد این بود که شُک و استرس زیادی بهم وارد شد به طوری که موقع شام هیچ تمایلی به غذا خوردن نداشتم و قصد داشتم فقط زمان بذارم و مشکل رو حل کنم! اما ۵ دقیقه سکوت و فکر کردن حالم رو دگرگون کرد و احساس آرامش عجیبی بهم دست داد!

تفکر و سوال

وقتی به مشکل فکر میکردم از زوایای مختلف آن را بررسی کردم، خودم رو از چالش بیرون کشیدم و به آن نگاه کردم و سوالات زیر را از خودم پرسیدم :

  • چرا این مشکل به وجود آمده است ؟
  • آخرین زمانی که همه چیز درست بود کی بود؟
  • آیا تا الان مشکلی بوده که نتونم حل کنم ؟ آیا اصلا مشکل غیرقابل حلی وجود دارد ؟
  • آیا چند ماه دیگر این مساله اهمیت دارد ؟
  • آیا افراد دیگری هستند که بتوانند در رفع این مشکل کمک کنند ؟
  • راه حل این مشکل چیست ؟
  • آیا خداوندی که همیشه همراهم هست و چالشهای قبلی را با کمکش حل کردم این را نیز حل نمیکند ؟
  • و …

و اینجا بود که به قدرت تفکر و سوال پی بردم ، واقعا فوق العاده بود، جواب همه سوالات به آدم الهام میشه راه حل های مختلف میاد توی ذهن و قطعا یکی به رفع آن می انجامد، البته به شرطی که باورش کنیم.

اگر عضو یک تیم باشید، جملات اعضای تیم برای ایجاد انگیزه و حامی بودن میتونه خیلی کمک بزرگی باشه، حتی اگر عضوی در بخش دیگری باشه ولی بدونی در هر شرایطی هم تیمیش رو حمایت میکنه حس فوق العاده قدرتمندی رو در آدم ایجاد میکنه که بتونه روی راه حل ها متمرکز بشه.

مهمترین قضیه اینه که من چند اشتباه رو انجام دادم که برای من درس بزرگی شدند :

وقتی مشکل به وجود اومد روی خود مشکل تمرکز کردم و حتی به حالت گله و شکایت پیش یکی از دوستانم بازگو کردم و این باعث شد علاوه بر اینکه من رو از راه حل دور کنه بلکه باعث قدرت بخشیدن به مشکل بشه که دیرتر حل بشه. در واقع باید روی راه حل تمرکز میکردم و بازگو کردن مشکل باعث دور شدن از راه حل میشه.

نقاطی به نام نقاط آسایش تعریف کنم، که در آن نقاط پروژه ها کاملا تست شده و داکیومنت شده باشند و بک آپی از آن داشته باشم. قبل ازهر تغییر ساختاری بک آپ و تست کلی الزامی است.

وقتی به زندگیم و به گذشته فکر میکنم تقریبا هیچ زمانی نبود که موضوعی مطرح نبوده باشه چالشی نبوده باشه و … تقریبا برای هر شخصی که کار میکنه امکان نداره چالش و مشکلی نباشه، مهم نیست چه کاری داشته باشیم ولی قطعا چالش برای همه هست و مهم اینه که چطور به آن نگاه کنیم و به نظرم باید دوسش داشته باشیم چراکه باعث رشد خودمون میشه واین یعنی لذت از سفری به نام زندگی!

شاید حرفها رو مثل شعار بدونید ولی اگر بشینیم فکر کنیم و به گذشته نگاه کنیم واقعا در همه زمانها برای همه این موضوع وجود داره در این بین عده ای غرق میشن توی مشکل و به روزگار و زمانه و هرچی که هست گلایه و شکایت میکنن و عده ای هم محدود هستند که دلشون آرومه و میگن این رو هم حل میکنم چون باور دارند هیچ چیزی توی زندگی آدم اتفاقی نیست و دلیل به وجود اومدن این چالش به خود شخص برمیگرده و میتونه پله ای برای رشد باشه.

در نهایت اینکه زندگی رو مثل یه سفری بدونیم و لذت سفر در لذت بردن از مسیر طی نمودن سفره نه رسیدن به مقصد! به همین خاطره که این چالش ها و مسائل را باید دوست داشته باشیم و با دید دیگری بهشون نگاه کنیم.

life is journey

مسافری که در سفر تمام حواسش در رسیدن به مقصد باشد و شادی را فقط در رسیدن به مقصد بداند، خود را از لذت لحظه لحظه سفر و مناظر زیبا و مکان های دیدنی بین راه، محروم کرده است.

انتقال مجنتو از لوکال هاست به هاست و برعکس

سیستم فروشگاه ساز مجنتو

( این آموزش برای مجنتو 1.9.x نوشته شده است هرچند به احتمال خیلی زیاد برای سایر نسخه ها نیز کاربرد دارد. )

چند ماهی است به خاطر انجام پروژه ای بزرگ با سیستم مجنتو کار میکنم و طرح فرانت اندی که برای فروشگاهی پیاده سازی کرده بودیم را به قالب مجنتو تبدیل کردیم و با چالش ها و موارد زیادی از این سیستم سر وکار داشتیم که خوشبختانه یکی پس از دیگری حل می شدند.

بعد از آپلود تعدادی از محصولات باید دیباگ های جزئی روی پروژه انجام میشد و برای اینکار لازم بود همان نسخه آنلاین را روی لوکال داشته باشم تا بتوانم تغییرات مورد نظر را اعمال کنیم.

نحوه انتقال مجنتو به لوکال هاست و برعکس ساده تر از چیزی است که فکرش را بکنید 🙂

برای انتقال مجنتو از هاست به لوکال قبل از هر چیزی تمام فایلهای خود را در مسیری که نصب کردید زیپ و سپس دانلود نمائید و در مسیری که میخواهید ( که معمولا Xampp است ) نصب کنید و وفولدر آن را به نام مورد نظر خود ذخیره نمایید. ( من نام فولدر را shop قرار می دهم)

ادامه مراحل را به صورت زیر انجام می دهیم.

گام اول : یک نسخه از دیتابیس را Export کنید.

گام دوم : روی لوکال هاست وارد phpmyadmin شوید و دیتابیس جدیدی با نام دلخواه بسازید.

گام سوم : نسخه دیتابیس دانلود شده از هاست را ایمپورت کنید و سپس وارد قسمت Structure دیتابیس شوید و جدول core_config_data را پیدا کنید و روی آن کلیک کنید. ( در صورتیکه پیشوندی به نام جداول دیتابیس اضافه کردید نام پیشوند به نام جداول نیز اضافه میشود : prefix_core_config_data )

structure phpmyadmin database

core config data in magento

گام چهارم : عبارت base_url را اگر در صفحه جستجو کنید دو تا سطر پیدا میکنید که آدرس وب سایت در آن درجشده است، این دو آدرس را به آدرس لوکال هاست خود تغییر دهید. ( من از دامنه مجازی استفاده میکنم و آدرس لوکال هاست من shop.dev است. )

base-url-magento

گام پنجم : وارد مسیر app < etc شوید و فایل local.xml را ویرایش نمائید. (username , password , dbname)

در صورتیکه مایل بودید مسیر ادمین را هم میتوانید تغییر دهید.

magento - local-xml

گام ششم: وارد فولدر فروشگاه شوید که در لوکال هاست مجنتو را در آن نصب کردید و سپس وارد وفولدر کش شوید  ( shop > var  > cache )  و تمام فولدرهای داخل آن را حذف نمایید، هم اکنون باید با وارد کردن آدرس لوکال فروشگاه شما نمایش داده شود.

var folder cache magento

هم اکنون اگر آدرس وبسایت را روی لوکال یا سایت باز کنید، اگر با خطای زیر مواجه شدید، باید دسترسی به فولدرهای var , media  رو بررسی کنید که روی ۷۷۷ باشند.

magento permission folder var and media

شاد و موفق باشید.