/** * Save and Publish page handler */ public function save($urlParams, $form) { $className = $this->stat('tree_class'); $SQL_id = Convert::raw2sql($_REQUEST['ID']); if (substr($SQL_id, 0, 3) != 'new') { $record = DataObject::get_one($className, "\"{$className}\".\"ID\" = {$SQL_id}"); if ($record && !$record->canEdit()) { return Security::permissionFailure($this); } } else { if (!singleton($this->stat('tree_class'))->canCreate()) { return Security::permissionFailure($this); } $record = $this->getNewItem($SQL_id, false); } // We don't want to save a new version if there are no changes $dataFields_new = $form->Fields()->dataFields(); $dataFields_old = $record->getAllFields(); $changed = false; $hasNonRecordFields = false; foreach ($dataFields_new as $datafield) { // if the form has fields not belonging to the record if (!isset($dataFields_old[$datafield->Name()])) { $hasNonRecordFields = true; } // if field-values have changed if (!isset($dataFields_old[$datafield->Name()]) || $dataFields_old[$datafield->Name()] != $datafield->dataValue()) { $changed = true; } } if (!$changed && !$hasNonRecordFields) { // Tell the user we have saved even though we haven't, as not to confuse them if (is_a($record, "Page")) { $record->Status = "Saved (update)"; } FormResponse::status_message(_t('LeftAndMain.SAVEDUP', "Saved"), "good"); FormResponse::update_status($record->Status); return FormResponse::respond(); } $form->dataFieldByName('ID')->Value = 0; if (isset($urlParams['Sort']) && is_numeric($urlParams['Sort'])) { $record->Sort = $urlParams['Sort']; } // HACK: This should be turned into something more general $originalClass = $record->ClassName; $originalStatus = $record->Status; $originalParentID = $record->ParentID; $originalBrokenLinkValues = $record->HasBrokenLink . $record->HasBrokenFile; $record->HasBrokenLink = 0; $record->HasBrokenFile = 0; $record->writeWithoutVersion(); // HACK: This should be turned into something more general $originalURLSegment = $record->URLSegment; $form->saveInto($record, true); if (is_a($record, "Page")) { $record->Status = $record->Status == "New page" || $record->Status == "Saved (new)" ? "Saved (new)" : "Saved (update)"; } if (Director::is_ajax()) { if ($SQL_id != $record->ID) { FormResponse::add("\$('sitetree').setNodeIdx(\"{$SQL_id}\", \"{$record->ID}\");"); FormResponse::add("\$('Form_EditForm').elements.ID.value = \"{$record->ID}\";"); } if ($added = DataObjectLog::getAdded('SiteTree')) { foreach ($added as $page) { if ($page->ID != $record->ID) { FormResponse::add($this->addTreeNodeJS($page)); } } } if ($deleted = DataObjectLog::getDeleted('SiteTree')) { foreach ($deleted as $page) { if ($page->ID != $record->ID) { FormResponse::add($this->deleteTreeNodeJS($page)); } } } if ($changed = DataObjectLog::getChanged('SiteTree')) { foreach ($changed as $page) { if ($page->ID != $record->ID) { $title = Convert::raw2js($page->TreeTitle()); FormResponse::add("\$('sitetree').setNodeTitle({$page->ID}, \"{$title}\");"); } } } $message = _t('LeftAndMain.SAVEDUP'); // Update the class instance if necessary if ($originalClass != $record->ClassName) { $newClassName = $record->ClassName; // The records originally saved attribute was overwritten by $form->saveInto($record) before. // This is necessary for newClassInstance() to work as expected, and trigger change detection // on the ClassName attribute $record->setClassName($originalClass); // Replace $record with a new instance $record = $record->newClassInstance($newClassName); // update the tree icon FormResponse::add("if(\$('sitetree').setNodeIcon) \$('sitetree').setNodeIcon({$record->ID}, '{$originalClass}', '{$record->ClassName}');"); } // HACK: This should be turned into somethign more general // Removed virtualpage test as we need to draft/published links when url is changed if ($originalURLSegment != $record->URLSegment || $originalClass != $record->ClassName || self::$ForceReload == true) { FormResponse::add("\$('Form_EditForm').getPageFromServer({$record->ID});"); } // After reloading action if ($originalStatus != $record->Status) { $message .= sprintf(_t('LeftAndMain.STATUSTO', " Status changed to '%s'"), $record->Status); } if ($originalParentID != $record->ParentID) { FormResponse::add("if(\$('sitetree').setNodeParentID) \$('sitetree').setNodeParentID({$record->ID}, {$record->ParentID});"); } $record->write(); if ($record->class != 'VirtualPage' && $originalURLSegment != $record->URLSegment) { $message .= sprintf(_t('LeftAndMain.CHANGEDURL', " Changed URL to '%s'"), $record->URLSegment); FormResponse::add("\$('Form_EditForm').elements.URLSegment.value = \"{$record->URLSegment}\";"); FormResponse::add("\$('Form_EditForm_StageURLSegment').value = \"" . $record->AbsoluteLink() . "\";"); } if ($virtualPages = DataObject::get("VirtualPage", "\"CopyContentFromID\" = {$record->ID}")) { foreach ($virtualPages as $page) { if ($page->ID != $record->ID) { $title = Convert::raw2js($page->TreeTitle()); FormResponse::add("\$('sitetree').setNodeTitle({$page->ID}, \"{$title}\");"); } } } // If there has been a change in the broken link values, reload the page if ($originalBrokenLinkValues != $record->HasBrokenLink . $record->HasBrokenFile) { FormResponse::add("\$('Form_EditForm').getPageFromServer({$record->ID});"); } // If the 'Save & Publish' button was clicked, also publish the page if (isset($urlParams['publish']) && $urlParams['publish'] == 1) { $this->extend('onAfterSave', $record); $record->doPublish(); // Update classname with original and get new instance (see above for explanation) $record->setClassName($originalClass); $publishedRecord = $record->newClassInstance($record->ClassName); return $this->tellBrowserAboutPublicationChange($publishedRecord, sprintf(_t('LeftAndMain.STATUSPUBLISHEDSUCCESS', "Published '%s' successfully", PR_MEDIUM, 'Status message after publishing a page, showing the page title'), $record->Title)); } else { // BUGFIX: Changed icon only shows after Save button is clicked twice http://support.silverstripe.com/gsoc/ticket/76 $title = Convert::raw2js($record->TreeTitle()); FormResponse::add("\$('sitetree').setNodeTitle(\"{$record->ID}\", \"{$title}\");"); FormResponse::add($this->getActionUpdateJS($record)); FormResponse::status_message($message, "good"); FormResponse::update_status($record->Status); $this->extend('onAfterSave', $record); return FormResponse::respond(); } } }
/** * Save and Publish page handler */ public function save($urlParams, $form) { $className = $this->stat('tree_class'); $result = ''; $SQL_id = Convert::raw2sql($_REQUEST['ID']); if(substr($SQL_id,0,3) != 'new') { $record = DataObject::get_one($className, "`$className`.ID = {$SQL_id}"); if($record && !$record->canEdit()) return Security::permissionFailure($this); } else { if(!singleton($this->stat('tree_class'))->canCreate()) return Security::permissionFailure($this); $record = $this->getNewItem($SQL_id, false); } // We don't want to save a new version if there are no changes $dataFields_new = $form->Fields()->dataFields(); $dataFields_old = $record->getAllFields(); $changed = false; $hasNonRecordFields = false; foreach($dataFields_new as $datafield) { // if the form has fields not belonging to the record if(!isset($dataFields_old[$datafield->Name()])) { $hasNonRecordFields = true; } // if field-values have changed if(!isset($dataFields_old[$datafield->Name()]) || $dataFields_old[$datafield->Name()] != $datafield->dataValue()) { $changed = true; } } if(!$changed && !$hasNonRecordFields) { // Tell the user we have saved even though we haven't, as not to confuse them if(is_a($record, "Page")) { $record->Status = "Saved (update)"; } FormResponse::status_message(_t('LeftAndMain.SAVEDUP',"Saved"), "good"); FormResponse::update_status($record->Status); return FormResponse::respond(); } $form->dataFieldByName('ID')->Value = 0; if(isset($urlParams['Sort']) && is_numeric($urlParams['Sort'])) { $record->Sort = $urlParams['Sort']; } // HACK: This should be turned into something more general $originalClass = $record->ClassName; $originalStatus = $record->Status; $record->HasBrokenLink = 0; $record->HasBrokenFile = 0; $record->writeWithoutVersion(); // HACK: This should be turned into something more general $originalURLSegment = $record->URLSegment; $form->saveInto($record, true); if(is_a($record, "Page")) { $record->Status = ($record->Status == "New page" || $record->Status == "Saved (new)") ? "Saved (new)" : "Saved (update)"; } // $record->write(); if(Director::is_ajax()) { if($SQL_id != $record->ID) { FormResponse::add("$('sitetree').setNodeIdx(\"{$SQL_id}\", \"$record->ID\");"); FormResponse::add("$('Form_EditForm').elements.ID.value = \"$record->ID\";"); } if($added = DataObjectLog::getAdded('SiteTree')) { foreach($added as $page) { if($page->ID != $record->ID) $result .= $this->addTreeNodeJS($page); } } if($deleted = DataObjectLog::getDeleted('SiteTree')) { foreach($deleted as $page) { if($page->ID != $record->ID) $result .= $this->deleteTreeNodeJS($page); } } if($changed = DataObjectLog::getChanged('SiteTree')) { foreach($changed as $page) { if($page->ID != $record->ID) { $title = Convert::raw2js($page->TreeTitle()); FormResponse::add("$('sitetree').setNodeTitle($page->ID, \"$title\");"); } } } $message = _t('LeftAndMain.SAVEDUP'); // Update the icon if the class has changed if($originalClass != $record->ClassName) { $record->setClassName( $record->ClassName ); $newClass = $record->ClassName; $record = $record->newClassInstance( $newClass ); FormResponse::add("if(\$('sitetree').setNodeIcon) \$('sitetree').setNodeIcon($record->ID, '$originalClass', '$record->ClassName');"); } // HACK: This should be turned into somethign more general if( ($record->class == 'VirtualPage' && $originalURLSegment != $record->URLSegment) || ($originalClass != $record->ClassName) || self::$ForceReload == true) { FormResponse::add("$('Form_EditForm').getPageFromServer($record->ID);"); } // After reloading action if($originalStatus != $record->Status) { $message .= sprintf(_t('LeftAndMain.STATUSTO'," Status changed to '%s'"),$record->Status); } $record->write(); if( ($record->class != 'VirtualPage') && $originalURLSegment != $record->URLSegment) { $message .= sprintf(_t('LeftAndMain.CHANGEDURL'," Changed URL to '%s'"),$record->URLSegment); FormResponse::add("\$('Form_EditForm').elements.URLSegment.value = \"$record->URLSegment\";"); FormResponse::add("\$('Form_EditForm_StageURLSegment').value = \"{$record->URLSegment}\";"); } // If the 'Save & Publish' button was clicked, also publish the page if (isset($urlParams['publish']) && $urlParams['publish'] == 1) { $record->doPublish(); $record->setClassName($record->ClassName); $newClass = $record->ClassName; $publishedRecord = $record->newClassInstance($newClass); return $this->tellBrowserAboutPublicationChange( $publishedRecord, sprintf( _t( 'LeftAndMain.STATUSPUBLISHEDSUCCESS', "Published '%s' successfully", PR_MEDIUM, 'Status message after publishing a page, showing the page title' ), $record->Title ) ); } else { // BUGFIX: Changed icon only shows after Save button is clicked twice http://support.silverstripe.com/gsoc/ticket/76 $title = Convert::raw2js($record->TreeTitle()); FormResponse::add("$('sitetree').setNodeTitle(\"$record->ID\", \"$title\");"); $result .= $this->getActionUpdateJS($record); FormResponse::status_message($message, "good"); FormResponse::update_status($record->Status); return FormResponse::respond(); } } }
public function cms_publishwithcomment($urlParams, $form) { $className = 'SiteTree'; $SQL_id = Convert::raw2sql($_REQUEST['ID']); if (substr($SQL_id, 0, 3) != 'new') { $bt = defined('DB::USE_ANSI_SQL') ? "\"" : "`"; $record = DataObject::get_one($className, "{$bt}{$className}{$bt}.{$bt}ID{$bt} = {$SQL_id}"); if ($record && !$record->canEdit()) { return Security::permissionFailure($this); } } else { if (!singleton($this->stat('tree_class'))->canCreate()) { return Security::permissionFailure($this); } $record = $this->getNewItem($SQL_id, false); } // We don't want to save a new version if there are no changes $dataFields_new = $form->Fields()->dataFields(); $dataFields_old = $record->getAllFields(); $changed = false; $hasNonRecordFields = false; foreach ($dataFields_new as $datafield) { // if the form has fields not belonging to the record if (!isset($dataFields_old[$datafield->Name()])) { $hasNonRecordFields = true; } // if field-values have changed if (!isset($dataFields_old[$datafield->Name()]) || $dataFields_old[$datafield->Name()] != $datafield->dataValue()) { $changed = true; } } if (!$changed && !$hasNonRecordFields) { // Tell the user we have saved even though we haven't, as not to confuse them if (is_a($record, "Page")) { $record->Status = "Saved (update)"; } FormResponse::status_message(_t('LeftAndMain.SAVEDUP', "Saved"), "good"); FormResponse::update_status($record->Status); return FormResponse::respond(); } $form->dataFieldByName('ID')->Value = 0; if (isset($urlParams['Sort']) && is_numeric($urlParams['Sort'])) { $record->Sort = $urlParams['Sort']; } // HACK: This should be turned into something more general $originalClass = $record->ClassName; $originalStatus = $record->Status; $originalParentID = $record->ParentID; $record->HasBrokenLink = 0; $record->HasBrokenFile = 0; $record->writeWithoutVersion(); // HACK: This should be turned into something more general $originalURLSegment = $record->URLSegment; $form->saveInto($record, true); if (is_a($record, "Page")) { $record->Status = $record->Status == "New page" || $record->Status == "Saved (new)" ? "Saved (new)" : "Saved (update)"; } if (Director::is_ajax()) { if ($SQL_id != $record->ID) { FormResponse::add("\$('sitetree').setNodeIdx(\"{$SQL_id}\", \"{$record->ID}\");"); FormResponse::add("\$('Form_EditForm').elements.ID.value = \"{$record->ID}\";"); } if ($added = DataObjectLog::getAdded('SiteTree')) { foreach ($added as $page) { if ($page->ID != $record->ID) { FormResponse::add($this->addTreeNodeJS($page)); } } } if ($deleted = DataObjectLog::getDeleted('SiteTree')) { foreach ($deleted as $page) { if ($page->ID != $record->ID) { FormResponse::add($this->deleteTreeNodeJS($page)); } } } if ($changed = DataObjectLog::getChanged('SiteTree')) { foreach ($changed as $page) { if ($page->ID != $record->ID) { $title = Convert::raw2js($page->TreeTitle()); FormResponse::add("\$('sitetree').setNodeTitle({$page->ID}, \"{$title}\");"); } } } $message = _t('LeftAndMain.SAVEDUP'); // Update the class instance if necessary if ($originalClass != $record->ClassName) { $newClassName = $record->ClassName; // The records originally saved attribute was overwritten by $form->saveInto($record) before. // This is necessary for newClassInstance() to work as expected, and trigger change detection // on the ClassName attribute $record->setClassName($originalClass); // Replace $record with a new instance $record = $record->newClassInstance($newClassName); // update the tree icon FormResponse::add("if(\$('sitetree').setNodeIcon) \$('sitetree').setNodeIcon({$record->ID}, '{$originalClass}', '{$record->ClassName}');"); } // HACK: This should be turned into somethign more general if ($record->class == 'VirtualPage' && $originalURLSegment != $record->URLSegment || $originalClass != $record->ClassName || LeftAndMain::$ForceReload == true) { FormResponse::add("\$('Form_EditForm').getPageFromServer({$record->ID});"); } // After reloading action if ($originalStatus != $record->Status) { $message .= sprintf(_t('LeftAndMain.STATUSTO', " Status changed to '%s'"), $record->Status); } if ($originalParentID != $record->ParentID) { FormResponse::add("if(\$('sitetree').setNodeParentID) \$('sitetree').setNodeParentID({$record->ID}, {$record->ParentID});"); } $record->write(); // if changed to a single_instance_only page type if ($record->stat('single_instance_only')) { FormResponse::add("jQuery('#sitetree li.{$record->ClassName}').addClass('{$record->stat('single_instance_only_css_class')}');"); FormResponse::add($this->hideSingleInstanceOnlyFromCreateFieldJS($record)); } else { FormResponse::add("jQuery('#sitetree li.{$record->ClassName}').removeClass('{$record->stat('single_instance_only_css_class')}');"); } // if chnaged from a single_instance_only page type $sampleOriginalClassObject = new $originalClass(); if ($sampleOriginalClassObject->stat('single_instance_only')) { FormResponse::add($this->showSingleInstanceOnlyInCreateFieldJS($sampleOriginalClassObject)); } if ($record->class != 'VirtualPage' && $originalURLSegment != $record->URLSegment) { $message .= sprintf(_t('LeftAndMain.CHANGEDURL', " Changed URL to '%s'"), $record->URLSegment); FormResponse::add("\$('Form_EditForm').elements.URLSegment.value = \"{$record->URLSegment}\";"); FormResponse::add("\$('Form_EditForm_StageURLSegment').value = \"{$record->URLSegment}\";"); } // Update classname with original and get new instance (see above for explanation) $record->setClassName($originalClass); $publishedRecord = $record->newClassInstance($record->ClassName); return $this->workflowAction('WorkflowPublicationRequest', 'saveAndPublish', $urlParams['ID'], $urlParams['WorkflowComment']); // return $this->owner->tellBrowserAboutPublicationChange( // $publishedRecord, // sprintf( // _t( // 'LeftAndMain.STATUSPUBLISHEDSUCCESS', // "Published '%s' successfully", // PR_MEDIUM, // 'Status message after publishing a page, showing the page title' // ), // $record->Title // ) // ); } }