/**
  * Tests {@link Convert::raw2htmlatt()}
  */
 function testRaw2HtmlAtt()
 {
     $val1 = '<input type="text">';
     $this->assertEquals('ltinputtypequottextquotgt', Convert::raw2htmlatt($val1), 'Special characters are escaped');
     $val2 = 'This is some normal text.';
     $this->assertEquals('Thisissomenormaltext', Convert::raw2htmlatt($val2), 'Normal text is not escaped');
 }
 /**
  * Tests {@link Convert::raw2htmlatt()}
  */
 public function testRaw2HtmlAtt()
 {
     $val1 = '<input type="text">';
     $this->assertEquals('&lt;input type=&quot;text&quot;&gt;', Convert::raw2htmlatt($val1), 'Special characters are escaped');
     $val2 = 'This is some normal text.';
     $this->assertEquals('This is some normal text.', Convert::raw2htmlatt($val2), 'Normal text is not escaped');
 }
 public function getFormField()
 {
     $v = $this->Default;
     if (Controller::curr()->getRequest()->requestVar($this->Name)) {
         $v = Convert::raw2htmlatt(Controller::curr()->getRequest()->requestVar($this->Name));
     }
     $field = HiddenField::create($this->Name, $this->EscapedTitle, $v)->setFieldHolderTemplate('UserFormsField_holder')->setTemplate('UserFormsField');
     $this->doUpdateFormField($field);
     return $field;
 }
 public function getOptions()
 {
     $odd = 0;
     $source = $this->source;
     $values = $this->value;
     $items = array();
     if (!$source) {
         $source = array();
     }
     if ($values instanceof SS_List || is_array($values)) {
         $items = $values;
     } else {
         if ($values === null) {
             $items = array();
         } else {
             $items = explode(',', $values);
             $items = str_replace('{comma}', ',', $items);
         }
     }
     if (is_string($source)) {
         $source = explode(',', $values);
         $source = str_replace('{comma}', ',', $source);
     } else {
         if ($source instanceof SS_List) {
             $source = $source->toArray();
         } else {
             if (is_array($source)) {
                 // nothing to do
             } else {
                 throw new Exception(__CLASS__ . " only supports array, SS_List and strings as source");
             }
         }
     }
     // Detect a current custom value
     $diff = array_diff($items, $source);
     $last = '';
     if (count($diff)) {
         $last = end($diff);
     }
     $this->setAttribute('data-other-value', Convert::raw2htmlatt($last));
     $source['_'] = $this->other_text;
     $options = array();
     foreach ($source as $value => $item) {
         $title = $item;
         $itemID = $this->ID() . '_' . preg_replace('/[^a-zA-Z0-9]/', '', $value);
         $odd = ($odd + 1) % 2;
         $extraClass = $odd ? 'odd' : 'even';
         $extraClass .= ' val' . preg_replace('/[^a-zA-Z0-9\\-\\_]/', '_', $value);
         $options[] = new ArrayData(array('ID' => $itemID, 'Class' => $extraClass, 'Name' => "{$this->name}[]", 'Value' => $title, 'Title' => $title, 'isChecked' => in_array($title, $items) || in_array($title, $this->defaultItems), 'isDisabled' => $this->disabled || in_array($title, $this->disabledItems)));
     }
     $options = new ArrayList($options);
     return $options;
 }
    public function Field($properties = array())
    {
        if ($this->readonly) {
            return '';
        }
        $label = $this->Title();
        $id = $this->name;
        $title = Convert::raw2htmlatt($this->text);
        $fieldHtml = <<<HTML
\t\t<div id="{$id}" class="field formaction cancel">
\t\t<label class="left" for="Form_Form_action_storesubmission">{$label}</label>
\t\t<div class="middleColumn">
\t\t<input id="{$id}" class="action cancel" type="submit" title="{$title}" value="{$title}" name="action_storesubmission"/>
\t\t</div>
\t\t</div>
HTML;
        return $fieldHtml;
    }
 public function HTMLATT()
 {
     return Convert::raw2htmlatt($this->value);
 }
 /**
  * Renders the TextField and add button to the GridField.
  *
  * @param $girdField GridField
  *
  * @return string HTML
  **/
 public function getHTMLFragments($gridField)
 {
     $dataClass = $gridField->getList()->dataClass();
     $obj = singleton($dataClass);
     if (!$obj->canCreate()) {
         return "";
     }
     $dbField = $this->getDataObjectField();
     $textField = TextField::create("gridfieldaddbydbfield[" . $obj->ClassName . "][" . Convert::raw2htmlatt($dbField) . "]")->setAttribute("placeholder", $obj->fieldLabel($dbField))->addExtraClass("no-change-track");
     $addAction = new GridField_FormAction($gridField, 'add', _t('GridFieldAddByDBField.Add', "Add {name}", "Add button text", array("name" => $obj->i18n_singular_name())), 'add', 'add');
     $addAction->setAttribute('data-icon', 'add');
     // Start thinking about rending this back to the GF
     $forTemplate = new ArrayData(array());
     $forTemplate->Fields = new ArrayList();
     $forTemplate->Fields->push($textField);
     $forTemplate->Fields->push($addAction);
     return array($this->targetFragment => $forTemplate->renderWith("GridFieldAddByDBField"));
 }
 /**
  * Renders the TextField and add button to the GridField.
  *
  * @param $gridField GridField
  *
  * @return string
  */
 public function getHTMLFragments($gridField)
 {
     /**
      * @var DataList $dataList
      */
     $dataList = $gridField->getList();
     $dataClass = $dataList->dataClass();
     $obj = singleton($dataClass);
     if (!$obj->canCreate()) {
         return "";
     }
     $dbField = $this->getDataObjectField();
     $textField = TextField::create(sprintf("gridfieldaddbydbfield[%s][%s]", $obj->ClassName, Convert::raw2htmlatt($dbField)))->setAttribute('placeholder', $obj->fieldLabel($dbField))->addExtraClass('no-change-track');
     $addAction = new GridField_FormAction($gridField, 'add', _t('GridFieldAddByDBField.Add', 'Add {name}', "Add button text", array('name' => $obj->i18n_singular_name())), 'add', 'add');
     $addAction->setAttribute('data-icon', 'add');
     $forTemplate = new ArrayData(array());
     $forTemplate->Fields = new ArrayList();
     $forTemplate->Fields->push($textField);
     $forTemplate->Fields->push($addAction);
     return array($this->targetFragment => $forTemplate->renderWith('GridFieldAddByDBField'));
 }
 public function getURL()
 {
     return $this->Page() ? $this->Page()->Link() : Convert::raw2htmlatt($this->getCustomURL());
 }
 public function getURL()
 {
     if ($this->linkmode == "external") {
         $url = $this->getCustomURL();
         // add default http if no URL_SCHEME present
         if (parse_url($url, PHP_URL_SCHEME) === null) {
             $url = 'http://' . $url;
         }
         return Convert::raw2htmlatt($url);
     } else {
         if ($page = $this->Page()) {
             return $page->AbsoluteLink();
         }
     }
 }
    /**
     * Send this HTTPReponse to the browser
     */
    public function output()
    {
        // Attach appropriate X-Include-JavaScript and X-Include-CSS headers
        if (Director::is_ajax()) {
            Requirements::include_in_response($this);
        }
        if (in_array($this->statusCode, self::$redirect_codes) && headers_sent($file, $line)) {
            $url = Director::absoluteURL($this->headers['Location'], true);
            $urlATT = Convert::raw2htmlatt($url);
            $urlJS = Convert::raw2js($url);
            $title = Director::isDev() ? "{$urlATT}... (output started on {$file}, line {$line})" : "{$urlATT}...";
            echo <<<EOT
<p>Redirecting to <a href="{$urlATT}" title="Click this link if your browser does not redirect you">{$title}</a></p>
<meta http-equiv="refresh" content="1; url={$urlATT}" />
<script type="text/javascript">setTimeout(function(){
\twindow.location.href = "{$urlJS}";
}, 50);</script>";
EOT;
        } else {
            $line = $file = null;
            if (!headers_sent($file, $line)) {
                header($_SERVER['SERVER_PROTOCOL'] . " {$this->statusCode} " . $this->getStatusDescription());
                foreach ($this->headers as $header => $value) {
                    header("{$header}: {$value}", true, $this->statusCode);
                }
            } else {
                // It's critical that these status codes are sent; we need to report a failure if not.
                if ($this->statusCode >= 300) {
                    user_error("Couldn't set response type to {$this->statusCode} because " . "of output on line {$line} of {$file}", E_USER_WARNING);
                }
            }
            // Only show error pages or generic "friendly" errors if the status code signifies
            // an error, and the response doesn't have any body yet that might contain
            // a more specific error description.
            if (Director::isLive() && $this->isError() && !$this->body) {
                Debug::friendlyError($this->statusCode, $this->getStatusDescription());
            } else {
                echo $this->body;
            }
        }
    }
 /**
  * render() generates the HTML for the component, including generic containment. Generally subclasses shouldn't
  * override this, but will override renderContent. The parent component (typically layout components) can provide
  * extra properties that affect the containment.
  * @param $context		Context for binding.
  * @param $extras		Map that can contain the following keys:
  * 						- "classes" - an array of CSS class names to be added.
  * 						- "styles" - a map of style definitions that are aggregated into the style attribute
  * 								of the container.
  * 						- "attrs" - a map of additional attributes to add to the containment tag. This
  * 								shouldn't include "class" or "style" keys. Values should not be quoted.
  * @return string
  */
 function render($context, $extras = null)
 {
     $lm = $this->view->getLayoutManager();
     // Give the layout manager the first opportunity to render. If it handles this component,
     // it is expected to handle the entire component render. This is not the normal case, it's
     // just a hook.
     $r = $lm->render($this, $this->view, $context, $extras);
     if ($r !== FALSE) {
         return $r;
     }
     // This is a more common case, where the layout manager is given the opportunity to
     // provide extra classes or attributes for this component.
     $extras = $lm->augmentExtras($this, $this->context, $extras);
     // Determine the CSS classes of the container.
     $classes = $this->containerClasses($context);
     if (isset($extras["classes"])) {
         $classes = array_merge($classes, $extras["classes"]);
     }
     $cssClasses = implode(" ", array_unique($classes));
     // Determine the styles of the container.
     $styles = array();
     if (isset($extras["styles"])) {
         foreach ($extras["styles"] as $name => $value) {
             $styles[] = $name . ":" . $value;
         }
     }
     $styles = implode(";", $styles);
     // Determine the attributes of the container.
     $attrs = array();
     if (isset($extras["attrs"])) {
         foreach ($extras["attrs"] as $name => $value) {
             $attrs[] = $name . "=\"" . Convert::raw2htmlatt($value) . "\"";
         }
     }
     $attrs = implode(" ", $attrs);
     $componentTag = $this->getMetadataValue("display") == "block" ? "div" : "span";
     return $this->customise(new ArrayData(array("Tag" => $componentTag, "Content" => $this->renderContent($context), "ClassName" => get_class($this), "ExtraClasses" => $cssClasses, "ExtraStyles" => $styles, "ExtraAttrs" => $attrs)))->renderWith("NLComponentContainment");
 }
 public function getURL()
 {
     switch ($this->linkmode) {
         case "external":
             // legacy
         // legacy
         case "URL":
             $url = $this->getCustomURL();
             // add default http if no URL_SCHEME present (NO, relative urls should be possible)
             //				if( parse_url($url, PHP_URL_SCHEME) === null ){
             //					$url = 'http://' . $url;
             //				}
             return Convert::raw2htmlatt($url);
         case "Shortcode":
             // Should probably be handled differently from template (<% if IsShortcode ...)
             return '';
         case "internal":
             // legacy
         // legacy
         case "Page":
             $url = '';
             if ($page = $this->Page()) {
                 $url = $page->AbsoluteLink();
             }
             if ($anchor = $this->getPageAnchor()) {
                 $url .= "#{$anchor}";
             }
             return Convert::raw2htmlatt($url);
         case "Email":
             return Convert::raw2htmlatt($this->getEmail());
         default:
             // File
             if ($file = $this->File()) {
                 return $file->AbsoluteLink();
             }
     }
 }
 function slideLabel()
 {
     return $this->Label ? Convert::raw2htmlatt($this->Label) : false;
 }
 /**
  *
  * @return FormField
  */
 public function getFieldForProduct(Product $product, $value = null)
 {
     if ($this->Options) {
         //if HasImages?
         $finalOptions = array();
         $optionArray = explode(",", $this->Options);
         foreach ($optionArray as $option) {
             $option = trim($option);
             $finalOptions[Convert::raw2htmlatt($option)] = $option;
         }
         if ($this->HasImages) {
             return new ProductQuestionImageSelectorField($this->getFieldForProductName($product), $this->Question, $finalOptions, $value, $this->FolderID);
         } else {
             $formFieldClass = $this->DefaultFormField;
             if (!$formFieldClass) {
                 $formFieldClass = "DropdownField";
             }
             $finalOptions = array("" => _t("ProductQuestion.PLEASE_SELECT", " -- please select --")) + $finalOptions;
             return $formFieldClass::create($this->getFieldForProductName($product), $this->Question, $finalOptions, $value);
         }
     } else {
         $formFieldClass = $this->DefaultFormField;
         if (!$formFieldClass) {
             $formFieldClassd = "TextField";
         }
         return $formFieldClass::create($this->getFieldForProductName($product), $this->Question, $value);
     }
 }