/** * 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; }
/** * 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; }
/** * 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); }
/** * 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; }
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; }
/** * 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; }
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"); } } }
/** * 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); }
/** * 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; }