/** * Prepares an element's content for being saved to the database. * * @param BaseElementModel $element * @param FieldLayoutModel $fieldLayout * @param bool $validate * @return ContentModel */ public function prepElementContentForSave(BaseElementModel $element, FieldLayoutModel $fieldLayout, $validate = true) { $elementTypeClass = $element->getElementType(); $elementType = craft()->elements->getElementType($elementTypeClass); $content = $element->getContent(); if ($validate) { // Set the required fields from the layout $requiredFields = array(); if ($elementType->hasTitles()) { $requiredFields[] = 'title'; } foreach ($fieldLayout->getFields() as $field) { if ($field->required) { $requiredFields[] = $field->fieldId; } } if ($requiredFields) { $content->setRequiredFields($requiredFields); } } // Give the fieldtypes a chance to clean up the post data foreach (craft()->fields->getAllFields() as $field) { $fieldType = craft()->fields->populateFieldType($field); if ($fieldType) { $fieldType->element = $element; $handle = $field->handle; $content->{$handle} = $fieldType->prepValueFromPost($content->{$handle}); } } return $content; }
private function _exportFieldLayout(FieldLayoutModel $fieldLayout) { if ($fieldLayout->getTabs()) { $tabDefs = array(); foreach ($fieldLayout->getTabs() as $tab) { $tabDefs[$tab->name] = array(); foreach ($tab->getFields() as $field) { $tabDefs[$tab->name][$field->getField()->handle] = $field->required; } } return array('tabs' => $tabDefs); } else { $fieldDefs = array(); foreach ($fieldLayout->getFields() as $field) { $fieldDefs[$field->getField()->handle] = $field->required; } return array('fields' => $fieldDefs); } }
/** * @param FieldLayoutModel $fieldLayout * @return array */ public function getFieldLayoutDefinition(FieldLayoutModel $fieldLayout) { if ($fieldLayout->getTabs()) { $tabDefinitions = array(); foreach ($fieldLayout->getTabs() as $tab) { $tabDefinitions[$tab->name] = $this->getFieldLayoutFieldsDefinition($tab->getFields()); } return array('tabs' => $tabDefinitions); } return array('fields' => $this->getFieldLayoutFieldsDefinition($fieldLayout->getFields())); }
/** * Saves a field layout. * * @param FieldLayoutModel $layout * @param bool $saveTabs Whether to save tab records. * @return bool */ public function saveLayout(FieldLayoutModel $layout, $saveTabs = true) { // First save the layout $layoutRecord = new FieldLayoutRecord(); $layoutRecord->type = $layout->type; $layoutRecord->save(false); $layout->id = $layoutRecord->id; if ($saveTabs) { foreach ($layout->getTabs() as $tab) { $tabRecord = new FieldLayoutTabRecord(); $tabRecord->layoutId = $layout->id; $tabRecord->name = $tab->name; $tabRecord->sortOrder = $tab->sortOrder; $tabRecord->save(false); $tab->id = $tabRecord->id; foreach ($tab->getFields() as $field) { $fieldRecord = new FieldLayoutFieldRecord(); $fieldRecord->layoutId = $layout->id; $fieldRecord->tabId = $tab->id; $fieldRecord->fieldId = $field->fieldId; $fieldRecord->required = $field->required; $fieldRecord->sortOrder = $field->sortOrder; $fieldRecord->save(false); $field->id = $fieldRecord->id; } } } else { foreach ($layout->getFields() as $field) { $fieldRecord = new FieldLayoutFieldRecord(); $fieldRecord->layoutId = $layout->id; $fieldRecord->fieldId = $field->fieldId; $fieldRecord->required = $field->required; $fieldRecord->sortOrder = $field->sortOrder; $fieldRecord->save(false); $field->id = $fieldRecord->id; } } return true; }
/** * Updates the search indexes based on the new content values. * * @param BaseElementModel $element * @param ContentModel $content * @param FieldLayoutModel $fieldLayout * @param array|null &$nonTranslatableFields * @param array|null &$otherContentModels * * @return null */ private function _updateSearchIndexes(BaseElementModel $element, ContentModel $content, FieldLayoutModel $fieldLayout, &$nonTranslatableFields = null, &$otherContentModels = null) { $searchKeywordsByLocale = array(); foreach ($fieldLayout->getFields() as $fieldLayoutField) { $field = $fieldLayoutField->getField(); if ($field) { $fieldType = $field->getFieldType(); if ($fieldType) { $fieldType->element = $element; $handle = $field->handle; // Set the keywords for the content's locale $fieldSearchKeywords = $fieldType->getSearchKeywords($element->getFieldValue($handle)); $searchKeywordsByLocale[$content->locale][$field->id] = $fieldSearchKeywords; // Should we queue up the other locales' new keywords too? if (isset($nonTranslatableFields[$field->id])) { foreach ($otherContentModels as $otherContentModel) { $searchKeywordsByLocale[$otherContentModel->locale][$field->id] = $fieldSearchKeywords; } } } } } foreach ($searchKeywordsByLocale as $localeId => $keywords) { craft()->search->indexElementFields($element->id, $localeId, $keywords); } }
public function getCustomFieldsFromFieldLayout(FieldLayoutModel $fieldLayout) { $fields = array(); $fieldLayoutFieldModels = $fieldLayout->getFields(); foreach ($fieldLayoutFieldModels as $fieldLayoutFieldModel) { if (!in_array($fieldLayoutFieldModel->field->getFieldType()->name, $this->getUnsupportedFieldTypes())) { $fields[$fieldLayoutFieldModel->field->handle] = $fieldLayoutFieldModel->field; } } return $fields; }