public function php($data) { if (!parent::php($data)) { return false; } // Skip unsaved records if (!$this->record || !$this->record->exists()) { return true; } // Skip validation if not required if (empty($data['Required'])) { return; } // Skip validation if no rules $count = EditableCustomRule::get()->filter('ParentID', $this->record->ID)->count(); if ($count == 0) { return true; } // Both required = true and rules > 0 should error $this->validationError('Required_Error', _t("EditableFormFieldValidator.REQUIRED_ERROR", "Form fields cannot be required and have conditional display rules."), 'error'); return false; }
/** * Create or find an existing field with the matched specification * * @param EditableFormField $field * @param string $stage * @param string $conditionOption * @param string $display * @param string $conditionFieldName * @param string $value * @return EditableCustomRule */ protected function findOrCreateRule(EditableFormField $field, $stage, $conditionOption, $display, $conditionFieldName, $value) { // Get id of field $conditionField = $conditionFieldName ? EditableFormField::get()->filter('Name', $conditionFieldName)->first() : null; // If live, search stage record for matching one if ($stage === 'Live') { $list = Versioned::get_by_stage('EditableCustomRule', 'Stage')->filter(array('ParentID' => $field->ID, 'ConditionFieldID' => $conditionField ? $conditionField->ID : 0, 'Display' => $display, 'ConditionOption' => $conditionOption)); if ($value) { $list = $list->filter('FieldValue', $value); } else { $list = $list->where('"FieldValue" IS NULL OR "FieldValue" = \'\''); } $rule = $list->first(); if ($rule) { $rule->write(); $rule->publish("Stage", "Live"); return $rule; } } // If none found, or in stage, create new record $rule = new EditableCustomRule(); $rule->ParentID = $field->ID; $rule->ConditionFieldID = $conditionField ? $conditionField->ID : 0; $rule->Display = $display; $rule->ConditionOption = $conditionOption; $rule->FieldValue = $value; $rule->write(); return $rule; }