Ярлык для установки / получения переменных в $ _SESSION? - PullRequest
0 голосов
/ 11 февраля 2010

У меня около сотни элементов формы в многостраничной форме, и я должен проверить, были ли определенные переменные сеанса определены или нет.

Главное, чтобы у меня в сеансах были подпространства имен с помощью CONSTANT, а затем ключа поля.

Есть ли ярлык для этого? Скажем,

<input value="<?php echo isset($_SESSION[CONSTANT]['fields']['first_name']) ? $_SESSION[CONSTANT]['fields']['first_name'] : ''; ?>">

Я сомневаюсь, что мог бы зациклить это, потому что моя структура не состоит из элементов ввода одного уровня, а очень, очень настраиваемой разметки, которой нельзя управлять внутри структуры цикла.

Возможно, я мог бы использовать Zend Session или что-то подобное, в крайнем случае можно было бы ввести переменную, которую нужно заменить в моем текстовом редакторе, например, $ s ['first_name'], и заменить все экземпляры $ s.

Ответы [ 5 ]

6 голосов
/ 11 февраля 2010

Напишите ярлык самостоятельно.

function s($key) {
    return isset($_SESSION[CONSTANT]['fields'][$key]) ? $_SESSION[CONSTANT]['fields'][$key] : '';
}
$foo = s('first_name');
3 голосов
/ 11 февраля 2010

Попробуйте это:

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;
}
1 голос
/ 11 февраля 2010

У меня есть этот класс, он может обрабатывать пространства имен:

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__));
    }
}
0 голосов
/ 11 февраля 2010
$var = & $_SESSION[CONSTANT]['fields'];
echo $var['first_name'];
0 голосов
/ 11 февраля 2010

Я бы тогда бросил эти "подпространства имен". Я имею в виду, что в правильной html-форме вы бы в любом случае дали каждому элементу ввода имя (а в настоящее время и идентификатор), почему бы не использовать - это? Я имею в виду, зачем все эти вещи хранятся в сессии? Пока вы можете однозначно установить и получить, я не понимаю, почему вы должны усложнить его, добавив еще один уровень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...