/**
  * 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;
 }
Пример #2
0
 /**
  * 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;
 }