Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 08. März 2013 16:15

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Formbuilder Dropdown und optgroup

Hi,

ist sicher eine Kleinigkeit - aber ich kann es nicht finden:
Kann ich im Formbuilder bei der Ausklappliste optgroups bilden? Wäre für ein aktuelles Projekt echt praktisch.
Wie gesagt - weder in der Hilfe noch in den Foren nichts gefunden ...

Offline

#2 03. Juni 2016 11:38

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Re: Formbuilder Dropdown und optgroup

Ich muss das noch mal ausgraben, da es mir keine Ruhe lässt und ich es schon wieder gerne einsetzen würde smile

Ich habe auch eine Datei im Modul gefunden, bei der man wohl ansetzen muss:
lib/class.formbuilder_utils.php

Die letzte Funktion dieser Datei scheint die Dropdowns zusammenzubauen. Nun mein Gedanke - ich setze einfach zwei Zeichen (z.B. "xx") an den Anfang der Option, die eine Gruppenüberschrift werden soll und baue eine Abfrage ein:

[== php ==]
foreach ($items as $key=>$value)
      {
	      if (strpos($key,'xx')===true) {
		    $text .= '<optgroup label="'.str_replace("xx", "", $key).'">';
			$count++;
	      } elseif (strpos($key,'yy')===true) {
		    $text .= '</optgroup>';
			$count++;
		  } else {
			$text .= '<option value="'.$value.'"';
			if ($selectedindex == $count || $selectedvalue == $value)
			{
			  $text .= ' ' . 'selected="selected"';
			}
			$text .= '>';
			$text .= $key;
			$text .= '</option>';
			$count++;
		  }
      }

"xx" startet die optgroup, "yy" schließt sie wieder.
Nun kommt es - ich habe keine Ahnung, ob das funktioniert, weil sich am Formular auf der Homepage nichts ändert. Ich habe testweise auch schon ein "blabla" in die class eingefügt - nichts.
Zwischenspeicher von CMSms und vom Browser wurden selbstverständlich gelöscht. Smarty-Cache ist deaktiviert. Gibt es sonst noch einen Cache von dem ich nichts weiß?
Oder bin ich vielleicht in der falschen Datei?

Offline

#3 03. Juni 2016 12:27

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: Formbuilder Dropdown und optgroup

strpos() liefert niemals true zurück.
Entweder es gibt false zurück, wenn der Text nicht existiert, oder es gibt die Position zurück.
Du müsstest also prüfen, ob strpos($key, 'xx') alles andere als false ist:

Das Problem ist allerdings, dass diese Funktion, die Du da gefunden hast, nirgends verwendet wird. FormBuilder nutzt die Core-Funktion der Modul-API.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#4 03. Juni 2016 12:33

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Re: Formbuilder Dropdown und optgroup

Mist - das hab ich mir gedacht (das mit der Core-Funktion).
Über den Fehler mit strpos() wäre ich sicher gestolpert, aber wenn die Funktion eh nicht (mehr) genutzt wird ...

Wie es aussieht, hab ich die Funktion in der lib/classes/module_support/modform.inc.php gefunden. Gibt es eine Möglichkeit, Funktionen zu überschreiben ohne die Core-Datei anzufassen? Bei Modulen geht das ja.
Finde die Möglichkeit der Optgroups schon interessant und hätte einige Seiten, bei denen es die Formulare verbessern würde ...

Offline

#5 03. Juni 2016 12:40

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Re: Formbuilder Dropdown und optgroup

Hey, es funktioniert!

Man ersetze in lib/classes/module_support/modform.inc.php Zeile 594 - 627 mit:

[== PHP ==]
function cms_module_CreateInputDropdown(&$modinstance, $id, $name, $items, $selectedindex, $selectedvalue, $addttext)
{
  $id = cms_htmlentities($id);
  $name = cms_htmlentities($name);
  $selectedindex = cms_htmlentities($selectedindex);
  $selectedvalue = cms_htmlentities($selectedvalue);

	$text = '<select class="cms_dropdown" name="'.$id.$name.'"';
	if ($addttext != '')
	{
		$text .= ' ' . $addttext;
	}
	$text .= '>';
	$count = 0;
	if (is_array($items) && count($items) > 0)
	{
		foreach ($items as $key=>$value)
		{
		  //		  $value = cms_htmlentities($value);
		
			if (strpos($key,'xx')!==false) {
			    $text .= '<optgroup label="'.str_replace("xx", "", $key).'">';
				$count++;
		    } elseif (strpos($key,'yy')!==false) {
			    $text .= '</optgroup>';
				$count++;
			} else {  
			  
			$text .= '<option value="'.$value.'"';
				if ($selectedindex == $count || $selectedvalue == $value)
				{
					$text .= ' ' . 'selected="selected"';
				}
				$text .= '>';
				$text .= $key;
				$text .= '</option>';
				$count++;
			}
		}
	}
	$text .= '</select>'."\n";

	return $text;
}

Im Formbuilder startet eine Optgroup dann mit "xxName der Optgroup" und endet mit "yyName der Optgroup".

Noch ist die Lösung nicht "sauber", da die Core-Datei verändert wird. Aber vielleicht gibt es da ja einen Weg???

Danke @NaN!

Offline