public function __construct($name, $title = null, $value = null, $form = null)
 {
     // Create a callable function that returns an array of options for the DependentDropdownField.
     // When the value of the field it depends on changes, this function is called passing the
     // updated value as the first parameter ($val)
     $getanchors = function ($page_id) {
         // Copied from HtmlEditorField_Toolbar::getanchors()
         if (($page = Page::get()->byID($page_id)) && !empty($page)) {
             //			if (!$page->canView()) { /* ERROR? */ }
             // Similar to the regex found in HtmlEditorField.js / getAnchors method.
             if (preg_match_all("/\\s(name|id)=\"([^\"]+?)\"|\\s(name|id)='([^']+?)'/im", $page->Content, $matches)) {
                 //					var_dump(array_filter(array_merge($matches[2], $matches[4])));
                 $anchors = array_filter(array_merge($matches[2], $matches[4]));
                 return array_combine($anchors, $anchors);
             }
         }
     };
     // naming with underscores to prevent values from actually being saved somewhere
     $this->fieldCustomURL = new TextField("{$name}[CustomURL]", '', '', 300, $form);
     $this->fieldShortcode = new TextField("{$name}[Shortcode]", '', '', 300, $form);
     $this->fieldPageID = new TreeDropdownField("{$name}[PageID]", '', 'SiteTree', 'ID', 'MenuTitle');
     $this->fieldPageID->setForm($form);
     //		$this->fieldPageAnchor = new DropdownField("{$name}[PageAnchor]", 'Anchor:',array(), '', $form);
     // The DependentDropdownField, setting the source as the callable function
     // and setting the field it depends on to the appropriate field
     $this->fieldPageAnchor = DependentDropdownField::create("{$name}[PageAnchor]", 'Text-anchor:', $getanchors, $form)->setEmptyString('Page anchor: (none)')->setDepends($this->fieldPageID);
     $this->fieldFileID = new TreeDropdownField("{$name}[FileID]", '', 'File', 'ID', 'Name');
     $this->fieldFileID->addExtraClass('filetree');
     $this->fieldFileID->setForm($form);
     $this->fieldTitle = new TextField("{$name}[Title]", 'Title: ', '', 300, $form);
     $this->fieldLinkmode = new DropdownField("{$name}[Linkmode]", 'Type: ', array('Page' => 'Page', 'URL' => 'URL', 'File' => 'File', 'Email' => 'Email', 'Shortcode' => 'Shortcode'), '', $form);
     $this->fieldLinkmode->addExtraClass('LinkModePicker');
     parent::__construct($name, $title, $value, $form);
 }
 public function __construct($name, $title = null, $value = null, $form = null)
 {
     // naming with underscores to prevent values from actually being saved somewhere
     $this->fieldCustomURL = new TextField("{$name}[CustomURL]", '', '', 300, $form);
     $this->fieldPageID = new TreeDropdownField("{$name}[PageID]", '', 'SiteTree', 'ID', 'Title');
     $this->fieldTitle = new TextField("{$name}[Title]", 'Title: ', '', 300, $form);
     $this->fieldLinkmode = new DropdownField("{$name}[Linkmode]", 'Type: ', array('internal' => 'Internal', 'external' => 'External'), '', $form);
     $this->fieldLinkmode->addExtraClass('LinkModePicker');
     $this->fieldPageID->setForm($form);
     parent::__construct($name, $title, $value, $form);
 }
 public function testRemoveManyExtraClasses()
 {
     $field = new FormField('MyField');
     $field->addExtraClass('class1 class2     class3	class4		class5');
     //test we can remove a single class we just added
     $field->removeExtraClass('class3');
     $this->assertStringEndsWith('class1 class2 class4 class5', $field->extraClass());
     //check we can remove many classes at once
     $field->removeExtraClass('class1 class5');
     $this->assertStringEndsWith('class2 class4', $field->extraClass());
     //check that removing a dud class is fine
     $field->removeExtraClass('dudClass');
     $this->assertStringEndsWith('class2 class4', $field->extraClass());
 }
 /**
  * Override addExtraClass
  * 
  * @param string $class
  */
 public function addExtraClass($class)
 {
     $this->fieldPostcode->addExtraClass($class);
     $this->fieldCountry->addExtraClass($class);
     return $this;
 }
 /**
  * Adds the form-control class to *just* the formfield, not the holder.
  * This seems a bit of a hack, but addExtraClass() affects both the holder
  * and the field, so that's not a realistic option. We can't have form-control
  * on the wrapping div.
  * 
  * @param  FormField $field	 
  */
 public function onBeforeRender(FormField $field)
 {
     $inline_fields = Config::inst()->get('BootstrapForm', 'inline_fields');
     if (!in_array($field->class, $inline_fields)) {
         $field->addExtraClass('form-control');
     }
 }
 /**
  * Add the extra class to our child elements too
  * {@inheritdoc}
  */
 public function addExtraClass($class)
 {
     parent::addExtraClass($class);
     foreach ($this->getChildren() as $childField) {
         $childField->addExtraClass($class);
     }
     return $this;
 }
 /**
  * Transform a translatable field to show the field value from the default language
  * DataObject below the translated field.
  * 
  * This is a fallback function which handles field types that aren't transformed by
  * $this->transform{FieldType} functions.
  * 
  * @param FormField $nonEditableField The readonly field to contain the original value
  * @param FormField $originalField The original editable field containing the translated value
  * @return \CompositeField The transformed field
  */
 protected function baseTransform($nonEditableField, $originalField)
 {
     $fieldname = $originalField->getName();
     $nonEditableField_holder = new CompositeField($nonEditableField);
     $nonEditableField_holder->setName($fieldname . '_holder');
     $nonEditableField_holder->addExtraClass('originallang_holder');
     $nonEditableField->setValue($this->original->{$fieldname});
     $nonEditableField->setName($fieldname . '_original');
     $nonEditableField->addExtraClass('originallang');
     $nonEditableField->setTitle(_t('Translatable_Transform.OriginalFieldLabel', 'Original {title}', 'Label for the original value of the translatable field.', array('title' => $originalField->Title())));
     $nonEditableField_holder->insertBefore($originalField, $fieldname . '_original');
     return $nonEditableField_holder;
 }
 /**
  * Updates a formfield with the additional metadata specified by this field
  *
  * @param FormField $field
  */
 protected function updateFormField($field)
 {
     // set the error / formatting messages
     $field->setCustomValidationMessage($this->getErrorMessage());
     // set the right title on this field
     if ($this->RightTitle) {
         // Since this field expects raw html, safely escape the user data prior
         $field->setRightTitle(Convert::raw2xml($this->RightTitle));
     }
     // if this field is required add some
     if ($this->Required) {
         // Required validation can conflict so add the Required validation messages as input attributes
         $errorMessage = $this->getErrorMessage()->HTML();
         $field->addExtraClass('requiredField');
         $field->setAttribute('data-rule-required', 'true');
         $field->setAttribute('data-msg-required', $errorMessage);
         if ($identifier = UserDefinedForm::config()->required_identifier) {
             $title = $field->Title() . " <span class='required-identifier'>" . $identifier . "</span>";
             $field->setTitle($title);
         }
     }
     // if this field has an extra class
     if ($this->ExtraClass) {
         $field->addExtraClass($this->ExtraClass);
     }
 }
 /**
  * Override addExtraClass
  * 
  * @param string $class
  */
 public function addExtraClass($class)
 {
     $this->fieldLatitude->addExtraClass($class);
     $this->fieldLongditude->addExtraClass($class);
     return $this;
 }
 /**
  * Override addExtraClass
  * 
  * @param string $class
  */
 public function addExtraClass($class)
 {
     $this->fieldAddress->addExtraClass($class);
     return $this;
 }
 /**
  * @param ISurveyStep $current_step
  * @param ISurveyQuestionTemplate $question
  * @param array $js_rules
  * @param FormField $field
  */
 public function apply(ISurveyStep $current_step, ISurveyQuestionTemplate $question, array $js_rules, FormField $field)
 {
     if (count($js_rules)) {
         $js = "jQuery(document).ready(function(\$){\n\n                    var form                = \$('.survey_step_form');\n                    var form_id             = form.attr('id');\n                    var clickable_fields    = [];\n                    var selectable_fields   = [];\n                    var rankable_fields     = [];\n                    var double_table_fields = [];\n                    ";
         //hide and set js rule
         $field->addExtraClass('hidden');
         $question_id = $question->name();
         foreach ($js_rules as $id => $info) {
             $d = $info['question'];
             $values = $info['values'];
             $operator = $info['operator'];
             $visibility = $info['visibility'];
             if ($d instanceof ISurveyClickableQuestion || $d instanceof ISurveyRankableQuestion || $d instanceof IDoubleEntryTableQuestionTemplate) {
                 foreach ($values as $value) {
                     $option_id = $d->name();
                     if ($d instanceof ISurveyClickableQuestion) {
                         if ($d instanceof IMultiValueQuestionTemplate && intval($value) > 0) {
                             //$value = $d->getValueById(intval($d->ValueID));
                             $option_id .= '_' . str_replace(' ', '', intval($value));
                         }
                         $js .= " clickable_fields.push(\$('#'+form_id+'_{$option_id}'));";
                     }
                     if ($d instanceof ISurveyRankableQuestion) {
                         if ($d instanceof IMultiValueQuestionTemplate && intval($value) > 0) {
                             if ($d instanceof IMultiValueQuestionTemplate && intval($value) > 0) {
                                 //$value = $d->getValueById(intval($d->ValueID));
                                 $option_id .= '_' . str_replace(' ', '', intval($value));
                             }
                             $js .= " rankable_fields.push( \$('#'+form_id+'_{$option_id}') );";
                         }
                     }
                     if ($d instanceof IDoubleEntryTableQuestionTemplate) {
                         $js .= " double_table_fields.push({table : \$('#'+'{$option_id}'), value: {$value} });";
                     }
                 }
             }
             if ($d instanceof ISurveySelectableQuestion && $d instanceof IMultiValueQuestionTemplate) {
                 $option_id = $d->name();
                 $values = implode(',', $values);
                 $js .= " selectable_fields.push({ddl : \$('#'+form_id+'_{$option_id}'), values: [{$values}] });";
             }
         }
         $js .= "for(var i = 0 ; i < selectable_fields.length; i++ ){\n                form.survey_validation_rules('addRequiredAnswer4SelectAbleGroup', selectable_fields, \$('#{$question_id}'));\n                }";
         $js .= "if(clickable_fields.length > 0 )\n                form.survey_validation_rules('addRequiredAnswer4CheckAbleGroup', clickable_fields, \$('#{$question_id}') ); ";
         $js .= "if(rankable_fields.length > 0 )\n                form.survey_validation_rules('addRequiredAnswer4RankAbleGroup', rankable_fields, \$('#{$question_id}') );";
         $js .= "if(double_table_fields.length > 0 )\n                form.survey_validation_rules('addRequiredAnswer4TableGroup', double_table_fields, \$('#{$question_id}') );\n                });";
         Requirements::customScript($js);
     }
 }