Allow passing an array of keys/values to getUrl()

getUrl()을 호출할 때 파라미터 이름과 파라미터 값을 풀어서 각각의 파라미터로
넘길 필요 없이, 하나의 연관배열로 넘길 수 있도록 허용합니다.

    $args = array(
        'mid' => $mid,
        'document_srl' => $document_srl,
    );

    getUrl($args);

이 문법을 사용하면 맨 앞에 빈 문자열을 넘겼을 때와 마찬가지로 기존의 URL
파라미터들은 모두 초기화됩니다. 즉 아래와 동일한 효과입니다.

    getUrl('', 'mid', $mid, 'document_srl', $document_srl);

기존의 URL 파라미터들을 남겨놓으려면 기존 방식대로 풀어서 써야 합니다.
This commit is contained in:
Kijin Sung 2020-05-18 19:41:06 +09:00
parent 3430e21be4
commit 586f010f55
3 changed files with 53 additions and 34 deletions

View file

@ -1646,39 +1646,58 @@ class Context
$domain = null;
}
// Get URL parameters. If the first argument is '', reset existing parameters.
if (!self::$_get_vars || strval($args_list[0]) === '')
// Get existing parameters from the current request.
$get_vars = self::$_get_vars ? get_object_vars(self::$_get_vars) : array();
// If $args_list is not an array, reset it to an empty array.
if (!is_array($args_list))
{
$args_list = array();
}
// If the first argument is '', reset existing parameters.
if (strval($args_list[0]) === '')
{
array_shift($args_list);
$get_vars = array();
if(is_array($args_list) && strval($args_list[0]) === '')
{
array_shift($args_list);
}
}
elseif ($_SERVER['REQUEST_METHOD'] === 'GET')
{
$get_vars = get_object_vars(self::$_get_vars);
}
else
// Otherwise, only keep existing parameters that are safe.
elseif ($_SERVER['REQUEST_METHOD'] !== 'GET')
{
$preserve_vars = array('module', 'mid', 'act', 'page', 'document_srl', 'search_target', 'search_keyword');
$preserve_keys = array_combine($preserve_vars, array_fill(0, count($preserve_vars), true));
$get_vars = array_intersect_key(get_object_vars(self::$_get_vars), $preserve_keys);
$get_vars = array_intersect_key($get_vars, $preserve_keys);
}
// arrange args_list
for($i = 0, $c = count($args_list); $i < $c; $i += 2)
// If $args_list contains one array, reset existing parameters and use keys & values from $args_list.
if (is_array($args_list[0]) && count($args_list) == 1)
{
$key = $args_list[$i];
$val = trim($args_list[$i + 1]);
// If value is not set, remove the key
if(!isset($val) || !strlen($val))
foreach ($args_list[0] as $key => $val)
{
unset($get_vars[$key]);
continue;
$val = trim($val);
if ($val !== '')
{
$get_vars[$key] = $val;
}
}
}
// Otherwise, use alternating members of $args_list as keys and values, respectively.
else
{
$num_args = count($args_list);
for($i = 0; $i < $num_args; $i += 2)
{
$key = $args_list[$i];
$val = trim($args_list[$i + 1]);
if ($val === '')
{
unset($get_vars[$key]);
}
else
{
$get_vars[$key] = $val;
}
}
// set new variables
$get_vars[$key] = $val;
}
// remove vid, rnd

View file

@ -20,11 +20,11 @@
<a class="default_header" href="javascript:void()"><i class="xi xi-cog"></i></a>
</h1>
<p class="site" cond="$this->user->isAdmin()">
<a href="{getUrl('module', 'admin', 'act', $act, 'module_srl', $module_info->module_srl, 'mid', '')}">{lang('admin.view_in_manager_layout')}</a>
<a href="{getUrl(['module' => 'admin', 'act' => $act, 'module_srl' => $module_info->module_srl])}">{lang('admin.view_in_manager_layout')}</a>
</p>
<!--@else-->
<h1>
<a class="default_header" href="{getUrl('','module','admin')}"><i class="xi xi-cog"></i></a>
<a class="default_header" href="{getUrl(['module' => 'admin'])}"><i class="xi xi-cog"></i></a>
<a class="mobile_menu_open" href="#gnbNav"><i class="xi xi-bars"></i></a>
</h1>
<p class="site"><a href="{$xe_default_url}">{$site_module_info->settings->title ?: $xe_default_url|autolang}</a></p>
@ -32,15 +32,15 @@
<div class="account">
<ul>
<!--@if($module_manager)-->
<li><a href="{getUrl('', 'mid', $mid, 'act', 'dispMemberInfo')}">{$logged_info->nick_name}</a></li>
<li><a href="{getUrl('', 'mid', $mid, 'act', 'dispMemberLogout')}">{$lang->cmd_logout}</a></li>
<li><a href="{getUrl(['mid' => $mid, 'act' => 'dispMemberInfo'])}">{$logged_info->nick_name}</a></li>
<li><a href="{getUrl(['mid' => $mid, 'act' => 'dispMemberLogout'])}">{$lang->cmd_logout}</a></li>
<!--@else-->
<li><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminInfo', 'member_srl', $logged_info->member_srl)}">{$logged_info->nick_name}</a></li>
<li><a href="{getUrl('', 'module', 'admin', 'act', 'procAdminLogout')}">{$lang->cmd_logout}</a></li>
<li><a href="{getUrl(['module' => 'admin', 'act' => 'dispMemberAdminInfo', 'member_srl' => $logged_info->member_srl])}">{$logged_info->nick_name}</a></li>
<li><a href="{getUrl(['module' => 'admin', 'act' => 'procAdminLogout'])}">{$lang->cmd_logout}</a></li>
<!--@end-->
<li><a href="#lang" class="lang" data-toggle>{$lang_supported[$lang_type]}</a>
<ul id="lang" class="x_dropdown-menu">
<li loop="$lang_supported=>$key,$val" class="x_active"|cond="$key==$lang_type"><a href="{getUrl('l',$key)}" data-langcode="{$key}" onclick="doChangeLangType('{$key}'); return false;">{$val}</a></li>
<li loop="$lang_supported=>$key,$val" class="x_active"|cond="$key==$lang_type"><a href="#lang" data-langcode="{$key}" onclick="doChangeLangType('{$key}'); return false;">{$val}</a></li>
</ul>
</li>
</ul>
@ -64,18 +64,18 @@
<a href="#favorite" data-href="favorite" title="{$lang->favorite}"><span class="tx">{$lang->favorite}</span></a>
<ul id="favorite" style="display:block"|cond="$_COOKIE['__xe_admin_gnb_tx_favorite'] == 'open'">
<li loop="$favorite_list => $favorite">
<a cond="$favorite->title" href="{getUrl('', 'module', 'admin', 'act', $favorite->admin_index_act)}" title="{$favorite->title}">{$favorite->title}</a>
<a cond="$favorite->title" href="{getUrl(['module' => 'admin', 'act' => $favorite->admin_index_act])}" title="{$favorite->title}">{$favorite->title}</a>
<a cond="!$favorite->title">{$lang->msg_not_founded}</a>
<form class="remove" action="./" method="post">
<input type="hidden" name="module" value="admin" />
<input type="hidden" name="act" value="procAdminToggleFavorite" />
<input type="hidden" name="site_srl" value="0" />
<input type="hidden" name="module_name" value="{$favorite->module}" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin')}" />
<input type="hidden" name="success_return_url" value="{getUrl(['module' => 'admin'])}" />
<button type="submit" class="x_close" title="{$lang->cmd_delete}">&times;</button>
</form>
</li>
<li cond="!is_array($favorite_list) || count($favorite_list) < 1"><a href="{getUrl('', 'module', 'admin', 'act', 'dispModuleAdminContent')}">{$lang->no_data}</a></li>
<li cond="!is_array($favorite_list) || count($favorite_list) < 1"><a href="{getUrl(['module' => 'admin', 'act' => 'dispModuleAdminContent'])}">{$lang->no_data}</a></li>
</ul>
</li>
<!--@end-->

View file

@ -24,7 +24,7 @@
<div class="message error" cond="$db_info->use_sitelock == 'Y'">
<h2>{$lang->sitelock_in_use}</h2>
<p>{$lang->about_sitelock_in_use} <a href="{getUrl('', 'module', 'admin', 'act', 'dispAdminConfigSitelock')}">{$lang->cmd_configure}</a></p>
<p>{$lang->about_sitelock_in_use} <a href="{getUrl(['module' => 'admin', 'act' => 'dispAdminConfigSitelock'])}">{$lang->cmd_configure}</a></p>
</div>
<div class="message update" cond="$addTables || $needUpdate">