Ejemplo n.º 1
0
 /**
  * Gets table state for items in $rows
  *
  * @param  ParamsInterface  $input  The user form input
  * @param  array            $rows   IN+OUT
  * @return void
  *
  * @throws \UnexpectedValueException
  */
 protected function _getTableStateItems($input, &$rows = array())
 {
     foreach ($rows as $name => $value) {
         $postedValueRaw = $input->get($this->name . '.' . $name, null, GetterInterface::RAW);
         if ($postedValueRaw !== null) {
             $postedValue = null;
             if (!is_array($postedValueRaw)) {
                 $postedValue = $input->get($this->name . '.' . $name, null, GetterInterface::STRING);
             }
             if ($rows[$name]['type'] != 'field_show_only_if_selected' && $rows[$name]['selectValues']) {
                 if (is_array($postedValueRaw)) {
                     // 'field' type:
                     $subInputs = $input->subTree($this->name . '.' . $name);
                     if (!$subInputs->count()) {
                         continue;
                     }
                     $subInputsArray = $subInputs->asArray();
                     if (is_array(array_shift($subInputsArray))) {
                         // Parse Repeat usage:
                         $rows[$name]['valuefield'] = array();
                         $rows[$name]['table'] = array();
                         $rows[$name]['table_key'] = array();
                         $rows[$name]['operator'] = array();
                         $rows[$name]['internalvalue'] = array();
                         $rows[$name]['value'] = array();
                         foreach ($subInputs as $inputColOpVal) {
                             if (!$inputColOpVal instanceof ParamsInterface) {
                                 throw new \UnexpectedValueException('Unexpected inputs in _getTableStateItems');
                             }
                             $column = $inputColOpVal->get('column', null, GetterInterface::STRING);
                             $operator = $inputColOpVal->get('operator', null, GetterInterface::RAW);
                             $value = $inputColOpVal->get('value', null, GetterInterface::STRING);
                             if ($column == '' || $operator == '') {
                                 continue;
                             }
                             if (!in_array($operator, $this->possibleOperators)) {
                                 throw new \UnexpectedValueException('Unexpected operator in _getTableStateItems' . var_dump($_REQUEST[$this->name]));
                             }
                             $internalValue = $value;
                             if (in_array($operator, array('IN', 'NOT IN||ISNULL'))) {
                                 $internalValue = explode(',', $internalValue);
                             }
                             if (in_array($operator, array('LIKE', 'NOT LIKE||ISNULL'))) {
                                 $internalValue = '%' . addcslashes($internalValue, '%_') . '%';
                             }
                             foreach ($rows[$name]['selectValues'] as $selObj) {
                                 if ($column === $selObj->value) {
                                     $rows[$name]['valuefield'][] = isset($selObj->index) ? $selObj->index : $selObj->value;
                                     $rows[$name]['table'] = $selObj->table;
                                     $rows[$name]['table_key'] = $selObj->table_key;
                                     $rows[$name]['operator'][] = $operator;
                                     $rows[$name]['internalvalue'][] = $internalValue;
                                     $rows[$name]['value'][] = array('column' => $column, 'operator' => $operator, 'value' => $value);
                                     break;
                                 }
                             }
                         }
                     } else {
                         // Pase multiselect usage:
                         $values = array();
                         $internalValues = array();
                         // Make sure the values selected are actaully available to the input:
                         foreach ($subInputs as $inputVal) {
                             foreach ($rows[$name]['selectValues'] as $selObj) {
                                 if ($inputVal != '' && $inputVal === $selObj->value) {
                                     $values[] = $selObj->value;
                                     if (isset($selObj->internalvalue) && $selObj->internalvalue !== null) {
                                         $internalValues[] = $selObj->internalvalue;
                                     } else {
                                         $internalValues[] = $selObj->value;
                                     }
                                     break;
                                 }
                             }
                         }
                         $rows[$name]['value'] = $values;
                         $rows[$name]['internalvalue'] = $internalValues;
                     }
                     continue;
                 }
                 // check if value is in possible values list:
                 foreach ($rows[$name]['selectValues'] as $selObj) {
                     if ($postedValue === $selObj->value) {
                         $rows[$name]['value'] = $selObj->value;
                         if (isset($selObj->internalvalue) && $selObj->internalvalue !== null) {
                             $rows[$name]['internalvalue'] = $selObj->internalvalue;
                         } else {
                             $rows[$name]['internalvalue'] = $selObj->value;
                         }
                         if (isset($selObj->operator) && $selObj->operator !== null) {
                             $rows[$name]['operator'] = $selObj->operator;
                         }
                         break;
                     }
                 }
             } else {
                 if (is_array($postedValueRaw)) {
                     // Remove empty string and null as neither are acceptable multiselect filter values:
                     $postedValueRaw = array_filter($postedValueRaw, function ($k) {
                         return $k != '';
                     });
                     $rows[$name]['value'] = $postedValueRaw;
                 } elseif ($rows[$name]['basetype'] == 'int') {
                     $rows[$name]['value'] = (int) $postedValue;
                 } elseif ($rows[$name]['basetype'] == 'float') {
                     $rows[$name]['value'] = (double) $postedValue;
                 } else {
                     $rows[$name]['value'] = $postedValue;
                 }
                 $rows[$name]['internalvalue'] = $rows[$name]['value'];
             }
         }
     }
 }