نصب ماژول

نصب ماژول


به نام خدا

ماژول نویسی دروپال قسمت هفتم

اعتبار سنجی فرم ها

چرا اعتبار سنجی انجام می دهیم؟

اعتبار سنجی فرم ها

  1. ورود اطلاعات صحیح مثلا میخواهیم شماره موبایل رو بررسی کنیم که کاربر درست وارد کرده باشد اولا باید عدد باشد،۱۱رقم باشد،با ۰۹ شروع شود و…
  2. سفارشی سازی فیلدها
  3. جلوگیری از حملات CSRF (Cross-Site Request Forgery) یک حمله است که یک کاربر نهایی را مجبور می کند تا اقدامات ناخواسته را بر روی یک برنامه وب انجام دهد که در حال حاضر آن را تأیید کرده است.

مراحل لازم برای انجام اعتبارسنجی

  1. استاندارد سازی تابع فراخوانی شده
  2. نام تابع فرم بعلاوه _validate

قبل از نوشتن تابع اعتبار سنجی با استفاده از تابع dpm  مقادیر اولیه و مقادیر بعدی $form_state آن را بعد از زدن دکمه save  ببینیم.

function

windfarms_admin_settings_form_validate($form, &$form_state){
dpm($form_state);

}

اگر در ابتدای فرم این دستور را بزنیم

می بینیم که form_state شامل اندیس input که خالی است اما چون در قسمت اعتبار سنجی نوشتیم و وقتی دکمه ذخیره رو میزنیم و این تابع اجرا میشه میبینیم که input شامل ۸عنصر است و بامقادیر وارد شده ای کاربر پرشده. اما ما هیچ وقت از این اندیس استفاده نمیکنیم چرا که در واقع این مقادیری است که توسط form_api هنوز اعتبار سنجی نشده و می تواند شامل اطلاعات مخرب باشد.

اندیس value شامل داده هایی که توسط کاربر وارد شده و به صورت امن و قابل استفاده است.

Complete form ارجاعی به $form در زمان ثبت توسط کاربر است.

Triggering_element :المانی که باعث ارسال اطلاعات به سایت شده وقتی که چندین دکمه در فرم وجود دارد مثل دکمه لغو و حذف که مهمه بدونیم انتخاب کاربر چی بوده.

Clicked_button دکمه ای که کلیک شده

Form_build_id  و form_token  که برای تشخیص فرم ثبت شده توسط کاربر به صورت داخلی در form api برای اعتبار سنجی ها وجلوگیری از CSRF استفاده می شود.

Op  عملیاتی که انتخاب شده همان save  است.

تابع اعتبار سنجی ما در ابتدا ما یک عبارت منظم برای طول و عرض جغرافیایی در نظر میگیرم که آن برابر با متغیر$signed_degree_regex قرار میدهیم و بعد طول و عرض جغرافیایی رو از تابع فرم میگیرم درون متغیرهای $lat & $long  میریزیم و با تابع preg_match  آن ها را با متغیری که برابر با عبارت منظم برای طول و عرض جغرافیایی درنظر گرفته ایم مطابقت میدهیم که اگر تطبیق داشت با عدد وارد شده که دستور بعد رو چک میکند و اگر تطبیق نداشت با تابع form_set_error پیغام خطا چاپ کند .

در مرحله بعد اعتبار سنجی طول و عرض جغرافیایی را انجام میدهیم که بین ۱۸۰- تا ۱۸۰ باشد به کد زیر دقت کنید.

/*
* validates wind farms adminsettings.
*/
function

windfarms_admin_settings_form_validate($form, &$form_state){
dpm($form_state);
//regular expression for validating signed degrees
$signed_degree_regex=‘/^[+-]?\d+(\.\d+)?$/’;
//shorthand for long array name
$lat= $form_state[‘values’][‘windfarm_default_center_lat’];
$long= $form_state[‘values’][‘windfarm_default_center_long’];
//validation latitude and longitude format
if (!preg_match($signed_degree_regex,$lat)){
form_set_error(‘windfarms_default_center_lat’,t(‘Invalid latitude ,must be a signed degree(DDD.dddd).’));
}
if (!preg_match($signed_degree_regex,$long)){
form_set_error(‘windfarms_default_center_long’,t(‘Invalid longitude ,must be a signed degree(DDD.dddd).’));
}
//validate latitude and longitude values.
if (!((-۱۸۰<=$lat)&&($lat<=180))){
form_set_error(‘windfarms_default_center_lat’,t(‘latitude must be between -180 and 180’));
}
if (!((-۱۸۰<=$long)&&($long<=180))){
form_set_error(‘windfarms_default_center_long’,t(‘longitude must be between -180 and 180’));
}
}

توضیحاتی در باره تابع form_set_error :

  1. دو پارامتردر نظر میگیریم که اولین پارامتر ما نام عنصری است که دچار خطا شده و دور آن کادر قرمز رنگ ایجاد میشود.
  2. دومین پارامتر ما پیغام خطایی است که میخواهیم نمایش داده شود
  3. اطلاعات بیشتر مراجعه به سایت

https://api.drupal.org/api/drupal/includes%21form.inc/function/form_set_error/7.x

 

حال میخواهیم عملیات ارسال فرم را انجام دهیم.

متغیرهای پایدار

  1. Variable_get :دارای دو پارامتر است (یک متغیر پایدار را بر میگرداند.)
  • $name نام متغیری است که برای عنصر مورد نظرمون در نظر میگیریم
  • $default مقدار پیش فرض برای عنصر ما است
  • اطلاعات بیشتر مراجعه به آدرس

https://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/variable_get/7.x

 

  1. Variable_set : دارای دو پارامتر است (یک متغیر پایدار را تعیین می کند.)
  • $name : نامی که برای عنصرمون در نظر گرفته شده
  • $value : مقداری برای تنظیم می تواند هر نوع داده php باشد ودر صورت لزوم می توانیم توابع را سریالایز کنیم.
  • اطلاعات بیشتر مراجعه به آدرس

https://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/variable_set/7.x

 

 

  1. Variable_del دارای یک پارامتر است (یک متغیر پایدار را حذف می کند)
  • $name نام متغیری که قصد حذف کردن آن را داریم.

نکته برای قرار دادن نام برای متغیر هامون بهتره نام کوتاه درنظر گرفته بشه و هر کلمه با آندراسکور ( _ )   استفاده کنیم و نام متغیرمون را با نام ماژول شروع کنیم.

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

تغییرات انجام شده در فرم با متغیرهای پایدار.

فرم  windfarms_gmap

‘#default_value’=> variable_get(‘windfarms_gmap’, ۱),

فرم windfarm_default_center_lat

‘#default_value’=> variable_get(‘windfarm_default_center_lat’,۳۲۴۲۷۹ ),

فرم windfarm_default_center_long

‘#default_value’=> variable_get(‘windfarm_default_center_long’,۵۳۶۸۸۰ ),

فرم windfarms_default_gmap_zoom

‘#default_value’=> variable_get(‘windfarms_default_gmap_zoom’,۸),

ارسال فرم مانند اعتبار سنجی نام تابع فرم بعلاوه _submit

function windfarms_admin_settings_form_submit($form, &$form_state){
//Rebulid the form.
$form_state[‘rebuild’]=TRUE ;
//save windfarm setting variables.
variable_set(‘windfarms_gmap’,$form_state[‘values’][‘windfarms_gmap’]);
variable_set(‘windfarm_default_center_lat’,$form_state[‘values’][‘windfarm_default_center_lat’]);
variable_set(‘windfarm_default_center_long’,$form_state[‘values’][‘windfarm_default_center_long’]);
variable_set(‘windfarm_default_gmap_zoom’,$form_state[‘values’][‘windfarms_default_gmap_zoom’]);
//notify user
drupal_set_message(t(‘windfarms settings save’));
}

$form_state[‘rebuild’] برای ارسال فرم های چند مرحله ای استفاده می شود. یعنی ما اطلاعاتی که از کاربر دریافت کردیم بعد از اعتبار سنجی بازسازی میکنیم .مرحله بعدی نیاز به تنظیم عناصرمون داریم و از تابع variable_set() استفاده میکنیم. drupal_set_message برای چاپ پیغام به کار می رود.در مقاله بعدی کار با نودها را توضیح خواهیم داد.

آموزش دروپال

امکان ارسال نظر وجود ندارد!