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