예제 #1
0
 /**
  * Acl handle
  *
  * @param string $acl_key
  * @param string $acl_type
  * @param array $data
  * @param array $options
  * @return boolean
  */
 public function acl_handle($acl_key, $acl_type, &$data, &$options)
 {
     // if we have no acls we must return null
     if (empty($this->data[$acl_key][$acl_type])) {
         return null;
     }
     // sort
     array_key_sort($this->data[$acl_key][$acl_type], ['order' => SORT_ASC], ['order' => SORT_NUMERIC]);
     // process one by one
     foreach ($this->data[$acl_key][$acl_type] as $k => $v) {
         $method = factory::method($v['method'], null, true);
         $result = $method[0]->{$method[1]}($acl_key, $acl_type, $data, $options);
         if (!$result) {
             debug::$data['acls'][$acl_key][$acl_type] = 'Failed';
             return false;
         } else {
             debug::$data['acls'][$acl_key][$acl_type] = 'Success';
         }
     }
     return true;
 }
예제 #2
0
 /**
  * Multi level options
  *
  * @param array $data
  * @param array $optmultis_map
  * @param array $options
  * @return array
  */
 public static function optmultis($data, $optmultis_map, $options = [])
 {
     $keys = array_keys($optmultis_map);
     $max_level = count($keys) - 1;
     $result = [];
     // process models
     $models = [];
     foreach ($optmultis_map as $k => $v) {
         if (!empty($v['model'])) {
             $model = $v['model'];
             $object = new $model();
             $models[$k] = $object->options();
         }
     }
     // generating all items in one run
     foreach ($data as $k => $v) {
         $temp_result = $k2_hash2 = $k2_hash = [];
         $level = -1;
         // a must
         foreach ($keys as $k2 => $v2) {
             $k2_alias = $optmultis_map[$v2]['alias'] ?? $v2;
             $k2_hash[$k2_alias] = $v[$v2];
             if (!empty($v[$v2])) {
                 $level++;
                 if ($k2 != 0) {
                     $k2_hash2[] = 'options';
                 }
                 $k2_hash2[] = $v[$v2];
             }
             if ($k2 < $max_level) {
                 if (!array_key_get($result, $k2_hash2)) {
                     $k2_temp = [];
                     $k2_temp['level'] = $level;
                     $k2_temp['name'] = $models[$v2][$v[$v2]]['name'] ?? $v[$v2];
                     if (!empty($options['i18n'])) {
                         $k2_temp['name'] = i18n(null, $k2_temp['name']);
                     }
                     $k2_temp['json_key'] = json_encode($k2_hash);
                     $k2_temp['disabled'] = $optmultis_map[$v2]['disabled'] ?? false;
                     array_key_set($result, $k2_hash2, $k2_temp);
                 }
             }
             // last key - we have items
             if ($k2 == $max_level) {
                 $temp_result['level'] = $level;
                 $name = '';
                 if (isset($optmultis_map[$v2]['column'])) {
                     $name = $v[$optmultis_map[$v2]['column']];
                 } else {
                     $name = $v[$k2_alias];
                 }
                 if (empty($options['i18n'])) {
                     $temp_result['name'] = $name;
                 } else {
                     $temp_result['name'] = i18n(null, $name);
                 }
                 // icon
                 $temp_result['icon_class'] = null;
                 if (isset($optmultis_map[$v2]['icon_column']) && !empty($v[$optmultis_map[$v2]['icon_column']])) {
                     $temp_result['icon_class'] = html::icon(['type' => $v[$optmultis_map[$v2]['icon_column']], 'class_only' => true]);
                 }
                 // only this value flag
                 if (!empty($optmultis_map[$v2]['only_this_value'])) {
                     $temp_result['json_key'] = $v[$v2];
                 } else {
                     $temp_result['json_key'] = json_encode($k2_hash);
                 }
                 array_key_set($result, $k2_hash2, $temp_result);
             }
         }
     }
     // sorting & generating final array
     array_key_sort($result, ['name' => SORT_ASC]);
     $result2 = [];
     foreach ($result as $v) {
         // level 0
         $result2[$v['json_key']] = ['name' => $v['name'], 'level' => $v['level'], 'icon_class' => $v['icon_class'] ?? null, 'disabled' => $v['disabled'] ?? false];
         // level 1
         if (!empty($v['options'])) {
             array_key_sort($v['options'], ['name' => SORT_ASC]);
             foreach ($v['options'] as $v2) {
                 $result2[$v2['json_key']] = ['name' => $v2['name'], 'level' => $v2['level'], 'icon_class' => $v2['icon_class'] ?? null, 'disabled' => $v2['disabled'] ?? false];
                 // level 2
                 if (!empty($v2['options'])) {
                     array_key_sort($v2['options'], ['name' => SORT_ASC]);
                     foreach ($v2['options'] as $v3) {
                         $result2[$v3['json_key']] = ['name' => $v3['name'], 'level' => $v3['level'], 'icon_class' => $v3['icon_class'] ?? null, 'disabled' => $v3['disabled'] ?? false];
                         // level 3
                         if (!empty($v3['options'])) {
                             array_key_sort($v3['options'], ['name' => SORT_ASC]);
                             foreach ($v3['options'] as $v4) {
                                 $result2[$v4['json_key']] = ['name' => $v4['name'], 'level' => $v4['level'], 'icon_class' => $v4['icon_class'] ?? null, 'disabled' => $v4['disabled'] ?? false];
                             }
                         }
                     }
                 }
             }
         }
     }
     return $result2;
 }
예제 #3
0
 /**
  * Render table rows
  *
  * @param array $rows
  * @return string
  */
 public function render_row_grid($rows)
 {
     $data = ['options' => []];
     foreach ($rows as $k => $v) {
         $index = 0;
         array_key_sort($v['value']['elements'], ['order' => SORT_ASC]);
         // processing buttons
         if (in_array($v['key'], [$this::buttons, $this::batch_buttons])) {
             $buttons = ['left' => [], 'center' => [], 'right' => []];
             foreach ($v['value']['elements'] as $k2 => $v2) {
                 $button_group = $v2['options']['button_group'] ?? 'left';
                 if (!isset($buttons[$button_group])) {
                     $buttons[$button_group] = [];
                 }
                 $v2['options']['tabindex'] = $this->tabindex;
                 $this->tabindex++;
                 $buttons[$button_group][] = $this->render_element_value($v2);
             }
             // render button groups
             foreach ($buttons as $k2 => $v2) {
                 $value = implode(' ', $v2);
                 $value = '<div class="grid_button_' . $k2 . '">' . $value . '</div>';
                 $data['options'][$k][$v['key']][$k2] = ['label' => null, 'value' => $value, 'description' => null, 'error' => [], 'options' => []];
             }
             continue;
         }
         // group by
         $groupped = [];
         foreach ($v['value']['elements'] as $k2 => $v2) {
             $groupped[$v2['options']['label_name'] ?? ''][$k2] = $v2;
         }
         foreach ($groupped as $k2 => $v2) {
             $first = current($v2);
             $first_key = key($v2);
             if ($first_key == self::separator_horisontal) {
                 $data['options'][$k][$k2][0] = ['value' => html::separator(['value' => $first['options']['label_name'], 'icon' => $first['options']['icon'] ?? null]), 'separator' => true];
             } else {
                 $first['prepend_to_field'] = ':';
                 foreach ($v2 as $k3 => $v3) {
                     // handling errors
                     $error = $this->get_field_errors($v3);
                     if (!empty($error['counters'])) {
                         $this->error_in_tabs($error['counters']);
                     }
                     // hidden row
                     $hidden = false;
                     if ($v['key'] === $this::hidden && !application::get('flag.numbers.frontend.html.form.show_field_settings')) {
                         $v3['options']['row_class'] = ($v3['options']['row_class'] ?? '') . ' grid_row_hidden';
                         $hidden = true;
                     } else {
                         if ($v['key'] === $this::hidden) {
                             $v3['options']['row_class'] = ($v3['options']['row_class'] ?? '') . ' grid_row_hidden_testing';
                         }
                     }
                     // we do not show hidden fields
                     if (($v3['options']['method'] ?? '') == 'hidden') {
                         if (application::get('flag.numbers.frontend.html.form.show_field_settings')) {
                             $v3['options']['method'] = 'input';
                         } else {
                             $v3['options']['style'] = ($v3['options']['style'] ?? '') . 'display: none;';
                             $hidden = true;
                         }
                     }
                     if (!$hidden) {
                         $v3['options']['tabindex'] = $this->tabindex;
                         $this->tabindex++;
                     }
                     // processing value and neighbouring_values
                     if (!empty($v3['options']['detail_11'])) {
                         $neighbouring_values =& $this->values[$v3['options']['detail_11']];
                     } else {
                         $neighbouring_values =& $this->values;
                     }
                     $value = array_key_get($this->values, $v3['options']['values_key']);
                     $data['options'][$k][$k2][$k3] = ['error' => $error, 'label' => $this->render_element_name($first), 'value' => $this->render_element_value($v3, $value, $neighbouring_values), 'description' => $v3['options']['description'] ?? null, 'options' => $v3['options'], 'row_class' => $v3['options']['row_class'] ?? null];
                 }
             }
         }
     }
     return html::grid($data);
 }
예제 #4
0
 /**
  * Render
  */
 public function render()
 {
     // process form submition
     /*
     $bypass = [];
     if (!empty($this->values['__form_submitted']) && !empty($this->values['__form_link']) && !empty($this->options['links'][$this->values['__form_link']])) {
     	$v2 = $this->options['links'][$this->values['__form_link']];
     	$options = $v2['options'] ?? [];
     	$options['input'] = $this->values;
     	$class = $v2['model'];
     	$model = new $class($options);
     	$this->options['links'][$this->values['__form_link']]['__value'] = $model->render();
     	// we need to process map
     	foreach ($this->options['links'] as $k => $v) {
     		if (empty($v['map'])) continue;
     		foreach ($v['map'] as $k2 => $v2) {
     			if ($k == $this->values['__form_link']) {
     				if (array_key_exists($v2, $model->form_object->values)) {
     					$this->values[$k2] = $bypass[$k2] = $model->form_object->values[$v2];
     				}
     			} else {
     				if (array_key_exists($k2, $model->form_object->values)) {
     					$this->values[$v2] = $bypass[$v2] = $model->form_object->values[$k2];
     				}
     			}
     		}
     	}
     }
     */
     // distribute
     $this->distribute();
     // render current screen
     $segment = null;
     $result = [];
     $index = 0;
     // sort rows in a screen
     $rows = $this->data[$this->collection_screen_link][$this::rows];
     array_key_sort($rows, ['order' => SORT_ASC]);
     foreach ($rows as $row_k => $row_v) {
         $forms = $row_v[$this::forms];
         array_key_sort($forms, ['order' => SORT_ASC]);
         // if its own segment
         if (!empty($row_v['options']['its_own_segment'])) {
             $index++;
             $result[$index] = ['segment' => $row_v['options']['segment'] ?? null, 'grid' => [], 'html' => null];
         }
         if (!isset($result[$index])) {
             $result[$index] = ['segment' => null, 'grid' => [], 'html' => null];
             if ($index == 0 && !empty($this->data[$this->collection_screen_link]['options']['segment'])) {
                 $result[$index]['segment'] = $this->data[$this->collection_screen_link]['options']['segment'];
             }
         }
         // render forms
         if (($row_v['options']['type'] ?? 'forms') == 'forms') {
             foreach ($forms as $form_k => $form_v) {
                 $class = $form_v['model'];
                 $model_options = $form_v['options'];
                 // we pass links to the form
                 $model_options['collection_link'] = $this->collection_link;
                 $model_options['collection_screen_link'] = $this->collection_screen_link;
                 $model_options['form_link'] = $form_k;
                 // input
                 $model_options['input'] = $this->values;
                 $model = new $class($model_options);
                 // render to grid
                 $result[$index]['grid']['options'][$row_k][$form_k][$form_k] = ['value' => $model->render(), 'options' => $form_v['options'], 'row_class' => $form_v['options']['row_class'] ?? null];
             }
         } else {
             if ($row_v['options']['type'] == 'tabs') {
                 // tabs
                 $tab_id = "form_collection_tabs_{$this->collection_link}_{$row_k}";
                 $tab_header = [];
                 $tab_values = [];
                 $tab_options = [];
                 $have_tabs = false;
                 foreach ($forms as $form_k => $form_v) {
                     $this->current_tab[] = "{$tab_id}_{$form_k}";
                     $labels = '';
                     foreach (['records', 'danger', 'warning', 'success', 'info'] as $v78) {
                         $labels .= html::label2(['type' => $v78 == 'records' ? 'primary' : $v78, 'style' => 'display: none;', 'value' => 0, 'id' => implode('__', $this->current_tab) . '__' . $v78]);
                     }
                     $tab_header[$form_k] = i18n(null, $form_v['options']['label_name']) . $labels;
                     $tab_values[$form_k] = 'test tab';
                     $have_tabs = true;
                     // process model
                     //$class = $form_v['model'];
                     // remove last element from an array
                     array_pop($this->current_tab);
                 }
                 // if we do not have tabs
                 if ($have_tabs) {
                     $result[$index]['html'] = html::tabs(['id' => $tab_id, 'header' => $tab_header, 'options' => $tab_values, 'tab_options' => $tab_options]);
                 }
             }
         }
     }
     // todo handle separator
     //$result[] = html::separator(['value' => $v2['separator']['title'], 'icon' => $v2['separator']['icon'] ?? '']);
     $html = '';
     foreach ($result as $k => $v) {
         if (!empty($v['grid'])) {
             $temp = html::grid($v['grid']);
         } else {
             $temp = $v['html'] ?? '';
         }
         if (!empty($v['segment'])) {
             $v['segment']['value'] = $temp;
             $temp = html::segment($v['segment']);
         }
         $html .= $temp;
     }
     return $html;
 }
예제 #5
0
 public function process($data, $options = [])
 {
     $temp = [];
     // we need to precess items that are controller and suboptions at the same time
     $subgroups = [];
     foreach ($data as $k => $v) {
         // determine acl
         if (!empty($v['sm_menuitm_acl_controller_id']) && !helper_acl::can_see_this_controller($v['sm_menuitm_acl_controller_id'], $v['sm_menuitm_acl_action_id'])) {
             unset($data[$k]);
             continue;
         }
         // go though each group
         for ($i = 1; $i <= 4; $i++) {
             if (!empty($v["g{$i}_code"])) {
                 $subgroups[$v["g{$i}_code"]] = true;
             }
         }
     }
     $subgroup_items = [];
     foreach ($data as $k => $v) {
         if (isset($subgroups[$v['sm_menuitm_code']])) {
             $subgroup_items[$v['sm_menuitm_code']] = $v;
             unset($data[$k]);
         }
     }
     // loop though data
     foreach ($data as $k => $v) {
         // loop though groups and add them to menu
         $key = [];
         for ($i = 1; $i <= 4; $i++) {
             if (!empty($v['g' . $i . '_code'])) {
                 $key[] = $v['g' . $i . '_code'];
                 // we need to set all groups
                 $temp2 = array_key_get($temp, $key);
                 if (is_null($temp2)) {
                     // if we have a controller that acts as submenu
                     if (!empty($subgroup_items[$v['g' . $i . '_code']])) {
                         $v9 = $subgroup_items[$v['g' . $i . '_code']];
                         array_key_set($temp, $key, ['code' => $v9['sm_menuitm_code'], 'name' => $v9['sm_menuitm_name'], 'name_extension' => null, 'icon' => $v9['sm_menuitm_icon'], 'url' => $v9['sm_menuitm_url'], 'order' => $v9['sm_menuitm_order'], 'options' => []]);
                     } else {
                         // if we do not have url we assume visitor wants to see extended menu
                         if (empty($v['g' . $i . '_url'])) {
                             $params = [];
                             for ($j = 1; $j <= $i; $j++) {
                                 $params['group' . $j . '_code'] = $v['g' . $j . '_code'];
                             }
                             $v['g' . $i . '_url'] = '/numbers/backend/system/menu/controller/menu?' . http_build_query2($params);
                         }
                         array_key_set($temp, $key, ['code' => $v['g' . $i . '_code'], 'name' => $v['g' . $i . '_name'], 'icon' => $v['g' . $i . '_icon'], 'order' => $v['g' . $i . '_order'], 'url' => $v['g' . $i . '_url'], 'options' => []]);
                     }
                 }
                 $key[] = 'options';
             }
         }
         // some replaces
         $name_extension = null;
         if ($v['sm_menuitm_code'] == 'entites.authorization.__entity_name') {
             $name_extension = '<b>' . session::get(['numbers', 'entity', 'em_entity_name']) . '</b>';
         }
         // finally we need to add menu item to the array
         $key[] = $v['sm_menuitm_code'];
         array_key_set($temp, $key, ['code' => $v['sm_menuitm_code'], 'name' => $v['sm_menuitm_name'], 'name_extension' => $name_extension, 'icon' => $v['sm_menuitm_icon'], 'url' => $v['sm_menuitm_url'], 'order' => $v['sm_menuitm_order'], 'options' => []]);
         // options generator
         if (!empty($v['sm_menuitm_options_generator'])) {
             $temp3 = explode('::', $v['sm_menuitm_options_generator']);
             $temp_data = factory::model($temp3[0])->{$temp3[1]}();
             $temp_key = $key;
             $temp_key[] = 'options';
             foreach ($temp_data as $k2 => $v2) {
                 $temp_key2 = $temp_key;
                 $temp_key2[] = $k2;
                 array_key_set($temp, $temp_key2, $v2);
             }
         }
     }
     // sorting
     foreach ($temp as $k => $v) {
         if (!empty($v['options'])) {
             foreach ($v['options'] as $k2 => $v2) {
                 if (!empty($v2['options'])) {
                     foreach ($v2['options'] as $k3 => $v3) {
                         if (!empty($v3['options'])) {
                             foreach ($v3['options'] as $k4 => $v4) {
                                 if (!empty($v4['options'])) {
                                     array_key_sort($temp[$k]['options'][$k2]['options'][$k3]['options'][$k4]['options'], ['order' => SORT_ASC], ['order' => SORT_NUMERIC]);
                                 }
                             }
                             array_key_sort($temp[$k]['options'][$k2]['options'][$k3]['options'], ['order' => SORT_ASC], ['order' => SORT_NUMERIC]);
                         }
                     }
                     array_key_sort($temp[$k]['options'][$k2]['options'], ['order' => SORT_ASC], ['order' => SORT_NUMERIC]);
                 }
             }
             array_key_sort($temp[$k]['options'], ['order' => SORT_ASC], ['order' => SORT_NUMERIC]);
         }
     }
     // sort root
     array_key_sort($temp, ['order' => SORT_ASC], ['order' => SORT_NUMERIC]);
     return $temp;
 }
예제 #6
0
 /**
  * Get data
  *
  * @param array $options
  *		where - array of conditions
  *		pk - primary key to be used by query
  *		orderby - array of columns to sort by
  * @return array
  */
 public function get($options = [])
 {
     // get available data types
     if (get_called_class() == 'object_data_types') {
         $types = $this->data;
     } else {
         $types = object_data_types::get_static();
     }
     // transform data
     $result = [];
     foreach ($this->data as $k => $v) {
         foreach ($this->columns as $k2 => $v2) {
             if ($this->column_key == $k2) {
                 $result[$k][$k2] = $k;
             } else {
                 if (!array_key_exists($k2, $v)) {
                     $result[$k][$k2] = $v2['default'] ?? $types[$v2['type']]['no_data_type_default'] ?? null;
                 } else {
                     $result[$k][$k2] = $v[$k2];
                 }
             }
         }
     }
     // filtering
     if (!empty($options['where'])) {
         foreach ($result as $k => $v) {
             $found = true;
             foreach ($options['where'] as $k2 => $v2) {
                 // todo: add options ad in query
                 if (array_key_exists($k2, $v) && $v[$k2] != $v2) {
                     $found = false;
                     break;
                 }
             }
             if (!$found) {
                 unset($result[$k]);
             }
         }
     }
     // sorting, if none specified we sort by name if its in columns
     $orderby = null;
     if (isset($options['orderby'])) {
         $orderby = $options['orderby'];
     } else {
         if (isset($this->orderby)) {
             $orderby = $this->orderby;
         } else {
             if (isset($this->columns[$this->column_prefix . 'name'])) {
                 $orderby = [$this->column_prefix . 'name' => SORT_ASC];
             }
         }
     }
     if (!empty($orderby)) {
         $method = [];
         foreach ($orderby as $k => $v) {
             $type = $types[$this->columns[$k]['type']]['php_type'];
             if ($type == 'integer' || $type == 'float') {
                 $method[$k] = SORT_NUMERIC;
             }
         }
         array_key_sort($result, $orderby, $method);
     }
     // if we have primary key
     $pk = $options['pk'] ?? $this->pk;
     if (!empty($pk)) {
         pk($pk, $result);
     }
     return $result;
 }
예제 #7
0
파일: db.php 프로젝트: pksunkara/pdql
 protected function deletefrom($table, $limit, $order, $where)
 {
     $flag = true;
     $row = null;
     $cond = changetoLogic($where);
     $fp = fopen(self::$db . "mysql", "r");
     while (fscanf($fp, "%s\n", $hash)) {
         $tbarr = $this->json->decode($hash);
         if ($tbarr->name == $table) {
         }
         $tbf = self::$db . $table;
         break;
     }
     if (!empty($tbf)) {
         $tbfp = fopen($tbf, "a+");
         $tbfl = $tbarr->fields;
         $tbvl = array();
         $tblf = array();
         while (fscanf($tbfp, "%s", $hash)) {
             if (!empty($hash)) {
                 $row_orig = $this->json->decode($hash);
                 $row = make_assoc_array($tbfl, $row_orig);
                 if (!empty($cond)) {
                     eval("\$flag = (" . $cond . ");");
                 } else {
                     $flag = true;
                 }
                 if (!$flag) {
                     array_push($tbvl, $row_orig);
                 } else {
                     array_push($tblf, $row_orig);
                 }
             }
             $flag = true;
             $hash = null;
         }
         $order[0] = get_key_index($tbfl, $order[0]);
         if (count($order) == 2) {
             if (strtolower($order[1]) == "asc") {
                 $tblf = array_key_sort($tblf, $order[0]);
             } else {
                 if (strtolower($order[1]) == "desc") {
                     $tblf = array_key_rsort($tblf, $order[0]);
                 }
             }
         }
         if (!empty($limit[0])) {
             for ($i = 0; !empty($tblf[$i]); $i++) {
                 if ($i < $limit[0] || $i >= $limit[1]) {
                     array_push($tbvl, $tblf[$i]);
                 }
             }
         }
         $tbfp = fopen($tbf, "w");
         foreach ($tbvl as $id => $arr) {
             fwrite($tbfp, $this->json->encode($arr) . "\n");
         }
     }
 }
예제 #8
0
 /**
  * Render actions
  *
  * @return string
  */
 private function render_actions()
 {
     // sorting first
     array_key_sort($this->actions, ['sort' => SORT_ASC], ['sort' => SORT_NUMERIC]);
     // looping through data and building html
     $temp = [];
     foreach ($this->actions as $k => $v) {
         $icon = !empty($v['icon']) ? html::icon(['type' => $v['icon']]) . ' ' : '';
         $onclick = !empty($v['onclick']) ? $v['onclick'] : '';
         $value = !empty($v['value']) ? i18n(null, $v['value']) : '';
         $href = $v['href'] ?? 'javascript:void(0);';
         $temp[] = html::a(array('value' => $icon . $value, 'href' => $href, 'onclick' => $onclick));
     }
     return implode(' ', $temp);
 }
예제 #9
0
 /**
  * Render actions
  * 
  * @return string
  */
 public static function render_actions()
 {
     $result = '';
     $data = application::get(array('layout', 'bar_action'));
     if (!empty($data)) {
         // sorting first
         array_key_sort($data, ['orderby' => SORT_ASC], ['orderby' => SORT_NUMERIC]);
         // looping through data and building html
         $temp = array();
         foreach ($data as $k => $v) {
             $icon = !empty($v['icon']) ? html::icon(['type' => $v['icon']]) . ' ' : '';
             $onclick = !empty($v['onclick']) ? $v['onclick'] : '';
             $value = !empty($v['value']) ? $v['value'] : '';
             $href = $v['href'] ?? 'javascript:void(0);';
             $temp[] = html::a(array('value' => $icon . $value, 'href' => $href, 'onclick' => $onclick));
         }
         $result = implode(' ', $temp);
     }
     return $result;
 }