public function getCMSFields()
 {
     $fields = parent::getCMSFields();
     $config = EmailTemplate::config();
     if (!$this->Theme) {
         $this->Theme = MandrillEmail::config()->default_theme;
     }
     if (!$this->Template) {
         $this->Template = MandrillEmail::config()->default_template;
     }
     if ($config->allow_configure_template || Permission::check('ADMIN')) {
         $templates = MandrillEmail::getAvailablesTemplates();
         $fields->replaceField('Template', $templateDropdown = new DropdownField('Template', 'Template', $templates));
     } else {
         $fields->removeByName('Template');
     }
     if ($config->allow_configure_theme || Permission::check('ADMIN')) {
         $themes = MandrillEmail::getAvailableThemes();
         $fields->replaceField('Theme', $themeDropdown = new DropdownField('Theme', 'Theme', array_combine($themes, $themes)));
     } else {
         $fields->removeByName('Theme');
     }
     $objectsSource = array();
     $dataobjects = ClassInfo::subclassesFor('DataObject');
     foreach ($dataobjects as $dataobject) {
         if ($dataobject == 'DataObject') {
             continue;
         }
         $objectsSource[$dataobject] = $dataobject;
     }
     asort($objectsSource);
     // form-extras integration
     if (class_exists('TableField')) {
         $fields->replaceField('ExtraModels', $extraModels = new TableField('ExtraModels', 'Extra Models'));
         $extraModels->addColumn('Name');
         $extraModels->addColumn('Model', null, TableField::TYPE_SELECT, null, array('ctrlOptions' => $objectsSource));
     } else {
         if (class_exists('CodeEditorField')) {
             $fields->replaceField('ExtraModels', $extraModelsCode = new CodeEditorField('ExtraModels', 'Extra Models'));
             $extraModelsCode->setMode('json');
         }
     }
     // form-extras integration
     if (class_exists('ComboField')) {
         $categories = EmailTemplate::get()->column('Category');
         $fields->replaceField('Category', new ComboField('Category', 'Category', array_combine($categories, $categories)));
     }
     $fields->dataFieldByName('Callout')->setRows(5);
     $codeField = $fields->dataFieldByName('Code');
     $codeField->setAttribute('placeholder', _t('EmailTemplate.CODEPLACEHOLDER', 'A unique code that will be used in code to retrieve the template, e.g.: my-email'));
     if ($this->Code) {
         $codeField->setReadonly(true);
     }
     // Merge fields helper
     $fields->addFieldToTab('Root.Main', new HeaderField('MergeFieldsHelperTitle', _t('EmailTemplate.AVAILABLEMERGEFIELDSTITLE', 'Available merge fields')));
     $content = '';
     $baseFields = array('To', 'Cc', 'Bcc', 'From', 'Subject', 'Body', 'BaseURL', 'Controller');
     foreach ($baseFields as $baseField) {
         $content .= $baseField . ', ';
     }
     $content = trim($content, ', ') . '<br/><br/>';
     $models = $this->getAvailableModels();
     $modelsByClass = array();
     $classes = array();
     foreach ($models as $name => $model) {
         $classes[] = $model;
         if (!isset($modelsByClass[$model])) {
             $modelsByClass[$model] = array();
         }
         $modelsByClass[$model][] = $name;
     }
     $classes = array_unique($classes);
     foreach ($classes as $model) {
         if (!class_exists($model)) {
             continue;
         }
         $props = Config::inst()->get($model, 'db');
         $o = singleton($model);
         $methods = array_diff($o->allMethodNames(true), $o->allMethodNames());
         $content .= '<strong>' . $model . ' (' . implode(',', $modelsByClass[$model]) . ') :</strong><br/>';
         foreach ($props as $fieldName => $fieldType) {
             $content .= $fieldName . ', ';
         }
         foreach ($methods as $method) {
             if (strpos($method, 'get') === 0) {
                 $content .= $method . ', ';
             }
         }
         $content = trim($content, ', ') . '<br/>';
     }
     $content .= "<div class='message info'>" . _t('EmailTemplate.ENCLOSEFIELD', 'To escape a field from surrounding text, you can enclose it between brackets, eg: {$CurrentMember.FirstName}.') . '</div>';
     $fields->addFieldToTab('Root.Main', new LiteralField('MergeFieldsHelper', $content));
     if ($this->ID) {
         $fields->addFieldToTab('Root.Preview', $this->previewTab());
     }
     return $fields;
 }