הרבה זמן לא שוטטתי פה, ודומני שאני לא היחיד. אני תוהה אם יש טעם לפרסם, ובכ"ז.
בFORM API ניתן להוסיף פונקציות בדיקה (ולידציה) לשדות בטופס. הבעיה מתחילה כשיש המון שדות שחוזרים על עצמם. מה עושים?
הפתרון המתבקש הוא לעשות פונקציית אב עם SWITCH שבודקת מה שם הדה ולפי זה מפעילה עליו ולידציה.
בפועל, כדי שפונקציה כזו תהיה אפקיטיבת, היא צריכה לדעת גם את הנתיב של השדה (כלומר, בן של אלו מערכים הוא), ועדיף גם את הLABEL שלו.
מה שעושים הוא כך:
קודם כל, פונקציה רקורסיבית, שתמיד יודעת מה ה"נתיב" של השדה ומה הנתונים שלו
<?php
function form_fund_validate_recurs($array,$func,$key = false,$item =array() ){
if(!$key) $key = array();
foreach($array as $cur_key => $value){
$item[] = $item[count($item)-1][$cur_key];
$key[] = $cur_key;
if(is_array( $value)){
form_fund_validate_recurs($value,$func,$key,$item);
}
else call_user_func($func,$key,$value,$item);
array_pop($key);
array_pop($item);
}
}
?>
אחרי שיש לנו אותה, נשים פונקציה עם סוויצ'. אני עשיתי סוויצ' על שם השדה הספציפי, אם יש לכם שדות עם שמות זהים בנתיבים שונים, אפשר לעשות סוויצ' על השם המלא (myarray]][mysecarray][myfield):
<?php
function form_fund_validate_main($key,$value,$item){
$last = $key[count($key) -1];
$key = trim(implode("][",$key),"][");
switch($last){
case "phone":
case "zip_code":
case "fax":
case "project_participant_number":
case "organization_number":
case "contact_phone_1":
case "contact_phone_2":
if(!form_fund_validate_num_more($value)){
form_set_error($key,t('@field not numeric!',array("@field"=>$item[count($item)-1]['#title'])));
}
break;
case "project_weeky_hours":
case "project_participant_hours":
case "project_request_annfum_num":
case "project_exchange_rafte":
if(!is_numeric($value))
form_set_error($key,t('fill @field just with numeric _ and ","',array("@field"=>$item[count($item)-1]['#title'])));
break;
case "contact_email":