/**
  * Clone of DataObject::getCMSFields() with some additional SilverCart
  * related features.
  * <ul>
  *  <li>Restricted fields can be updated by DataExtension (updateRestrictCMSFields).</li>
  *  <li>Translation fields of DataObjects with SilverCart based translation model will be scaffolded.</li>
  * </ul>
  * 
  * @param DataObject $dataObject                     DataObject to get CMS fields for
  * @param string     $neighbourFieldOfLanguageFields Name of the field to insert language fields after or before
  * @param bool       $insertLangugeFieldsAfter       Determines whether to add language fields before or after the given neighbour field
  * @param bool       $tabbed                         Determines whether get tabbed fields or not
  * 
  * @return FieldList
  */
 public static function getCMSFields(DataObject $dataObject, $neighbourFieldOfLanguageFields = null, $insertLangugeFieldsAfter = true, $tabbed = true)
 {
     $params = array('includeRelations' => $dataObject->isInDB(), 'tabbed' => $tabbed, 'ajaxSafe' => true);
     $restrictFields = array();
     $dataObject->extend('updateRestrictCMSFields', $restrictFields);
     if (!empty($restrictFields)) {
         $params['restrictFields'] = $restrictFields;
     }
     $tabbedFields = self::scaffoldFormFields($dataObject, $params);
     if ($dataObject->has_extension($dataObject->class, 'SilvercartDataObjectMultilingualDecorator')) {
         $languageFields = SilvercartLanguageHelper::prepareCMSFields($dataObject->getLanguageClassName());
         foreach ($languageFields as $languageField) {
             if (!is_null($neighbourFieldOfLanguageFields)) {
                 if ($insertLangugeFieldsAfter) {
                     $tabbedFields->insertAfter($languageField, $neighbourFieldOfLanguageFields);
                     /*
                      * Change the name of the field the insert the next field
                      * Otherwise the sort order would be inverted
                      */
                     $neighbourFieldOfLanguageFields = $languageField->getName();
                 } else {
                     $tabbedFields->insertBefore($languageField, $neighbourFieldOfLanguageFields);
                 }
             } else {
                 $tabbedFields->addFieldToTab('Root.Main', $languageField);
             }
         }
     }
     $dataObject->extend('updateCMSFields', $tabbedFields);
     return $tabbedFields;
 }
 /**
  * Pull out all the fields that should be indexed for a particular object
  *
  * This mapping is done to make it easier to
  *
  * @param DataObject $dataObject
  * @return array
  */
 protected function objectToFields($dataObject)
 {
     $ret = array();
     $fields = Config::inst()->get($dataObject->ClassName, 'db');
     $fields['Created'] = 'SS_Datetime';
     $fields['LastEdited'] = 'SS_Datetime';
     $ret['ClassName'] = array('Type' => 'Varchar', 'Value' => $dataObject->class);
     $ret['SS_ID'] = array('Type' => 'Int', 'Value' => $dataObject->ID);
     foreach ($fields as $name => $type) {
         if (preg_match('/^(\\w+)\\(/', $type, $match)) {
             $type = $match[1];
         }
         // Just index everything; the query can figure out what to exclude... !
         $value = $dataObject->{$name};
         if ($type == 'MultiValueField') {
             $value = $value->getValues();
         }
         $ret[$name] = array('Type' => $type, 'Value' => $value);
     }
     $rels = Config::inst()->get($dataObject->ClassName, 'has_one');
     if ($rels) {
         foreach (array_keys($rels) as $rel) {
             $ret["{$rel}ID"] = array('Type' => 'ForeignKey', 'Value' => $dataObject->{$rel . "ID"});
         }
     }
     if ($dataObject->hasMethod('additionalSolrValues')) {
         $extras = $dataObject->extend('additionalSolrValues');
         if ($extras && is_array($extras)) {
             foreach ($extras as $add) {
                 foreach ($add as $k => $v) {
                     $ret[$k] = array('Type' => $this->mapper->mapValueToType($k, $v), 'Value' => $v);
                 }
             }
         }
     }
     return $ret;
 }