Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

API CHANGE Removed FormResponse class, use custom HTTP status codes t…

…o communicate state on text/html responses, or use text/json for more structured data responses
  • Loading branch information...
commit e6be56e3b4c90982114a8306bdae5a751266584a 1 parent fa6142c
@chillu chillu authored
View
273 control/FormResponse.php
@@ -1,273 +0,0 @@
-<?php
-/**
- * This class collects all output that needs to be returned after an Form-Request to the client. It automatically determines
- * if it needs to send back javascript after an Ajax-Request or just redirect to another page (on a normal request).
- *
- * FormResponse is also responsible for keeping the client- and serverside in sync after an HTTP-Request
- * by collecting javascript-commands (which mostly trigger subsequent update-calls by Ajax.)
- * Use the output as a return-value for Ajax-based saving methods. Be sure to check if the call is acutally "ajaxy"
- * by checking Director::is_ajax(). It is the developers responsibility to include this into his custom form-methods.
- * Use the Request-Parameter 'htmlonly' to enforce a pure HTML-response from the client-side.
- *
- * Example: A {@TableField} is in an incorrect state after being saved, as it still has rows marked as "new"
- * which are already saved (and have an ID) in the database. By using AjaxSynchroniser we make sure that every instance
- * is refreshed by Ajax and reflects the correct state.
- *
- * Caution:
- * - FormResponse assumes that prototype.js is included on the client-side. (We can't put it into Requirements because it has to
- * be included BEFORE an AjaxSynchroniser is called).
- * - Please DON'T escape literal parameters which are passed to FormResponse, they are escaped automatically.
- * - Some functions assume a {LeftAndMain}-based environment (e.g. load_form())
- *
- * @todo Force a specific execution order ($forceTop, $forceBottom)Ω
- * @todo Extension to return different formats, e.g. JSON or XML
- *
- * WARNING: This should only be used within the CMS context. Please use markup or JSON to transfer state to the client,
- * and react with javascript callbacks instead in other situations.
- *
- * @package forms
- * @subpackage core
- */
-class FormResponse {
-
- /**
- * @var $rules array
- */
- static protected $rules = array();
-
- /**
- * @var $behaviour_apply_rules array Separated from $rules because
- * we need to apply all behaviour at the very end of the evaluated script
- * to make sure we include all possible Behaviour.register()-calls.
- */
- static protected $behaviour_apply_rules = array();
-
- /**
- * @var $non_ajax_content string
- */
- static protected $non_ajax_content;
-
- /**
- * Status-messages are accumulated, and the "worst" is chosen
- *
- * @var $status_messages array
- */
- static protected $status_messages = array();
-
- /**
- * @var $redirect_url string
- */
- static protected $redirect_url;
-
-
- /**
- * @var $redirect_url string
- */
- static protected $status_include_order = array('bad', 'good', 'unknown');
-
- /**
- * Get all content as a javascript-compatible string (only if there is an Ajax-Request present).
- * Falls back to {non_ajax_content}, {redirect_url} or Director::redirectBack() (in this order).
- *
- * @return string
- */
- static function respond() {
- // we don't want non-ajax calls to receive javascript
- if(isset($_REQUEST['forcehtml'])) {
- return self::$non_ajax_content;
- } else if(isset($_REQUEST['forceajax']) || Director::is_ajax()) {
- $response = Controller::curr()->getResponse();
- $response->addHeader('Content-Type', 'text/javascript');
- return self::get_javascript();
- } elseif(!empty(self::$non_ajax_content)) {
- return self::$non_ajax_content;
- } elseif(!empty(self::$redirect_url)) {
- Director::redirect(self::$redirect_url);
- return null;
- } elseif(!Director::redirected_to()) {
- Director::redirectBack();
- return null;
- } else {
- return null;
- }
-
- }
-
- /**
- * Caution: Works only for forms which inherit methods from LeftAndMain.js
- */
- static function load_form($content, $id = 'Form_EditForm') {
- // make sure form-tags are stripped
- // loadNewPage() uses innerHTML to replace the form, which makes IE cry when replacing an element with itself
- $content = preg_replace(array('/<form[^>]*>/','/<\/form>/'), '', $content);
- $JS_content = Convert::raw2js($content);
- self::$rules[] = "\$('{$id}').loadNewPage('{$JS_content}');";
- self::$rules[] = "\$('{$id}').initialize();";
- }
-
- /**
- * Add custom scripts.
- * Caution: Not escaped for backwards-compatibility.
- *
- * @param $scriptContent string
- *
- * @todo Should this content be escaped?
- */
- static function add($scriptContent, $uniquenessID = null) {
- if(isset($uniquenessID)) {
- self::$rules[$uniquenessID] = $scriptContent;
- } else {
- self::$rules[] = $scriptContent;
- }
- }
-
- static function clear() {
- self::$rules = array();
- }
-
- /**
- * @param $id int
- */
- static function get_page($id, $form = 'Form_EditForm', $uniquenessID = null) {
- $JS_id = (int)$id;
- if($JS_id){
- if(isset($uniquenessID)) {
- self::$rules[$uniquenessID] = "\$('$form').getPageFromServer($JS_id);";
- } else {
- self::$rules[] = "\$('$form').getPageFromServer($JS_id);";
- }
- }
- }
-
- /**
- * Sets the status-message (overlay-notification in the CMS).
- * You can call this method multiple times, it will default to the "worst" statusmessage.
- *
- * @param $message string
- * @param $status string
- */
- static function status_message($message = "", $status = null) {
- $JS_message = Convert::raw2js($message);
- $JS_status = Convert::raw2js($status);
- if(isset($JS_status)) {
- self::$status_messages[$JS_status] = "statusMessage('{$JS_message}', '{$JS_status}');";
- } else {
- self::$status_messages['unknown'] = "statusMessage('{$JS_message}');";
- }
- }
-
- /**
- * Alias for status_message($messsage, 'bad')
- *
- * @param $message string
- */
- static function error($message = "") {
- $JS_message = Convert::raw2js($message);
- self::$status_messages['bad'] = $JS_message;
- }
-
- /**
- * Update the status (upper right corner) of the given Form
- *
- * @param $status string
- * @param $form string
- */
- static function update_status($status, $form = "Form_EditForm") {
- $JS_form = Convert::raw2js($form);
- $JS_status = Convert::raw2js($status);
- self::$rules[] = "\$('$JS_form').updateStatus('$JS_status');";
- }
-
- /**
- * Set the title of a single page in the pagetree
- *
- * @param $id int
- * @param $title string
- */
- static function set_node_title($id, $title = "") {
- $JS_id = Convert::raw2js($id);
- $JS_title = Convert::raw2js($title);
- self::$rules[] = "$('sitetree').setNodeTitle('$JS_id', '$JS_title');";
- }
-
- /**
- * Fallback-method to supply normal HTML-response when not being called by ajax.
- *
- * @param $content string HTML-content
- */
- static function set_non_ajax_content($content) {
- self::$non_ajax_content = $content;
- }
-
- /**
- * @param $url string
- */
- static function set_redirect_url($url) {
- self::$redirect_url = $url;
- }
-
- /**
- * @return string
- */
- static function get_redirect_url() {
- return self::$redirect_url;
- }
-
- /**
- * Replace a given DOM-element with the given content.
- * It automatically prefills {$non_ajax_content} with the passed content (as a fallback).
- *
- * @param $domID string The DOM-ID of an HTML-element that should be replaced
- * @param $domContent string The new HTML-content
- * @param $reapplyBehaviour boolean Applies behaviour to the given domID after refreshing it
- * @param $replaceMethod string Method for replacing - either 'replace' (=outerHTML) or 'update' (=innerHTML)
- * (Caution: "outerHTML" might cause problems on the client-side, e.g. on table-tags)
- *
- * @todo More fancy replacing with loading-wheel etc.
- */
- static function update_dom_id($domID, $domContent, $reapplyBehaviour = true, $replaceMethod = 'replace', $uniquenessID = null) {
- //self::$non_ajax_content = $domContent;
- $JS_domID = Convert::raw2js($domID);
- $JS_domContent = Convert::raw2js($domContent);
- $JS_replaceMethod = Convert::raw2js($replaceMethod);
- if(isset($uniquenessID)) {
- self::$rules[$uniquenessID] = "Element.$JS_replaceMethod('{$JS_domID}','{$JS_domContent}');";
- } else {
- self::$rules[] = "Element.$JS_replaceMethod('{$JS_domID}','{$JS_domContent}');";
- }
- if($reapplyBehaviour) {
- if(isset($uniquenessID)) {
- self::$behaviour_apply_rules[$uniquenessID] .= "Behaviour.apply('{$JS_domID}', true);";
- } else {
- self::$behaviour_apply_rules[] = "Behaviour.apply('{$JS_domID}', true);";
- }
- }
- }
-
- /**
- * @return string Compiled string of javascript-function-calls (needs to be evaluated on the client-side!)
- */
- protected static function get_javascript() {
- $js = "";
-
- // select only one status message (with priority on "bad" messages)
- $msg = "";
- foreach(self::$status_include_order as $status) {
- if(isset(self::$status_messages[$status])) {
- $msg = self::$status_messages[$status];
- break;
- }
- }
- if(!empty($msg)) self::$rules[] = $msg;
-
-
- $js .= implode("\n", self::$rules);
- $js .= Requirements::get_custom_scripts();
-
- // make sure behaviour is applied AFTER all registers are collected
- $js .= implode("\n", self::$behaviour_apply_rules);
-
- return $js;
- }
-}
-
View
2  forms/ComplexTableField.php
@@ -228,7 +228,7 @@ function FieldHolder() {
$js = <<<JS
$('$id').GB_Caption = '$this->popupCaption';
JS;
- FormResponse::add($js);
+ // FormResponse::add($js);
} else {
$js = <<<JS
Event.observe(window, 'load', function() { \$('$id').GB_Caption = '$this->popupCaption'; });
View
2  forms/TableField.php
@@ -267,7 +267,7 @@ function saveInto(DataObject $record) {
$this->value = null;
$items = $this->sourceItems();
- FormResponse::update_dom_id($this->id(), $this->FieldHolder());
+ // FormResponse::update_dom_id($this->id(), $this->FieldHolder());
}
}
View
3  forms/Validator.php
@@ -7,9 +7,6 @@
*
* Acts as a visitor to individual form fields.
*
- * @todo Automatically mark fields after serverside validation and replace the form through
- * FormResponse if the request was made by ajax.
- *
* @package forms
* @subpackage validators
*/

5 comments on commit e6be56e

@jahbini

Seems a bit terse for workarounds. Got examples? Pointers to TFM??

@chillu
Owner

Its custom dev now. If you still require the functionality, simply copy the class from a 2.4 install, it should work in 3.0 as well (just no longer supported).

@jahbini
@chillu
Owner

Hello! Not sure what kind of JS you're trying to evaluate here, but I'd suggest validating it through JSLint to ensure you don't have a syntax error. But that's best continued on the forum, rather than comments on a (more or less unrelated) commit hehe. I'm not aware of any developers in your region, although that doesn't say much ... :) You know about the dev network, right? http://www.silverstripe.org/silverstripe-developer-network/

All the best from Germany
Ingo

@jahbini
Please sign in to comment.
Something went wrong with that request. Please try again.