Esempio n. 1
0
 public static function generateTemplate($sql, $postedParams = [], $field, $paramDefs = [])
 {
     $returnParams = [];
     ## find all params
     preg_match_all("/\\:[\\w\\d_]+/", $sql, $params);
     $model = $field->model;
     foreach ($params[0] as $idx => $p) {
         if (isset($postedParams[$p])) {
             if (is_string($postedParams[$p])) {
                 $isJs = strpos($postedParams[$p], 'js:') !== false || isset($paramDefs[$p]) && strpos($paramDefs[$p], 'js:') !== false;
                 if ($isJs) {
                     switch (get_class($field)) {
                         case "DataSource":
                             $returnParams[$p] = @$field->queryParams[$p];
                             break;
                         default:
                             $returnParams[$p] = '';
                             break;
                     }
                 } else {
                     $postParam = $postedParams[$p];
                     if (stripos($postParam, 'php:') === 0) {
                         $postParam = substr($postParam, 4);
                     }
                     if (!!$postParam) {
                         $returnParams[$p] = $field->evaluate($postParam, true, ['model' => $model]);
                     }
                 }
             } else {
                 if (is_array($postedParams[$p]) && !empty($postedParams[$p])) {
                     $returnParams[$p] = $postedParams[$p];
                     $params[0][$idx] = ['name' => $p, 'length' => count($postedParams[$p])];
                 }
             }
         }
     }
     ## find all blocks
     preg_match_all("/\\{(.*?)\\}/", $sql, $blocks);
     foreach ($blocks[1] as $block) {
         if (strtolower($block) == "and" || strtolower($block) == "or") {
             continue;
         }
         $bracket = DataSource::processSQLBracket($block, $postedParams, $field);
         $renderBracket = false;
         if (isset($bracket['render'])) {
             $renderBracket = $bracket['render'];
         }
         foreach ($bracket['params'] as $bracketParam => $bracketValue) {
             if (is_array($bracketValue) && count($bracketValue) > 0) {
                 $renderBracket = true;
                 foreach ($bracketValue as $k => $p) {
                     $returnParams[$k] = $p;
                 }
             }
         }
         ## check if there is another params
         preg_match_all("/\\:[\\w\\d_]+/", $bracket['sql'], $attachedParams);
         if (count($attachedParams[0]) > 0) {
             $inParams = 0;
             foreach ($attachedParams[0] as $ap) {
                 if (isset($returnParams[$ap]) && $returnParams[$ap] != "") {
                     $inParams++;
                     ## if current params is an ARRAY then convert to multiple params
                     if (is_array($returnParams[$ap]) && !empty($returnParams[$ap])) {
                         $newParamString = [];
                         foreach ($returnParams[$ap] as $rpIdx => $rp) {
                             $rpKey = $ap . "_" . $rpIdx;
                             $newParamString[] = $rpKey;
                             $returnParams[$rpKey] = $rp;
                         }
                         unset($returnParams[$ap]);
                         $bracket['sql'] = Helper::strReplaceFirst($ap, implode(",", $newParamString), $bracket['sql']);
                     }
                 }
             }
             if ($inParams == count($attachedParams)) {
                 $renderBracket = true;
             }
         }
         if ($renderBracket) {
             $sql = str_replace("{{$block}}", $bracket['sql'], $sql);
         } else {
             $sql = str_replace("{{$block}}", "", $sql);
         }
     }
     ## concat 'WHERE' sql with operators
     if ($sql != "") {
         $sql = DataSource::concatSql($sql, "AND");
         $sql = DataSource::concatSql($sql, "OR");
     }
     ## remove uneeded return params
     preg_match_all("/\\:[\\w\\d_]+/", $sql, $cp);
     foreach ($returnParams as $k => $p) {
         if (!in_array($k, $cp[0]) && !in_array(':' . $k, $cp[0])) {
             unset($returnParams[$k]);
         }
     }
     return ['sql' => trim($sql), 'params' => $returnParams];
 }