31
تشکر

ایجاد فرم تماس با ما با استفاده از لاراول – بخش اول

Laravel

Laravel

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

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

قبل از هر چیز جدیدترین نسخه Laravel که در زمان این مطلب 4.2.0 است را نصب میکنیم. نحوه نصب و تنظیمات اولیه را در مطلب اول و دوم سری آموزشی لاراول بخوانید.

در ادامه مطلب همراه ما باشید…

چند نکته

ابتدا در فایل app.php در مسیر app/config مقدار debug برابر true قرار دهید، تا اگر خطایی بوجود آمد بتوانید آن را به سادگی تشخیص دهید.

ممکن است مطالبی که در این مطلب گفته می‌شود، در سری آموزش لاراول به آن اشاره‌ای نکرده باشیم و جدید باشد.

مسیریابی و ساختار برنامه

در ابتدا میخواهیم مشخص کنیم زمانی که کاربر آدرس contact-us/ را باز کرد، فرم تماس با ما نمایش داده شود. برای مشخص کردن این مسیر به فایل routes.php در مسیر app رفته و کد زیر را اضافه میکنیم.

Route::get('contact-us', array('as' => 'get.contact-us', function() {
  return View::make('contact-us');
}));

در کد بالا یک مسیر را مشخص کردیم (خط یک) و زمانی که کاربر این مسیر را باز کند (به صورت get)، فایل contact-us (خط دو) را به خروجی میفرستیم. همچنین به مسیر مشخص شده یک نام تحت عنوان get.contact-us (خط یک) دادیم که برای آدرس دهی به این مسیر کار ما را در ادامه راحتتر میکند.

در همان فایل routes.php مسیر زیر را نیز ایجاد میکنیم که در‌ واقع post مسیر بالا است و آن را با نام post.contact-us نام گذاری میکنیم اما فعلاً درون آن کاری انجام نمیدهیم.

Route::post('contact-us', array('as' => 'post.contact-us', function() {

}));

حالا اگر به مسیر contact-us/ برویم، با خطا مواجه می‌شویم، زیرا ما هنوز فایلی را که به خروجی فرستادیم ایجاد نکردیم. برای اینکار یک فایل با نام contact-us.blade.php در مسیر app/views میسازیم، سپس درون این فایل ساختار HTML را ایجاد کرده و درون تگ body کدهای زیر را قرار میدهیم.

{{ Form::open(array('route' => 'post.contact-us')) }}
  <p>
    {{ Form::label('name', 'نام:') }}
    {{ Form::text('name') }}
  </p>
  <p>
    {{ Form::label('email', 'ایمیل') }}
    {{ Form::email('email') }}
  </p>
  <p>
    {{ Form::label('context', 'متن:', array('style' => 'float:left;')) }}
    {{ Form::textarea('context') }}
  </p>
  <p>
    {{ Form::submit('ارسال') }}
  </p>
{{ Form::close() }}

کد بالا در‌ واقع فرم ما است که با استفاده از کدهای لاراول نوشته شده، میتوان هر قسمت از فرم را به صورت HTML معمولی نیز نوشت.

در خط اول، تگ فرم را ایجاد کرده و action آن را برابر مسیر post.contact-us قرار دادیم. در خط‌های بعدی نیز ساختار فرم را قرار میدهیم.

حالا شما باید فرم را  بدون خطا در مرورگر مشاهده کنید و همچنین زمانی که فرم را پر کنید و ارسال را بزنید، فقط یک صفحه سفید مشاهده کنید، زیرا ما هنوز در مسیر post.contact-us هیچکاری انجام ندادیم.

اعتبارسنجی

خب اولین کاری که باید بر روی اطلاعاتی که از طرف کاربر میرسد انجام دهیم چیست؟ مطمئناً اعتبارسنجی یا Validation.

اما قبل از اینکه وارد اعتبارسنجی اطلاعات شویم، ابتدا بهتر است تگهایی را برای نمایش خطاهایی که کاربر ایجاد میکند درون فایل HTML ایجاد کنیم. برای اینکار Laravel یک شیء به نام errors$ دارد که متن خطاهایی که باید به کاربر نمایش دهیم را درون خود نگه میدارد.

{{ $errors -> first('name', '<span class="error">:message</span>') }}

برای مثال در کد بالا، در صورتی که کاربر در فیلدی با نام name خطایی در ورورد اطلاعات داشته باشد، متن خطای ایجاد شده درون تگ span با کلاس error نمایش داده میشود. پس باید برای هر کدام از فیلدهایمان یک خط کد مانند بالا ایجاد کنیم. پس کدهای HTML به صورت زیر تغییر میکند.

{{ Form::open(array('route' => 'post.contact-us')) }}
  <p>
    {{ Form::label('name', 'نام:') }}
    {{ Form::text('name') }}
    {{ $errors -> first('name', '<span class="error">:message</span>') }}
  </p>
  <p>
    {{ Form::label('email', 'ایمیل') }}
    {{ Form::email('email') }}
    {{ $errors -> first('email', '<span class="error">:message</span>') }}
  </p>
  <p>
    {{ Form::label('context', 'متن:', array('style' => 'float:left;')) }}
    {{ Form::textarea('context') }}
    {{ $errors -> first('context', '<span class="error">:message</span>') }}
  </p>
  <p>
    {{ Form::submit('ارسال') }}
  </p>
{{ Form::close() }}

حالا به فایل routes.php می‌رویم و مسیر contact-us قسمت post را در نظر میگیریم. ابتدا برای اعتبارسنجی داده‌ها باید قوانینی را تعیین کنیم که این قوانین باید به صورت یک آرایه باشد. مانند کد زیر:

$rules = array(
  'name' => 'alpha|max:10',
  'email' => 'required|email',
  'context' => 'required'
);

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

برای فیلد name اولین قانونی که آوردیم alpha است. این قانون مشخص میکند که داده‌های کاربر در فیلد name فقط از کاراکترهای الفبایی باشد و در صورتی که کاربر برای مثال در این فیلد عدد وارد کند با خطا مواجه می‌شود. دومین قانون max است که مقدار جلوی آن 10 است که مشخص میکند حداکثر تعداد حروفی که کاربر میتواند وارد کند 10 است.

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

برای فیلد context فقط یک قانون تعریف کردیم و آنهم اینکه کاربر حتماً باید آن را وارد کند.

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

حالا که قوانین تعیین شدند اعتبارسنجی را انجام میدهیم.

$validator = Validator::make(Input::all(), $rules);

در کد بالا متد make از namespace یا فضای نام Validator را فراخوانی کردیم. این متد دو پارامتر دریافت میکند. اولین پارامتر داده‌های کاربر است که ما تمام اطلاعات وارد شده توسط کاربر را با استفاده از ()Input::all به این متد میفرستیم. دومین پارامتر قوانینی است که میخواهیم روی آن‌ها بررسی و اعمال شود که آن را هم به این متد میدهیم که نتیجه را درون متغیر validator$ میریزد.

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

if($validator -> fails()) {
  return Redirect::back() -> withErrors($validator);
} else {
  return 'true';
}

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

اما اگر کاربر هیچ خطایی در ورود اطلاعات نداشته باشد مقدار true را فعلاً چاپ میکنیم.

کار اعتبارسنجی داده‌ها به پایان رسید. حالا شما باید آن را با استفاده از داده‌های اشتباه تست کنید.

در پایان فایل routes.php باید دارای کدهای زیر باشد.

Route::get('contact-us', array('as' => 'get.contact-us', function() {
  return View::make('contact-us');
}));

Route::post('contact-us', array('as' => 'post.contact-us', function() {
  $rules = array(
    'name' => 'alpha|max:10',
    'email' => 'required|email',
    'context' => 'required'
  );
  
  $validator = Validator::make(Input::all(), $rules);
  if($validator -> fails()) {
    return Redirect::back() -> withErrors($validator);
  } else {
    return 'true';
  }
}));

محلی کردن لاراول

اگر تا اینجا برنامه را تست کرده باشید متوجه خواهید شد که متن خطاهایی که به کاربر نمایش داده می‌شود انگلیسی است. خوشبختانه لاراول در این قسمت هم قوی عمل کرده است. برای اینکه خطاها به زبانی که میخواهید نمایش داده شود ابتدا به مسیر app/lang بروید و از پوشه en یک کپی گرفته و در همان مکان با نام دیگری (در اینجا با نام fa) ذخیره کنید.

سپس به فایل app.php در مسیر app/config رفته و قسمت locale را برابر نام همان پوشه جدید (در اینجا fa) قرار دهید.

اگر پوشه fa را مشاهده کنید خواهید دید که حاوی سه فایل است. اما فایلی که ما فعلاً به آن احتیاج داریم validation.php است. تمام پیغام های خطا درون این فایل وجود دارد.

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

قسمت‌هایی که ما در این برنامه استفاده کردیم در زیر آمده است فقط کافیست آنها را پیدا کرده و جایگزین کنید.

"alpha"                => "فیلد :attribute فقط باید حاوی حروف باشد.",
"email"                => "این فیلد فقط باید حاوی ایمیل باشد.",
"required"             => "پر کردن فیلد :attribute ضروری است.",
"max"                  => array(
  "numeric" => "The :attribute may not be greater than :max.",
  "file"    => "The :attribute may not be greater than :max kilobytes.",
  "string"  => "فیلد :attribute نباید بیشتر از :max حرف باشد.",
  "array"   => "The :attribute may not have more than :max items.",
),

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

'attributes' => array(
  'name' => 'نام',
  'email' => 'ایمیل',
  'context' => 'متن'
),

برگشت داده‌ها

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

return Redirect::back() -> withErrors($validator) -> withInput();

سپس خاصیت value فیلدها را برابر Input::old(‘name’) قرار دهیم که به جای name باید نام همان فیلد گذاشته شود مانند زیر:

{{ Form::text('name', Input::old('name')) }}
{{ Form::email('email', Input::old('name')) }}
{{ Form::textarea('context', Input::old('name')) }}

نتیجه‌گیری

در این بخش ما با Routing و Validation آشنا شدیم و کار کردیم. تمام بخش‌هایی که در این مطلب به آن اشاره کردیم را میتوان از راه‌های دیگری نیز انجام داد که بسته به سلیقه برنامه نویس متفاوت است.

در بخش بعدی اطلاعات را درون پایگاه داده ذخیره و همچنین یک ایمیل به کاربر میفرستیم.

این مطلب از سری مطالب، آموزش فریم ورک Laravel است
  • بابک می‌گه:

    واقعا ممنونم.
    لطفا آموزش های پروژه محور لاراول رو ادامه بدید.

  • ALI می‌گه:

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

  • mohamad می‌گه:

    سلام ، خسته نباشید

    صفحه خطایی که لارول نشون میده بهم ریختست ! کسی این مشکلو داره که کمکم

    کنه

  • سینا می‌گه:

    سلام آیا کسی در مورد نحوه درست کردن چندین گروه user در جدول های مختلف اطلاعی داره؟
    مثلا جدول های یوزر معلم و دانش اموز (جدول ها دارای ستون های متفاوتی هستند)
    پیش فرض لاراول تنها یه جدول یوزر میده. چطور میشه این مشکل رو برطرف کرد.
    نتیجه جست و جوی من موراردی بود که نتونستم رو لاراول 4.2.4 اجراش کنم.
    کسی میتونه راهنمایی کنه؟

    • محسن شفیعی می‌گه:

      به این مورد من خودم تا به حال برنخوردم
      ولی یک روشی که الان به ذهن من میرسه این هست که شما باید یک جدول users داشته باشید که تمام دانش آموزان و معلم ها در اون لیست بشن و با استفاده از اون وارد حساب کاربری بشن یا خارج بشن
      بعد درون این جدول باید یک فیلدی باشه که مشخص بکنه موجودیت مورد نظر دانش آموز هست یا معلم و اونو با یک کلید خارجی مرتبط بکنه با جدول معلم ها یا دانش آموزها
      شاید روشی که شما میگید هم بشه ولی به نظر من این روش شاید بهتر باشه

    • احسان می‌گه:

      معمولا برای اینکار شما باید از دو تا جدول استفاده کنید. یکی جدول کاربر و اون یکی جدول گروه کاربری و بعد براساس دسترسی هایی که داره برخی از صفحات را به یکسری از گروه کاربری نمایش داده بشه.
      https://cartalyst.com/manual/sentry

      ابزاری برای Authoriztion و دسترسی کاربران براساس گروه کاربری می باشد

  • اسماعیل می‌گه:

    خسته نباشید خیلی عالی بود

  • محمد علی می‌گه:

    سلام
    مرسی عالی بود
    منتظر بخش دوم هستم.

    خسته نباشی


  • نظرات این مطلب بسته است.