我喜欢多页表单中的一百个表单元素,我必须检查是否定义了某些会话变量。
主要的是我在会话中通过CONSTANT然后使用字段键来设置子命名空间。
有一些捷径可以吗?说,
<input value="<?php echo isset($_SESSION[CONSTANT]['fields']['first_name']) ? $_SESSION[CONSTANT]['fields']['first_name'] : ''; ?>">
我怀疑我可以循环这个,因为我的结构不是由兄弟输入元素组成,而是非常非常自定义的标记,不能在循环结构中控制。
也许我可以使用Zend Session或类似的东西,最后的方法是键入一个变量以替换我的文本编辑器,例如$ s ['first_name']并替换所有$ s实例。
答案 0 :(得分:6)
自己写一个快捷方式。
function s($key) {
return isset($_SESSION[CONSTANT]['fields'][$key]) ? $_SESSION[CONSTANT]['fields'][$key] : '';
}
$foo = s('first_name');
答案 1 :(得分:3)
试试这个:
function sessionOrBlank() {
$args = func_get_args();
if (count($args) < 0) {
return '';
}
$argCtr = 0;
$argPtr =& $_SESSION;
do {
if (!isset($argPtr[$args[$argCtr]])) {
return '';
}
$argPtr =& $argPtr[$args[$argCtr++]];
} while($argCtr < count($args));
return $argPtr;
}
然后使用:
<input value="<?php echo sessionOrBlank(CONSTANT,'fields','first_name'); ?>">
按照您希望搜索数组的顺序将参数传递给此函数。例如,如果您要搜索$_SESSION['foo']['bar']
,请使用sessionOrBlank('foo','bar');
。
不完全确定您的意思,但此函数的行为与前一个函数类似,不同之处在于它会将传递给它的最后一个参数视为要设置的值。它还将返回它设置的值,因此使用此函数的结果与赋值表达式(通常)的结果相同。它不应该允许覆盖整个会话变量,但如果它们确实存在,它将覆盖当前不是数组的任何键,或者如果它们不存在则将补充现有数组。享受。
function setSession() {
$args = func_get_args();
if (count($args) < 1) {
return false; // don't overwrite whole session
}
$argCtr = 0;
$argPtr =& $_SESSION;
do {
if (!isset($argPtr[$args[$argCtr]]) || !is_array($argPtr[$args[$argCtr]])) {
$argPtr[$args[$argCtr]] = array();
}
$argPtr =& $argPtr[$args[$argCtr++]];
} while($argCtr < count($args) - 1);
$argPtr = $args[$argCtr];
return $argPtr;
}
答案 2 :(得分:1)
我有这个类,它可以处理命名空间:
class Core_Session extends Singleton{
/**
* Core_Session::getVar($varname,$context='global',...mas contextos)
*
* @param mixed $varname nombre de la variable
* @param mixed $context contexto en el que se llama
* @return valor de la variable (null si no existe o si estan mal los parametros)
*/
public static function listContextVars($context='global'){
$contexts = func_get_args();
if(count($contexts)==1&&is_array($contexts[0]))
$contexts = $contexts[0];
$values = &$_SESSION;
foreach($contexts as $context){
if(!isset($values[$context]))
return(null);
$values = &$values[$context];
}
return(array_keys($values));
}
public static function listContextValues($modo='array', $context='global'){
$contexts = func_get_args();
$contexts = array_slice($contexts, 1);
if(count($contexts)==1&&is_array($contexts[0]))
$contexts = $contexts[0];
$values = &$_SESSION;
foreach($contexts as $context){
if(!isset($values[$context])){
return(null);
}
$values = &$values[$context];
}
switch($modo){
case 'array':{
$ret = array();
foreach($values as $varname=>$value){
$ret[] = array(
'varname'=>$varname,
'value'=>self::getVarMulticontext($varname, $contexts)
);
}
break;
}
case 'Core_Object':{
$ret = array();
foreach($values as $varname=>$value){
$oret = new Core_Object();
$oret->setVarname($varname);
$oret->setValue(self::getVarMulticontext($varname, $contexts));
//$oret->setData($varname, self::getVarMulticontext($varname, $contexts));
$ret[] = $oret;
}
}
}
return($ret);
}
public static function getVar($varname, $context='global'){
if(isset($context)&&is_string($context)){
$args = func_get_args();
$contexts = array_slice($args, 1);
return(self::getVarMulticontext($varname, $contexts));
}
return(null);
}
public static function getVarMulticontext($varname, $contexts=array()){
if(!is_array($contexts)||!count($contexts))
return(null);
if($varname!=null)
$contexts = array_merge($contexts, array($varname));
$values = &$_SESSION;
foreach($contexts as $context){
if(!isset($values[$context]))
return(null);
$values = &$values[$context];
}
if($values===null)
return($values);
return(unserialize($values));
}
/**
* Core_Session::setVar()
*
* @param mixed $varname nombre de la variable
* @param mixed $value valor a setear
* @param string $context contexto en el que se llama
* @return true si esta bien, false si no
*/
public static function setVar($varname, $value, $context='global'){
if(isset($context)&&is_string($context)){
/*if(is_object($value))*/
$args = func_get_args();
$contexts = array_slice($args, 2);
return(self::setVarMulticontext($varname, $value, $contexts));
}
return(false);
}
public static function setVarMulticontext($varname, $value, $contexts=array()){
if(!is_array($contexts)||!count($contexts))
return(null);
if($varname!=null)
$contexts = array_merge($contexts, array($varname));
$parent_context = null;
$values = &$_SESSION;
//var_dump($contexts);
foreach($contexts as $context){
$parent_context = &$values;
$values = &$values[$context];
}
if($value==null){
//$values = null;
$find = array_search($context, array_keys($parent_context));
if($find!==null && $find!==false){
array_splice($parent_context, $find, 1 );
}
}
else
$values = serialize($value);
return(true);
}
public function getInstance(){
return(self::getInstanceOf(__CLASS__));
}
}
答案 3 :(得分:0)
然后我会把那些“子命名空间”扔掉。我的意思是,在一个正确的html表单中,你会给每个输入元素一个名字(现在也是一个id),为什么不使用 - 那个?我的意思是,为什么要关心这些东西如何存储在会话中?只要您可以毫不含糊地设置和获取,我就不明白为什么您必须通过添加另一个级别来使其变得更复杂。
答案 4 :(得分:0)
$var = & $_SESSION[CONSTANT]['fields'];
echo $var['first_name'];