Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.
Seiten: 1
#1 29. Juni 2015 00:02
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
[GELÖST] AdvancedContent: Bedingte Pflichtfelder möglich?
Hallo Foristi,
ich nutze in AC eine simple Checkbox mit der entsprechenden Logik, um festlegen zu können, ob eine div-Box im Frontend angezeigt wird oder nicht. Innerhalb der div-Box gibt es nun ein Eingabefeld, was nur dann ein Pflichtfeld sein soll, wenn die Checkbox aktiviert wurde.
Hattet ihr schon mal ein solches Problem? Geht das? Wenn ja, wie?
Hab in der Hilfe dazu nix gefunden ...
Offline
#2 29. Juni 2015 10:42
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.437
Re: [GELÖST] AdvancedContent: Bedingte Pflichtfelder möglich?
Geht derzeit leider noch nicht.
D.h. nur mit CMSms 2.0 und der SVN-Version aus dem Verzeichnis "/branches/CMSms-2.0".
Da kann man dann die Validierung eines Inhaltsblocks über den Inhaltsblock selbst vornhemen. D.h. man erstellt sich einfach einen eigenen Block-Typen. Dabei erweitert man den Core-Block-Typ und überschreibt die Methode "Validate()". Da kann man dann prüfen, ob die Checkbox aktiviert ist, oder nicht und ggfs. eine Fehlermeldung zurückgeben.
Im Moment kannst Du es nur über Javascript versuchen. Das Javascript kannst Du über den Parameter "description" einfügen. Ist zwar mehr ein Hack als eine Lösung, aber mehr geht derzeit nicht. Habe das hier und hier schonmal vorgeschlagen. Mit dem Javascript kannst Du ja dann beim jeweiligen Input-Feld das HTML5 Attribut "required" hinzufügen/entfernen sobald sich die Checkbox ändert.
Bsp.:
[== UDT: toggle_required ==]
echo '
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery("#'. $params['control_who'] .'").change(function() {
if($(this).attr("checked")) {
jQuery("#'. $params['control_what'] .'").attr("required", true);
}
else {
jQuery("#'. $params["control_what"] .'").removeAttr("required");
}
});
});
</script>';
Template:
{content block='my_checkbox' block_type='checkbox' description=':::toggle_required control_who="my_checkbox" control_what="text_input":::' smarty='backend'}
{content block='text_input'}
Andere Möglichkeit: Du änderst ein paar Zeilen im Modul und erstellst Dir selber einen Blocktypen, der nur dann ein Pflichtfeld ist, wenn die Checkbox aktiviert ist. (Das wäre dann das, was ich auch in der nächsten Version einbauen würde)
In der Datei "/modules/AdvancedContent/class.acContentBlockBase.php" einfach folgende Funktion hinzufügen:
public function Validate()
{
$errors = array();
if($this->_properties['required'] && $this->content_obj->GetProperty($this->_properties['id']) == '')
$errors[] = lang('nofieldgiven', array($this->_properties['name']));
return (count($errors) > 0 ? $errors : FALSE);
}
In der Datei "/modules/AdvancedContent/class.ac_admin_ops.php" in der Funktion "ValidateData()" (Zeile 936-980) in der Foreach-Schleife statt pauschal zu entscheiden, dass leere Blöcke, die als Pflichtfeld gekennzeichnet sind, generell einen Fehler darstellen, den Block über die Funktion "Validate()" selber entscheiden lassen.
Alter Code:
foreach($content_obj->GetContentBlocks() as $contentBlock)
{
if($contentBlock->GetProperty('required') && $content_obj->GetProperty($contentBlock->GetProperty('id')) == '')
$errors[] = lang('nofieldgiven', array($contentBlock->GetProperty('name')));
}
Neuer Code:
foreach($content_obj->GetContentBlocks() as $contentBlock)
{
if(!$prop_errors = $contentBlock->Validate())
continue;
if(is_array($prop_errors))
$errors = array_merge($errors, $prop_errors);
else
$errors[] = $prop_errors;
}
Dann erstellst Du Dir einen eigenen Block-Typen und überscrheibst die Funktion "Validate()" so, dass sie erst die Checkbox und dann den Inhalt das Textfeldes prüft:
class acBlockType_conditional_text extends acBlockType_text
{
function __construct(&$content_obj, $params = array())
{
parent::__construct($content_obj, $params);
$this->SetProperty('trigger', isset($params['trigger']) ? $params['trigger'] : null);
}
public function Validate()
{
if(!$this->GetProperty('trigger') || $this->content_obj->GetProperty($this->GetProperty('trigger')))
return parent::Validate();
return false;
}
}
Auf Deutsch: Wenn kein "trigger" angegeben ist, oder der Inhaltsblock mit der ID des "triggers" nicht leer ist (also wenn die Checkbox aktiviert ist), dann läuft alles so wie immer. Anderenfalls - wenn also ein "trigger" angegeben wurde und der Inhaltsblock mit der ID des "triggers" leer ist (also wenn die Checkbox nicht aktiviert ist) - dann ist alles okay.
Der Parameter "trigger" ist der Name der Checkbox.
Im Template sieht das dann so aus:
{content block="my_checkbox" block_type="checkbox"}
{content block="text_input" block_type="conditional_text" trigger="my_checkbox" required="true"}
Ich hab beides in der Form noch nicht getestet, müsste aber funktionieren.
Das Prinzip sollte klar sein, oder?
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
#3 29. Juni 2015 12:00
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] AdvancedContent: Bedingte Pflichtfelder möglich?
Danke für die ausführliche Erklärung und die Sourcen - werd es wohl über den Blocktypen machen.
Offline
Seiten: 1