-
Contentmodel Instanz
Ich versuche ein Formular im Frontend darzustellen.
Das Formular lade ich mit
$objForm = \FormModel::findOneBy('title', $strForm);
den Content lade ich mit
$objFormElement = \ContentModel::findOneBy('form', $objForm->id);
soweit OK
Beim Darstellen des Contents wird aber nichts angezeigt.
Der Grund ist dass in der Class Hybrid die Abfrage isHidden die Instanz mittels
if (!$this->objParent instanceof ContentModel)
geprüft wird.
Die Instanz von $objFormElement wird jedoch als
Contao\ContentModel
!!!!!gesetzt.!!!
Wenn ich in Hybrid die Abfrage auf
if (!$this->objParent instanceof Contao\ContentModel)
ändere isrt alles Ok.
Ist das ein Bug, oder was mache ich falsch
-
PHP-Code:
echo $this->getForm('42');
-
Danke für den Hinweis. Das hilft mir leider nur ein bisschen weiter.
In dem dargestelten Formlar möcht ich gerne Daten eines bestehenden Datensatzes darstellen die ich edieren kann.
Dazu habe ic eine Extendedform abgeleite von Form geschrieben.
Diese Class wird auch mir dem entsprechenden compile() aufgerufen.
Mir ist nicht klar, wie ich die Daten der Result-Klasse in dieses Formullar bekommen.
Ich hoffe ich habe mich klar genug ausgedrückt.
Idee
-
ah - o.k. ... da stecke ich jetzt nicht so tief in der Matrie... guck mal bei https://github.com/codefog/contao-haste ob da was Brauchbares dabei ist
-
Ich würde Haste Forms dafür nutzen, nicht den Formulargenerator.
-
Vielen Dank für den Tipp
Ich bin schon ein großes Stück weiter.
Was bei mir irgendwie noch nicht funktioniert ist das Zurückschreiben in die Datenbank
Hier in etwa mein Code
$formID=127;
$objForm = new \Haste\Form\Form('efg-bundle', 'POST', function($objHaste) {
return \Input::post('FORM_SUBMIT') === $objHaste->getFormId();
});
$objForm->addFieldsFromFormGenerator($formId, function(&$strField, &$arrDca) {
// add anything you like
if (isset($this->objEditRecord->$strField)) { // objEditRecord ist gefüllt aus der tabelle tl_formdata_details die zum Formular formID (127) gehören
$arrDca['value'] = $this->objEditRecord->$strField;
}
// you must return true otherwise the field will be skipped
return true;
});
// Das Model an das Formular binden
$objFormElement = \ContentModel::findOneBy('form', $formId); // class Contao\ContentModel
$objForm->bindModel($objFormElement);
// validate() also checks whether the form has been submitted
if ($objForm->validate()) {
$objFormElement->save();
}
...
Die Form wird richtig dargestellt incl. der Werte aus objEditRecord
Die geänderten Werte werden aber nicht mit $objFormElement->save(); in die Datenbank geschrieben. Da bleiben die alten.
Was mache ich falsch ??
-
gelöst
Den Update in der DB muss ich wohl selber machen
if ($objHasteForm->validate()) { // validate() also checks whether the form has been submitted
$resData = $objHasteForm->fetchAll(); // Get all the submitted and parsed data (only works with POST):
foreach ($resData as $k=>$v) {
$val=$v;
if (is_array($v)) {
$val=$v[0]; // checkbox wird ein array zurückgemeldet. Sollen alle Werte übernommen werden so sollte dies hier in einer Update Schleife gemacht werden
}
$resUp = \Database::getInstance()->prepare('UPDATE tl_formdata_details SET `value`=? where `ff_name`=? AND pid =?')->execute($val,$k,$this->intRecordId);
}
\Controller::reload(); // Jetzt kannst du reloaden
}
-
btw: wenn Du Code postest, bitte das Icon "php" verwenden ;-)