Example #1
0
 public function setWithDisplayValue($value)
 {
     if ($value === '' || $value === null) {
         parent::setValue(null);
         return;
     }
     $parts = explode("//", $value);
     $mainId = $this->mainModel->getKeyField();
     $mainField = Model::resolvePath($this->mainModelField);
     $mainField = $mainField['field'];
     $subField = Model::resolvePath($this->subModelField);
     $subField = $subField['field'];
     $possibleMainItem = reset($this->mainModel->getWithField2("trim({$mainField})", trim($parts[0])));
     if ($possibleMainItem === false) {
         throw new Exception("Invalid option <b>{$value}</b> for <b>{$this->label}</b> field.");
     }
     $possibleSubItem = reset($this->subModel->get(array('conditions' => "{$mainId} = {$possibleMainItem[$mainId]} and trim({$subField}) = '" . trim($this->mainModel->escape($parts[1])) . "'"), Model::MODE_ASSOC, false, false));
     if ($possibleSubItem === false) {
         throw new Exception("Invalid option <b>{$value}</b> for <b>{$this->label}</b> field.");
     } else {
         if ($possibleSubItem === false) {
             parent::setValue(null);
         } else {
             parent::setValue($possibleSubItem[$this->getName()]);
         }
     }
 }
Example #2
0
 /**
  * Creates a new ModelField. The example below creates a ModelField which
  * lists client accounts for selection.
  * 
  * @code
  * $clients = new ModelField("brokerage.setup.clients.client_id", "account");
  * @endcode
  * @param $path The full path to the field in the module which is to be returned by this field.
  * @param $value The name of the field from the model whose value should be displayed in the list.
  */
 public function __construct($path, $value)
 {
     global $redirectedPackage;
     $this->info = Model::resolvePath($path);
     $this->model = Model::load((substr($this->info["model"], 0, 1) == "." ? $redirectedPackage : "") . $this->info["model"]);
     $this->valueField = $value;
     $field = $this->model->getFields(array($value));
     $this->setLabel($field[0]["label"]);
     $this->setDescription($field[0]["description"]);
     $this->setName($this->info["field"]);
     $params = array("fields" => array($this->info["field"], $this->valueField), "sort_field" => $this->valueField);
     if ($this->conditions != '') {
         $params['conditions'] = $this->conditions;
     }
     $data = $this->model->get($params, Model::MODE_ARRAY);
     $this->addOption("Add new " . Utils::singular($this->model->getEntity()), 'NEW');
     foreach ($data as $datum) {
         if ($datum[1] == "") {
             $this->addOption($datum[0]);
         } else {
             $this->addOption($datum[1], $datum[0]);
         }
     }
     $modelPath = str_replace('.', '/', $this->model->package);
     $this->addAttribute('onchange', "fapiAddModelItem('{$modelPath}', this, '{$value}')");
 }
Example #3
0
 /**
  * A utility function around the SQLDataStore::getMulti() method. This function
  * allows for dynamic fields. These dynamic fields are fields which are read
  * from a database table.
  * 
  * @param array $params
  * @param int $mode
  * @return array
  * @see SQLDataStore::getMulti()
  */
 public static function getReportData($params, $mode = SQLDatabaseModel::MODE_ASSOC)
 {
     $dynamicFields = array();
     if (is_array($params["dynamicHeaders"])) {
         foreach ($params["dynamicHeaders"] as $key => $dynamicHeader) {
             $info = Model::resolvePath($dynamicHeader);
             $headers = Model::load($info["model"]);
             $data = $headers->get(array("fields" => array($headers->getKeyField(), $info["field"])), SQLDataBaseModel::MODE_ARRAY);
             foreach ($data as $dat) {
                 $replacement[$dat[1]] = null;
             }
             $dynamicFields[$key]["replacement"] = $replacement;
             $dynamicFields[$key]["headers"] = $data;
             $dynamicFields[$key]["field"] = $params["dynamicFields"][$key];
             $dynamicFields[$key]["keyField"] = count($params["fields"]);
             //array_search($headers->getKeyField(), $params["fields"]);
             $dynamicFields[$key]["replaceIndex"] = array_search($params["dynamicFields"][$key], $params["fields"]);
             $dynamicFields[$key]["numFields"] = count($data);
             $params["fields"][] = $headers->package . "." . $headers->getKeyField();
         }
     }
     $data = SQLDBDataStore::getMulti($params, $mode);
     $numData = count($data);
     if ($numData == 0) {
         return $data;
     } elseif ($numData == 1) {
         foreach ($dynamicFields as $dynamicField) {
             array_splice($data[0], $dynamicField["replaceIndex"], 1, array_pad(array(), $dynamicField["numFields"], $data[0][$dynamicField["replaceIndex"]]));
         }
     } else {
         if (count($dynamicFields) == 0) {
             return $data;
         }
         $keys = array_keys($data[0]);
         $numReturnData = 0;
         for ($i = 0; $i < $numData;) {
             foreach ($dynamicFields as $dynamicField) {
                 $base = $i;
                 $returnData[] = $data[$i];
                 array_splic($returnData[$numReturnData], $dynamicField["replaceIndex"], 1, $dynamicField["replacement"]);
                 foreach ($dynamicField["headers"] as $header) {
                     for ($j = 0; $j < $dynamicField["numFields"]; $j++) {
                         if ($data[$base + $j][$dynamicField["keyField"]] == $header[0]) {
                             $returnData[$numReturnData][$header[1]] = $data[$base + $j][$keys[$dynamicField["replaceIndex"]]];
                             break;
                         }
                     }
                     $i++;
                 }
                 unset($returnData[$numReturnData][$dynamicField["keyField"]]);
                 $numReturnData++;
             }
         }
         $data = $returnData;
     }
     return $data;
 }
Example #4
0
 public function __construct($path = null, $value = null)
 {
     if ($path != null) {
         $info = Model::resolvePath($path);
         if ($value == "") {
             $value = $info["field"];
         }
         $this->model = model::load($info["model"]);
         $field = $this->model->getFields(array($value));
         $this->setLabel($field[0]["label"]);
         $this->setDescription($field[0]["description"]);
         $this->setName($info["field"]);
         $this->addSearchField($value);
         $this->storedField = $info["field"];
     }
 }
Example #5
0
 public function setWithDisplayValue($value)
 {
     $parts = explode("//", $value);
     $mainId = $this->mainModel->getKeyField();
     $mainField = Model::resolvePath($this->mainModelField);
     $mainField = $mainField['field'];
     $subField = Model::resolvePath($this->subModelField);
     $subField = $subField['field'];
     $possibleMainItem = reset($this->mainModel->getWithField2("trim({$mainField})", trim($parts[0])));
     if ($possibleMainItem === false) {
         parent::setValue(null);
         return;
     }
     $possibleSubItem = reset($this->subModel->get(array('filter' => "{$mainId} = ? and trim({$subField}) = ?", 'bind' => [$possibleMainItem[$mainId], trim($this->mainModel->escape($parts[1]))]), Model::MODE_ASSOC, false, false));
     parent::setValue($possibleSubItem[$this->getName()]);
 }
Example #6
0
 /**
  * Creates a new relationship field.
  * @param unknown_type $label The label for the field.
  * @param unknown_type $name The name for the field.
  * @param unknown_type $mainModelPath The path of the main model.
  * @param unknown_type $subModelPath The path of the sub model.
  */
 public function __construct($label, $name, $mainModelPath, $subModelPath)
 {
     $this->setName($name);
     $this->setLabel($label);
     $this->mainSelectionList = new SelectionList();
     $this->mainSelectionList->setId($name . "_main");
     $this->mainSelectionList->addAttribute("onchange", "fapi_change_{$name}()");
     $this->subSelectionList = new SelectionList();
     $this->subSelectionList->setName($name);
     $subSelectionList = new SelectionList();
     $mainModelPathInfo = Model::resolvePath($mainModelPath);
     $this->subModelPathInfo = Model::resolvePath($subModelPath);
     $this->mainModel = Model::load($mainModelPathInfo["model"]);
     $this->subModel = Model::load($this->subModelPathInfo["model"]);
     $info = $this->mainModel->get(array("fields" => array($mainModelPathInfo["field"], $this->mainModel->getKeyField()), "sort_field" => $mainModelPathInfo["field"]), Model::MODE_ARRAY);
     foreach ($info as $inf) {
         $this->mainSelectionList->addOption($inf[0], $inf[1]);
     }
 }
Example #7
0
 /**
  * Creates a new ModelField. The example below creates a ModelField which
  * lists client accounts for selection.
  * 
  * @code
  * $clients = new ModelField("brokerage.setup.clients.client_id", "account");
  * @endcode
  * @param $path The full path to the field in the module which is to be returned by this field.
  * @param $value The name of the field from the model whose value should be displayed in the list.
  */
 public function __construct($path, $value)
 {
     global $redirectedPackage;
     $info = Model::resolvePath($path);
     $this->model = Model::load((substr($info["model"], 0, 1) == "." ? $redirectedPackage : "") . $info["model"]);
     $this->valueField = $value;
     $field = $this->model->getFields(array($value));
     $this->setLabel($field[0]["label"]);
     $this->setDescription($field[0]["description"]);
     $this->setName($info["field"]);
     $data = $this->model->get(array("fields" => array($info["field"], $value), "sort_field" => $value), Model::MODE_ARRAY);
     $this->addOption("", "");
     foreach ($data as $datum) {
         if ($datum[1] == "") {
             $this->addOption($datum[0]);
         } else {
             $this->addOption($datum[1], $datum[0]);
         }
     }
 }
Example #8
0
 public static function getMulti($params, $mode = SQLDatabaseModel::MODE_ASSOC)
 {
     //Load all models
     $fields = array();
     $field_infos = array();
     $models = array();
     $fieldDescriptions = array();
     $headers = array();
     $fixedConditions = array();
     foreach ($params["fields"] as $field) {
         $fieldreferences = explode(", ", $field);
         if (count($fieldreferences) == 1) {
             $fields[] = (string) $field;
             $field_infos[] = Model::resolvePath((string) $field);
         } else {
             $fields[] = $fieldreferences;
             foreach ($fieldreferences as $ref) {
                 $infos[] = Model::resolvePath((string) $ref);
             }
             $field_infos[] = $infos;
         }
     }
     foreach ($fields as $i => $field) {
         if (is_array($field)) {
             foreach ($field_infos[$i] as $info) {
                 if (array_search($info["model"], array_keys($models)) === false) {
                     $models[$info["model"]] = Model::load($info["model"]);
                 }
             }
         } else {
             if (array_search($field_infos[$i]["model"], array_keys($models)) === false) {
                 $models[$field_infos[$i]["model"]] = Model::load($field_infos[$i]["model"]);
                 if ($models[$field_infos[$i]["model"]]->fixedConditions != "") {
                     $fixedConditions[] = $models[$field_infos[$i]["model"]]->fixedConditions;
                 }
             }
         }
     }
     // Replace any conditions with filters
     if (isset($params['filter'])) {
         $params['conditions'] = $params['filter'];
     } else {
         $params['conditions'] = '';
     }
     if (count($fixedConditions) > 0) {
         $params["conditions"] = ($params["conditions"] == "" ? "" : "(" . $params["conditions"] . ") AND ") . "(" . implode(" AND ", $fixedConditions) . ")";
     }
     //Buld the query
     $query = "SELECT ";
     $fieldList = array();
     $rawFields = array();
     $functions = $params["global_functions"];
     foreach ($fields as $i => $field) {
         $field_info = $field_infos[$i];
         if (is_array($field)) {
             $concatFieldList = array();
             foreach ($field_info as $info) {
                 $fieldData = $models[$info["model"]]->getFields(array($info["field"]));
                 $concatFieldList[] = $models[$info["model"]]->datastore->formatField($fieldData[0], $models[$info["model"]]->getDatabase() . "." . $info["field"], true, null, true);
                 $rawFields[] = $models[$info["model"]]->getDatabase() . "." . $info["field"];
             }
             $fieldList[] = $models[$info["model"]]->datastore->applySqlFunctions($models[$info["model"]]->datastore->concatenate($concatFieldList), $functions);
         } else {
             $fieldData = $models[$field_infos[$i]["model"]]->getFields(array($field_info["field"]));
             $fieldDescriptions[] = $fieldData[0];
             $headers[] = $fieldData[0]["label"];
             $fieldList[] = $models[$field_info["model"]]->datastore->formatField($fieldData[0], $models[$field_info["model"]]->getDatabase() . "." . $field_info["field"], true, $functions, true);
             $rawFields[] = $models[$field_info["model"]]->getDatabase() . "." . $field_info["field"];
         }
     }
     if ($params['moreInfoOnly'] === true) {
         return array("data" => $data, "fieldInfos" => $fieldDescriptions, "headers" => $headers, "rawFields" => $rawFields);
     }
     $tableList = array();
     foreach ($models as $model) {
         $tableList[] = $model->getDatabase();
     }
     $joinConditions = array();
     $hasDontJoin = is_array($params['dont_join']);
     foreach ($models as $model) {
         foreach ($models as $other_model) {
             // skip if the models are the same
             if ($model->name == $other_model->name) {
                 continue;
             }
             if ($model->hasField($other_model->getKeyField())) {
                 if ($hasDontJoin) {
                     $modelPair = "{$model->package},{$other_model->package}";
                     $fieldPair = "{$model->package}.{$other_model->getKeyField()},{$other_model->package}.{$other_model->getKeyField()}";
                     Application::log('GET_MULTI')->debug("Trying to skip a join", ['model_pair' => $modelPair, 'field_pair' => $fieldPair, 'dont_join' => $params['dont_join']]);
                     if (array_search($modelPair, $params['dont_join']) !== false) {
                         continue;
                     }
                     if (array_search($fieldPair, $params['dont_join']) !== false) {
                         continue;
                     }
                 }
                 $joinConditions[] = "{$model->getDatabase()}.{$other_model->getKeyField()}={$other_model->getDatabase()}.{$other_model->getKeyField()}";
             }
         }
     }
     if ($params["distinct"] === true) {
         $query .= " DISTINCT ";
     }
     // Apply any special modifiers to the fields
     if ($params["count"] === true || $params["enumerate"] === true) {
         $query .= ' COUNT(*) as "count" FROM ' . implode(', ', array_unique($tableList));
     } else {
         if ($params["sum"] === true) {
             $query .= "SUM(" . implode("), SUM(", $rawFields) . ") FROM " . implode(", ", array_unique($tableList));
         } else {
             if ($params["max"] === true) {
                 $query .= "MAX(" . implode("), MAX(", $rawFields) . ") FROM " . implode(", ", array_unique($tableList));
             } else {
                 $query .= ($params["resolve"] === false ? implode(",", $rawFields) : implode(",", $fieldList)) . " FROM " . implode(",", array_unique($tableList));
             }
         }
     }
     if (count($joinConditions) > 0) {
         $query .= " WHERE (" . implode(" AND ", $joinConditions) . ") ";
         $query .= strlen($params["conditions"]) > 0 ? " AND (" . $params["conditions"] . ")" : "";
     } else {
         $query .= strlen($params["conditions"]) > 0 ? " WHERE " . $params["conditions"] : "";
     }
     if (is_array($params["sort_field"]) && $params["count"] !== true) {
         if (count($params["sort_field"]) > 0) {
             $query .= " ORDER BY ";
             $orderClauses = array();
             foreach ($params["sort_field"] as $sortField) {
                 if ($sortField["field"] == "") {
                     continue;
                 }
                 $orderClauses[] = "{$sortField["field"]} {$sortField["type"]}";
             }
             $query .= implode(", ", $orderClauses);
         }
     } else {
         if ($params["sort_field"] != "" && $params["count"] !== true) {
             $query .= " ORDER BY {$params["sort_field"]} {$params["sort_type"]}";
         }
     }
     if ($params["group_field"] != "") {
         $query .= " GROUP BY {$params["group_field"]}";
         foreach ($rawFields as $field) {
             if ($field != $params["group_field"]) {
                 $query .= "," . $field;
             }
         }
     }
     if (isset($params["limit"])) {
         $query .= " LIMIT ?";
         $params['bind'][] = $params['limit'];
     }
     if (isset($params['offset'])) {
         $query .= " OFFSET ?";
         $params['bind'][] = $params['offset'];
     }
     Application::log()->info($params['cache_key']);
     $data = $other_model->datastore->query($query, $mode, $params['bind'], $params['cache_key']);
     if (isset($params['cache_key'])) {
         Cache::add($params['cache_key'], $query);
     }
     if ($params["moreInfo"] === true) {
         if (isset($params['cache_key'])) {
             Cache::add("{$params['cache_key']}_meta", ['fieldInfos' => $fieldDescriptions, 'headers' => $headers, 'rawFields' => $rawFields]);
         }
         return array("data" => $data, "fieldInfos" => $fieldDescriptions, "headers" => $headers, "rawFields" => $rawFields);
     } else {
         return $data;
     }
 }
Example #9
0
 public static function getMulti($params, $mode = SQLDatabaseModel::MODE_ASSOC)
 {
     //Load all models
     $fields = array();
     $field_infos = array();
     $models = array();
     $fieldDescriptions = array();
     $headers = array();
     $fixedConditions = array();
     foreach ($params["fields"] as $field) {
         $fieldreferences = explode(", ", $field);
         if (count($fieldreferences) == 1) {
             $fields[] = (string) $field;
             $field_infos[] = Model::resolvePath((string) $field);
         } else {
             $fields[] = $fieldreferences;
             foreach ($fieldreferences as $ref) {
                 $infos[] = Model::resolvePath((string) $ref);
             }
             $field_infos[] = $infos;
         }
     }
     foreach ($fields as $i => $field) {
         if (is_array($field)) {
             foreach ($field_infos[$i] as $info) {
                 if (array_search($info["model"], array_keys($models)) === false) {
                     $models[$info["model"]] = Model::load($info["model"]);
                 }
             }
         } else {
             if (array_search($field_infos[$i]["model"], array_keys($models)) === false) {
                 $models[$field_infos[$i]["model"]] = Model::load($field_infos[$i]["model"]);
                 if ($models[$field_infos[$i]["model"]]->fixedConditions != "") {
                     $fixedConditions[] = $models[$field_infos[$i]["model"]]->fixedConditions;
                 }
             }
         }
     }
     if (count($fixedConditions) > 0) {
         $params["conditions"] = ($params["conditions"] == "" ? "" : "(" . $params["conditions"] . ") AND ") . "(" . implode(" AND ", $fixedConditions) . ")";
     }
     //Buld the query
     $query = "SELECT ";
     $fieldList = array();
     $rawFields = array();
     $functions = $params["global_functions"];
     foreach ($fields as $i => $field) {
         $field_info = $field_infos[$i];
         if (is_array($field)) {
             $concatFieldList = array();
             foreach ($field_info as $info) {
                 $fieldData = $models[$info["model"]]->getFields(array($info["field"]));
                 $concatFieldList[] = $models[$info["model"]]->datastore->formatField($fieldData[0], $models[$info["model"]]->getDatabase() . "." . $info["field"], true, null, true);
                 $rawFields[] = $models[$info["model"]]->getDatabase() . "." . $info["field"];
             }
             $fieldList[] = $models[$info["model"]]->datastore->applySqlFunctions($models[$info["model"]]->datastore->concatenate($concatFieldList), $functions);
         } else {
             $fieldData = $models[$field_infos[$i]["model"]]->getFields(array($field_info["field"]));
             $fieldDescriptions[] = $fieldData[0];
             $headers[] = $fieldData[0]["label"];
             $fieldList[] = $models[$field_info["model"]]->datastore->formatField($fieldData[0], $models[$field_info["model"]]->getDatabase() . "." . $field_info["field"], true, $functions, true);
             $rawFields[] = $models[$field_info["model"]]->getDatabase() . "." . $field_info["field"];
         }
     }
     if ($params['moreInfoOnly'] === true) {
         return array("data" => $data, "fieldInfos" => $fieldDescriptions, "headers" => $headers, "rawFields" => $rawFields);
     }
     $tableList = array();
     foreach ($models as $model) {
         $tableList[] = $model->getDatabase();
     }
     $joinConditions = array();
     foreach ($models as $model) {
         foreach ($models as $other_model) {
             // skip if the models are the same
             if ($model->name == $other_model->name) {
                 continue;
             }
             // skip explicitly selected models
             if (is_array($params['dont_join'])) {
                 if (array_search("{$model->package},{$other_model->package}", $params['dont_join']) !== false) {
                     continue;
                 }
                 if (array_search("{$other_model->package},{$model->package}", $params['dont_join']) !== false) {
                     continue;
                 }
             }
             if ($model->hasField($other_model->getKeyField())) {
                 $joinConditions[] = "{$model->getDatabase()}.{$other_model->getKeyField()}={$other_model->getDatabase()}.{$other_model->getKeyField()}";
             }
         }
     }
     if ($params["distinct"] === true) {
         $query .= " DISTINCT ";
     }
     if ($params["count"] === true || $params["enumerate"] === true) {
         $query .= ' COUNT(*) as "count" FROM ' . implode(', ', array_unique($tableList));
     } else {
         if ($params["sum"] === true) {
             $query .= "SUM(" . implode("), SUM(", $rawFields) . ") FROM " . implode(", ", array_unique($tableList));
         } else {
             $query .= ($params["resolve"] === false ? implode(",", $rawFields) : implode(",", $fieldList)) . " FROM " . implode(",", array_unique($tableList));
         }
     }
     if (count($joinConditions) > 0) {
         $query .= " WHERE (" . implode(" AND ", $joinConditions) . ") ";
         $query .= strlen($params["conditions"]) > 0 ? " AND (" . $params["conditions"] . ")" : "";
     } else {
         $query .= strlen($params["conditions"]) > 0 ? " WHERE " . $params["conditions"] : "";
     }
     if (is_array($params["sort_field"]) && $params["count"] !== true) {
         if (count($params["sort_field"]) > 0) {
             $query .= " ORDER BY ";
             $orderClauses = array();
             foreach ($params["sort_field"] as $sortField) {
                 if ($sortField["field"] == "") {
                     continue;
                 }
                 $orderClauses[] = "{$sortField["field"]} {$sortField["type"]}";
             }
             $query .= implode(", ", $orderClauses);
         }
     } else {
         if ($params["sort_field"] != "" && $params["count"] !== true) {
             $query .= " ORDER BY {$params["sort_field"]} {$params["sort_type"]}";
         }
     }
     if ($params["group_field"] != "") {
         $query .= " GROUP BY {$params["group_field"]}";
         foreach ($rawFields as $field) {
             if ($field != $params["group_field"]) {
                 $query .= "," . $field;
             }
         }
     }
     if (isset($params["limit"])) {
         $query .= " LIMIT {$params["limit"]}";
         //$query = "select * from ( select  a.*, ROWNUM autoremove_oracle_rnum from ( $query ) a where ROWNUM <= ".($params["offset"]+$params["limit"])." ) where autoremove_oracle_rnum  >= ".($params["offset"]+0);
     }
     if (isset($params['offset'])) {
         $query .= " OFFSET {$params["offset"]}";
     }
     $data = $other_model->datastore->query($query, $mode);
     if ($params["moreInfo"] === true) {
         return array("data" => $data, "fieldInfos" => $fieldDescriptions, "headers" => $headers, "rawFields" => $rawFields);
     } else {
         return $data;
     }
 }
Example #10
0
 public function setResolvableData($data, $primary_key_field = null, $primary_key_value = null)
 {
     $errors = array();
     foreach ($data as $key => $value) {
         switch ($this->fields[$key]["type"]) {
             case "date":
                 if ($value != "") {
                     $data[$key] = Model::stringToTime($value);
                     if ($data[$key] === false) {
                         $errors[$key][] = "Invalid Date Format. Use yy/mm/dddd.";
                     }
                 }
                 break;
             case "datetime":
                 if ($value != "") {
                     $data[$key] = Model::stringToTime($value, true);
                     if ($data[$key] === false) {
                         $errors[$key][] = "Invalid Date Format. Use yy/mm/dddd.";
                     }
                 }
                 break;
             case "enum":
                 if ($data[$key] != "") {
                     $data[$key] = array_search(trim($value), $this->fields[$key]["options"]);
                     if ($data[$key] === false) {
                         $errors[$key][] = "Invalid Value '<b>{$value}</b>'<br/>Possible values may include <ul><li>'" . implode("'</li><li>'", $this->fields[$key]["options"]) . "'</li></ul>";
                     }
                     $data[$key] = (string) $data[$key];
                 }
                 break;
             case "boolean":
                 $data[$key] = $value == "Yes" ? "1" : "0";
                 break;
             case "reference":
                 if ($data[$key] != "") {
                     $modelInfo = Model::resolvePath($this->fields[$key]["reference"]);
                     $model = Model::load($modelInfo["model"]);
                     $row = $model->get(array("fields" => array($modelInfo["field"]), "conditions" => "TRIM(UPPER({$this->fields[$key]["referenceValue"]}))=TRIM(UPPER('{$data[$key]}'))"));
                     if (isset($row[0][$modelInfo["field"]])) {
                         $data[$key] = $row[0][$modelInfo["field"]];
                     } else {
                         $errors[$key][] = "Invalid Value";
                     }
                 }
                 break;
         }
     }
     if (count($errors) == 0) {
         return $this->setData($data, $primary_key_field, $primary_key_value);
     } else {
         return array("errors" => $errors);
     }
 }
 /**
  * Returns a form to be used to filter the report. This method analyses the
  * XML file and uses the fields specified in there to generate a very form
  * which allows you to define filter for the form. The form generated also
  * gives you options to sort and group the reports.
  * @return Form
  */
 public function getForm()
 {
     $this->initializeForm();
     $filters = array();
     $fieldInfos = array();
     $queries = $this->xml->xpath("/rapi:report/rapi:query");
     $tables = $this->xml->xpath("/rapi:report/rapi:table");
     /// Filters and sorting.
     foreach ($tables as $table) {
         $numConcatFields = 0;
         $fields = $table->xpath("/rapi:report/rapi:table[@name='{$table["name"]}']/rapi:fields/rapi:field");
         $labels = $table->xpath("/rapi:report/rapi:table[@name='{$table["name"]}']/rapi:fields/rapi:field/@label");
         $filters = new TableLayout(count($fields) + 1, 5);
         $filters->add(Element::create("Label", "Field")->addCssClass("header-label"), 0, 0)->add(Element::create("Label", "Options")->addCssClass("header-label"), 0, 1)->add(Element::create("Label", "Exclude")->addCssClass("header-label"), 0, 4)->resetCssClasses()->addCssClass("filter-table")->setRenderer("default");
         $sortingField = new SelectionList("Sorting Field", "{$table["name"]}_sorting_field");
         $grouping1 = new SelectionList();
         $i = 1;
         foreach ($fields as $key => $field) {
             if (isset($field["labelsField"])) {
                 continue;
             }
             if (count(explode(",", (string) $field)) == 1) {
                 $fieldInfo = Model::resolvePath((string) $field);
                 $model = Model::load($fieldInfo["model"]);
                 $fieldName = $fieldInfo["field"];
                 $fieldInfo = $model->getFields(array($fieldName));
                 $fieldInfo = $fieldInfo[0];
                 $fields[$key] = (string) $field;
                 $sortingField->addOption(str_replace("\\n", " ", $fieldInfo["label"]), $model->getDatabase() . "." . $fieldInfo["name"]);
                 $grouping1->addOption(str_replace("\\n", " ", $field["label"]), (string) $field);
                 if (array_search($model->getKeyField(), $this->referencedFields) === false || $fieldInfo["type"] == "double" || $fieldInfo["type"] == "date") {
                     switch ($fieldInfo["type"]) {
                         case "integer":
                         case "double":
                             $filters->add(Element::create("Label", str_replace("\\n", " ", (string) $field["label"])), $i, 0)->add(Element::create("SelectionList", "", "{$table["name"]}.{$fieldInfo["name"]}_option")->addOption("Equals", "EQUALS")->addOption("Greater Than", "GREATER")->addOption("Less Than", "LESS")->addOption("Between", "BETWEEN")->setValue("BETWEEN"), $i, 1)->add(Element::create("TextField", "", "{$table["name"]}.{$fieldInfo["name"]}_start_value")->setAsNumeric(), $i, 2)->add(Element::create("TextField", "", "{$table["name"]}.{$fieldInfo["name"]}_end_value")->setAsNumeric(), $i, 3);
                             //->add(Element::create("Checkbox","","{$table["name"]}.{$fieldInfo["name"]}_ignore","","1"),$i,4);
                             break;
                         case "date":
                         case "datetime":
                             $filters->add(Element::create("Label", str_replace("\\n", " ", (string) $field["label"])), $i, 0)->add(Element::create("SelectionList", "", "{$table["name"]}.{$fieldInfo["name"]}_option")->addOption("Before", "LESS")->addOption("After", "GREATER")->addOption("On", "EQUALS")->addOption("Between", "BETWEEN")->setValue("BETWEEN"), $i, 1)->add(Element::create("DateField", "", "{$table["name"]}.{$fieldInfo["name"]}_start_date")->setId("{$table["name"]}_{$fieldInfo["name"]}_start_date"), $i, 2)->add(Element::create("DateField", "", "{$table["name"]}.{$fieldInfo["name"]}_end_date")->setId("{$table["name"]}_{$fieldInfo["name"]}_end_date"), $i, 3);
                             //->add(Element::create("Checkbox","","{$table["name"]}.{$fieldInfo["name"]}_ignore","","1"),$i,4);
                             break;
                         case "enum":
                             $enum_list = new SelectionList("", "{$table["name"]}.{$fieldInfo["name"]}_value");
                             $enum_list->setMultiple(true);
                             foreach ($fieldInfo["options"] as $value => $label) {
                                 $enum_list->addOption($label, $value);
                             }
                             if (!isset($field["value"])) {
                                 $filters->add(Element::create("Label", str_replace("\\n", " ", (string) $field["label"])), $i, 0)->add(Element::create("SelectionList", "", "{$table["name"]}.{$fieldInfo["name"]}_option")->addOption("Is any of", "INCLUDE")->addOption("Is none of", "EXCLUDE")->setValue("INCLUDE"), $i, 1)->add($enum_list, $i, 2);
                             }
                             //->add(Element::create("Checkbox","","{$table["name"]}.{$fieldInfo["name"]}_ignore","","1"),$i,4);
                             break;
                         case "string":
                         case "text":
                             $filters->add(Element::create("Label", str_replace("\\n", " ", (string) $field["label"])), $i, 0)->add(Element::create("SelectionList", "", "{$table["name"]}.{$fieldInfo["name"]}_option")->addOption("Is exactly", "EXACTLY")->addOption("Contains", "CONTAINS")->setValue("CONTAINS"), $i, 1)->add(Element::create("TextField", "", "{$table["name"]}.{$fieldInfo["name"]}_value"), $i, 2);
                             //->add(Element::create("Checkbox","","{$table["name"]}.{$fieldInfo["name"]}_ignore","","1"),$i,4);
                             break;
                     }
                     if (isset($field["hide"])) {
                         $filters->add(Element::create("HiddenField", "{$table["name"]}.{$fieldInfo["name"]}_ignore", "1"), $i, 4);
                     } else {
                         $filters->add(Element::create("Checkbox", "", "{$table["name"]}.{$fieldInfo["name"]}_ignore", "", "1"), $i, 4);
                     }
                 } else {
                     $enum_list = new ModelSearchField();
                     $enum_list->setName("{$table["name"]}.{$fieldInfo["name"]}_value");
                     $enum_list->setModel($model, $fieldInfo["name"]);
                     $enum_list->addSearchField($fieldInfo["name"]);
                     $enum_list->boldFirst = false;
                     $filters->add(Element::create("Label", str_replace("\\n", " ", (string) $field["label"])), $i, 0)->add(Element::create("SelectionList", "", "{$table["name"]}.{$fieldInfo["name"]}_option")->addOption("Is any of", "IS_ANY_OF")->addOption("Is none of", "IS_NONE_OF")->setValue("IS_ANY_OF"), $i, 1)->add(Element::create("MultiFields")->setTemplate($enum_list), $i, 2)->add(Element::create("Checkbox", "", "{$table["name"]}.{$fieldInfo["name"]}_ignore", "", "1"), $i, 4);
                 }
             } else {
                 $grouping1->addOption(str_replace("\\n", " ", $field["label"]), $field);
                 $filters->add(Element::create("Label", str_replace("\\n", " ", (string) $field["label"])), $i, 0)->add(Element::create("SelectionList", "", "{$table["name"]}_concat_{$numConcatFields}_option")->addOption("Is exactly", "EXACTLY")->addOption("Contains", "CONTAINS")->setValue("CONTAINS"), $i, 1)->add(Element::create("TextField", "", "{$table["name"]}_concat_{$numConcatFields}_value"), $i, 2)->add(Element::create("Checkbox", "", "{$table["name"]}_concat_{$numConcatFields}_ignore", "", "1"), $i, 4);
                 $numConcatFields++;
             }
             $i++;
         }
         $grouping1->setName("{$table["name"]}_grouping[]")->setLabel("Grouping Field 1");
         $g1Paging = new Checkbox("Start on a new page", "grouping_1_newpage", "", "1");
         $g1Logo = new Checkbox("Repeat Logos", "grouping_1_logo", "", "1");
         $g1Summarize = new Checkbox("Summarize", "grouping_1_summary", "", "1");
         $grouping2 = clone $grouping1;
         $grouping2->setName("{$table["name"]}_grouping[]")->setLabel("Grouping Field 2");
         $g2Paging = new Checkbox("Start on a new page", "grouping_2_newpage", "", "1");
         $g2Logo = new Checkbox("Repeat Logos", "grouping_2_logo", "", "1");
         $grouping3 = clone $grouping1;
         $grouping3->setName("{$table["name"]}_grouping[]")->setLabel("Grouping Field 3");
         $g3Paging = new Checkbox("Start on a new page", "grouping_3_newpage", "", "1");
         $g3Logo = new Checkbox("Repeat Logos", "grouping_3_logo", "", "1");
         $sortingField->setLabel("Sorting Field");
         $sortingField->setName($table["name"] . "_sorting");
         $groupingTable = new TableLayout(3, 4);
         $groupingTable->add($grouping1, 0, 0);
         $groupingTable->add($g1Paging, 0, 1);
         $groupingTable->add($g1Logo, 0, 2);
         $groupingTable->add($g1Summarize, 0, 3);
         $groupingTable->add($grouping2, 1, 0);
         /* $groupingTable->add($g2Paging, 1, 1);
            $groupingTable->add($g2Logo, 1, 2); */
         $groupingTable->add($grouping3, 2, 0);
         $container = new FieldSet($table["name"]);
         $container->setId("{$table["name"]}_options");
         $container->add(Element::create("FieldSet", "Filters")->add($filters)->setId("table_{$table['name']}"), Element::create("FieldSet", "Sorting & Limiting")->add($sortingField, Element::create("SelectionList", "Direction", "{$table["name"]}.sorting_direction")->addOption("Ascending", "ASC")->addOption("Descending", "DESC"), Element::create('TextField', 'Limit', "{$table['name']}.limit")->setAsNumeric())->setId("{$table['name']}_sorting_fs"), Element::create("FieldSet", "Grouping")->setId("{$table['name']}_grouping_fs")->add($groupingTable));
         $sortingField->setName($table["name"] . "_sorting");
         $this->form->add($container);
     }
     $this->form->setSubmitValue("Generate");
     $this->form->addAttribute("action", $this->path . "/generate");
     $this->form->addAttribute("target", "blank");
     return $this->form;
 }
Example #12
0
 /**
  * Default controller action. This is the default action which is executed
  * when no action is specified for a given call.
  * @see lib/controllers/Controller::getContents()
  */
 public function getContents()
 {
     if (count($this->listFields) > 0) {
         $fieldNames = $this->listFields;
     } else {
         if ($this->app != null) {
             $fieldNames = $this->app->xpath("/app:app/app:list/app:field");
             $concatenatedLabels = $this->app->xpath("/app:app/app:list/app:field/@label");
         } else {
             $fieldNames = array();
             $keyField = $this->model->getKeyField();
             $fieldNames[$keyField] = "{$this->model->package}.{$keyField}";
             $fields = $this->model->getFields();
             foreach ($fields as $i => $field) {
                 if ($field["reference"] == "") {
                     $fieldNames[$i] = $this->model->package . "." . $field["name"];
                 } else {
                     $modelInfo = Model::resolvePath($field["reference"]);
                     $fieldNames[$i] = $modelInfo["model"] . "." . $field["referenceValue"];
                 }
             }
         }
     }
     foreach ($fieldNames as $i => $fieldName) {
         $fieldNames[$i] = substr((string) $fieldName, 0, 1) == "." ? $this->redirectedPackage . (string) $fieldName : (string) $fieldName;
     }
     if (count($this->fieldNames) > 0) {
         $fieldNames = $this->fieldNames;
     }
     if ($this->apiMode === false) {
         $this->setupList();
         $params["fields"] = $fieldNames;
         $params["page"] = 0;
         $params["sort_field"] = array(array("field" => $this->model->database . "." . $this->model->getKeyField(), "type" => "DESC"));
         $this->table->setParams($params);
         $return = '<div id="table-wrapper">' . $this->toolbar->render() . $this->table->render() . '</div>';
     } else {
         $params["fields"] = $fieldNames;
         $params["page"] = 0;
         $params["sort_field"] = array(array("field" => $this->model->database . "." . $this->model->getKeyField(), "type" => "DESC"));
         $return = json_encode(SQLDBDataStore::getMulti($params));
     }
     return $return;
 }
Example #13
0
 private function getDefaultFieldNames()
 {
     $fieldNames = array();
     $keyField = $this->model->getKeyField();
     $fieldNames[$keyField] = "{$this->model->package}.{$keyField}";
     $fields = $this->model->getFields();
     foreach ($fields as $i => $field) {
         if ($field["reference"] == "") {
             $fieldNames[$i] = $this->model->package . "." . $field["name"];
         } else {
             $modelInfo = Model::resolvePath($field["reference"]);
             $fieldNames[$i] = $modelInfo["model"] . "." . $field["referenceValue"];
         }
     }
     return $fieldNames;
 }