"AwesomeDataObjects" ); public function getCMSFields() { $fields = parent::getCMSFields(); $fields->addFieldToTab("Root.Content.Stuff", new ComplexTableField( $this, "Things", "AwesomeDataObjects" )); return $fields } function getCMSValidator(){ return new MyAwesomePage_Validator("Things"); } } class MyAwesomePage_Validator extends RequiredFields { protected $required_many; function validate(){ $x = parent::validate(); if($this->getErrors()){ if(Director::is_ajax() && $this->getJavascriptValidationHandler() == 'prototype') { foreach($this->getErrors() as $Error){ FormResponse::status_message($Error["message"],'bad'); } } } return false; } function php($data) { $obj = $this->form->getRecord(); $hasMany = Object::combined_static($obj->ClassName, 'has_many', 'DataObject'); foreach($this->required as $field) { if($hasMany && array_key_exists($field, $hasMany)) { $this->removeRequiredField($field); $this->required_many[] = $field; } } $valid = parent::php($data); if($this->required_many) { foreach($this->required_many as $fieldName) { if($obj->$fieldName()->Count() == 0) { $formField = $this->form->Fields()->dataFieldByName($fieldName); $this->validationError( $fieldName, $formField->getCustomValidationMessage() ? $formField->getCustomValidationMessage() : sprintf(_t('Form.FIELDISREQUIRED', '%s is required').'.', strip_tags('"' . ($formField->Title() ? $formField->Title() : $fieldName) . '"')), "required" ); $valid = false; } } } return $valid; } }