Manch mal hängt der code von einem user attribute ab, also will man das user attribute in seinem functional test überschreiben.
Das Problem ist das die doCall Methode in der sfBrowser Klasse den context neuerstellt und am ende die shutdown Methode für den user und die storage Objekte , zum schreiben der Session daten, aufruft.
Also muss man seine eigene Browser Klasse erstellen und die doCall Methode überschreiben und den code an den Anfang verschieben.
Browser Klasse:
class myBrowser extends sfBrowser
{
/**
* Calls a request to a uri.
*/
protected function doCall()
{
// manually shutdown user to save current session data
if (isset($this->context) AND $this->context->getUser())
{
$this->context->getUser()->shutdown();
$this->context->getStorage()->shutdown();
}
// recycle our context object
$this->context = $this->getContext(true);
sfConfig::set('sf_test', true);
// we register a fake rendering filter
sfConfig::set('sf_rendering_filter', array('sfFakeRenderingFilter', null));
$this->resetCurrentException();
// dispatch our request
ob_start();
$this->context->getController()->dispatch();
$retval = ob_get_clean();
// append retval to the response content
$this->context->getResponse()->setContent($retval);
}
}
Test code:
include dirname(__FILE__).'/../../bootstrap/functional.php';
$browser = new sfTestFunctional(new myBrowser());
$browser->
get('/site-one');
// override the session data
$browser->getUser()->setAttribute('key', $value);
$browser->
get('/site-one');
Wenn du bestimmt Felder oder Feldgruppen entfernen möchtest, wenn ein Benutzer nicht die dafür erforderlichen Rechte besitzt, musst du folgendes tun:
1. öffne deine action Klasse und füge folgendes ein:
public function preExecute()
{
parent::preExecute();
$this->configuration->setUser($this->getUser());
}
2. öffne die *GeneratorConfiguration Klasse und füge folgendes ein:
protected $user;
public function setUser($user)
{
$this->user = $user;
}
public function getUser()
{
return $this->user;
}
public function getEditDisplay()
{
$fieldsets = parent::getEditDisplay();
if (!$this->getUser()->hasCredential('admin'))
{
unset(
$fieldsets['Auth'][2], // field
$fieldsets['Rights'] // field group
);
}
return $fieldsets;
}
public function getNewDisplay()
{
... // see getEditDisplay
}
public function getFormOptions()
{
return array('user' => $this->getUser());
}
3. zuletzt öffne die *Form Klasse und füge folgendes ein:
public function configure()
{
...
if (!$this->getOption('user')->hasCredential('admin'))
{
unset($this['is_super_admin'], $this['groups_list'], $this['permissions_list']);
}
...
}
Wer seine XML Xliff Dateien gegen die dtd validiert hat oft das Problem, dass die einzelnen trans-unit Nodes keine oder eine bereits existierende id aufweisen. Um dieses Problem zu lösen hab ich mir ein kleines Skript gebaut.
fix_id.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <?php
$doc = new DOMDocument();
$doc->load($argv[1]);
$xpath = new DOMXPath($doc);
$query = '//trans-unit';
$entries = $xpath->query($query);
foreach ($entries as $i => $entry) {
$entry->setAttribute('id', $i+1);
}
$doc->save($argv[1]); |
Im symfony1 Hauptverzeichnis nun folgenden Befehl absetzen
for FILE in `find apps/*/i18n -name *\.xml`; do php fix_id.php $FILE; done;
Du hast ein Registrierungsformular mit einem Feld account_type und zwei eingebetteten Formularen Company und Address.
Du willst das eingebettete Company Formular entfernen, wenn das Feld account_type sfGuardUserProfile::TYPE_PRIVATE entspricht, andernfalls willst du das eingebettete Address Formular entfernen.
Die Lösung ist die bind Methode in deinem Formular zu überschreiben.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| public function bind(array $taintedValues = null, array $taintedFiles = null)
{
// unset request param and validator
if($taintedValues['account_type'] == sfGuardUserProfile::TYPE_PRIVATE)
{
unset(
$taintedValues['Company'],
$this->validatorSchema['Company']
);
}
else
{
unset(
$taintedValues['Address'],
$this->validatorSchema['Address']
);
}
parent::bind($taintedValues, $taintedFiles);
} |
Erstelle die Datei lib/gfFormHerlp.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| <?php
/**
* Some usefull form helper
*
* @package symfony
* @subpackage helper
* @author Gordon Franke <gfranke@nevalon.de>
* @link http://www.nevalon.de
*/
class gfFormHelper
{
/**
* Add * to required field labels
*
* @param sfForm $form
* @param string $symbol
* @param string $title
*
* @return void
*/
public static function addRequiredToLabel(sfForm $form, $symbol = '*', $title = 'This field is mandatory.')
{
$widgetSchema = $form->getWidgetSchema();
$validatorSchema = $form->getValidatorSchema();
foreach($form->getFormFieldSchema()->getWidget()->getFields() as $key => $object)
{
$label = $form->getFormFieldSchema()->offsetGet($key)->renderLabelName();
if(isset($validatorSchema[$key]) and $validatorSchema[$key]->getOption('required') == true) {
$label .= '<sup title="' . $widgetSchema->getFormFormatter()->translate($title) . '">' . $symbol . '</sup>';
}
$widgetSchema->setLabel($key, $label);
}
}
} |
Füge folgendes am ende deiner Formular in der setup oder besser wenn du Unterformulare hast in der configure Methode ein
1
| gfFormHelper::addRequiredToLabel($this); |
Benutze dies in deinem Testcode um das User Objekt zu erstellen
1
2
3
4
5
6
7
8
| $_SERVER['session_id'] = 'test';
$dispatcher = new sfEventDispatcher();
$sessionPath = sfToolkit::getTmpDir().'/sessions_'.rand(11111, 99999);
$storage = new sfSessionTestStorage(array('session_path' => $sessionPath));
$myUser = new myUser($dispatcher, $storage);
$myUser->setAttribute('user_id', 1, 'sfGuardSecurityUser'); |
Letzte Kommentare