optgroup-Tag im form:select-Tag

Das Forum ist für das Melden von Bugs gedacht. // This forum is intended to report bugs with the APF.
Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

optgroup-Tag im form:select-Tag

Beitrag von Well » 26.08.2010, 23:29:59

Hey,

der form:select-Tag bietet als "Subtag"(?) nur den select:option-Tag an, richtig? :?

Wie bekomme ich dann einen optgroup-Tag unter?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: optgroup-Tag im form:select-Tag

Beitrag von dr.e. » 26.08.2010, 23:40:16

Hallo Well,

die Schachtelung funktioniert wie folgt:

Code: Alles auswählen

<form:select name="options-and-groups">
   <select:group label="Teil 1">
      <group:option value="11">Teil 1.1</group:option>
      <group:option value="12">Teil 1.2</group:option>
      <group:option value="13">Teil 1.3</group:option>
   </select:group>
   <select:option value="2">Teil 2</select:option>
</form:select>
Die API von form_taglib_select bietet dir mit
  • addGroupOption()
  • getGroup()
ebenfalls Methoden um Gruppern dynamisch im Controller hinzuzufügen oder zu manipulieren. Hilft dir das?
Viele Grüße,
Christian

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: optgroup-Tag im form:select-Tag

Beitrag von Well » 27.08.2010, 00:14:20

Jop, genau danach suchte ich. Danke.

Edit: Hm, ich habe nun folgenden Code:

Code: Alles auswählen

$categories = $forumMgr->loadCategories();
			
foreach($categories as $category) {
	$forums = $forumMgr->loadForumsByCategory($category);
		
	foreach($forums as $forum) {
		$forumsElement->addGroupOption($category->getProperty('Title'), $forum->getProperty('Name'), $forum->getProperty('ForumID'));
	}
}
Die Anzeige funktioniert wunderbar - Wenn ich das Formular absende, bleiben die ausgewählte Einträge allerdings nicht ausgewählt. Wenn ich anstelle addGroupOption -> addOption nutze, und den Titel der Kategorie nicht mit anzeige, funktioniert auch das.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: optgroup-Tag im form:select-Tag

Beitrag von dr.e. » 27.08.2010, 09:46:26

Hallo Well,

ich hatte zuerst einen Bug vermutet, mein lokales Beispiel funktioniert jedoch ohne Probleme. Einziger Unterschied ist der, dass ich das nicht in einer Schleife, sondern mit einigen "statischen" Code-Zeile generiere. Kannst du mal den resultierenden HTML-Code posten?
Viele Grüße,
Christian

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: optgroup-Tag im form:select-Tag

Beitrag von Well » 27.08.2010, 20:37:46

Erzeugt wird folgender Code:

Code: Alles auswählen

<select multiple="multiple" name="forums[]" class="multiple"><optgroup label="dotnot"><option value="1">Nachrichten</option><option value="2">Reales Leben</option></optgroup><optgroup label="Programmieren"><option value="3">Allgemein</option><option value="4">Assembler</option><option value="5">C/C++</option><option value="6">PHP</option><option value="7">Python</option><option value="8">Ressourcen</option><option value="9">Sonstige</option></optgroup></select>
Die komplette Methode zur Generierung sieht so aus:

Code: Alles auswählen

		private function buildForm() {
			$forumMgr = &$this->__getServiceObject('dotnot::biz', 'ForumManager');
			$form__search = &$this->__getForm('search');
			$forumsElement = &$form__search->getFormElementByName('forums');
		
			// Foren eintragen
			$categories = $forumMgr->loadCategories();
			
			foreach($categories as $category) {
				$forums = $forumMgr->loadForumsByCategory($category);
				
				foreach($forums as $forum) {
					$forumsElement->addGroupOption($category->getProperty('Title'), $forum->getProperty('Name'), $forum->getProperty('ForumID'));
				}
			}		
		}
Der Validator erkennt, dass mindestens ein Eintrag ausgewählt wurde - Die Abfrage im Controller funktioniert allerdings nicht:

Code: Alles auswählen

		private function getSelectedForums() {
			$forumMgr = &$this->__getServiceObject('dotnot::biz', 'ForumManager');
			$form__search = &$this->__getForm('search');
			$forumsElement = &$form__search->getFormElementByName('forums');
			$selectedForums = $forumsElement->getSelectedOptions();
			$forumIDs = array();
			
			foreach($selectedForums as $selectedForum) {
				$forumIDs[] = $selectedForum->getAttribute('value');
			}
			
			return $forumMgr->loadForumsByIDs($forumIDs);
		}
Wenn ich aber, wie bereits gesagt, anstelle addGroupOption() -> addOption() nutze, funktioniert beides.

Formularfeld im Template:

Code: Alles auswählen

<form:multiselect name="forums" class="multiple" />

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: optgroup-Tag im form:select-Tag

Beitrag von dr.e. » 28.08.2010, 12:52:41

Hallo Well,

mit dem multiselect-Feld kann ich das Verhalten nachvollziehen. Hier wurde die Unterstützung für optgroups auch noch nicht fertiggestellt, das sollte in 1.13 folgen. Da du das aber benötigst, habe ich die Änderungen nach 1.12 portiert. Da der 1.12er-Branch aktuell für Bugfixes der Version 1.12 betrieben wird und keine neuen und unstabilen Entwicklungen enthält, kannst du dir das APF-Code-Package hier herunterladen. In Kürze wird es zu 1.12 noch ein Fixpack 1.12.1 geben, das diese Änderung selbstverständlich auch beinhaltet.

Folgendes Beispiel funktioniert bei mir nun:

Template:

Code: Alles auswählen

   <core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
   <html:form name="search" method="post" action="./?Modul=BildergaleriePanel&Galerie=13&Thema=23&pagepart=multiuploadwizzard">
      <form:multiselect name="forums" class="eingabe_feld" style="width: 200px;">
         <select:option value="13">Simple option</select:option>
         <select:group label="Statische Optionen">
            <group:option value="10">SOpt 1</group:option>
            <group:option value="11">SOpt 2</group:option>
            <group:option value="12">SOpt 3</group:option>
         </select:group>
      </form:multiselect>
      <form:addvalidator
         class="MultiSelectFieldValidator"
         control="forums"
         button="send"
      />
      <br />
      <br />
      <form:button name="send" value="send" class="eingabe_feld"/>
   </html:form>
Controller:

Code: Alles auswählen

         $form = &$this->__getForm('search');
         $forums = &$form->getFormElementByName('forums');
         /* @var $forums form_taglib_multiselect */

         $forums->addGroupOption('dotnot','Nachrichten',1);
         $forums->addGroupOption('dotnot','Reales Leben',2);
         $forums->addGroupOption('Programmieren','Allgemein',3);
         $forums->addGroupOption('Programmieren','Assembler',4);
         $forums->addGroupOption('Programmieren','C/C++',5);
         $forums->addGroupOption('Programmieren','PHP',6);
         $forums->addGroupOption('Programmieren','Python',7);
         $forums->addGroupOption('Programmieren','Ressourcen',8);
         $forums->addGroupOption('Programmieren','Sonstige',9);

         $options = &$forums->getSelectedOptions();
         foreach($options as $option){
            echo '<br />selected: '.$option->getAttribute('value');
         }

         $form->transformOnPlace();
Ich hoffe, das hilft dir weiter.
Viele Grüße,
Christian

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: optgroup-Tag im form:select-Tag

Beitrag von Well » 28.08.2010, 14:25:21

Args - Fällt mir auch erst jetzt auf: Dann habe ich im ersten Beitrag select mit multiselect verwechselt - Entschuldigung für den vermehrten Aufwand.

Danke für die Änderung, nun funktioniert es wunderbar. :)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: optgroup-Tag im form:select-Tag

Beitrag von dr.e. » 28.08.2010, 14:37:24

Hallo Well,

kein Problem. :) Ich habe bei der Gelegenheit auch gesehen, dass die Doku nicht ganz vollständig ist und ziehe das für 1.12.1 noch nach.
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: optgroup-Tag im form:select-Tag

Beitrag von dr.e. » 04.09.2010, 15:09:35

Hallo Well,

die Dokumentation habe ich nun unter http://adventure-php-framework.org/Seit ... -11-Select aktualisiert, damit die Anwendung klarer wird.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 931
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: optgroup-Tag im form:select-Tag

Beitrag von dave » 18.08.2011, 18:59:55

Hi, ich muss mal ein recht alten Thread ausgraben. Aber der Titel passt wunderbar und so muss ich nichts Neues aufmachen.

Folgendes:
Ich will ein einfaches <form:select ...> mit optgroup auslesen. Bei einfachen <form:selects ...> ohne Gruppen klappt dies ja wunderbar per

Code: Alles auswählen

$ProduktPreisHandelskette = $form->getFormElementByName('selKette');
$ProduktPreisHandelsketteVal = $ProduktPreisHandelskette->getSelectedOption()->getAttribute('value');
Wenn ich dies aber nun auf mein <form:select ...> mit optgroup anwende, wird mir mitgeteilt, dass auf getAttribute() nicht zugegriffen werden kann:
Fatal error: Call to a member function getAttribute() on a non-object
Mein <form:select ...> sieht so aus:

Code: Alles auswählen

<form:select name="KategorieProdukt" style="width: 350px;">
    <select:option value=""></select:option>

    <select:group label="Milchprodukte">
        <group:option value="milch">Milch und Milchprodukte</group:option>
    </select:group>

    <select:group label="Eier und Öle">
        <group:option value="ole">Fette und Speiseöle</group:option>
        <group:option value="eier">Eier und Eierspeisen</group:option>
    </select:group>
</form:select>
Wie komme ich nun an den selektierten Wert im Controller heran?

Danke, wie immer, für den Input!

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: optgroup-Tag im form:select-Tag

Beitrag von Megger » 19.08.2011, 10:16:16

Was bekommst du den genau bei getSelectedOption() zurück?
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dave
Beiträge: 931
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: optgroup-Tag im form:select-Tag

Beitrag von dave » 19.08.2011, 17:26:53

Wenn ich nur

Code: Alles auswählen

getSelectedOption()
auf das Objekt anwende und mir das direkt ausgeben lasse, erhalte ich nichts.

Füge ich ein getAttribute() hinzu

Code: Alles auswählen

getSelectedOption()->getAttribute()
erhalte ich folgende Fehlermeldung:
Fatal error: Call to a member function getAttribute() on a non-object in /is/htdocs/wp10589425_464WIA00JH/www/xxx.de/apps/sites/design1/pres/documentcontroller/test_controller.php on line 20

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: optgroup-Tag im form:select-Tag

Beitrag von dr.e. » 19.08.2011, 17:36:34

Das Verhalten scheint mir komisch. Ich schaue mir das mal an Hand deines Code-Beispiels lokal an.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 931
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: optgroup-Tag im form:select-Tag

Beitrag von dave » 19.08.2011, 17:50:25

Jo, ich habe mir jetzt auch extra dafür nochmal ein kleines Template und nen Controller gebastelt.

Template: (ich poste einfach mal den gesamten Select, ohne etwas zu entfernen)

Code: Alles auswählen

<@controller namespace="sites::design1::pres::documentcontroller" file="test_controller" class="test_controller" @>

<core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />

<html:form name="addProdukte" method="post">

    <p>Produktkategorie auswählen - <i><a href="?view=produkte&produkte=kat">Zur Kategorieübersicht</a></i><br />
    <ul><form:select name="KategorieProdukt" style="width: 350px;">
            <select:option value=""></select:option>

            <select:group label="Milchprodukte">
                <group:option value="milch">Milch und Milchprodukte</group:option>
            </select:group>

            <select:group label="Eier und Öle">
                <group:option value="ole">Fette und Speiseöle</group:option>
                <group:option value="eier">Eier und Eierspeisen</group:option>
            </select:group>

            <select:group label="Fleisch, Geflügel und Fisch">
                <group:option value="fleisch">Fleisch und Fleischwaren</group:option>
                <group:option value="geflugel">Geflügel und Wild</group:option>
                <group:option value="fisch">Fisch, Fischwaren und Delikatessen</group:option>
                <group:option value="krustentiere">Krusten, Schalen- und Weichtiere</group:option>
            </select:group>

            <select:group label="Obst, Gemüse und Nüsse">
                <group:option value="gemuse">Gemüse und Salate</group:option>
                <group:option value="kartoffeln">Kartoffeln und Kartoffelgerichte</group:option>
                <group:option value="krauter">Kräuter und Gewürze</group:option>
                <group:option value="nusse">Nüsse und Samen</group:option>
                <group:option value="obst">Obst und Obstwaren</group:option>
            </select:group>

            <select:group label="Müsli, Backwaren, Konserven und Süßigkeiten">
                <group:option value="getreide">Getreide und Getreideprodukte</group:option>
                <group:option value="musli">Getreidezubereitung, Beilagen, Müsli</group:option>
                <group:option value="bindemittel">Bindemittel</group:option>
                <group:option value="brot">Brot, Brotaufstrich, Backwaren</group:option>
                <group:option value="suppen">Suppen, Soßen, Eintopf- und Fertiggerichte</group:option>
                <group:option value="dessert">Süßspeisen und Desserts</group:option>
                <group:option value="eis">Eis und Dessert-Soßen</group:option>
                <group:option value="zucker">Zucker, Süßungsmittel</group:option>
                <group:option value="susswaren">Süßwaren</group:option>
                <group:option value="knabbergeback">Knabbergebäck</group:option>
                <group:option value="diabetiker">Diabetiker-Produkte</group:option>
            </select:group>

            <select:group label="Sonstiges">
                <group:option value="partyhappen">Partyhappen</group:option>
                <group:option value="kurprodukte">Kurprodukte</group:option>
                <group:option value="fitness">Fitness-Drinks</group:option>
                <group:option value="diverses">Diverses</group:option>
            </select:group>
        </form:select> <form:listener control="KategorieProdukt"><div class="apf-form-error-text">Bitte die entsprechende Produktkategorie auswählen</div></form:listener></ul></p>

    <p><form:button name="ButtonProdukt" class="art-button" value="Absenden" /></p>

</html:form>

Controller:

Code: Alles auswählen

<?php

import('tools::request', 'RequestHandler');

class test_controller extends base_controller {

    public function transformContent() {

        //Formular holen
        $form = &$this->getForm('addProdukte');

        $ProduktKategorie = $form->getFormElementByName('KategorieProdukt');
        $ProduktKategorieVal = $ProduktKategorie->getSelectedOption();

        echo $ProduktKategorieVal;

        if ($form->isSent() == true && $form->isValid() == true) {

            $ProduktKategorie = $form->getFormElementByName('KategorieProdukt');
            $ProduktKategorieVal = $ProduktKategorie->getSelectedOption();

            $test = $ProduktKategorieVal->getAttribute();
            echo $test;

        }

        $form->transformOnPlace();
    }

}

?>

Danke fürs Anschauen!

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: optgroup-Tag im form:select-Tag

Beitrag von dr.e. » 20.08.2011, 10:55:41

Hallo dave,

vielen Dank für dein Code-Beispiel, es handelt sich hierbei um einen Bug des APF, da vorherige Treffer bei der Suche in den Option-Gruppen durch folgende überschrieben werden. Daher erhälst du mit der Leer-Auswahl (einfache option) einen Treffer, mit allen anderen nicht.

Ich habe den Bug im SVN gefixt, du kannst dir ein Update ziehen.
Viele Grüße,
Christian

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast