/** * Generate url * * @param array $options * controller - array or string controller parts * action - string action * id - mixed id * virtual - boolean flag * tinyurl - whether to generate tinuurl * full - boolean flag * get_params - array of GET parameters * @return string */ public static function get($options = []) { // we need to fix controller, action and id $controller = $options['controller'] ?? ''; if (is_array($controller)) { $controller = implode('/', $controller); } $controller = rtrim($controller, '/'); $action = $options['action'] ?? null; $id = $options['id'] ?? null; // processing virtual if (!empty($options['virtual'])) { $virtual_object = new object_virtual_controllers(); $virtual_data = $virtual_object->get(); foreach ($virtual_data as $k => $v) { if ($v['no_virtual_controller_path'] == $controller) { $controller = '/__' . $v['no_virtual_controller_code']; break; } } } // assembling $result = ''; $host = ''; if (!empty($options['full'])) { $host = rtrim(request::host(), '/'); } $result .= $host; $result .= $controller; if (!empty($id) && empty($action)) { $action = 'index'; } if (!empty($action)) { $result .= '/_' . $action; } if (!empty($id)) { $result .= '/' . $id; } // if we have GET parameters if (!empty($options['get_params'])) { $result .= '?' . http_build_query2($options['get_params']); } // if we need to generate tinyurl if (!empty($options['tinyurl'])) { $tinyurl_result = url_tinyurl::set($result); if ($tinyurl_result['success']) { $result = $host . '/__tinyurl/_i/' . $tinyurl_result['data']['hash']; } } return $result; }
/** * Parse request string into readable array * * @param string $url * @return array */ public static function mvc($url = '') { $result = array('controller' => '', 'controller_extension' => '', 'action' => '', 'id' => 0, 'controllers' => []); // remove an extra backslashes from left side $request_uri = explode('?', trim($url, '/')); $request_uri = $request_uri[0]; // determine action and controller $parts = explode('/', $request_uri); // virtual controller if (substr($parts[0], 0, 2) == '__') { $virtual_object = new object_virtual_controllers(); $virtual_data = $virtual_object->get(); $key = substr($parts[0], 2); if (isset($virtual_data[$key])) { $temp = $parts; unset($temp[0]); $parts = explode('/', trim($virtual_data[$key]['no_virtual_controller_path'], '/')); foreach ($temp as $v) { $parts[] = $v; } } } $flag_action_found = false; foreach ($parts as $v) { if ($v . '' == '') { continue; } if (isset($v[0]) && $v[0] == '_' && !$flag_action_found) { $flag_action_found = true; $result['action'] = substr($v, 1); continue; } if (!$flag_action_found) { $result['controllers'][] = $v; } if ($flag_action_found) { $result['id'] = $v; break; } } // set default values for action and controller if (empty($result['controllers'])) { $result['controllers'][] = 'index'; } else { // processing controller extension end($result['controllers']); $key = key($result['controllers']); $last = $result['controllers'][$key]; if (strpos($last, '.')) { $temp = explode('.', $last); $result['controllers'][$key] = $temp[0]; unset($temp[0]); $result['controller_extension'] = implode('.', $temp); } } $result['controller'] = '/' . implode('/', $result['controllers']); $result['controller'] = str_replace('_', '/', $result['controller']); if (empty($result['action'])) { $result['action'] = 'index'; } // full string $result['full'] = $result['controller'] . '/_' . $result['action']; return $result; }