Алтернатива за запис/задаване/промяна на стойности в потребителска сесия в Symfony 1.4 при използване на AJAX за извикване на контролери?

Започнах тази публикация за да знам как мога да получа/задам стойности от потребителската сесия (Symfony 1.4). Get работи перфектно, но Set никога не работи. Виждам в режима за отстраняване на грешки, че глобалната сесия ($_SESSION) е актуализирана, но потребителската сесия не. Опитах по този начин и по този начин и още едно и поне this... Без успех. Никога не съм чел за такъв бъг от Symfony 1.4. Използвам като браузър (linux) Firefox и Chrome (тествах го и в анонимния раздел).

Debug Modus User изглежда така:

attributeHolder:
myNS: { 
     aValue: '15', 
     ns_15: { 
         Tel: '78568951', 
         myID: '15', 
         anotherID: '120', 
         anArray: [{ 
             arrayID: '78', 
             Company: 'myComp'
         }] }, 
     ns_17: { ... } 
}

Мога да променя атрибута aValue, да го изтрия и вмъкна отново. Но ns_15 или ns_17 могат да бъдат изтрити или променени, но тази промяна не може да бъде засегната (symfony Debug Mode) Потребител, но само в $_SESSION (symfony Debug Modus Globals ) мога да видя актуализираните стойности.

Има ли друг начин за задаване/промяна/изтриване или запис на стойност в потребителска сесия със symfony 1.4 или това е грешка в Symfony?

РЕДАКТИРАНЕ1

Просто не го разбирам, докато не видя този Бъг и този Блог !! добре, използвам AJAX за извикване на контролера. Така че това може би е причината, поради която не мога да пиша на Session. Друг начин, по който наистина не мога да класифицирам sfWebResponse, защото действията ми вече са подклас sfActions. :(

РЕДАКТИРАНЕ 2

Тъй като Edit1 се опитах да направя това:

  $sessionData = $this->getUser()->getAttribute("ns_15", array(), "myNS");//all good
  $sessionData["Tel"] = "0111111110";
  var_dump($sessionData["Tel"]);//show me 0111111110
  $this->getUser()->setAttribute("ns_15", $sessionData, "myNS");
  $this->getUser()->shutdown();
  sfContext::getInstance()->getStorage()->shutdown();

Поведението с двукратно презареждане е разрешено, но все още не може да се записва в $_SESSION и USER SESSION. (Същият проблем също).


person 3logy    schedule 10.08.2012    source източник


Отговори (1)


Опитвам се да обобщя как можете да манипулирате потребителските атрибути (обърнете внимание, че това не е същото като модифицирането на $_SESSION global, вижте моя коментар тук, за да разберете защо).

// set a singe value in a namespace
$this->getUser()->setAttribute('aValue', 15, 'myNS');
// set an array in a namespace
$this->getUser()->setAttribute('ns_15', array('Tel' => '78568951', 'myID' => '15', 'anotherID' => '120', 'anArray' => array(array('arrayID' => '78', 'Company' => 'myComp'))), 'myNS');

// get the array from a namespace
$attributes = $this->getUser()->getAttribute('ns_15', array(), 'myNS');
// modify some value in the array
$attributes['Tel'] = '12345';
// remove some value from the array
unset($attributes['myID']);
// ... and save your changes back
$this->getUser()->setAttribute('ns_15', $attributes, 'myNS');
// remove the whole array from the namespase
$this->getUser()->getAttributeHolder()->remove('ns_15', null, 'myNS');
// remove the whole namespace
$this->getUser()->getAttributeHolder()->removeNamespace('myNS');

Можете също да получите достъп до цялото пространство от имена:

// get all attributes from a namespace
$allAttributes = $this->getUser()->getAttributeHolder()->getAll('myNS');
// manipulate the whole namespace here...
// ...and save your changes back
$this->getUser()->getAttributeHolder()->add($allAttributes, 'myNS');

Ако работите върху едно и също пространство от имена и искате да пропуснете параметъра за пространство от имена:

$originalDefaultNs = $this->getUser()->getAttributeHolder()->getDefaultNamespace();
$this->getUser()->getAttributeHolder()->setDefaultNamespace('myNS', false);
// ...
$attributes = $this->getUser()->getAttribute('ns_15', array());
// ...
// don't forget to set back the original ns
$this->getUser()->getAttributeHolder()->setDefaultNamespace($originalDefaultNS, false);

Знам, че е многословно, но мисля, че няма друг начин да го направя в symfony. Можете да вземете плячка в класа sfNamespacedParameterHolder, за да видите как работят тези функции.

person 1ed    schedule 10.08.2012
comment
Всички комплекти работят, но комплектът не работи! Направих редактиране! Мерси. - person 3logy; 10.08.2012