/** * Perform any actions * * @return boolean true on sucess */ protected function action() { /* * XX lists/form/position/facility+location/county/district?district%2Bregion=region|1 * XX lists/field/person_position+facility/default/?? * lists/LIST/[FORM[+FIELD]/[STYLE]]?[limit={JSON}&FORM[+FIELD]=VALUE * lists/district/position+facility?country=country|TF * lists/facility?facility+location=country|TF */ $list = array_shift($this->request_remainder); $is_public = false; I2CE::getConfig()->setIfIsSet($is_public, "/modules/forms/forms/{$list}/meta/list/is_public"); if (!$is_public) { $task = "can_view_database_list_{$list}"; if (!$this->hasPermission("task({$task})")) { $this->setError('noaccess_page'); return false; } } $listObj = I2CE_FormFactory::instance()->createContainer($list); if (!$listObj instanceof I2CE_List) { $this->setError('invalid_list', array($list)); } $style = 'default'; $fields = array(); $forms = array($list); $where = array(); $get = $this->request(); if (array_key_exists('limit', $get)) { $where = json_decode($get['limit']); unset($get['limit']); } $enclose_array = false; if (array_key_exists('array', $get)) { if ($get['array']) { $enclose_array = true; } unset($get['array']); } if (count($this->request_remainder) > 0) { $formfield = array_shift($this->request_remainder); if (strpos($formfield, '+') === false) { $form = $formfield; $field = $list; } else { list($form, $field) = explode('+', $formfield, 2); } $formObj = I2CE_FormFactory::instance()->createContainer($form); if (!$formObj instanceof I2CE_Form) { $this->setError('invalid_form', array($form)); } if (!$formObj->hasField($field)) { $this->setError('invalid_field', array($field, $form)); return true; } $fieldObj = $formObj->getField($field); if (!$fieldObj instanceof I2CE_FormField_MAPPED) { $this->setError('invalid_field', array($field, $form)); } if (count($this->request_remainder) > 0) { $style = array_shift($this->request_remainder); } $form_limits = $fieldObj->getFormLimits($style); $form_fields = $fieldObj->getDisplayedFields($style); $form_limits = $this->getCurrentListLimits($form_limits, $list, $form_fields); array_walk($form_fields, 'self::removeHidden'); $add_where = array(); foreach ($get as $formfield => $limit) { if (($form_key = array_search($formfield, $form_fields)) !== false) { if (!is_array($limit)) { $limit = array('equals' => $limit); } unset($get[$formfield]); if ($form_key == 0) { if (strpos($formfield, '+') !== false) { list($form, $field) = self::explodeLimitField($formfield); foreach ($limit as $limit_style => $value) { self::addOrCombineFieldLimit($add_where, $form, $field, $value, $limit_style); } } } else { $prev_key = $form_key - 1; $prev_form = $form_fields[$prev_key]; $curr_form = $form_fields[$form_key]; $new_limit = array(); if (strpos($prev_form, '+') === false) { if (($curr_pos = strpos($curr_form, '+')) !== false) { $curr_form = substr($curr_form, 0, $curr_pos); } foreach ($limit as $limit_style => $value) { self::addOrCombineFieldLimit($add_where, $prev_form, $curr_form, $value, $limit_style); } } else { list($form, $field) = self::explodeLimitField($prev_form); foreach ($limit as $limit_style => $value) { self::addOrCombineFieldLimit($add_where, $form, $field, $value, $limit_style); } } } } } $form_limits = self::combineFormLimits($form_limits, $add_where); if (!array_key_exists($list, $form_limits)) { $skip = true; foreach ($form_fields as $ff) { if (($pluspos = strpos($ff, '+')) !== false) { $ff_form = substr($ff, 0, $pluspos); } else { $ff_form = $ff; } $ff = str_replace('[', '', str_replace(']', '', $ff)); if ($ff_form == $list) { $skip = false; } if ($skip) { continue; } $fields[] = $ff; if (array_key_exists($ff_form, $form_limits)) { break; } } } else { $fields[] = $list; } $where = self::combineFormLimits($where, $form_limits); } else { $fields[] = $list; } if (count($get) > 0) { $add_where = array(); foreach ($get as $formfield => $limit) { if (!is_array($limit)) { $limit = array('equals' => $limit); } if (strpos($formfield, '+') !== false) { list($form, $field) = self::explodeLimitField($formfield); foreach ($limit as $limit_limit_style => $value) { self::addOrCombineFieldLimit($add_where, $form, $field, $value, $limit_style); } } } $where = self::combineFormLimits($where, $add_where); } foreach ($where as $w_form => $w_limits) { if (!in_array($w_form, $fields)) { unset($where[$w_form]); } } $this->data = array('list' => $list); //$this->data['data'] = I2CE_List::listOptions( $list ); //$results = I2CE_DataTree::flattenDataTree( I2CE_DataTree::buildDataTree( array( 'position', 'facility+location', 'county', 'district' ), array( 'position' ), $where ), true ); //I2CE::raiseMessage("building tree for " . print_r($fields,true).print_r($forms,true).print_r($where,true)); $results = I2CE_DataTree::flattenDataTree(I2CE_DataTree::buildDataTree($fields, $forms, $where, array(), 0, null, $style), true); $this->data['length'] = count($results); $this->data['data'] = $results; if ($enclose_array) { $this->data = array($this->data); } return true; }
/** * Create a data tree of the selectable forms. Deisgned to be fed into tree select * @param array $fields an ordered array E.g array('village+county','county','district,'region+country','country'). * it is an "bottom up" array of string where strings are of the form "$form" or "$form+$link_field". * In the case of the former type, then $link_field is assumed to be the next form. So for example, * "county" has link field "district". If a "$form(+$link_field)" is surrounded by brackets [ ] , * it is not displayed. * @param array $forms An unorderd array of form names whose values we allow to be selected * @param array $limits An array with keys form names and value limit data * @param array $orders An array with keys form names and values array of field orders for that form. If the form * name has no orders, we use default * ordering for that form based on its displayed firelds * @param int $show_hidden 0=non-hidden, 1=All, 2=hidden only. Defaults to 0 * @return array */ public static function buildDataTree($fields, $forms, $limits, $orders = array(), $show_hidden = 0) { return I2CE_DataTree::buildDataTree($fields, $forms, $limits, $orders, $show_hidden); }
/** *@returns array where keys are ids, values are arrays with the following keys 'value', 'display' */ public function getMapOptions($type = 'default', $show_hidden = 0, $flat = true, $add_limits = array()) { $forms = $this->getSelectableForms(); $fields = $this->getDisplayedFields($type); $limits = $this->getFormLimits($type); $report = $this->getDisplayReport($type); if (is_array($add_limits) && count($add_limits) > 0) { if (!is_array($limits) || count($limits) > 0) { $limits = $add_limits; } else { //need to go through each form and possibly merge limits foreach ($add_limits as $form => $formLimits) { if (!array_key_exists($form, $limits) || !is_array($limits[$form]) || count($limits[$form]) == 0) { $limits[$form] = $formLimits; } else { $limits[$form] = array('operator' => 'AND', 'operand' => array(0 => $limits[$form], 1 => $formLimits)); } } } } $orders = $this->getFormOrders($type); //echo "For " . ($this->getContainer() instanceof I2CE_Form ? $this->getContainer()->getName() . " + " : "" ) . $this->getName() . " using " . $report . "\n"; //I2CE::raiseError( "For " . ($this->getContainer() instanceof I2CE_Form ? $this->getContainer()->getName() . " + " : "" ) . $this->getName() . " using " . print_r($limits,true) ); $data = I2CE_DataTree::buildDataTree($fields, $forms, $limits, $orders, $show_hidden, $report); if (!$data) { //I2CE::raiseError("Could not build data tree for " .implode(',',$fields) . " and " . implode(",",$forms)); return array(); } if ($flat) { $data = I2CE_DataTree::flattenDataTree($data); } return $data; }