Example #1
0
	/**
	 * Delete this data object.
	 * $this->onBeforeDelete() gets called.
	 * Note that in Versioned objects, both Stage and Live will be deleted.
	 *  @uses DataObjectDecorator->augmentSQL()
	 */
	public function delete() {
		$this->brokenOnDelete = true;
		$this->onBeforeDelete();
		if($this->brokenOnDelete) {
			user_error("$this->class has a broken onBeforeDelete() function.  Make sure that you call parent::onBeforeDelete().", E_USER_ERROR);
		}
		
		foreach($this->getClassAncestry() as $ancestor) {
			if(self::has_own_table($ancestor)) {
				$sql = new SQLQuery();
				$sql->delete = true;
				$sql->from[$ancestor] = "`$ancestor`";
				$sql->where[] = "ID = $this->ID";
				$this->extend('augmentSQL', $sql);
				$sql->execute();
			}
		}
		
		$this->onAfterDelete();

		$this->OldID = $this->ID;
		$this->ID = 0;

		DataObjectLog::deletedObject($this);
	}
 /**
  * Delete this data object.
  * $this->onBeforeDelete() gets called.
  * Note that in Versioned objects, both Stage and Live will be deleted.
  *  @uses DataObjectDecorator->augmentSQL()
  */
 public function delete()
 {
     $this->brokenOnDelete = true;
     $this->onBeforeDelete();
     if ($this->brokenOnDelete) {
         user_error("{$this->class} has a broken onBeforeDelete() function.  Make sure that you call parent::onBeforeDelete().", E_USER_ERROR);
     }
     // Deleting a record without an ID shouldn't do anything
     if (!$this->ID) {
         throw new Exception("DataObject::delete() called on a DataObject without an ID");
     }
     foreach ($this->getClassAncestry() as $ancestor) {
         if (self::has_own_table($ancestor)) {
             $sql = new SQLQuery();
             $sql->delete = true;
             $sql->from[$ancestor] = "\"{$ancestor}\"";
             $sql->where[] = "\"ID\" = {$this->ID}";
             $this->extend('augmentSQL', $sql);
             $sql->execute();
         }
     }
     // Remove this item out of any caches
     $this->flushCache();
     $this->onAfterDelete();
     $this->OldID = $this->ID;
     $this->ID = 0;
     DataObjectLog::deletedObject($this);
 }
Example #3
0
 /**
  * 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();
         }
     }
 }
Example #4
0
	/**
	 * 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
         // 	)
         // );
     }
 }