/** * Gets fields used in the cms * @return {FieldList} Fields to be used */ public function getCMSFields() { $fields = parent::getCMSFields(); $fields->insertAfter(new ReadonlyField('MenuTitle', $this->fieldLabel('MenuTitle')), 'Title'); $fields->addFieldToTab('Root.Main', new ReadonlyField('MetaDescription', $this->fieldLabel('MetaDescription'))); return $fields; }
/** * Updates the CMS fields adding the fields defined in this extension * @param {FieldList} $fields Field List that new fields will be added to */ public function updateSettingsFields(FieldList $fields) { $kapostRefID = $this->owner->KapostRefID; if (!empty($kapostRefID)) { if (CMSPageSettingsController::has_extension('KapostPageSettingsControllerExtension')) { $messageContent = _t('KapostSiteTreeExtension.KAPOST_CONTENT_WARNING_RO', '_This Page\'s content is being populated by Kapost, some fields are not editable.'); } else { $messageContent = _t('KapostSiteTreeExtension.KAPOST_CONTENT_WARNING', '_This Page\'s content is being populated by Kapost.'); } //Edit in kapost link $kapostBase = KapostAdmin::config()->kapost_base_url; if (!empty($kapostBase)) { $messageContent .= ' <a href="' . Controller::join_links($kapostBase, 'posts', $kapostRefID) . '" target="_blank">' . _t('KapostSiteTreeExtension.KAPOST_CONTENT_EDIT_LABEL', '_Click here to edit in Kapost') . '</a>'; } $fields->insertBefore(new LiteralField('KapostContentWarning', '<div class="message warning">' . $messageContent . '</div>'), 'ClassName'); //Detect Incoming Changes if (Permission::check('CMS_ACCESS_KapostAdmin')) { $incoming = KapostObject::get()->filter('KapostRefID', Convert::raw2sql($kapostRefID)); if ($incoming->count() >= 1) { $link = Controller::join_links(AdminRootController::config()->url_base, KapostAdmin::config()->url_segment, 'KapostObject/EditForm/field/KapostObject/item', $incoming->first()->ID, 'edit'); $messageContent = _t('KapostSiteTreeExtension.KAPOST_INCOMING', '_There are incoming changes from Kapost waiting for this page.') . ' ' . '<a href="' . $link . '" class="cms-panel-link">' . _t('KapostSiteTreeExtension.KAPOST_INCOMING_VIEW', '_Click here to view the changes') . '</a>'; $fields->insertBefore(new LiteralField('KapostIncomingWarning', '<div class="message warning">' . $messageContent . '</div>'), 'ClassName'); } } } }
/** * Gets the referenced object of this kapost bridge log entry */ public function getReferenceObject() { if ($this->reference_object === false) { $kapostRefID = false; if ($this->Method == 'metaWeblog.getPost' || $this->Method == 'metaWeblog.editPost') { $xml = simplexml_load_string($this->Request); if ($xml) { $kapostRefID = $xml->params->param[0]->value->string->__toString(); } } else { if ($this->Method == 'metaWeblog.newPost' || $this->Method == 'kapost.getPreview' || $this->Method == 'metaWeblog.newMediaObject') { $xml = simplexml_load_string($this->Response); if ($xml && !isset($xml->fault)) { if ($this->Method == 'metaWeblog.newPost') { $kapostRefID = $xml->params->param[0]->value->string->__toString(); } else { if ($this->Method == 'kapost.getPreview') { $kapostRefID = $xml->params->param[0]->value->struct->member[1]->value->string->__toString(); } else { if ($this->Method == 'metaWeblog.newMediaObject') { //Attempt to lookup the referenced file $fileURL = $xml->params->param[0]->value->struct->member[1]->value->string->__toString(); if (!empty($fileURL)) { $file = KapostService::find_file_by_url($fileURL); if (!empty($file) && $file !== false && $file->ID > 0) { $this->reference_object = $file; return $this->reference_object; } else { $this->reference_object = null; return; } } else { $this->reference_object = null; return; } } } } } } else { $this->reference_object = null; return; } } //If we have a if (!empty($kapostRefID)) { Versioned::reset(); //Reset versioned to remove filters //Try looking for a page $page = SiteTree::get()->filter('KapostRefID', Convert::raw2sql($kapostRefID))->first(); if (!empty($page) && $page !== false && $page->exists()) { $this->reference_object = $page; } else { //Allow extensions to add their own logic $extensionResult = array_filter($this->extend('updateObjectLookup', $kapostRefID), function ($item) { return is_object($item); }); $extensionResult = array_shift($extensionResult); if (!empty($extensionResult) && $extensionResult !== false && $extensionResult->exists()) { $this->reference_object = $kapostObj; } else { //Look for a kapost object that is not a preview $kapostObj = KapostObject::get()->filter('KapostRefID', Convert::raw2sql($kapostRefID))->first(); if (!empty($kapostObj) && $kapostObj !== false && $kapostObj->exists() && $kapostObj->IsKapostPreview == false) { $this->reference_object = $kapostObj; } else { //No result so set to null $this->reference_object = null; } } } } else { //No Kapost Reference ID so set to null $this->reference_object = null; } } return $this->reference_object; }
/** * Cleans up expired Kapost previews after twice the token expiry */ private function cleanUpExpiredPreviews() { $expiredPreviews = KapostObject::get()->filter('IsKapostPreview', true)->filter('LastEdited:LessThan', date('Y-m-d H:i:s', strtotime('-' . KapostService::config()->preview_data_expiry . ' minutes'))); if ($expiredPreviews->count() > 0) { foreach ($expiredPreviews as $kapostObj) { $kapostObj->delete(); } } }
/** * Handles rendering of the preview * @param {mixed} $blog_id Identifier for the current site * @param {array} $content Post details * @param {mixed} $content_id Identifier for the post */ protected function getPreview($blog_id, $content, $content_id) { $results = $this->extend('getPreview', $blog_id, $content, $content_id); if ($results && is_array($results)) { $results = array_filter($results, function ($v) { return !is_null($v); }); if (count($results) > 0) { return array_shift($results); } } //Detect if the record already exists or not so we can decide whether to create a new record or edit an existing $existing = KapostObject::get()->filter('KapostRefID', Convert::raw2sql($content_id))->first(); if (!empty($existing) && $existing !== false && $existing->exists()) { $resultID = $content_id; $this->editPost($content_id, $content, false, true); } else { $resultID = $this->newPost($blog_id, $content, false, true); //Make sure we got the kapost hash back or an id if we got an object back we assume that it's a response if (is_object($resultID)) { return $resultID; } //Find the object $existing = KapostObject::get()->filter('KapostRefID', Convert::raw2sql($resultID))->first(); } //Make sure we got the kapost hash back or an id if we got an object back we assume that it's a response if (is_object($resultID)) { return $resultID; } //Generate a preview token record $token = new KapostPreviewToken(); $token->Code = sha1(uniqid(time() . $resultID)); $token->KapostRefID = $resultID; $token->write(); //Return the details to kapost return array('url' => Controller::join_links(Director::absoluteBaseURL(), 'kapost-service/preview', $resultID, '?auth=' . $token->Code), 'id' => $resultID); }