[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REDAXO Forum • Problem mit SelectField in rex_form - DB Werte werden nicht angezeigt.
Seite 1 von 1

Problem mit SelectField in rex_form - DB Werte werden nicht angezeigt.

Verfasst: 20. Jan 2018, 18:47
von oliwan
Hey an alle!

Ich habe in einem rex_form folgenden Code für das Nutzen eines Selectfeldes

Code: Alles auswählen

        $field = $form->addSelectField('pk','pk',['class'=>'form-control selectpicker']); // die Klasse selectpicker aktiviert den Selectpicker von Bootstrap
	$field->setAttribute('multiple', 'multiple');
	$field->setAttribute("style","width:10em;");
	$field->setLabel("Preiskategorie");
	$select = $field->getSelect();
	$select->addOptions(['PK1','PK2','PK3','PK4','PK5'], true);
Beim Erfassen klappt alles super - die Daten landen top in der Datebnak als Pipegetrenntes Array - alles gut.

Nur wenn ich nun einen Datensatz editiere, werden mir die gespeicherten Daten in der Selectbox nicht angezeigt ?! Kann mir jemand
nen Tipp geben, was ich am Code falsch habe?!

THX in dolby

Oliwan

Re: Problem mit SelectField in rex_form - DB Werte werden nicht angezeigt.

Verfasst: 21. Jan 2018, 17:26
von oliwan
... echt niemand kann mir helfen :?
Was macht ein Select Field im rex_form für einen Sinn, wenn die Verknüpfung mit nem Datenbankfeld nicht wieder geladen wird ?

Hier mein weiterer Code zur Auswahl einer Bilderkategorie:

Code: Alles auswählen

$field = $form->addSelectField('bilder_cat_id','bilder_cat_id',['class'=>'form-control selectpicker']); 
$field->setLabel("Bilderkategorie");
$select = $field->getSelect();
$select->setSize(sizeof(rex_media_category::getRootCategories()));
foreach (rex_media_category::getRootCategories() as $category) {
	$select->addOption($category->getName(),$category->getId());
}
ID landet nach Auswahl und KLick auf [Speichern] wie erwartet in der Datenbank - nur wenn man später den Datensatz "editiert" wird
die Kategorie nicht korrekt "selected" ?!
really need help

Oliwan

Re: Problem mit SelectField in rex_form - DB Werte werden nicht angezeigt.

Verfasst: 21. Jan 2018, 22:10
von runstop64
Hi,

du musst dich selbst um das setzen der Auswahl kümmern und die Werte mit $select->setSelected() übergeben:
https://github.com/redaxo/redaxo/blob/m ... #L117-L126

Re: Problem mit SelectField in rex_form - DB Werte werden nicht angezeigt.

Verfasst: 22. Jan 2018, 14:37
von oliwan
Hallo Daniel!
Vielen dank für deinen Hinweis. Ich hoffe es ist Ok, dass ich hier nochmal nachfrage - nur dass ich es richtig verstehe:

1) Ich gehe in den Ordner Core in meiner Installation, suche die von dir verlinkte Klasse und ergänze die Methode setSelected - da die aktuell nicht enthalten ist

2) Ich rufe die Methode schlicht mit $select->getSelected('bilderCatId') auf

ODER

Ich muss nix ändern sondern nur "Code einbauen" der sowas macht wie

Code: Alles auswählen

$select->getSelected(form->getDatabaseFieldContent('bilderCatId'));

Code: Alles auswählen

$select->getSelected('bilderCatId');
geht nicht

Code: Alles auswählen

	foreach($form->sql as $row){
	$select->setSelected($row-getValue("bilderCatId"));					
	}
wirft nen Fehler Cannot access protected property rex_form::$SQL
:?

Ich habe gerade überhaupt keine Idee, wie ich hier überhaupt an den Inhalt eines Datenbankfeldes im Rahmen meines Codes komme, da der Inhalt doch vom rex_form erst dynamisch gefüllt wird?! Wie soll ich also das selected selber machen, wenn ich gar nicht auf den Inhalt der DB zugreifen kann?

-> eigene Klasse von rex_form ableiten und die Methoden überschreiben?!

Hope for a hint
Oliwan

Re: Problem mit SelectField in rex_form - DB Werte werden nicht angezeigt.

Verfasst: 22. Jan 2018, 19:34
von runstop64
Hi Oliwan,

kannst du bitte mal den kompletten Formular-Code posten?
Das von mir beschriebene Vorgehen stimmt für rex_form nicht, daher muss dein Problem woanders liegen.

Re: Problem mit SelectField in rex_form - DB Werte werden nicht angezeigt.

Verfasst: 22. Jan 2018, 21:19
von oliwan
Na klar!

Anbei:

Code: Alles auswählen


//------------------------------> Eintragsliste
if ($func == '' && $thiscat!="uebersicht") {
    echo rex_api_function::getMessage();

  
    $title = rex_i18n::msg('theater_list_caption');

    $list = rex_list::factory('SELECT `id`,`jahr`,`titel` FROM ' . rex::getTable($table) . ' WHERE `kategorie` = "' . $thiscat . '" ORDER BY Jahr DESC');
    $list->addTableAttribute('class', 'table-striped');

    //Icon für jede Zeile
	$tdIcon = '<i class="rex-icon fa-ticket"></i>';
	// + Zeichen
    $thIcon = '<a href="' . $list->getUrl(['func' => 'add']) . '"><i class="rex-icon rex-icon-add-metainfo"></i></a>';
	
    $list->addColumn($thIcon, $tdIcon, 0, ['<th class="rex-table-icon">###VALUE###</th>', '<td class="rex-table-icon">###VALUE###</td>']);
    $list->setColumnParams($thIcon, ['func' => 'edit', 'id' => '###id###']);

    $list->removeColumn('id');

    $list->setColumnLabel('id', "Id");
    $list->setColumnLayout('id', ['<th class="rex-table-id">###VALUE###</th>', '<td class="rex-table-id" data-title="Id">###VALUE###</td>']);

    $list->setColumnLabel('jahr', "Jahr");
    $list->setColumnParams('jahr', ['func' => 'edit', 'id' => '###id###']);
	
	$list->setColumnLabel('titel', "Titel");
    $list->setColumnParams('titel', ['func' => 'edit', 'id' => '###id###']);
    
	$list->addColumn(rex_i18n::msg('minfo_field_label_functions'), '<i class="rex-icon rex-icon-edit"></i> ' . rex_i18n::msg('edit'));
    $list->setColumnLayout(rex_i18n::msg('minfo_field_label_functions'), ['<th class="rex-table-action" colspan="2">###VALUE###</th>', '<td class="rex-table-action">###VALUE###</td>']);
    $list->setColumnParams(rex_i18n::msg('minfo_field_label_functions'), ['func' => 'edit', 'id' => '###id###']);
    $list->addLinkAttribute(rex_i18n::msg('minfo_field_label_functions'), 'class', 'rex-edit');

    
    $list->setNoRowsMessage(rex_i18n::msg('theater_not_found'));

    $content .= $list->get();

    $fragment = new rex_fragment();
    $fragment->setVar('title', $title);


    $fragment->setVar('content', $content, false);
    $content = $fragment->parse('core/page/section.php');

}
//------------------------------> Formular
elseif ($func == 'edit' || $func == 'add') {
    $title = rex_i18n::msg('theater_bearbeiten');

	$form = rex_form::factory(rex::getTable($table), 'Theaterstuecke', 'id=' . rex_request('id', 'int', 0),'post',true);	
	
	$form->addParam('id', rex_request('id', 'int', 0));
	
	if ($func=='add'){
	$field = $form->addHiddenField('kategorie',$value=$thiscat);
	}else{
		$field = $form->addHiddenField('kategorie');		
	}
		
	$field = $form->addTextField('jahr');
	$field->setAttribute("style","width:10em;");
	$field->setLabel("Jahr");
	
	
	$field = $form->addTextField('titel');
	$field->setLabel("Titel");

	
	$field = $form->addRadioField ('wosichtbar');
	$field->setLabel('Sichtbar unter:');
	$field->addOption ('Programm', 1);
	$field->addOption ('Archiv', 2);

	$field = $form->addTextAreaField('teaser');
	$field->setLabel("Teaser");
	
	$field = $form->addTextAreaField('beschreibung');
	$field->setLabel("Beschreibung");
	
	$field = $form->addMediaField('hauptbild');
	$field->setLabel("Bild");
	
	$field = $form->addSelectField('bilderCatId','',['class'=>'form-control selectpicker']); 
	$field->setLabel("Bilderkategorie");
	$select = $field->getSelect();
	$select->setSize(sizeof(rex_media_category::getRootCategories()));
	foreach (rex_media_category::getRootCategories() as $category) {
		$select->addOption($category->getName(),$category->getId());
	}
		

	$field = $form->addRawField('<script>var amountValidTermine=0;function hideempty(){for (loop=1;loop<=25;loop++){if (document.getElementById("rex-theaterstuecke-theaterstuecke-termine-termin"+loop+"-termin").value==""){$("#rex-termin"+loop).toggle();}else{amountValidTermine++;}}}function plus(){amountValidTermine++;$("#rex-termin"+amountValidTermine).toggle("slow", function() {});if (amountValidTermine>25){$("#plus").toggle();}}$( "#plus" ).click(function() { plus();}); $( "#showTermine" ).click(function() { hideempty();var oldText = $("#showTermine").text();var newText = $("#showTermine").attr("data-text");if ($("#showTermine").text(oldText)) {$("#showTermine").text(newText); } else {$("#showTermine").text(oldText); }	 $("#showTermine").attr("data-text",oldText); $( "#termine" ).toggle("slow", function() {});});</script>');
  
	$field = $form->addRawField('<div style="cursor:pointer; color:teal; font-weight:bold;" data-text="Termine ausblenden" id="showTermine">Termine anzeigen</div>');
	$field = $form->addRawField('<div id ="termine" style="display:none;">');
	
	$fieldContainer = $form->addContainerField('termine');
	for ($i=1;$i<=25;$i++){
	
	// HTML Prefix für den Container
	$fieldContainer->setPrefix('<fieldset id="termin"'.$i.'" class="termin">');
	// HTML Sufix für den Container
	$fieldContainer->setSuffix('</fieldset>');

	$f = $fieldContainer->addGroupedField('termin'.$i, 'text', 'termin','',['style'=>'width:20em;']);
	$f->setLabel('Datum');

	$f = $fieldContainer->addGroupedField('termin'.$i, 'text', 'uhrzeit','',['style'=>'width:20em;']);
	$f->setLabel('Uhrzeit');

	$f = $fieldContainer->addGroupedField('termin'.$i, 'select', 'pk','',['class'=>'selectpicker','multiple'=>'multiple']);

	$f->setLabel('verfügbare Preiskategorien');
	$select = $f->getSelect();
	$select->addOptions(['PK1','PK2','PK3','PK4','PK5'], true);

	}
	$field = $form->addRawField('<div id ="plus" style="cursor:pointer;color:teal; font-weight:bold;">+Termin hinzufügen</div>');
	$field = $form->addRawField('</div>');

    $content .= $form->get();

    $fragment = new rex_fragment();
    $fragment->setVar('class', 'edit', false);
    $fragment->setVar('title', $title);
    $fragment->setVar('body', $content, false);
    $content = $fragment->parse('core/page/section.php');
}
}

echo $content;

Oliwan

Re: Problem mit SelectField in rex_form - DB Werte werden nicht angezeigt.

Verfasst: 23. Jan 2018, 10:44
von oliwan
Hallo Daniel!

ich habe nun mal den Code in der Art angepasst, dass ich das Feld so initialisiere:

Code: Alles auswählen

	$field = $form->addSelectField('bilderCatId');
	$field->setAttribute("class","form-control selectpicker");
	$field->setLabel("Bilderkategorie");
Und siehe da, wenn man es so macht, funktioniert auch die Anzeige des Datenbankwertes!
Irgendwas scheint also mit der Initialisierung auf diese Art

Code: Alles auswählen

$field = $form->addSelectField('bilderCatId','',['class'=>'form-control selectpicker']); 
falsch zu laufen ?!

Vielen Danke für deine Hilfsbereitschaft - nun läufts ja :D
Oilwan

Re: Problem mit SelectField in rex_form - DB Werte werden nicht angezeigt.

Verfasst: 23. Jan 2018, 12:30
von runstop64
Hi,

ja, der zweite Parameter definiert, welche Werte das Feld anzeigt. Er muss null sein, damit die Werte aus der Datenbank genommen werden.

Mit

Code: Alles auswählen

$field = $form->addSelectField('bilderCatId',null,['class'=>'form-control selectpicker']); 
sollte es also gehen.

Re: Problem mit SelectField in rex_form - DB Werte werden nicht angezeigt.

Verfasst: 24. Jan 2018, 09:34
von oliwan
Na klar - das ist er wieder, Wald den man wegen der vielen Bäume nicht sieht '' ist nicht null :roll:

Vielen Dank dir!

Oliwan