/**
  * Overloaded so that form error messages are displayed.
  * 
  * @see OrderFormValidator::php()
  * @see Form::validate()
  */
 function validate()
 {
     if ($this->validator) {
         $errors = $this->validator->validate();
         if ($errors) {
             if (Director::is_ajax() && $this->validator->getJavascriptValidationHandler() == 'prototype') {
                 FormResponse::status_message(_t('Form.VALIDATIONFAILED', 'Validation failed'), 'bad');
                 foreach ($errors as $error) {
                     FormResponse::add(sprintf("validationError('%s', '%s', '%s');\n", Convert::raw2js($error['fieldName']), Convert::raw2js($error['message']), Convert::raw2js($error['messageType'])));
                 }
             } else {
                 $data = $this->getData();
                 $formError = array();
                 if ($formMessageType = $this->MessageType()) {
                     $formError['message'] = $this->Message();
                     $formError['messageType'] = $formMessageType;
                 }
                 // Load errors into session and post back
                 Session::set("FormInfo.{$this->FormName()}", array('errors' => $errors, 'data' => $data, 'formError' => $formError));
             }
             return false;
         }
     }
     return true;
 }
 function run(DataObjectSet $pages)
 {
     $pageIDs = $pages->column('ID');
     foreach ($pageIDs as $pageID) {
         FormResponse::add("\$('Form_EditForm').reloadIfSetTo({$pageID});");
     }
     $this->batchaction($pages, 'batchApprove', _t('BatchApprovePages.APPROVED_PAGES', 'Approved %d pages, %d failures'));
     return FormResponse::respond();
 }
 public function publish($comment, $member, $notify)
 {
     if (!$member) {
         $member = Member::currentUser();
     }
     // We have to mark as completed now, or we'll get
     // recursion from SiteTreeCMSWorkflow::onAfterPublish.
     $this->Status = 'Completed';
     $this->PublisherID = $member->ID;
     $this->write();
     $page = $this->Page();
     $page->doDeleteFromLive();
     // @todo Coupling to UI :-(
     FormResponse::add(LeftAndMain::deleteTreeNodeJS($page));
     if ($notify) {
         // notify
     }
     return _t('SiteTreeCMSWorkflow.PUBLISHMESSAGE', 'Published changes to live version. Emailed %s.');
 }
 function checkFolder()
 {
     if (!$this->RootFolderID) {
         $galleries = Folder::findOrMake('image-gallery');
         $galleries->Title = 'Image Gallery';
         $galleries->write();
         $folder = Folder::findOrMake('image-gallery/' . $this->URLSegment);
         $folder->Title = $this->Title;
         $folder->setName($this->Title);
         $folder->write();
         $this->RootFolderID = $folder->ID;
         $this->write();
         $this->requireDefaultAlbum();
         FormResponse::add("\$( 'Form_EditForm' ).getPageFromServer( {$this->ID} );");
     } else {
         $this->RootFolder()->setName($this->Title);
         $this->RootFolder()->write();
     }
 }
 function run(DataObjectSet $pages)
 {
     $pageIDs = $pages->column('ID');
     foreach ($pageIDs as $pageID) {
         FormResponse::add("\$('Form_EditForm').reloadIfSetTo({$pageID});");
     }
     $count = array();
     $count['PUBLISH_SUCCESS'] = $count['DELETE_SUCCESS'] = 0;
     $count['PUBLISH_FAILURE'] = $count['DELETE_FAILURE'] = 0;
     $arbitraryPage = $pages->First();
     $arbitraryPage->invokeWithExtensions('onBeforeBatchPublish', $pages);
     foreach ($pages as $page) {
         $type = $page->openWorkflowRequest() instanceof WorkflowDeletionRequest ? 'DELETE' : 'PUBLISH';
         if ($page->batchPublish()) {
             $count[$type . '_SUCCESS']++;
             // Now make sure the tree title is appropriately updated
             $publishedRecord = DataObject::get_by_id('SiteTree', $page->ID);
             if ($publishedRecord) {
                 $JS_title = Convert::raw2js($publishedRecord->TreeTitle());
                 FormResponse::add("\$('sitetree').setNodeTitle({$page->ID}, '{$JS_title}');");
             }
         } else {
             $count[$type . '_FAILURE']++;
             FormResponse::add("\$('sitetree').addNodeClassByIdx('{$page->ID}', 'failed');");
         }
         $page->destroy();
         unset($page);
     }
     $arbitraryPage->invokeWithExtensions('onAfterBatchPublish', $pages);
     $messages = array('PUBLISH_SUCCESS' => _t('BatchPublishPages.PUBLISH_SUCCESS', 'Published %d pages.'), 'PUBLISH_FAILURE' => _t('BatchPublishPages.PUBLISH_FAILURE', 'Failed to publish %d pages.'), 'DELETE_SUCCESS' => _t('BatchPublishPages.DELETE_SUCCESS', 'Deleted %d pages from the published site.'), 'DELETE_FAILURE' => _t('BatchPublishPages.DELETE_FAILURE', 'Failed to delete %d pages from the published site.'), 'PUBLISH_SUCCESS_ONE' => _t('BatchPublishPages.PUBLISH_SUCCESS_ONE', 'Published %d page.'), 'PUBLISH_FAILURE_ONE' => _t('BatchPublishPages.PUBLISH_FAILURE_ONE', 'Failed to publish %d page.'), 'DELETE_SUCCESS_ONE' => _t('BatchPublishPages.DELETE_SUCCESS_ONE', 'Deleted %d page from the published site.'), 'DELETE_FAILURE_ONE' => _t('BatchPublishPages.DELETE_FAILURE_ONE', 'Failed to delete %d page from the published site.'));
     $displayedMessages = array();
     foreach ($count as $type => $count) {
         if ($count) {
             $message = $count == 1 ? $messages[$type . '_ONE'] : $messages[$type];
             $displayedMessages[] = sprintf($message, $count);
         }
     }
     $displayedMessage = implode(" ", $displayedMessages);
     FormResponse::add('statusMessage("' . $displayedMessage . '","good");');
     return FormResponse::respond();
 }
 function moderate()
 {
     $id = (int) $this->urlParams['ID'];
     $className = Convert::raw2sql($this->urlParams['ClassName']);
     $state = Convert::raw2sql($this->urlParams['State']);
     $methods = array("delete" => "moderatorDelete", "isspam" => "markSpam", "isham" => "markHam", "approve" => "markApproved", "unapprove" => "markUnapproved");
     ModeratableState::push_state($state);
     $method = $methods[$this->urlParams['Command']];
     if (!$method) {
         FormResponse::clear();
         FormResponse::status_message("Command invalid", 'bad');
     } else {
         if ($error = DataObject::get_by_id($className, $id)->{$method}()) {
             FormResponse::status_message($error, 'bad');
         } else {
             FormResponse::add('$("moderation").elementMoved(' . $id . ');');
         }
     }
     ModeratableState::pop_state();
     return FormResponse::respond();
 }
    /**
     * Allows you to returns a new data object to the tree (subclass of sitetree)
     * and updates the tree via javascript.
     */
    public function returnItemToUser($p)
    {
        if (Director::is_ajax()) {
            // Prepare the object for insertion.
            $parentID = (int) $p->ParentID;
            $id = $p->ID ? $p->ID : "new-{$p->class}-{$p->ParentID}";
            $treeTitle = Convert::raw2js($p->TreeTitle());
            $hasChildren = is_numeric($id) && $p->AllChildren() && $p->AllChildren()->Count() ? ' unexpanded' : '';
            // Ensure there is definitly a node avaliable. if not, append to the home tree.
            $response = <<<JS
\t\t\t\tvar tree = \$('sitetree');
\t\t\t\tvar newNode = tree.createTreeNode("{$id}", "{$treeTitle}", "{$p->class}{$hasChildren}");
\t\t\t\tnode = \$('record-0');
\t\t\t\tnode.open();
\t\t\t\tnode.appendTreeNode(newNode);
\t\t\t\tnewNode.selectTreeNode();
JS;
            FormResponse::add($response);
            FormResponse::load_form($this->getitem(), 'Form_EditForm');
            return FormResponse::respond();
        } else {
            Director::redirect('admin/' . self::$url_segment . '/show/' . $p->ID);
        }
    }
Пример #8
0
	/**
	 * Create a new translation from an existing item, switch to this language and reload the tree.
	 */
	function createtranslation () {
		if(!Director::is_ajax()) {
			Director::redirectBack();
			return;
		}
		$langCode = $_REQUEST['newlang'];
		$langName = i18n::get_language_name($langCode);
		$originalLangID = $_REQUEST['ID'];

		$record = $this->getRecord($originalLangID);
	    $temporalID = "new-$record->RecordClassName-$record->ParentID-$originalLangID";
		Session::set($temporalID . '_originalLangID',$originalLangID);
		$tree = $this->switchlanguage($langCode, $originalLangID);
		FormResponse::add(<<<JS
		if (Element.hasClassName('LangSelector_holder','onelang')) {
			Element.removeClassName('LangSelector_holder','onelang');
			$('treepanes').resize();
		}
		if ($('LangSelector').options['$langCode'] == undefined) {
			var option = document.createElement("option");
			option.text = '$langName';
			option.value = '$langCode';
			$('LangSelector').options.add(option);
		}
JS
		);
		FormResponse::add("$('LangSelector').selectValue('$langCode');");
		$newrecord = clone $record;
		$newrecord->ID = $temporalID;

		return $this->returnItemToUser($newrecord);
	}
 /**
  * Create a new translation from an existing item, switch to this language and reload the tree.
  */
 function createtranslation($request)
 {
     // Protect against CSRF on destructive action
     if (!SecurityToken::inst()->checkRequest($request)) {
         return $this->httpError(400);
     }
     $langCode = Convert::raw2sql($_REQUEST['newlang']);
     $originalLangID = (int) $_REQUEST['ID'];
     $record = $this->getRecord($originalLangID);
     $this->Locale = $langCode;
     Translatable::set_current_locale($langCode);
     // Create a new record in the database - this is different
     // to the usual "create page" pattern of storing the record
     // in-memory until a "save" is performed by the user, mainly
     // to simplify things a bit.
     // @todo Allow in-memory creation of translations that don't persist in the database before the user requests it
     $translatedRecord = $record->createTranslation($langCode);
     $url = sprintf("%s/%d/?locale=%s", $this->Link('show'), $translatedRecord->ID, $langCode);
     FormResponse::add(sprintf('window.location.href = "%s";', $url));
     return FormResponse::respond();
 }
 /**
  * Process a workflow action.
  * @param string $workflowClass The sub-class of WorkflowRequest that is expected.
  * @param string $actionName The action method to call on the given WorkflowRequest objec.t
  * @param int $id The ID# of the page.
  * @param string $comment The comment to attach.
  * @param string $successMessage The message to show on success.
  */
 function workflowAction($workflowClass, $actionName, $id, $comment)
 {
     if (is_numeric($id)) {
         // For 2.3 and 2.4 compatibility
         $bt = defined('DB::USE_ANSI_SQL') ? "\"" : "`";
         $page = DataObject::get_by_id("SiteTree", $id);
         if (!$page) {
             $page = Versioned::get_one_by_stage("SiteTree", "Live", "{$bt}SiteTree{$bt}.{$bt}ID{$bt} = {$id}");
         }
         if (!$page) {
             return new HTTPResponse("Can't find Page #{$id}", 400);
         }
     } else {
         return new HTTPResponse("Bad ID", 400);
     }
     // If we are creating and approving a workflow in one step, then don't bother emailing
     $notify = !($actionName == 'action' && !$page->openWorkflowRequest($workflowClass));
     if ($request = $page->openOrNewWorkflowRequest($workflowClass, $notify)) {
         $request->clearMembersEmailed();
         if ($successMessage = $request->{$actionName}($comment, null, $notify)) {
             FormResponse::get_page($id);
             $title = Convert::raw2js($page->TreeTitle());
             FormResponse::add("\$('sitetree').setNodeTitle({$id}, \"{$title}\");");
             // gather members for status output
             if ($notify) {
                 $peeps = $request->getMembersEmailed();
                 if ($peeps && $peeps->Count()) {
                     $emails = '';
                     foreach ($peeps as $peep) {
                         if ($peep->Email) {
                             $emails .= $peep->Email . ', ';
                         }
                     }
                     $emails = trim($emails, ', ');
                 } else {
                     $emails = 'no-one';
                 }
             } else {
                 $emails = "no-one";
             }
             if ($successMessage) {
                 FormResponse::status_message(sprintf($successMessage, $emails), 'good');
                 return FormResponse::respond();
             } else {
                 return;
             }
         }
     }
     // Failure
     FormResponse::status_message(_t('SiteTreeCMSWorkflow.WORKFLOW_ACTION_FAILED', "There was an error when processing your workflow request."), 'bad');
     return FormResponse::respond();
 }
Пример #11
0
    /**
     * @return String
     */
    function FieldHolder()
    {
        // set caption if required
        if ($this->popupCaption) {
            $id = $this->id();
            if (Director::is_ajax()) {
                $js = <<<JS
\$('{$id}').GB_Caption = '{$this->popupCaption}';
JS;
                FormResponse::add($js);
            } else {
                $js = <<<JS
Event.observe(window, 'load', function() { \$('{$id}').GB_Caption = '{$this->popupCaption}'; });
JS;
                Requirements::customScript($js);
            }
        }
        // compute sourceItems here instead of Items() to ensure that
        // pagination and filters are respected on template accessors
        $this->sourceItems();
        return $this->renderWith($this->template);
    }
 public function publish($comment, $member, $notify)
 {
     if (!$member) {
         $member = Member::currentUser();
     }
     // We have to mark as completed now, or we'll get
     // recursion from SiteTreeCMSWorkflow::onAfterPublish.
     $page = $this->Page();
     $page->LatestCompletedWorkflowRequestID = $this->ID;
     $page->writeWithoutVersion();
     // Embargo means we go Approved -> Scheduled
     if ($this->EmbargoDate) {
         $this->setSchedule();
         $this->PublisherID = $member->ID;
         $this->write();
         // Otherwise we go Approved -> Published
     } else {
         $this->Status = 'Completed';
         $this->PublisherID = $member->ID;
         $this->write();
         // Only publish the page if it hasn't already been published elsewhere.  This occurs when
         // SiteTree::doPublish() 'auto-closes' an open workflow
         //if($page->getIsModifiedOnStage()) {
         $page->doPublish();
         //}
         if ($notify) {
             $this->notifyPublished($comment);
         }
     }
     $this->addNewChange($comment, $this->Status, DataObject::get_by_id('Member', $this->PublisherID));
     // @todo Coupling to UI :-(
     $title = Convert::raw2js($page->TreeTitle());
     FormResponse::add("\$('sitetree').setNodeTitle({$page->ID}, \"{$title}\");");
     return _t('SiteTreeCMSWorkflow.PUBLISHMESSAGE', 'Published changes to live version. Emailed %s.');
 }
Пример #13
0
 function run(DataObjectSet $pages)
 {
     foreach ($pages as $page) {
         $id = $page->ID;
         // Perform the action
         if ($page->canDelete()) {
             $page->doDeleteFromLive();
         }
         // check to see if the record exists on the live site, if it doesn't remove the tree node
         $stageRecord = Versioned::get_one_by_stage('SiteTree', 'Stage', "`SiteTree`.`ID`={$id}");
         if ($stageRecord) {
             $stageRecord->IsAddedToStage = true;
             $title = Convert::raw2js($stageRecord->TreeTitle());
             FormResponse::add("\$('sitetree').setNodeTitle({$id}, '{$title}');");
             FormResponse::add("\$('Form_EditForm').reloadIfSetTo({$id});");
         } else {
             FormResponse::add("var node = \$('sitetree').getTreeNodeByIdx('{$id}');");
             FormResponse::add("if(node && node.parentTreeNode)\tnode.parentTreeNode.removeTreeNode(node);");
             FormResponse::add("\$('Form_EditForm').reloadIfSetTo({$id});");
         }
         $page->destroy();
         unset($page);
     }
     $message = sprintf(_t('CMSBatchActions.DELETED_PAGES', 'Deleted %d pages from the published site'), $pages->Count());
     FormResponse::add('statusMessage("' . $message . '","good");');
     return FormResponse::respond();
 }
Пример #14
0
 /**
  * Delete a number of items
  */
 public function deleteitems($request)
 {
     // Protect against CSRF on destructive action
     if (!SecurityToken::inst()->checkRequest($request)) {
         return $this->httpError(400);
     }
     $ids = split(' *, *', $_REQUEST['csvIDs']);
     $script = "st = \$('sitetree'); \n";
     foreach ($ids as $id) {
         if (is_numeric($id)) {
             $record = DataObject::get_by_id($this->stat('tree_class'), $id);
             if ($record && !$record->canDelete()) {
                 return Security::permissionFailure($this);
             }
             DataObject::delete_by_id($this->stat('tree_class'), $id);
             $script .= "node = st.getTreeNodeByIdx({$id}); if(node) node.parentTreeNode.removeTreeNode(node); \$('Form_EditForm').closeIfSetTo({$id}); \n";
         }
     }
     FormResponse::add($script);
     return FormResponse::respond();
 }
Пример #15
0
 /**
  * Delete a number of items
  */
 public function deleteitems()
 {
     $ids = split(' *, *', $_REQUEST['csvIDs']);
     $script = "st = \$('sitetree'); \n";
     foreach ($ids as $id) {
         if (is_numeric($id)) {
             DataObject::delete_by_id($this->stat('tree_class'), $id);
             $script .= "node = st.getTreeNodeByIdx({$id}); if(node) node.parentTreeNode.removeTreeNode(node); \$('Form_EditForm').closeIfSetTo({$id}); \n";
         }
     }
     FormResponse::add($script);
     return FormResponse::respond();
 }
Пример #16
0
    function acceptmarked()
    {
        $numComments = 0;
        $folderID = 0;
        $deleteList = '';
        if ($_REQUEST['Comments']) {
            foreach ($_REQUEST['Comments'] as $commentid) {
                $comment = DataObject::get_by_id('PageComment', $commentid);
                if ($comment) {
                    $comment->IsSpam = false;
                    $comment->NeedsModeration = false;
                    $comment->write();
                    $numComments++;
                }
            }
        } else {
            user_error("No comments in {$commentList} could be found!", E_USER_ERROR);
        }
        $msg = sprintf(_t('CommentAdmin.APPROVED', 'Accepted %s comments.'), $numComments);
        $js = <<<JS
\t\t\t\t{$deleteList}
\t\t\t\t\$('Form_EditForm').getPageFromServer(\$('Form_EditForm_ID').value);
\t\t\t\tstatusMessage("Accepted {$numComments} comments.");
JS;
        FormResponse::add($js);
        return FormResponse::respond();
    }
    function savemember()
    {
        $data = $_REQUEST;
        $className = $this->stat('subitem_class');
        $id = $_REQUEST['ID'];
        if ($id == 'new') {
            $id = null;
        }
        if ($id) {
            if (defined('DB::USE_ANSI_SQL')) {
                $record = DataObject::get_one($className, "\"{$className}\".ID = {$id}");
            } else {
                $record = DataObject::get_one($className, "`{$className}`.ID = {$id}");
            }
        } else {
            // send out an email to notify the user that they have been subscribed
            $record = new $className();
        }
        $record->update($data);
        $record->ID = $id;
        $record->write();
        $record->Groups()->add($data['GroupID']);
        $FirstName = Convert::raw2js($record->FirstName);
        $Surname = Convert::raw2js($record->Surname);
        $Email = Convert::raw2js($record->Email);
        $Password = Convert::raw2js($record->Password);
        $response = <<<JS
\t\t\t\$('MemberList').setRecordDetails({$record->ID}, {
\t\t\t\tFirstName : "{$FirstName}",
\t\t\t\tSurname : "{$Surname}",
\t\t\t\tEmail : "{$Email}"
\t\t\t});
\t\t\t\$('MemberList').clearAddForm();
JS;
        FormResponse::add($response);
        FormResponse::status_message(_t('NewsletterAdmin.SAVED'), 'good');
        return FormResponse::respond();
    }
Пример #18
0
	/**
	 * Delete a number of items
	 */
	public function deleteitems() {
		$ids = split(' *, *', $_REQUEST['csvIDs']);

		$script = "st = \$('sitetree'); \n";
		foreach($ids as $id) {
			if(is_numeric($id)) {
				$record = DataObject::get_by_id($this->stat('tree_class'), $id);
				if($record && !$record->canDelete()) return Security::permissionFailure($this);
				
				DataObject::delete_by_id($this->stat('tree_class'), $id);
				$script .= "node = st.getTreeNodeByIdx($id); if(node) node.parentTreeNode.removeTreeNode(node); $('Form_EditForm').closeIfSetTo($id); \n";
			}
		}
		FormResponse::add($script);

		return FormResponse::respond();
	}
Пример #19
0
    /**
     * Create a new translation from an existing item, switch to this language and reload the tree.
     */
    function createtranslation()
    {
        if (!Director::is_ajax()) {
            Director::redirectBack();
            return;
        }
        $langCode = $_REQUEST['newlang'];
        $langName = i18n::get_language_name($langCode);
        $originalLangID = $_REQUEST['ID'];
        $record = $this->getRecord($originalLangID);
        $temporalID = "new-{$record->RecordClassName}-{$record->ParentID}-{$originalLangID}";
        Session::set($temporalID . '_originalLangID', $originalLangID);
        $tree = $this->switchlanguage($langCode, $originalLangID);
        FormResponse::add(<<<JS
\t\tif (Element.hasClassName('LangSelector_holder','onelang')) {
\t\t\tElement.removeClassName('LangSelector_holder','onelang');
\t\t\t\$('treepanes').resize();
\t\t}
\t\tif (\$('LangSelector').options['{$langCode}'] == undefined) {
\t\t\tvar option = document.createElement("option");
\t\t\toption.text = '{$langName}';
\t\t\toption.value = '{$langCode}';
\t\t\t\$('LangSelector').options.add(option);
\t\t}
JS
);
        FormResponse::add("\$('LangSelector').selectValue('{$langCode}');");
        $newrecord = clone $record;
        $newrecord->ID = $temporalID;
        $newrecord->CheckedPublicationDifferences = $newrecord->AddedToStage = true;
        return $this->returnItemToUser($newrecord);
    }
 function onBeforeWrite()
 {
     if (!$this->owner->ID && !$this->owner->SubsiteID) {
         $this->owner->SubsiteID = Subsite::currentSubsiteID();
     }
     // If the content has been changed, then the page should be marked as 'custom content'
     if (!$this->nextWriteDoesntCustomise && $this->owner->ID && $this->owner->MasterPageID && !$this->owner->CustomContent) {
         $changed = $this->owner->getChangedFields();
         foreach (self::$template_fields as $field) {
             if (isset($changed[$field]) && $changed[$field]) {
                 $this->owner->CustomContent = true;
                 FormResponse::add("if(\$('Form_EditForm_CustomContent')) \$('Form_EditForm_CustomContent').checked = true;");
                 break;
             }
         }
     }
     $this->nextWriteDoesntCustomise = false;
     parent::onBeforeWrite();
 }
 function run(DataObjectSet $pages)
 {
     $ids = $pages->column('ID');
     $this->batchaction($pages, 'doUnpublish', _t('CMSBatchActions.DELETED_PAGES', 'Deleted %d pages from the published site, %d failures'));
     foreach ($ids as $pageID) {
         $id = $pageID;
         // check to see if the record exists on the stage site, if it doesn't remove the tree node
         $stageRecord = Versioned::get_one_by_stage('SiteTree', 'Stage', "\"SiteTree\".\"ID\"={$id}");
         if ($stageRecord) {
             $stageRecord->IsAddedToStage = true;
             $title = Convert::raw2js($stageRecord->TreeTitle());
             FormResponse::add("\$('sitetree').setNodeTitle({$id}, '{$title}');");
             FormResponse::add("\$('Form_EditForm').reloadIfSetTo({$id});");
         } else {
             FormResponse::add("var node = \$('sitetree').getTreeNodeByIdx('{$id}');");
             FormResponse::add("if(node && node.parentTreeNode)\tnode.parentTreeNode.removeTreeNode(node);");
             FormResponse::add("\$('Form_EditForm').reloadIfSetTo({$id});");
         }
     }
     return FormResponse::respond();
 }
Пример #22
0
 /**
  * Perform the "delete marked" action.
  * Called and returns in same way as 'save' function
  */
 public function deletemarked($urlParams, $form)
 {
     $fileList = "'" . ereg_replace(' *, *', "','", trim(addslashes($_REQUEST['FileIDs']))) . "'";
     $numFiles = 0;
     $folderID = 0;
     $deleteList = '';
     $brokenPageList = '';
     if ($fileList != "''") {
         $files = DataObject::get("File", "\"File\".\"ID\" IN ({$fileList})");
         if ($files) {
             $brokenPages = array();
             foreach ($files as $file) {
                 $brokenPages = array_merge($brokenPages, $file->BackLinkTracking()->toArray());
                 if ($file instanceof Image) {
                     $file->deleteFormattedImages();
                 }
                 if (!$folderID) {
                     $folderID = $file->ParentID;
                 }
                 $file->delete();
                 $numFiles++;
             }
             if ($brokenPages) {
                 $brokenPageList = "  " . _t('AssetAdmin.NOWBROKEN', 'These pages now have broken links:') . '</ul>';
                 foreach ($brokenPages as $brokenPage) {
                     $brokenPageList .= "<li style=&quot;font-size: 65%&quot;>" . $brokenPage->Breadcrumbs(3, true) . '</li>';
                 }
                 $brokenPageList .= '</ul>';
             } else {
                 $brokenPageList = '';
             }
             $deleteList = '';
             if ($folderID) {
                 $remaining = DB::query("SELECT COUNT(*) FROM \"File\" WHERE \"ParentID\" = {$folderID}")->value();
                 if (!$remaining) {
                     $deleteList .= "Element.removeClassName(\$('sitetree').getTreeNodeByIdx('{$folderID}').getElementsByTagName('a')[0],'contents');";
                 }
             }
         } else {
             user_error("No files in {$fileList} could be found!", E_USER_ERROR);
         }
     }
     $message = sprintf(_t('AssetAdmin.DELETEDX', "Deleted %s files.%s"), $numFiles, $brokenPageList);
     FormResponse::add($deleteList);
     FormResponse::status_message($message, "good");
     FormResponse::add("\$('Form_EditForm').getPageFromServer(\$('Form_EditForm_ID').value)");
     return FormResponse::respond();
 }
Пример #23
0
    /**
     * @return String
     */
    function FieldHolder()
    {
        Requirements::javascript(THIRDPARTY_DIR . "/greybox/AmiJS.js");
        Requirements::javascript(THIRDPARTY_DIR . "/greybox/greybox.js");
        Requirements::add_i18n_javascript(SAPPHIRE_DIR . '/javascript/lang');
        Requirements::javascript(SAPPHIRE_DIR . '/javascript/TableListField.js');
        Requirements::javascript(SAPPHIRE_DIR . "/javascript/ComplexTableField.js");
        Requirements::css(THIRDPARTY_DIR . "/greybox/greybox.css");
        Requirements::css(SAPPHIRE_DIR . "/css/TableListField.css");
        Requirements::css(SAPPHIRE_DIR . "/css/ComplexTableField.css");
        // set caption if required
        if ($this->popupCaption) {
            $id = $this->id();
            if (Director::is_ajax()) {
                $js = <<<JS
\$('{$id}').GB_Caption = '{$this->popupCaption}';
JS;
                FormResponse::add($js);
            } else {
                $js = <<<JS
Event.observe(window, 'load', function() { \$('{$id}').GB_Caption = '{$this->popupCaption}'; });
JS;
                Requirements::customScript($js);
            }
        }
        // compute sourceItems here instead of Items() to ensure that
        // pagination and filters are respected on template accessors
        $this->sourceItems();
        return $this->renderWith($this->template);
    }
Пример #24
0
	/**
	 * Perform the "delete marked" action.
	 * Called and returns in same way as 'save' function
	 */
	public function deletemarked($urlParams, $form) {
		$fileList = "'" . ereg_replace(' *, *',"','",trim(addslashes($_REQUEST['FileIDs']))) . "'";
		$numFiles = 0;
		$folderID = 0;
		$deleteList = '';
		$brokenPageList = '';

		if($fileList != "''") {
			$files = DataObject::get('File', "`File`.ID IN ($fileList)");
			if($files) {
				foreach($files as $file) {
					if($file instanceof Image) {
						$file->deleteFormattedImages();
					}
					if(!$folderID) {
						$folderID = $file->ParentID;
					}
					$file->delete();
					$numFiles++;
				}
				if($brokenPages = Notifications::getItems('BrokenLink')) {
					$brokenPageList = "  ". _t('AssetAdmin.NOWBROKEN', 'These pages now have broken links:') . '</ul>';
					foreach($brokenPages as $brokenPage) {
						$brokenPageList .= "<li style=&quot;font-size: 65%&quot;>" . $brokenPage->Breadcrumbs(3, true) . '</li>';
					}
					$brokenPageList .= '</ul>';
					Notifications::notifyByEmail("BrokenLink", "Page_BrokenLinkEmail");
				} else {
					$brokenPageList = '';
				}
				
				$deleteList = '';
				if($folderID) {
					$remaining = DB::query("SELECT COUNT(*) FROM `File` WHERE `ParentID`=$folderID")->value();
					if(!$remaining) $deleteList .= "Element.removeClassName(\$('sitetree').getTreeNodeByIdx('$folderID').getElementsByTagName('a')[0],'contents');";
				}
			} else {
				user_error("No files in $fileList could be found!", E_USER_ERROR);
			}
		}
		
		$message = sprintf(_t('AssetAdmin.DELETEDX',"Deleted %s files.%s"),$numFiles,$brokenPageList) ;
		
		FormResponse::add($deleteList);
		FormResponse::status_message($message, "good");
		FormResponse::add("$('Form_EditForm').getPageFromServer($('Form_EditForm_ID').value)");
		
		return FormResponse::respond();	
	}
 public function removememberfromgroup()
 {
     $groupID = $this->urlParams['ID'];
     $memberID = $this->urlParams['OtherID'];
     if (is_numeric($groupID) && is_numeric($memberID)) {
         $member = DataObject::get_by_id('Member', (int) $memberID);
         if (!$member->canDelete()) {
             return Security::permissionFailure($this);
         }
         $member->Groups()->remove((int) $groupID);
         FormResponse::add("reloadMemberTableField();");
     } else {
         user_error("SecurityAdmin::removememberfromgroup: Bad parameters: Group={$groupID}, Member={$memberID}", E_USER_ERROR);
     }
     return FormResponse::respond();
 }
 function onAfterWrite()
 {
     parent::onAfterWrite();
     // Don't do this stuff when we're publishing
     if (!$this->extension_instances['Versioned']->migratingVersion) {
         if ($this->isChanged('CopyContentFromID') && $this->CopyContentFromID != 0 && $this instanceof VirtualPage) {
             $this->updateImageTracking();
         }
     }
     FormResponse::add("\$('Form_EditForm').reloadIfSetTo({$this->ID});", $this->ID . "_VirtualPage_onAfterWrite");
 }
Пример #27
0
 /**
  * Processing that occurs before a form is executed.
  * This includes form validation, if it fails, we redirect back
  * to the form with appropriate error messages
  */
 function beforeProcessing()
 {
     if ($this->validator) {
         $errors = $this->validator->validate();
         if ($errors) {
             if (Director::is_ajax()) {
                 // Send validation errors back as JSON with a flag at the start
                 //echo "VALIDATIONERROR:" . Convert::array2json($errors);
                 FormResponse::status_message(_t('Form.VALIDATIONFAILED', 'Validation failed'), 'bad');
                 foreach ($errors as $error) {
                     FormResponse::add(sprintf("validationError('%s', '%s', '%s');\n", Convert::raw2js($error['fieldName']), Convert::raw2js($error['message']), Convert::raw2js($error['messageType'])));
                 }
                 echo FormResponse::respond();
                 return false;
             } else {
                 $data = $this->getData();
                 // People will get worried if you leave credit card information in session..
                 if (isset($data['CreditCardNumber'])) {
                     unset($data['CreditCardNumber']);
                 }
                 if (isset($data['DateExpiry'])) {
                     unset($data['Expiry']);
                 }
                 // Load errors into session and post back
                 Session::set("FormInfo.{$this->FormName()}", array('errors' => $errors, 'data' => $data));
                 Director::redirectBack();
             }
             return false;
         }
     }
     return true;
 }
Пример #28
0
    protected function getRelatedData()
    {
        $relatedName = $_REQUEST['RelatedClass'];
        $id = $_REQUEST[$relatedName]['ID'];
        $baseClass = $this->stat('data_type');
        $relatedClasses = singleton($baseClass)->stat('has_one');
        if ($id) {
            $relatedObject = DataObject::get_by_id($relatedClasses[$relatedName], $id);
            $response .= <<<JS
\t\t\t\$('{$relatedName}').unsetNewRelatedKey();
JS;
        } elseif ($id !== '0') {
            //in case of null;
            $relatedObject = new $relatedClasses[$relatedName]();
            if ($parentID = $_REQUEST[$relatedName]['ParentID']) {
                $relatedObject->ParentID = $parentID;
            }
            $id = $relatedObject->write();
            $response .= <<<JS
\t\t\t\$('{$relatedName}').setNewRelatedKey({$id});
JS;
        } else {
            // in case of 0
            $relatedObject = new $relatedClasses[$relatedName]();
            if ($parentID = $_REQUEST[$relatedName]['ParentID']) {
                $relatedObject->ParentID = $parentID;
            }
            $response .= <<<JS
\t\t\t\$('{$relatedName}').unsetNewRelatedKey();
JS;
        }
        if (Director::is_ajax()) {
            $fields = $_REQUEST[$relatedName];
            $response .= <<<JS
var dataArray = new Array();
JS;
            foreach ($fields as $k => $v) {
                $JS_newKey = Convert::raw2js($relatedName . '[' . $k . ']');
                $JS_newValue = Convert::raw2js($relatedObject->{$k});
                $response .= <<<JS
dataArray['{$JS_newKey}'] = '{$JS_newValue}';
JS;
            }
            $response .= <<<JS
\$('{$relatedName}').updateChildren(dataArray, true);
JS;
            FormResponse::add($response);
        }
        return FormResponse::respond();
    }
Пример #29
0
    public function removefile($request)
    {
        // Protect against CSRF on destructive action
        if (!SecurityToken::inst()->checkRequest($request)) {
            return $this->httpError(400);
        }
        if ($fileID = $this->urlParams['ID']) {
            $file = DataObject::get_by_id('File', $fileID);
            if (!$file) {
                return $this->httpError(400);
            }
            // Delete the temp verions of this file in assets/_resampled
            if ($file instanceof Image) {
                $file->deleteFormattedImages();
            }
            $file->delete();
            $file->destroy();
            if (Director::is_ajax()) {
                $js = <<<JS
\t\t\t\t\$('Form_EditForm_Files').removeFile({$fileID});
\t\t\t\tstatusMessage('removed file', 'good');
JS;
                FormResponse::add($js);
                return FormResponse::respond();
            } else {
                Director::redirectBack();
            }
        } else {
            user_error("AssetAdmin::removefile: Bad parameters: File={$fileID}", E_USER_ERROR);
        }
    }
 protected function javascriptRefresh($message = 'Please wait...')
 {
     FormResponse::add("\$('Form_EditForm').resetElements();");
     FormResponse::add('$$("#sitetree li.current")[0].selectTreeNode();');
     FormResponse::status_message($message, "good");
     return FormResponse::respond();
 }