Files
xstore/inc/Hura8/System/Controller/UrlManagerController.php

243 lines
6.8 KiB
PHP
Raw Permalink Normal View History

2025-10-04 11:46:59 +07:00
<?php
namespace Hura8\System\Controller;
use Hura8\Interfaces\AppResponse;
use Hura8\System\IDGenerator;
use Hura8\System\Language;
use Hura8\System\Model\UrlModel;
use Hura8\System\Url;
use Hura8\Traits\ClassCacheTrait;
class UrlManagerController
{
use ClassCacheTrait;
/* @var UrlModel $objUrlModel */
protected $objUrlModel;
public function __construct() {
$this->objUrlModel = new UrlModel();
}
public function createRedirect($info) {
$request_path = $info['request_path'] ?? '';
$redirect_code = $info['redirect_code'] ?? 0;
$redirect_url = $info['redirect_url'] ?? '';
if(!$request_path || !$redirect_url) {
return false;
}
$request_path_element = Url::parse($request_path);
$request_path_path = $request_path_element['path'];
// home page or itself is forbidden
if($request_path_path == '/' || $request_path_path == $redirect_url) {
return false;
}
return $this->objUrlModel->create([
"url_type" => "redirect",
"request_path" => $request_path_path,
"redirect_code" => $redirect_code,
"redirect_url" => $redirect_url,
]);
}
public function getInfo($id) : ?array {
return $this->objUrlModel->getInfo($id);
}
public function getEmptyInfo($addition_field_value = []) : array {
return $this->objUrlModel->getEmptyInfo($addition_field_value);
}
public function getList(array $condition) : array
{
return $this->objUrlModel->getList($condition);
}
public function getTotal(array $condition) : int
{
return $this->objUrlModel->getTotal($condition);
}
public function deleteByRequestPath($request_path) {
$this->objUrlModel->deleteByRequestPath($request_path);
}
public static function translateRequestPathConfig(
$request_path_config, // "/%extra_path%/%item_index%/ac%item_id%.html",/
$item_id = '',
$item_index = '',
$extra_path = ''
) {
$item_index = static::create_url_index($item_index); //reclean url index
$new_url = str_replace(
array('%item_id%', '%item_index%', '%extra_path%',),
array($item_id, $item_index, $extra_path),
$request_path_config
);
return str_replace("//","/",$new_url);
}
public static function create_url_index($name, $vietnamese=true){
if($vietnamese) $name = Language::chuyenKhongdau($name);
$name = preg_replace("/[^a-z0-9\s_\-]/i", " ", $name);
$name = preg_replace("/\s+/i", " ", $name);
$name = str_replace(" ","-", trim($name));
$name = preg_replace("/-+/","-", $name);
if (!defined("BUILD_URL_INDEX_LOWERCASE") || BUILD_URL_INDEX_LOWERCASE) {
return strtolower($name);
}
return $name;
}
public function getUrlMetaInfo($request_path){
return $this->objUrlModel->getUrlMetaInfo($request_path);
}
public function createUrlMeta(array $info){
return $this->objUrlModel->createUrlMeta($info);
}
public function getUrlInfoByRequestPath($request_path) {
$info = $this->objUrlModel->getUrlByRequestPath($request_path);
if($info){
$id_path_content = $this->analyze_url_id_path($info['id_path']);
$id_path_content['option'] = $id_path_content['module'];
//$id_path_content['redirect_code'] = $info['redirect_code'];
//$id_path_content['request_path'] = $info['request_path'];
return array_merge($info, $id_path_content);
}
return false;
}
///module:product/view:category/view_id:1/brand_id:55/type:hello-ther
//return:
/*
[
"module" => "product",
"view" => "category",
"view_id" => "1",
'query' => [
"brand_id" => 55,
"type" => "hello-ther",
],
],
* */
protected function analyze_url_id_path($id_path) : array
{
$id_path_ele = explode("/", $id_path);
$result = array();
$query_string = array();
foreach ( $id_path_ele as $ele ) {
if(!$ele) continue;
$ele_part = explode(":", $ele);
if(!in_array($ele_part[0], array('module', 'view', 'view_id'))) {
$query_string[$ele_part[0]] = $ele_part[1];
}else{
$result[$ele_part[0]] = $ele_part[1];
}
}
$result['query'] = $query_string;
return $result;
}
public static function createIdPath($module, $view, $view_id, array $other_list = []): string
{
$parameter_constr = [
"module:".$module,
"view:".$view,
"view_id:".$view_id,
];
foreach($other_list as $arg => $value) {
$parameter_constr[] = $arg.":".$value;
}
return "/".join("/", $parameter_constr);
}
/**
* @description create or update url's $request_path by checking $id_path. $new_request_path will return to be updated to item's entity
* @param string $url_type $module:$view
* @param string $wanted_request_path
* @param string $id_path
* @param string $redirect_code
* @return ?string $wanted_request_path or new $request_path if the path already exists
*/
public function createUrl(string $url_type, string $wanted_request_path, string $id_path, $redirect_code=0) : ?string
{
$new_request_path = $this->createUniqueRequestPath($wanted_request_path, $id_path);
$check_id_path_exist = $this->objUrlModel->getUrlByIdPath($id_path);
if($check_id_path_exist) {
$res = $this->objUrlModel->update($check_id_path_exist['id'], [
'request_path' => $new_request_path ,
]);
} else {
$res = $this->objUrlModel->create([
'url_type' => $url_type,
'request_path' => $new_request_path ,
'id_path' => $id_path,
'redirect_code' => $redirect_code,
]);
}
return ($res->getStatus() == AppResponse::SUCCESS) ? $new_request_path : null;
}
//create a unique request-path
protected function createUniqueRequestPath(string $wanted_request_path, string $id_path) : string
{
$check_exist = $this->objUrlModel->getUrlByRequestPath($wanted_request_path);
//ok, can use this one
if(!$check_exist || $check_exist['id_path'] == $id_path ) {
return $wanted_request_path;
}
//other case, create new path and check again
$random_suffix = IDGenerator::createStringId(4, true);
$new_request_path = $wanted_request_path . '-'.$random_suffix;
return $this->createUniqueRequestPath($new_request_path, $id_path);
}
}