示例#1
0
	/**
	 * Custom request handler that will check component handlers before proceeding to the default implementation.
	 * 
	 * @todo There is too much code copied from RequestHandler here.
	 */
	function handleRequest(SS_HTTPRequest $request, DataModel $model) {
		if($this->brokenOnConstruct) {
			user_error("parent::__construct() needs to be called on {$handlerClass}::__construct()", E_USER_WARNING);
		}

		$this->request = $request;
		$this->setModel($model);

		$fieldData = $this->request->requestVar($this->getName());
		if($fieldData && $fieldData['GridState']) $this->getState(false)->setValue($fieldData['GridState']);
		
		foreach($this->components as $component) {
			if(!($component instanceof GridField_URLHandler)) {
				continue;
			}
			
			$urlHandlers = $component->getURLHandlers($this);
			
			if($urlHandlers) foreach($urlHandlers as $rule => $action) {
				if($params = $request->match($rule, true)) {
					// Actions can reference URL parameters, eg, '$Action/$ID/$OtherID' => '$Action',
					if($action[0] == '$') $action = $params[substr($action,1)];
					if(!method_exists($component, 'checkAccessAction') || $component->checkAccessAction($action)) {
						if(!$action) {
							$action = "index";
						} else if(!is_string($action)) {
							throw new LogicException("Non-string method name: " . var_export($action, true));
						}

						try {
							$result = $component->$action($this, $request);
						} catch(SS_HTTPResponse_Exception $responseException) {
							$result = $responseException->getResponse();
						}

						if($result instanceof SS_HTTPResponse && $result->isError()) {
							return $result;
						}

						if($this !== $result && !$request->isEmptyPattern($rule) && is_object($result) && $result instanceof RequestHandler) {
							$returnValue = $result->handleRequest($request, $model);

							if(is_array($returnValue)) {
								throw new LogicException("GridField_URLHandler handlers can't return arrays");
							}

							return $returnValue;

						// If we return some other data, and all the URL is parsed, then return that
						} else if($request->allParsed()) {
							return $result;

						// But if we have more content on the URL and we don't know what to do with it, return an error.
						} else {
							return $this->httpError(404, "I can't handle sub-URLs of a " . get_class($result) . " object.");
						}
					}
				}
			}
		}
		
		return parent::handleRequest($request, $model);
	}
示例#2
0
 /**
  * Custom request handler that will check component handlers before proceeding to the default
  * implementation.
  *
  * @todo copy less code from RequestHandler.
  *
  * @param SS_HTTPRequest $request
  * @param DataModel $model
  *
  * @return array|RequestHandler|SS_HTTPResponse|string|void
  *
  * @throws SS_HTTPResponse_Exception
  */
 public function handleRequest(SS_HTTPRequest $request, DataModel $model)
 {
     if ($this->brokenOnConstruct) {
         user_error(sprintf("parent::__construct() needs to be called on %s::__construct()", __CLASS__), E_USER_WARNING);
     }
     $this->setRequest($request);
     $this->setDataModel($model);
     $fieldData = $this->getRequest()->requestVar($this->getName());
     if ($fieldData && isset($fieldData['GridState'])) {
         $this->getState(false)->setValue($fieldData['GridState']);
     }
     foreach ($this->getComponents() as $component) {
         if ($component instanceof GridField_URLHandler && ($urlHandlers = $component->getURLHandlers($this))) {
             foreach ($urlHandlers as $rule => $action) {
                 if ($params = $request->match($rule, true)) {
                     // Actions can reference URL parameters.
                     // e.g. '$Action/$ID/$OtherID' → '$Action'
                     if ($action[0] == '$') {
                         $action = $params[substr($action, 1)];
                     }
                     if (!method_exists($component, 'checkAccessAction') || $component->checkAccessAction($action)) {
                         if (!$action) {
                             $action = "index";
                         }
                         if (!is_string($action)) {
                             throw new LogicException(sprintf('Non-string method name: %s', var_export($action, true)));
                         }
                         try {
                             $result = $component->{$action}($this, $request);
                         } catch (SS_HTTPResponse_Exception $responseException) {
                             $result = $responseException->getResponse();
                         }
                         if ($result instanceof SS_HTTPResponse && $result->isError()) {
                             return $result;
                         }
                         if ($this !== $result && !$request->isEmptyPattern($rule) && is_object($result) && $result instanceof RequestHandler) {
                             $returnValue = $result->handleRequest($request, $model);
                             if (is_array($returnValue)) {
                                 throw new LogicException('GridField_URLHandler handlers can\'t return arrays');
                             }
                             return $returnValue;
                         }
                         if ($request->allParsed()) {
                             return $result;
                         }
                         return $this->httpError(404, sprintf('I can\'t handle sub-URLs of a %s object.', get_class($result)));
                     }
                 }
             }
         }
     }
     return parent::handleRequest($request, $model);
 }
 public function handleRequest(SS_HTTPRequest $request, DataModel $model)
 {
     if ($request->match('addinlinerecord', true)) {
         // NOTE(Jake): Handling here as I'm not sure how to do a url_handler that allows
         //             infinite parameters after 'addinlinerecord'
         $result = $this->handleAddInline($request);
         if ($result && is_object($result) && $result instanceof RequestHandler) {
             // NOTE(Jake): Logic copied from parent::handleRequest()
             $returnValue = $result->handleRequest($request, $model);
             if ($returnValue && is_array($returnValue)) {
                 $returnValue = $this->customise($returnValue);
             }
             return $returnValue;
         }
         // NOTE(Jake): Consume all remaining parts so that 'RequestHandler::handleRequest'
         //             doesn't hit an error. (Use Case: Getting an error with a GridField::handleRequest)
         // NOTE(Jake): THis is probably due to just CLASSNAME not being consumed/shifted in 'addinlinerecord'
         //             but cbf changing and re-testing everything.
         $dirParts = explode('/', $request->remaining());
         foreach ($dirParts as $dirPart) {
             $request->shift();
         }
         return $result;
     }
     $result = parent::handleRequest($request, $model);
     return $result;
 }