/** * 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; }