execute(lq("SELECT class,name,filtering FROM #_TP_tablefields WHERE status > 0 AND filtering!=''")) or dberror(); while (!$result->EOF) { $row = $result->fields; // convert filter into a function $filters = preg_split("/\|/", $row['filtering']); #$filters = explode('|',$row['filter']); $filterfunc = '$x'; foreach ($filters as $filter) { if (preg_match("/^([A-Za-z][A-Za-z_0-9]*)(?:\((.*?)\))?$/", $filter, $result2)) { $funcname = $result2[1]; // name of the pipe function $arg = $result2[2]; // argument if any // process the variable. The processing is simple here. Need more ? Sould be associated with parser variable processing. $arg = preg_replace("/\[\#([A-Z][A-Z_0-9]*)\]/e", ' "$"."context[".strtolower("\\1")."]" ', $arg); if ($arg) { $arg = ','. $arg; } $filterfunc = $funcname.'('.$filterfunc.$arg.')'; } elseif ($filter) { die("invalid filter function: $filter"); } // do nothing if $filter is empty } $filterfunc = "return ". $filterfunc. ";"; $filterstr .= "'". $row['class'].'.'. $row['name']. "' => '". addcslashes($filterfunc, "'")."',"; #echo "filterstr=$filterstr"; $result->MoveNext(); } // build the function with filtering // to update with ADODB $fp = fopen("CACHE/filterfunc.php", "w"); fputs($fp, '<'.'?php function filtered_mysql_fetch_assoc($context, $result) { $filters = array('.$filterstr.'); $count = mysql_num_fields($result); $row = mysql_fetch_row($result); if (!$row) return array(); for($i = 0; $i < $count; $i++) { $fieldname[$i] = mysql_field_name($result, $i); $fullfieldname[$i] = mysql_field_table($result,$i). ".". $fieldname[$i]; $ret[$fieldname[$i]] = $row[$i]; } $localcontext=array_merge($context, $ret); for($i = 0; $i < $count; $i++) { if ($filters[$fullfieldname[$i]]) { $filter = create_function(\'$x, $context\', $filters[$fullfieldname[$i]]); $ret[$fieldname[$i]] = $filter($ret[$fieldname[$i]], $localcontext); # echo $filters[$fullfieldname[$i]], " ", $fieldname[$i], " ", $ret[$fieldname[$i]]," ", $filter, "
"; } } return $ret; } /** * Function to filter field of a single class. */ function merge_and_filter_fields(&$context, $class, &$assoc) { $filters = array('. $filterstr. '); $localcontext = array_merge($context, $assoc); foreach($assoc as $k=>$v) { if ($filters[$class. ".". $k]) { $filter = create_function(\'$x, $context\', $filters[$class. ".". $k]); $context[$k] = $filter($v, $localcontext); } else { $context[$k] = $v; } } } ?'.'>'); fclose($fp); } ?>