/** * Refreshes the file list. If passed an array of ids, it will add those to the list. * * @todo Add some better error handling. * @param SS_HTTPRequest * @return string|SS_Viewer */ public function refresh(SS_HTTPRequest $r) { if ($r->requestVar('ids')) { $id = reset($r->requestVar('ids')); if ($file = DataObject::get_by_id("File", (int) $id)) { $this->processFile($file); } else { die("File {$id} doesn't exist"); } } else { $file = $this->File(); } return $this->customise(array('File' => $file))->renderWith($this->AttachedFilesTemplate); }
/** * This may need to be optimised. We'll just have to see how it performs. * * @param SS_HTTPRequest $req * @return array */ public function downloads(SS_HTTPRequest $req) { $downloads = new ArrayList(); $member = Member::currentUser(); if (!$member || !$member->exists()) { $this->httpError(401); } // create a dropdown for sorting $sortOptions = Config::inst()->get('DownloadableAccountPageController', 'sort_options'); if ($sortOptions) { $sort = $req->requestVar('sort'); if (empty($sort)) { reset($sortOptions); $sort = key($sortOptions); } $sortControl = new DropdownField('download-sort', 'Sort By:', $sortOptions, $sort); } else { $sort = 'PurchaseDate'; $sortControl = ''; } // create a list of downloads $orders = $member->getPastOrders(); if (!empty($orders)) { foreach ($orders as $order) { if ($order->DownloadsAvailable()) { $downloads->merge($order->getDownloads()); } } } Requirements::javascript(SHOP_DOWNLOADABLE_FOLDER . '/javascript/AccountPage_downloads.js'); return array('Title' => 'Digital Purchases', 'Content' => '', 'SortControl' => $sortControl, 'HasDownloads' => $downloads->count() > 0, 'Downloads' => $downloads->sort($sort)); }
protected function getToken(SS_HTTPRequest $request) { $token = $request->requestVar('token'); if (!$token) { $token = $request->getHeader('X-Auth-Token'); } return $token; }
/** * Delete a file * * @param SS_HTTPRequest */ public function deletefile(SS_HTTPRequest $r) { if ($file = DataObject::get_by_id("File", (int) $r->requestVar('id'))) { $file->delete(); return new SS_HTTPResponse("OK", 200); } return false; }
function GET(SS_HTTPRequest $request) { // If we get a request var set as 'Error', trigger an errpr if ($request->requestVar('Error')) { $this->addResponseHeader('x-exception-id', '1'); return $this->respondWithError(404); } // Normal response - set a header, and respond $this->addResponseHeader('x-some-sideinfo', 'Zap!'); return $this->respondWith('ID', 'Baz', 'Qux'); }
public function index(SS_HTTPRequest $r) { if(isset($_FILES["Filedata"]) && is_uploaded_file($_FILES["Filedata"]["tmp_name"])) { $upload_folder = urldecode($r->requestVar('uploadFolder')); if(isset($_REQUEST['FolderID'])) { if($folder = DataObject::get_by_id("Folder", Convert::raw2sql($_REQUEST['FolderID']))) { $upload_folder = UploadifyField::relative_asset_dir($folder->Filename); } } $ext = strtolower(end(explode('.', $_FILES['Filedata']['name']))); $class = in_array($ext, UploadifyField::$image_extensions) ? $r->requestVar('imageClass') : $r->requestVar('fileClass'); $file = new $class(); $u = new Upload(); $u->loadIntoFile($_FILES['Filedata'], $file, $upload_folder); $file->write(); echo $file->ID; } else { echo ' '; // return something or SWFUpload won't fire uploadSuccess } }
public function spellcheck(SS_HTTPRequest $request) { $this->owner->request->addHeader('Content-Type', 'text/plain'); $this->owner->request->addHeader('Content-Encoding', 'UTF-8'); $this->owner->request->addHeader('Expires', 'Mon, 26 Jul 1007 05:00:00 GMT'); $this->owner->request->addHeader('Last-Modified', SS_DateTime::now()->Format('D, d M Y H:i:s') . ' GMT'); $this->owner->request->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate'); $this->owner->request->addHeader('Cache-Control', 'post-check=0, pre-check=0'); $this->owner->request->addHeader('Pragma', 'no-cache'); $engine = self::$engine; $shell = self::$shell; if (!defined('SPELLCHECK_POST_SS3')) { $engine = Config::inst()->get('CMSSpellChecker', 'engine') ?: $engine; $shell = Config::inst()->get('CMSSpellChecker', 'shell') ?: $shell; } if (!defined('PSPELL_FAST')) { define('PSPELL_FAST', 1); } # Fast mode (least number of suggestions) if (!defined('PSPELL_NORMAL')) { define('PSPELL_NORMAL', 2); } # Normal mode (more suggestions) if (!defined('PSPELL_BAD_SPELLERS')) { define('PSPELL_BAD_SPELLERS', 3); } # Slow mode (a lot of suggestions) $config['general.engine'] = $engine; $config['PSpell.mode'] = PSPELL_FAST; $config['PSpell.spelling'] = ''; $config['PSpell.jargon'] = ''; $config['PSpell.encoding'] = ''; $config['PSpellShell.mode'] = PSPELL_FAST; $config['PSpellShell.aspell'] = $shell; $config['PSpellShell.tmp'] = '/tmp'; $output = array('id' => null, 'result' => null, 'error' => null); $raw = $request->requestVar('json_data') ?: ''; if (!$raw) { $raw = '' . file_get_contents('php://input'); } if (!$raw) { $output['error'] = array('errstr' => 'Could not get raw post data', 'errfile' => '', 'errline' => null, 'errcontext' => '', 'level' => 'FATAL'); echo json_encode($output); exit; } $input = json_decode($raw, true); if (isset($config['general.engine'])) { $spellchecker = new $config['general.engine']($config); $result = call_user_func_array(array($spellchecker, $input['method']), $input['params']); } $output['id'] = $input['id']; $output['result'] = $result; echo json_encode($output); }
function preview(SS_HTTPRequest $request) { $strValue = $request->requestVar('markdown'); if ($strValue) { $shortCodeParser = ShortcodeParser::get_active(); $strValue = $shortCodeParser->parse($strValue); $parseDown = new Parsedown(); $strValue = $parseDown->text($strValue); } return $strValue; }
/** * * @param SS_HTTPRequest $request */ public function run($request) { $memberEmail = $request->requestVar('email'); $message = trim($request->requestVar('message')); if (!$memberEmail) { echo 'Please provide an email, eg ?email=user@example.com' . PHP_EOL; exit(1); } $members = Member::get()->filter('Email', $memberEmail); if (!$members->count()) { echo 'Please provide an existing member email' . PHP_EOL; exit(1); } $member = $members->first(); if (!$message) { echo 'Please provide a message, eg ?message=hello' . PHP_EOL; exit(1); } TimelineEvent::notify($member, $message); echo 'Member ' . $member->Email . ' has been notified' . PHP_EOL; }
/** * Refreshes the file list. If passed an array of IDs in the request, * it augments the list with those files. * * @param SS_HTTPRequest * @return SSViewer */ public function refresh(SS_HTTPRequest $r) { if ($r->requestVar('ids')) { $ids = array_unique($r->requestVar('ids')); $files = new DataObjectSet(); $implodestring = implode(',', $ids); $implodestring = preg_replace("/^[,]/", "", $implodestring); if ($set = DataObject::get("File", "`ID` IN ({$implodestring})")) { foreach ($set as $file) { $this->processFile($file); $files->push($file); } $files->merge($this->Files()); $files->removeDuplicates(); } else { die("File {$id} doesn't exist"); } } else { $files = $this->Files(); } return $this->customise(array('Files' => $files))->renderWith($this->AttachedFilesTemplate); }
/** * A controller action that handles the reordering of the panels * * @param SS_HTTPRequest The current request * @return SS_HTTPResponse */ public function sort(SS_HTTPRequest $r) { if ($sort = $r->requestVar('dashboard-panel')) { foreach ($sort as $index => $id) { if ($panel = DashboardPanel::get()->byID((int) $id)) { if ($panel->MemberID == Member::currentUserID()) { $panel->SortOrder = $index; $panel->write(); } } } } }
public function getresults(SS_HTTPRequest $r) { $q = Convert::raw2sql($r->requestVar('q')); $results = DataObject::get($this->sourceClass, $this->labelField . " LIKE '%{$q}%'"); if ($results) { $set = new DataObjectSet(); foreach ($results->toDropdownMap('ID', $this->labelField) as $key => $val) { $set->push(new ArrayData(array('Key' => $key, 'Val' => $val))); } } else { $set = false; } return $this->customise(array('Results' => $set))->renderWith('LiveDropdownField_results'); }
/** * @param SS_HTTPRequest $req * @return string */ public function search_suggest(SS_HTTPRequest $req) { /** @var SS_HTTPResponse $response */ $response = $this->owner->getResponse(); $callback = $req->requestVar('callback'); // convert the search results into usable json for search-as-you-type if (ShopSearch::config()->search_as_you_type_enabled) { $searchVars = $req->requestVars(); $searchVars[ShopSearch::config()->qs_query] = $searchVars['term']; unset($searchVars['term']); $results = ShopSearch::inst()->suggestWithResults($searchVars); } else { $results = array('suggestions' => ShopSearch::inst()->suggest($req->requestVar('term'))); } if ($callback) { $response->addHeader('Content-type', 'application/javascript'); $response->setBody($callback . '(' . json_encode($results) . ');'); } else { $response->addHeader('Content-type', 'application/json'); $response->setBody(json_encode($results)); } return $response; }
public function importlist(SS_HTTPRequest $request) { if ($id = $request->requestVar('FolderID')) { if (is_numeric($id)) { $files = DataObject::get("File", "\"ParentID\" = {$id} AND \"File\".\"ClassName\" != 'Folder'"); if ($ext = $request->requestVar('FileExt')) { $ext = str_replace('*.', '', $ext); $ext_arr = explode(';', $ext); $ext = ' AND ('; $x = 0; foreach ($ext_arr as $e) { if ($x++ == 0) { $ext .= " Name LIKE '%.{$e}' "; } else { $ext .= " OR Name LIKE '%.{$e}' "; } } $ext .= ')'; $files = DataObject::get("File", "ParentID = {$id} AND File.ClassName != 'Folder'" . $ext); } else { $files = DataObject::get("File", "ParentID = {$id} AND File.ClassName != 'Folder'"); } if ($files && $this->form) { if ($record = $this->form->getRecord()) { if ($relation_name = $this->getForeignRelationName($record)) { foreach ($files as $f) { if ($f->{$relation_name}) { $f->Disabled = true; } } } } } return $this->customise(array('Files' => $files))->renderWith('ImportList'); } } }
/** * Looks first for the X-Pull-Regions header and then for a __regions__ get/post var. * @return array */ protected function getPulledRegionIDs() { if (!$this->request) { return array(); } $header = $this->request->getHeader(self::PULL_HEADER); if (!empty($header)) { return explode(',', $header); } $param = $this->request->requestVar(self::PULL_PARAM); if (!empty($param)) { return explode(',', $param); } return array(); }
public function checkAuthToken(SS_HTTPRequest $r) { if ($token = $r->requestVar('token')) { if ($member = Member::get()->filter('AuthenticationToken', $token)->first()) { if ($member->checkToken()) { $member->refreshToken(); $member->login(); return true; } return $this->owner->httpError(403, "Token is expired"); } return $this->owner->httpError(403, "Invalid token"); } return false; }
/** * @param \SS_HTTPRequest $request * @return \SS_HTTPResponse */ public function history(\SS_HTTPRequest $request) { $data = []; $list = $this->environment->DeployHistory('DeployStarted'); $fromTimestamp = $request->requestVar('from'); if ($fromTimestamp) { $from = SS_Datetime::create(); $from->setValue($fromTimestamp); $list = $list->filter('LastEdited:GreaterThan', $from->Format('Y-m-d H:i:s')); } foreach ($list as $deployment) { $data[] = $this->formatter->getDeploymentData($deployment); } return $this->getAPIResponse(['list' => $data], 200); }
public function update(SS_HTTPRequest $r) { $ret = array(); $filter = null; if ($filter = $r->requestVar('q')) { $filter = "{$this->filteredField} = '" . Convert::raw2sql($filter) . "'"; } $results = DataObject::get($this->sourceClass, $filter); if ($results) { foreach ($results as $r) { $ret[$r->{$this->returnKey}] = $r->{$this->returnLabel}; } } return Convert::array2json($ret); }
/** * @param SS_HTTPRequest $req * @return string */ public function notify(SS_HTTPRequest $req) { $notify = Config::inst()->get('FBComments', 'notify'); $notifyFrom = Config::inst()->get('FBComments', 'notify_from'); $notifySubject = Config::inst()->get('FBComments', 'notify_subject'); if (!is_array($notify) || count($notify) <= 0) { return $this->httpError(401); } foreach ($notify as $to) { $email = new Email($notifyFrom, $to, $notifySubject); $email->setTemplate('FBCommentNotificationEmail'); $email->populateTemplate(array('URL' => $req->requestVar('page'), 'SiteConfig' => SiteConfig::current_site_config())); $email->send(); } return 'ok'; }
/** * Redirect back. Uses either the HTTP_REFERER or a manually set request-variable called * _REDIRECT_BACK_URL. * This variable is needed in scenarios where not HTTP-Referer is sent ( * e.g when calling a page by location.href in IE). * If none of the two variables is available, it will redirect to the base * URL (see {@link Director::baseURL()}). * @uses redirect() */ function redirectBack() { if ($this->request->requestVar('_REDIRECT_BACK_URL')) { $url = $this->request->requestVar('_REDIRECT_BACK_URL'); } else { if ($this->request->getHeader('Referer')) { $url = $this->request->getHeader('Referer'); } else { $url = Director::baseURL(); } } // absolute redirection URLs not located on this site may cause phishing if (Director::is_site_url($url)) { return $this->redirect($url); } else { return false; } }
public function importlist(SS_HTTPRequest $request) { if ($id = $request->requestVar('FolderID')) { if (is_numeric($id)) { $files = DataObject::get("File", "ParentID = {$id} AND ClassName != 'Folder'"); if ($files && $this->form) { if ($record = $this->form->getRecord()) { if ($relation_name = $this->getForeignRelationName($record)) { foreach ($files as $f) { if ($f->{$relation_name}) { $f->Disabled = true; } } } } } return $this->customise(array('Files' => $files))->renderWith('ImportList'); } } }
/** * Refresh the attached files box. This method may receive a list of IDs, * but it will only accept the last one in the list. * * @param SS_HTTPRequest $request * @return SSViewer */ public function refresh(SS_HTTPRequest $request) { ContentNegotiator::disable(); if ($id = $request->requestVar('FileIDs')) { if (!is_numeric($id)) { $arr = explode(',', $id); if (is_array($arr)) { $id = end($arr); } } $this->setValue($id); $name = null; if (is_numeric($id)) { if ($file = DataObject::get_by_id($this->baseFileClass, Convert::raw2sql($id))) { $name = $file->Name; } } } return Convert::array2json(array('html' => $this->renderWith('AttachedFiles'), 'success' => sprintf(_t('Uploadify.SUCCESSFULADDSINGLE', 'Added file "%s" successfully.'), $name))); }
public function getresults(SS_HTTPRequest $r) { $q = Convert::raw2sql($r->requestVar('q')); $qArray = explode(" ", $q); if (is_array($qArray) && count($qArray) > 1) { $where = $this->labelField . "!='' "; foreach ($qArray as $value) { $where .= "AND " . $this->labelField . " LIKE '%{$value}%' "; } } else { $where = $this->labelField . " LIKE '%{$q}%'"; } $results = DataObject::get($this->sourceClass, $where); if ($results) { $set = new DataObjectSet(); foreach ($results->toDropdownMap('ID', $this->labelField) as $key => $val) { $set->push(new ArrayData(array('Key' => $key, 'Val' => $val))); } } else { $set = false; } return $this->customise(array('Results' => $set))->renderWith('LiveDropdownField_results'); }
/** * Executes the main functionality of the input processor * @param \SS_HTTPRequest $request Request to process * @return mixed */ public function process(\SS_HTTPRequest $request) { $couponHolder = $this->getCouponHolder(); if ($request->param('ID') == 'add') { $couponCode = $request->requestVar('couponcode'); if (!$couponCode) { return ['Success' => false]; } /** @var CouponInterface[] $dbCoupons */ $dbCoupons = array_filter($this->getCouponsFromDatabase($couponCode), function ($coupon) { return $coupon instanceof CouponInterface && $coupon->isValid(); }); $coupons = $couponHolder->getCoupons(); if (count($dbCoupons) > 0) { foreach ($dbCoupons as $coupon) { $coupons[] = $coupon; } $couponHolder->setCoupons($coupons); return ['Success' => true]; } } elseif ($request->param('ID') == 'remove') { /** @var CouponInterface[] $dbCoupons */ $dbCoupons = array_filter($this->getCouponsFromDatabase($request->param('OtherID')), function ($coupon) { return $coupon instanceof CouponInterface; }); $coupons = $couponHolder->getCoupons(); if (count($dbCoupons) > 0) { foreach ($dbCoupons as $coupon) { unset($coupons[$coupon->getIdentifier()->getFull()]); } $couponHolder->setCoupons($coupons); return ['Success' => true]; } } return ['Success' => false]; }
/** * Returns the token from the request. * * Silverstripe doesn't include Authorization header in its requests. We should check it, because we can use the * mechanism in the tests. * @param \SS_HTTPRequest $request * @return String the token * @throws \Exception */ public static function get_token($request) { // try to get the token from request object $tokenStrFromHeader = $request->getHeader('Authorization'); $tokenStrFromVar = $request->requestVar('access_token'); if (!empty($tokenStrFromHeader)) { // string must have format: type token return explode(' ', $tokenStrFromHeader)[1]; } else { if (!empty($tokenStrFromVar)) { // try variables return $tokenStrFromVar; } else { if (function_exists('getallheaders')) { // get all headers from apache server $headers = getallheaders(); if (isset($headers['Authorization'])) { return explode(' ', $headers['Authorization'])[1]; } } } } throw new \Exception("Token can't be read or was not specified"); }
/** * Build snapshot move form. * * @param SS_HTTPRequest $request * @param DNDataArchive|null $dataArchive * * @return Form|SS_HTTPResponse */ public function getMoveForm(SS_HTTPRequest $request, DNDataArchive $dataArchive = null) { $dataArchive = $dataArchive ? $dataArchive : DNDataArchive::get()->byId($request->requestVar('DataArchiveID')); $envs = $dataArchive->validTargetEnvironments(); if (!$envs) { return $this->environment404Response(); } $warningMessage = '<div class="alert alert-warning"><strong>Warning:</strong> This will make the snapshot ' . 'available to people with access to the target environment.<br>By pressing "Change ownership" you ' . 'confirm that you have considered data confidentiality regulations.</div>'; $form = Form::create($this, 'MoveForm', FieldList::create(HiddenField::create('DataArchiveID', null, $dataArchive->ID), LiteralField::create('Warning', $warningMessage), DropdownField::create('EnvironmentID', 'Environment', $envs->map())->setEmptyString('Select an environment')), FieldList::create(FormAction::create('doMove', 'Change ownership')->addExtraClass('btn'))); $form->setFormAction($this->getCurrentProject()->Link() . '/MoveForm'); return $form; }
/** * Get's the previous URL that lead up to the current request. * * NOTE: Honestly, this should be built into SS_HTTPRequest, but we can't depend on that right now... so instead, * this is being copied verbatim from Controller (in the framework). * * @param SS_HTTPRequest $request * @return string */ protected function getBackURL(SS_HTTPRequest $request) { // Initialize a sane default (basically redirects to root admin URL). $controller = $this->getToplevelController(); $url = method_exists($this->requestHandler, "Link") ? $this->requestHandler->Link() : $controller->Link(); // Try to parse out a back URL using standard framework technique. if ($request->requestVar('BackURL')) { $url = $request->requestVar('BackURL'); } else { if ($request->isAjax() && $request->getHeader('X-Backurl')) { $url = $request->getHeader('X-Backurl'); } else { if ($request->getHeader('Referer')) { $url = $request->getHeader('Referer'); } } } return $url; }
/** Send an email with a link to unsubscribe from all this user's newsletters */ public function sendUnsubscribeLink(SS_HTTPRequest $request) { //get the form object (we just need its name to set the session message) $form = NewsletterContentControllerExtension::getUnsubscribeFormObject($this); $email = Convert::raw2sql($request->requestVar('email')); $recipient = Recipient::get()->filter('Email', $email)->First(); if ($recipient) { //get the IDs of all the Mailing Lists this user is subscribed to $lists = $recipient->MailingLists()->column('ID'); $listIDs = implode(',', $lists); $days = UnsubscribeController::get_days_unsubscribe_link_alive(); if ($recipient->ValidateHash) { $recipient->ValidateHashExpired = date('Y-m-d H:i:s', time() + 86400 * $days); $recipient->write(); } else { $recipient->generateValidateHashAndStore($days); } $templateData = array('FirstName' => $recipient->FirstName, 'UnsubscribeLink' => Director::absoluteBaseURL() . "unsubscribe/index/" . $recipient->ValidateHash . "/{$listIDs}"); //send unsubscribe link email $email = new Email(); $email->setTo($recipient->Email); $from = Email::getAdminEmail(); $email->setFrom($from); $email->setTemplate('UnsubscribeLinkEmail'); $email->setSubject(_t('Newsletter.ConfirmUnsubscribeSubject', "Confirmation of your unsubscribe request")); $email->populateTemplate($templateData); $email->send(); $form->sessionMessage(_t('Newsletter.GoodEmailMessage', 'You have been sent an email containing an unsubscribe link'), "good"); } else { //not found Recipient, just reload the form $form->sessionMessage(_t('Newsletter.BadEmailMessage', 'Email address not found'), "bad"); } Controller::curr()->redirectBack(); }
/** * Get the whole tree of a part of the tree via an AJAX request. * * @param SS_HTTPRequest $request * @return string */ public function tree(SS_HTTPRequest $request) { // Array sourceObject is an explicit list of values - construct a "flat tree" if (is_array($this->sourceObject)) { $output = "<ul class=\"tree\">\n"; foreach ($this->sourceObject as $k => $v) { $output .= '<li id="selector-' . $this->name . '-' . $k . '"><a>' . $v . '</a>'; } $output .= "</ul>"; return $output; } // Regular source specification $isSubTree = false; $this->search = $request->requestVar('search'); $ID = is_numeric($request->latestparam('ID')) ? (int) $request->latestparam('ID') : (int) $request->requestVar('ID'); if ($ID && !$request->requestVar('forceFullTree')) { $obj = DataObject::get_by_id($this->sourceObject, $ID); $isSubTree = true; if (!$obj) { throw new Exception("TreeDropdownField->tree(): the object #{$ID} of type {$this->sourceObject} could not be found"); } } else { if ($this->baseID) { $obj = DataObject::get_by_id($this->sourceObject, $this->baseID); } if (!$this->baseID || !$obj) { $obj = singleton($this->sourceObject); } } // pre-process the tree - search needs to operate globally, not locally as marking filter does if ($this->search != "") { $this->populateIDs(); } if ($this->filterCallback || $this->search != "") { $obj->setMarkingFilterFunction(array($this, "filterMarking")); } $obj->markPartialTree($nodeCountThreshold = 30, $context = null, $this->childrenMethod, $this->numChildrenMethod); // allow to pass values to be selected within the ajax request if (isset($_REQUEST['forceValue']) || $this->value) { $forceValue = isset($_REQUEST['forceValue']) ? $_REQUEST['forceValue'] : $this->value; if (($values = preg_split('/,\\s*/', $forceValue)) && count($values)) { foreach ($values as $value) { if (!$value || $value == 'unchanged') { continue; } $obj->markToExpose($this->objectForKey($value)); } } } $self = $this; $titleFn = function (&$child) use(&$self) { $keyField = $self->keyField; $labelField = $self->labelField; return sprintf('<li id="selector-%s-%s" data-id="%s" class="class-%s %s %s"><a rel="%d">%s</a>', Convert::raw2xml($self->getName()), Convert::raw2xml($child->{$keyField}), Convert::raw2xml($child->{$keyField}), Convert::raw2xml($child->class), Convert::raw2xml($child->markingClasses($self->numChildrenMethod)), $self->nodeIsDisabled($child) ? 'disabled' : '', (int) $child->ID, $child->obj($labelField)->forTemplate()); }; // Limit the amount of nodes shown for performance reasons. // Skip the check if we're filtering the tree, since its not clear how many children will // match the filter criteria until they're queried (and matched up with previously marked nodes). $nodeThresholdLeaf = Config::inst()->get('Hierarchy', 'node_threshold_leaf'); if ($nodeThresholdLeaf && !$this->filterCallback && !$this->search) { $className = $this->sourceObject; $nodeCountCallback = function ($parent, $numChildren) use($className, $nodeThresholdLeaf) { if ($className == 'SiteTree' && $parent->ID && $numChildren > $nodeThresholdLeaf) { return sprintf('<ul><li><span class="item">%s</span></li></ul>', _t('LeftAndMain.TooManyPages', 'Too many pages')); } }; } else { $nodeCountCallback = null; } if ($isSubTree) { $html = $obj->getChildrenAsUL("", $titleFn, null, true, $this->childrenMethod, $this->numChildrenMethod, true, null, $nodeCountCallback); return substr(trim($html), 4, -5); } else { $html = $obj->getChildrenAsUL('class="tree"', $titleFn, null, true, $this->childrenMethod, $this->numChildrenMethod, true, null, $nodeCountCallback); return $html; } }
/** * Determines if a specified file exists * * @param SS_HTTPRequest $request */ public function fileexists(SS_HTTPRequest $request) { // Assert that requested filename doesn't attempt to escape the directory $originalFile = $request->requestVar('filename'); if ($originalFile !== basename($originalFile)) { $return = array('error' => _t('File.NOVALIDUPLOAD', 'File is not a valid upload')); } else { $return = array('exists' => $this->checkFileExists($originalFile)); } // Encode and present response $response = new SS_HTTPResponse(Convert::raw2json($return)); $response->addHeader('Content-Type', 'application/json'); if (!empty($return['error'])) { $response->setStatusCode(400); } return $response; }