/** * 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; }
/** * Upload and process the result. * * @param BaseElementModel $element * @param AssetFileModel $asset * @param string $handle * * @return bool */ public function process(BaseElementModel $element, AssetFileModel $asset, $handle) { // Check if we have this asset already or upload to YouTube if (!($youTubeId = $this->exists($asset))) { try { $youTubeId = $this->assemble($asset); } catch (Exception $e) { return $e->getMessage(); } } // Get current video's $content = $element->getContent()->getAttribute($handle); // Make sure content's an array $content = is_array($content) ? $content : array(); // Remove this asset's id from the content unset($content[array_search($asset->id, $content)]); // Add video to (existing) content $element->getContent()->{$handle} = array_merge($content, array($youTubeId)); // Save the content without validation craft()->content->saveContent($element, false); // All went well return true; }
/** * Prepare reserved ElementModel values. * * @param array &$fields * @param BaseElementModel $element * * @return BaseElementModel */ public function prepForElementModel(array &$fields, BaseElementModel $element) { // Set slug $slug = Import_ElementModel::HandleSlug; if (isset($fields[$slug])) { $element->{$slug} = ElementHelper::createSlug($fields[$slug]); unset($fields[$slug]); } // Set title $title = Import_ElementModel::HandleTitle; if (isset($fields[$title])) { $element->getContent()->{$title} = $fields[$title]; unset($fields[$title]); } // Return element return $element; }
/** * Prepare reserved ElementModel values. * * @param array &$fields * @param BaseElementModel $element * * @return BaseElementModel */ public function prepForElementModel(array &$fields, BaseElementModel $element) { foreach ($fields as $handle => $value) { switch ($handle) { case Import_ElementModel::HandleLocale: $element->localeEnabled = true; case Import_ElementModel::HandleId: $element->{$handle} = $value; break; case Import_ElementModel::HandleSlug: $element->{$handle} = ElementHelper::createSlug($value); break; case Import_ElementModel::HandleTitle: $element->getContent()->{$handle} = $value; break; default: continue 2; } unset($fields[$handle]); } return $element; }
/** * Prepare reserved ElementModel values. * * @param array &$fields * @param BaseElementModel $element * * @return BaseElementModel */ public function prepForElementModel(array &$fields, BaseElementModel $element) { // Set author $author = Import_ElementModel::HandleAuthor; if (isset($fields[$author])) { $user = craft()->users->getUserByUsernameOrEmail($fields[$author]); $element->{$author} = is_numeric($fields[$author]) ? $fields[$author] : ($user ? $user->id : 1); unset($fields[$author]); } else { $user = craft()->userSession->getUser(); $element->{$author} = $element->{$author} ? $element->{$author} : ($user ? $user->id : 1); } // Set slug $slug = Import_ElementModel::HandleSlug; if (isset($fields[$slug])) { $element->{$slug} = ElementHelper::createSlug($fields[$slug]); unset($fields[$slug]); } // Set postdate $postDate = Import_ElementModel::HandlePostDate; if (isset($fields[$postDate])) { $element->{$postDate} = DateTime::createFromString($fields[$postDate], craft()->timezone); unset($fields[$postDate]); } // Set expiry date $expiryDate = Import_ElementModel::HandleExpiryDate; if (isset($fields[$expiryDate])) { $element->{$expiryDate} = DateTime::createFromString($fields[$expiryDate], craft()->timezone); unset($fields[$expiryDate]); } // Set enabled $enabled = Import_ElementModel::HandleEnabled; if (isset($fields[$enabled])) { $element->{$enabled} = (bool) $fields[$enabled]; unset($fields[$enabled]); } // Set title $title = Import_ElementModel::HandleTitle; if (isset($fields[$title])) { $element->getContent()->{$title} = $fields[$title]; unset($fields[$title]); } // Set parent or ancestors $parent = Import_ElementModel::HandleParent; $ancestors = Import_ElementModel::HandleAncestors; if (isset($fields[$parent])) { // Get data $data = $fields[$parent]; // Fresh up $data $data = str_replace("\n", '', $data); $data = str_replace("\r", '', $data); $data = trim($data); // Don't connect empty fields if (!empty($data)) { // Find matching element $criteria = craft()->elements->getCriteria(ElementType::Entry); $criteria->sectionId = $element->sectionId; // Exact match $criteria->search = '"' . $data . '"'; // Return the first found element for connecting if ($criteria->total()) { $element->{$parent} = $criteria->first()->id; } } unset($fields[$parent]); } elseif (isset($fields[$ancestors])) { // Get data $data = $fields[$ancestors]; // Fresh up $data $data = str_replace("\n", '', $data); $data = str_replace("\r", '', $data); $data = trim($data); // Don't connect empty fields if (!empty($data)) { // Get section data $section = new SectionModel(); $section->id = $element->sectionId; // This we append before the slugified path $sectionUrl = str_replace('{slug}', '', $section->getUrlFormat()); // Find matching element by URI (dirty, not all structures have URI's) $criteria = craft()->elements->getCriteria(ElementType::Entry); $criteria->sectionId = $element->sectionId; $criteria->uri = $sectionUrl . craft()->import->slugify($data); $criteria->limit = 1; // Return the first found element for connecting if ($criteria->total()) { $element->{$parent} = $criteria->first()->id; } } unset($fields[$ancestors]); } // Return element return $element; }
/** * Populate Element * * @param BaseElementModel $element Element * @param Request $request Request * * @return BaseElementModel Element */ public function populateElement(BaseElementModel $element, Request $request) { $fields_key = \Craft\craft()->config->get('contentModelFieldsLocation', 'restfulApi'); $attributes = $request->getParsedBody(); $element->setAttributes($attributes); if (isset($attributes[$fields_key])) { if (isset($attributes[$fields_key]['title'])) { $element->getContent()->title = $attributes[$fields_key]['title']; } $element->setContent($attributes[$fields_key]); } return $element; }
/** * Validates some content with a given field layout. * * @param BaseElementModel $element The element whose content should be validated. * * @return bool Whether the element's content validates. */ public function validateContent(BaseElementModel $element) { $elementType = craft()->elements->getElementType($element->getElementType()); $fieldLayout = $element->getFieldLayout(); $content = $element->getContent(); // Set the required fields from the layout $attributesToValidate = array('id', 'elementId', 'locale'); $requiredFields = array(); if ($elementType->hasTitles()) { $requiredFields[] = 'title'; $attributesToValidate[] = 'title'; } if ($fieldLayout) { foreach ($fieldLayout->getFields() as $fieldLayoutField) { $field = $fieldLayoutField->getField(); if ($field) { $attributesToValidate[] = $field->handle; if ($fieldLayoutField->required) { $requiredFields[] = $field->id; } } } } if ($requiredFields) { $content->setRequiredFields($requiredFields); } return $content->validate($attributesToValidate); }
/** * @inheritDoc IElementType::getEditorHtml() * * @param BaseElementModel $element * * @return string */ public function getEditorHtml(BaseElementModel $element) { $html = craft()->templates->renderMacro('_includes/forms', 'textField', array(array('label' => Craft::t('Title'), 'locale' => $element->locale, 'id' => 'title', 'name' => 'title', 'value' => $element->getContent()->title, 'errors' => $element->getErrors('title'), 'first' => true, 'autofocus' => true, 'required' => true))); $html .= craft()->templates->renderMacro('_includes/forms', 'textField', array(array('label' => Craft::t('Slug'), 'locale' => $element->locale, 'id' => 'slug', 'name' => 'slug', 'value' => $element->slug, 'errors' => $element->getErrors('slug'), 'required' => true))); $html .= parent::getEditorHtml($element); return $html; }
/** * Prepare reserved ElementModel values. * * @param array &$fields * @param BaseElementModel $element * * @return BaseElementModel */ public function prepForElementModel(array &$fields, BaseElementModel $element) { $author = Import_ElementModel::HandleAuthor; $parent = Import_ElementModel::HandleParent; $checkAncestors = !isset($fields[$parent]); foreach ($fields as $handle => $value) { switch ($handle) { case Import_ElementModel::HandleLocale: $element->localeEnabled = true; case Import_ElementModel::HandleId: $element->{$handle} = $value; break; case Import_ElementModel::HandleAuthor: $element->{$handle} = $this->prepAuthorForElement($value); break; case Import_ElementModel::HandleSlug: $element->{$handle} = ElementHelper::createSlug($value); break; case Import_ElementModel::HandlePostDate: case Import_ElementModel::HandleExpiryDate: $element->{$handle} = DateTime::createFromString($value, craft()->timezone); break; case Import_ElementModel::HandleEnabled: $element->{$handle} = (bool) $value; break; case Import_ElementModel::HandleTitle: $element->getContent()->{$handle} = $value; break; case Import_ElementModel::HandleParent: $element->{$handle} = $this->prepareParentForElement($value, $element->sectionId); break; case Import_ElementModel::HandleAncestors: if ($checkAncestors) { $element->{$parent} = $this->prepareAncestorsForElement($value, $element->sectionId); } break; default: continue 2; } unset($fields[$handle]); } // Set default author if not set if (!$element->{$author}) { $user = craft()->userSession->getUser(); $element->{$author} = $element->{$author} ? $element->{$author} : ($user ? $user->id : 1); } // Return element return $element; }