Ask your Symfony questions! Pay money and get answers fast! (more info)

Trouble with formular Symfony

  • SOLVED

Hi experts,
i'm having a problem with getting data from a formular. But before i start explaining the issue, here are some information:

<strong>schema.yml</strong>

Blaetter:
actAs:
Timestampable: ~
columns:
bezeichnung: { type: string(50), notnull: true }
abschnitt_id: { type: integer, notnull: true }
blatt_nr: { type: integer, notnull: true}
typ: { type: string(1), notnull: true }
termin: { type: timestamp(25), notnull: false }
created_by: { type: integer, notnull: true }
updated_by: { type: integer, notnull: true }
relations:
Abschnitte: { onDelete: RESTRICT, local: abschnitt_id, foreign: id}

AktuellesBlatt:
columns:
id: { type: integer, primary: true, notnull: true}
relations:
Blaetter: { onDelete: SET NULL, local: id, foreign: id }


As you can see on the attached image, i want to have radio-buttons for the type "Übungsblatt". After choosing one and pushing the submit-Button i get the following Error
<blockquote>
<strong>500 | Internal Server Error | sfValidatorErrorSchema</strong>
bezeichnung [Required.] abschnitt_id [Required.] blatt_nr [Required.] typ [Required.] _csrf_token [Required.]

stack trace
at ()
in SF_ROOT_DIR/lib/vendor/symfony/lib/validator/sfValidatorSchema.class.php line 110 ...

$clean = array();

$unused = array_keys($this->fields);

$errorSchema = new sfValidatorErrorSchema($this);

// check that post_max_size has not been reached

if (isset($_SERVER['CONTENT_LENGTH']) && (int) $_SERVER['CONTENT_LENGTH'] > $this->getBytes(ini....)</blockquote>

I tried creating the formular the old-fashioned way, because i only need the radio-buttons for getting one Id (indexSuccess.php):
<h1>Blaetters List</h1>
<em><form action="<? url_for('blaetter/index'); ?>" method="post" ></em>
<table border="1">
<thead>
<tr>
<th>Id</th>
<th>Aktuell</th>
<th>Bezeichnung</th>
<th>Abschnitt</th>
<th>Blatt nr</th>
<th>Typ</th>
<th>Termin</th>
<th>Operation</th>
<th>Created at</th>
<th>Updated at</th>
<th>Created by</th>
<th>Updated by</th>
</tr>
</thead>
<tbody>
<?php foreach ($blaetters as $blaetter): ?>
<tr>
<td><?php echo $abschnitte[$blaetter->getAbschnittId()].".".$blaetter->getBlattNr() ?></td>
<td>
<em><?php if ($blaetter->getTyp()==sfConfig::get('app_blaetter_uebung')):?>
<input type="radio" name="aktBlatt" value="<?php echo $blaetter->getId() ?>" />
<?php endif;?></em>
</td>
<td><?php echo $blaetter->getBezeichnung() ?></td>
<td><?php echo $abschnitte[$blaetter->getAbschnittId()] ?></td>
<td><?php echo $blaetter->getBlattNr() ?></td>
<td><?php echo sfConfig::get('app_blaetter_'.$blaetter->getTyp()) ?></td>
<td>
<?php $termin=$blaetter->getTermin();

if($termin!=str_replace(";",":",sfConfig::get('app_datum_defaultDatum'))&&($termin!='')&&($blaetter->getTyp()==sfConfig::get('app_blaetter_uebung'))){
echo DateTime::createFromFormat(sfConfig::get('app_datum_mysqlDatum'),$blaetter->getTermin())->format(sfConfig::get('app_datum_datumsFormat'));
}else{ echo sfConfig::get("app_datum_noDatum"); }
?>
</td>
<td>
<?php echo link_to1('&Auml;ndern','blaetter/edit?id='.$blaetter->getId())?> |
<?php echo link_to1('L&ouml;schen','blaetter/del?id='.$blaetter->getId())?> | Benotung | Einzelergebnisse drucken
</td>
<td>
<?php if($blaetter->getCreatedAt()!=str_replace(";",":",sfConfig::get('app_datum_defaultDatum'))){
echo DateTime::createFromFormat(sfConfig::get('app_datum_mysqlDatum'),$blaetter->getCreatedAt())->format(sfConfig::get('app_datum_datumsFormat'));
}else{ echo sfConfig::get("app_datum_noDatum"); }
?>
</td>
<td>
<?php if($blaetter->getUpdatedAt()!=str_replace(";",":",sfConfig::get('app_datum_defaultDatum'))){
echo DateTime::createFromFormat(sfConfig::get('app_datum_mysqlDatum'),$blaetter->getUpdatedAt())->format(sfConfig::get('app_datum_datumsFormat'));
}else{ echo sfConfig::get("app_datum_noDatum");}
?>
</td>
<td><?php echo $dozenten[$blaetter->getCreatedBy()] ?></td>
<td><?php echo $dozenten[$blaetter->getUpdatedBy()] ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<!--
<input type="hidden" name="bezeichnung" value="" />
<input type="hidden" name="abschnitt_id" value="" />
<input type="hidden" name="blatt_nr" value="" />
<input type="hidden" name="typ" value="" />
-->
<em><input type="submit" value=" Absenden ">

</form></em>


As you can see I already tried to give the "required-values" through hidden fields (uncommented), but that idea doesn't brought me any further.

I have searched for a function to disable the sfValidator only for this formular, but haven't found anything.

So do you know, what is wrong with my code?

Answers (1)

2010-05-18

Wojciech Sznapka answers:

you can set in form class in configure method:

$this->validatorSchema['FIELD_NAME']->setOption('required', false);


or set sfValidatorPass for non-validating vields:

$this->validatorSchema['FIELD_NAME'] = new sfValidatorPass()


or simply you can unset unnecessary fields this way (still in form class configure method):

unset($this['FIELD_NAME']);


Martin Baudrechsel comments:

tried both:
<em>$this->validatorSchema['FIELD_NAME']->setOption('required', false);
</em>
class AktuellesBlattDefinitionForm extends sfForm{

public function configure(){

$this->validatorSchema['bezeichnung']->setOption('required', false);
$this->validatorSchema['abschnitt_id']->setOption('required', false);
$this->validatorSchema['blatt_nr']->setOption('required', false);
$this->validatorSchema['typ']->setOption('required', false);
}
}

Result:
<blockquote>Fatal error: Call to a member function setOption() on a non-object in /Applications/XAMPP/xamppfiles/htdocs/bachelor/lib/form/doctrine/AktuellesBlattDefinitionForm.class.php on line 29</blockquote>

The Other Solution:
in configure():
$this->validatorSchema['bezeichnung'] = new sfValidatorPass();
$this->validatorSchema['abschnitt_id'] = new sfValidatorPass();
$this->validatorSchema['blatt_nr'] = new sfValidatorPass();
$this->validatorSchema['typ'] = new sfValidatorPass();

Result:
Again the Error mentioned above (sfValidatorErrorSchema)


Martin Baudrechsel comments:

unsetting gives me again the sfValidatorErrorSchema-Error


Wojciech Sznapka comments:

please provide code for blaetter/index action


Martin Baudrechsel comments:

maybe you need more information:
myAction:

class blaetterActions extends sfActions
{
public function executeIndex(sfWebRequest $request)
{

$this->form=new AktuellesBlattDefinitionForm();

$blaetters = Doctrine::getTable('Blaetter')
->createQuery('a')
->orderBy('typ,abschnitt_id,blatt_nr')
->execute();
$this->blaetters=$blaetters;

$this->abschnitte=$this->getAbschnitte();
$this->dozenten=DozentenTable::getDozentNameByFk();

/* $this->forward404Unless($request->isMethod(sfRequest::POST));
$this->forward404Unless(($blatt = Doctrine::getTable('blaetter')->findOneBy('id',$request->getParameter('id'))), sprintf('Objekt existiert nicht (%s).', $request->getParameter('id')));*/
}
}
}


$this->form= new AktuellesBlattDefinitionForm(); I am just doing to create an instance of the class and activating the things you said:
AktuellesBlattDefinitionForm:
class AktuellesBlattDefinitionForm extends sfForm{

public function configure(){

/*$this->validatorSchema['bezeichnung']->setOption('required', false);
$this->validatorSchema['abschnitt_id']->setOption('required', false);
$this->validatorSchema['blatt_nr']->setOption('required', false);
$this->validatorSchema['typ']->setOption('required', false);*/


/*$this->validatorSchema['bezeichnung'] = new sfValidatorPass();
$this->validatorSchema['abschnitt_id'] = new sfValidatorPass();
$this->validatorSchema['blatt_nr'] = new sfValidatorPass();
$this->validatorSchema['typ'] = new sfValidatorPass();*/
//$this->widgetSchema->setNameFormat('aktuellesBlatt[%s]');

unset($this['bezeichnung'],$this['abschnitt_id'],$this['blatt_nr'],$this['typ']);


}
}


Wojciech Sznapka comments:

how can it throw you any error while you aren't doing anything but displaying data in blaetter/index ? Where are you handling form?


Martin Baudrechsel comments:

that's why I'm really confused...

i'm displaying the data, as you can see above...

the error occourse after submitting the form


<form action="<? url_for('blaetter/index'); ?>" method="post" >

[---displaying data-----]

<input type="radio" name="aktBlatt" value="<?php echo $blaetter->getId() ?>" />

[---displaying data-----]

<input type="submit" value=" Absenden ">



</form>


Wojciech Sznapka comments:

haven't you modified routing? Maybe the form directs somewhere else...


Martin Baudrechsel comments:

that sucks... you are right... i already tried it before, but i did something wrong at this try...

Thank you so much!


Wojciech Sznapka comments:

so you messed up routing? :-)


Martin Baudrechsel comments:

yeah, i still have problems with this. the jobeet tutorial doesn't really helped me.
I choose you as winner, just want to make sure if that really is the reason.