mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
FIX Use RAW for DBField template helpers
This commit is contained in:
parent
b0f237bb3a
commit
2cdfe6cc21
@ -219,19 +219,19 @@ abstract class DBField extends ViewableData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function HTMLATT() {
|
public function HTMLATT() {
|
||||||
return Convert::raw2htmlatt($this->value);
|
return Convert::raw2htmlatt($this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function URLATT() {
|
public function URLATT() {
|
||||||
return urlencode($this->value);
|
return urlencode($this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function RAWURLATT() {
|
public function RAWURLATT() {
|
||||||
return rawurlencode($this->value);
|
return rawurlencode($this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function ATT() {
|
public function ATT() {
|
||||||
return Convert::raw2att($this->value);
|
return Convert::raw2att($this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function RAW() {
|
public function RAW() {
|
||||||
@ -239,15 +239,15 @@ abstract class DBField extends ViewableData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function JS() {
|
public function JS() {
|
||||||
return Convert::raw2js($this->value);
|
return Convert::raw2js($this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function HTML(){
|
public function HTML(){
|
||||||
return Convert::raw2xml($this->value);
|
return Convert::raw2xml($this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function XML(){
|
public function XML(){
|
||||||
return Convert::raw2xml($this->value);
|
return Convert::raw2xml($this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -100,7 +100,7 @@ class HTMLText extends Text {
|
|||||||
// Catch warnings thrown by loadHTML and turn them into a failure boolean rather than a SilverStripe error
|
// Catch warnings thrown by loadHTML and turn them into a failure boolean rather than a SilverStripe error
|
||||||
set_error_handler(create_function('$no, $str', 'throw new Exception("HTML Parse Error: ".$str);'), E_ALL);
|
set_error_handler(create_function('$no, $str', 'throw new Exception("HTML Parse Error: ".$str);'), E_ALL);
|
||||||
// Nonbreaking spaces get converted into weird characters, so strip them
|
// Nonbreaking spaces get converted into weird characters, so strip them
|
||||||
$value = str_replace(' ', ' ', $this->value);
|
$value = str_replace(' ', ' ', $this->RAW());
|
||||||
try {
|
try {
|
||||||
$res = $doc->loadHTML('<meta content="text/html; charset=utf-8" http-equiv="Content-type"/>' . $value);
|
$res = $doc->loadHTML('<meta content="text/html; charset=utf-8" http-equiv="Content-type"/>' . $value);
|
||||||
}
|
}
|
||||||
@ -241,14 +241,16 @@ class HTMLText extends Text {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$value = $this->RAW();
|
||||||
|
|
||||||
// If it's got a content tag
|
// If it's got a content tag
|
||||||
if(preg_match('/<(img|embed|object|iframe|meta|source|link)[^>]*>/i', $this->value)) {
|
if(preg_match('/<(img|embed|object|iframe|meta|source|link)[^>]*>/i', $value)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If it's just one or two tags on its own (and not the above) it's empty.
|
// If it's just one or two tags on its own (and not the above) it's empty.
|
||||||
// This might be <p></p> or <h1></h1> or whatever.
|
// This might be <p></p> or <h1></h1> or whatever.
|
||||||
if(preg_match('/^[\\s]*(<[^>]+>[\\s]*){1,2}$/', $this->value)) {
|
if(preg_match('/^[\\s]*(<[^>]+>[\\s]*){1,2}$/', $value)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,10 +31,11 @@ class HTMLVarchar extends Varchar {
|
|||||||
else {
|
else {
|
||||||
return $this->value;
|
return $this->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function exists() {
|
public function exists() {
|
||||||
return parent::exists() && $this->value != '<p></p>';
|
return parent::exists() && $this->RAW() != '<p></p>';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function scaffoldFormField($title = null, $params = null) {
|
public function scaffoldFormField($title = null, $params = null) {
|
||||||
|
@ -84,9 +84,10 @@ abstract class StringField extends DBField {
|
|||||||
* @see core/model/fieldtypes/DBField#exists()
|
* @see core/model/fieldtypes/DBField#exists()
|
||||||
*/
|
*/
|
||||||
public function exists() {
|
public function exists() {
|
||||||
return $this->getValue() // All truthy values exist
|
$value = $this->RAW();
|
||||||
|| (is_string($this->getValue()) && strlen($this->getValue())) // non-empty strings exist ('0' but not (int)0)
|
return $value // All truthy values exist
|
||||||
|| (!$this->getNullifyEmpty() && $this->getValue() === ''); // Remove this stupid exemption in 4.0
|
|| (is_string($value) && strlen($value)) // non-empty strings exist ('0' but not (int)0)
|
||||||
|
|| (!$this->getNullifyEmpty() && $value === ''); // Remove this stupid exemption in 4.0
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -118,7 +119,7 @@ abstract class StringField extends DBField {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function LimitCharacters($limit = 20, $add = '...') {
|
public function LimitCharacters($limit = 20, $add = '...') {
|
||||||
$value = trim($this->value);
|
$value = trim($this->RAW());
|
||||||
if($this->stat('escape_type') == 'xml') {
|
if($this->stat('escape_type') == 'xml') {
|
||||||
$value = strip_tags($value);
|
$value = strip_tags($value);
|
||||||
$value = html_entity_decode($value, ENT_COMPAT, 'UTF-8');
|
$value = html_entity_decode($value, ENT_COMPAT, 'UTF-8');
|
||||||
@ -142,13 +143,13 @@ abstract class StringField extends DBField {
|
|||||||
*/
|
*/
|
||||||
public function LimitCharactersToClosestWord($limit = 20, $add = '...') {
|
public function LimitCharactersToClosestWord($limit = 20, $add = '...') {
|
||||||
// Strip HTML tags if they exist in the field
|
// Strip HTML tags if they exist in the field
|
||||||
$this->value = strip_tags($this->value);
|
$value = strip_tags($this->RAW());
|
||||||
|
|
||||||
// Determine if value exceeds limit before limiting characters
|
// Determine if value exceeds limit before limiting characters
|
||||||
$exceedsLimit = mb_strlen($this->value) > $limit;
|
$exceedsLimit = mb_strlen($value) > $limit;
|
||||||
|
|
||||||
// Limit to character limit
|
// Limit to character limit
|
||||||
$value = $this->LimitCharacters($limit, '');
|
$value = DBField::create_field(get_class($this), $value)->LimitCharacters($limit, '');
|
||||||
|
|
||||||
// If value exceeds limit, strip punctuation off the end to the last space and apply ellipsis
|
// If value exceeds limit, strip punctuation off the end to the last space and apply ellipsis
|
||||||
if($exceedsLimit) {
|
if($exceedsLimit) {
|
||||||
@ -174,11 +175,11 @@ abstract class StringField extends DBField {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function LimitWordCount($numWords = 26, $add = '...') {
|
public function LimitWordCount($numWords = 26, $add = '...') {
|
||||||
$this->value = trim(Convert::xml2raw($this->value));
|
$value = trim(Convert::xml2raw($this->RAW()));
|
||||||
$ret = explode(' ', $this->value, $numWords + 1);
|
$ret = explode(' ', $value, $numWords + 1);
|
||||||
|
|
||||||
if(count($ret) <= $numWords - 1) {
|
if(count($ret) <= $numWords - 1) {
|
||||||
$ret = $this->value;
|
$ret = $value;
|
||||||
} else {
|
} else {
|
||||||
array_pop($ret);
|
array_pop($ret);
|
||||||
$ret = implode(' ', $ret) . $add;
|
$ret = implode(' ', $ret) . $add;
|
||||||
@ -209,7 +210,7 @@ abstract class StringField extends DBField {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function LowerCase() {
|
public function LowerCase() {
|
||||||
return mb_strtolower($this->value);
|
return mb_strtolower($this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -217,7 +218,7 @@ abstract class StringField extends DBField {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function UpperCase() {
|
public function UpperCase() {
|
||||||
return mb_strtoupper($this->value);
|
return mb_strtoupper($this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -226,6 +227,6 @@ abstract class StringField extends DBField {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function NoHTML() {
|
public function NoHTML() {
|
||||||
return strip_tags($this->value);
|
return strip_tags($this->RAW());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ class Text extends StringField {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function AbsoluteLinks() {
|
public function AbsoluteLinks() {
|
||||||
return HTTP::absoluteURLs($this->value);
|
return HTTP::absoluteURLs($this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -71,7 +71,7 @@ class Text extends StringField {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$output = array();
|
$output = array();
|
||||||
$data = trim(Convert::xml2raw($this->value));
|
$data = trim(Convert::xml2raw($this->RAW()));
|
||||||
$sentences = explode('.', $data);
|
$sentences = explode('.', $data);
|
||||||
|
|
||||||
if ($sentCount == 0) return '';
|
if ($sentCount == 0) return '';
|
||||||
@ -91,7 +91,7 @@ class Text extends StringField {
|
|||||||
* Caution: Not XML/HTML-safe - does not respect closing tags.
|
* Caution: Not XML/HTML-safe - does not respect closing tags.
|
||||||
*/
|
*/
|
||||||
public function FirstSentence() {
|
public function FirstSentence() {
|
||||||
$paragraph = Convert::xml2raw( $this->value );
|
$paragraph = Convert::xml2raw( $this->RAW() );
|
||||||
if( !$paragraph ) return "";
|
if( !$paragraph ) return "";
|
||||||
|
|
||||||
$words = preg_split('/\s+/', $paragraph);
|
$words = preg_split('/\s+/', $paragraph);
|
||||||
@ -112,7 +112,7 @@ class Text extends StringField {
|
|||||||
public function Summary($maxWords = 50) {
|
public function Summary($maxWords = 50) {
|
||||||
// get first sentence?
|
// get first sentence?
|
||||||
// this needs to be more robust
|
// this needs to be more robust
|
||||||
$value = Convert::xml2raw( $this->value /*, true*/ );
|
$value = Convert::xml2raw( $this->RAW() /*, true*/ );
|
||||||
if(!$value) return '';
|
if(!$value) return '';
|
||||||
|
|
||||||
// grab the first paragraph, or, failing that, the whole content
|
// grab the first paragraph, or, failing that, the whole content
|
||||||
@ -154,7 +154,7 @@ class Text extends StringField {
|
|||||||
|
|
||||||
// get first sentence?
|
// get first sentence?
|
||||||
// this needs to be more robust
|
// this needs to be more robust
|
||||||
$data = $plain ? Convert::xml2raw($this->value, true) : $this->value;
|
$data = $plain ? Convert::xml2raw($this->RAW(), true) : $this->RAW();
|
||||||
|
|
||||||
if(!$data) return '';
|
if(!$data) return '';
|
||||||
|
|
||||||
@ -194,8 +194,9 @@ class Text extends StringField {
|
|||||||
public function FirstParagraph($plain = 1) {
|
public function FirstParagraph($plain = 1) {
|
||||||
// get first sentence?
|
// get first sentence?
|
||||||
// this needs to be more robust
|
// this needs to be more robust
|
||||||
|
$value = $this->RAW();
|
||||||
if($plain && $plain != 'html') {
|
if($plain && $plain != 'html') {
|
||||||
$data = Convert::xml2raw($this->value, true);
|
$data = Convert::xml2raw($value, true);
|
||||||
if(!$data) return "";
|
if(!$data) return "";
|
||||||
|
|
||||||
// grab the first paragraph, or, failing that, the whole content
|
// grab the first paragraph, or, failing that, the whole content
|
||||||
@ -204,12 +205,12 @@ class Text extends StringField {
|
|||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
} else {
|
} else {
|
||||||
if(strpos($this->value, "</p>") === false) return $this->value;
|
if(strpos($value, "</p>") === false) return $value;
|
||||||
|
|
||||||
$data = substr($this->value, 0, strpos($this->value, "</p>") + 4);
|
$data = substr($value, 0, strpos($value, "</p>") + 4);
|
||||||
|
|
||||||
if(strlen($data) < 20 && strpos($this->value, "</p>", strlen($data))) {
|
if(strlen($data) < 20 && strpos($value, "</p>", strlen($data))) {
|
||||||
$data = substr($this->value, 0, strpos( $this->value, "</p>", strlen($data)) + 4 );
|
$data = substr($value, 0, strpos( $value, "</p>", strlen($data)) + 4 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return $data;
|
return $data;
|
||||||
@ -238,7 +239,7 @@ class Text extends StringField {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove HTML tags so we don't have to deal with matching tags
|
// Remove HTML tags so we don't have to deal with matching tags
|
||||||
$text = $striphtml ? $this->NoHTML() : $this->value;
|
$text = $striphtml ? $this->NoHTML() : $this->RAW();
|
||||||
|
|
||||||
// Find the search string
|
// Find the search string
|
||||||
$position = (int) stripos($text, $string);
|
$position = (int) stripos($text, $string);
|
||||||
@ -270,7 +271,7 @@ class Text extends StringField {
|
|||||||
$summary = trim($summary);
|
$summary = trim($summary);
|
||||||
|
|
||||||
if($position > 0) $summary = $prefix . $summary;
|
if($position > 0) $summary = $prefix . $summary;
|
||||||
if(strlen($this->value) > ($characters + $position)) $summary = $summary . $suffix;
|
if(strlen($this->RAW()) > ($characters + $position)) $summary = $summary . $suffix;
|
||||||
|
|
||||||
return $summary;
|
return $summary;
|
||||||
}
|
}
|
||||||
@ -283,14 +284,14 @@ class Text extends StringField {
|
|||||||
*/
|
*/
|
||||||
public function Parse($parser = "TextParser") {
|
public function Parse($parser = "TextParser") {
|
||||||
if($parser == "TextParser" || is_subclass_of($parser, "TextParser")) {
|
if($parser == "TextParser" || is_subclass_of($parser, "TextParser")) {
|
||||||
$obj = new $parser($this->value);
|
$obj = new $parser($this->RAW());
|
||||||
return $obj->parse();
|
return $obj->parse();
|
||||||
} else {
|
} else {
|
||||||
// Fallback to using raw2xml and show a warning
|
// Fallback to using raw2xml and show a warning
|
||||||
// TODO Don't kill script execution, we can continue without losing complete control of the app
|
// TODO Don't kill script execution, we can continue without losing complete control of the app
|
||||||
user_error("Couldn't find an appropriate TextParser sub-class to create (Looked for '$parser')."
|
user_error("Couldn't find an appropriate TextParser sub-class to create (Looked for '$parser')."
|
||||||
. "Make sure it sub-classes TextParser and that you've done ?flush=1.", E_USER_WARNING);
|
. "Make sure it sub-classes TextParser and that you've done ?flush=1.", E_USER_WARNING);
|
||||||
return Convert::raw2xml($this->value);
|
return Convert::raw2xml($this->RAW());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,15 +70,19 @@ class Varchar extends StringField {
|
|||||||
* Return the first letter of the string followed by a .
|
* Return the first letter of the string followed by a .
|
||||||
*/
|
*/
|
||||||
public function Initial() {
|
public function Initial() {
|
||||||
if($this->exists()) return $this->value[0] . '.';
|
if($this->exists()) {
|
||||||
|
$value = $this->RAW();
|
||||||
|
return $value[0] . '.';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensure that the given value is an absolute URL.
|
* Ensure that the given value is an absolute URL.
|
||||||
*/
|
*/
|
||||||
public function URL() {
|
public function URL() {
|
||||||
if(preg_match('#^[a-zA-Z]+://#', $this->value)) return $this->value;
|
$value = $this->RAW();
|
||||||
else return "http://" . $this->value;
|
if(preg_match('#^[a-zA-Z]+://#', $value)) return $value;
|
||||||
|
else return "http://" . $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,7 +90,7 @@ class Varchar extends StringField {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function RTF() {
|
public function RTF() {
|
||||||
return str_replace("\n", '\par ', $this->value);
|
return str_replace("\n", '\par ', $this->RAW());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -212,6 +212,106 @@ class HTMLTextTest extends SapphireTest {
|
|||||||
$this->assertEquals('<p>[shortcode]</p>', (string)$field);
|
$this->assertEquals('<p>[shortcode]</p>', (string)$field);
|
||||||
|
|
||||||
|
|
||||||
|
ShortcodeParser::set_active('default');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testShortCodeParsedInTemplateHelpers() {
|
||||||
|
$parser = ShortcodeParser::get('HTMLTextTest');
|
||||||
|
$parser->register('shortcode', function($arguments, $content, $parser, $tagName, $extra) {
|
||||||
|
return 'Replaced short code with this. <a href="home">home</a>';
|
||||||
|
});
|
||||||
|
ShortcodeParser::set_active('HTMLTextTest');
|
||||||
|
/** @var HTMLText $field */
|
||||||
|
$field = DBField::create_field('HTMLText', '<p>[shortcode]</p>');
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
'<p>Replaced short code with this. <a href="home">home</a></p>',
|
||||||
|
$field->HTMLATT()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'%3Cp%3EReplaced+short+code+with+this.+%3Ca+href%3D%22home%22%3Ehome%3C%2Fa%3E%3C%2Fp%3E',
|
||||||
|
$field->URLATT()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'%3Cp%3EReplaced%20short%20code%20with%20this.%20%3Ca%20href%3D%22home%22%3Ehome%3C%2Fa%3E%3C%2Fp%3E',
|
||||||
|
$field->RAWURLATT()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<p>Replaced short code with this. <a href="home">home</a></p>',
|
||||||
|
$field->ATT()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<p>Replaced short code with this. <a href="home">home</a></p>',
|
||||||
|
$field->RAW()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'\x3cp\x3eReplaced short code with this. \x3ca href=\"home\"\x3ehome\x3c/a\x3e\x3c/p\x3e',
|
||||||
|
$field->JS()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<p>Replaced short code with this. <a href="home">home</a></p>',
|
||||||
|
$field->HTML()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<p>Replaced short code with this. <a href="home">home</a></p>',
|
||||||
|
$field->XML()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'Repl...',
|
||||||
|
$field->LimitCharacters(4, '...')
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'Replaced...',
|
||||||
|
$field->LimitCharactersToClosestWord(10, '...')
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'Replaced...',
|
||||||
|
$field->LimitWordCount(1, '...')
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<p>replaced short code with this. <a href="home">home</a></p>',
|
||||||
|
$field->LowerCase()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<P>REPLACED SHORT CODE WITH THIS. <A HREF="HOME">HOME</A></P>',
|
||||||
|
$field->UpperCase()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'Replaced short code with this. home',
|
||||||
|
$field->NoHTML()
|
||||||
|
);
|
||||||
|
Config::nest();
|
||||||
|
Config::inst()->update('Director', 'alternate_base_url', 'http://example.com/');
|
||||||
|
$this->assertEquals(
|
||||||
|
'<p>Replaced short code with this. <a href="http://example.com/home">home</a></p>',
|
||||||
|
$field->AbsoluteLinks()
|
||||||
|
);
|
||||||
|
Config::unnest();
|
||||||
|
$this->assertEquals(
|
||||||
|
'Replaced short code with this.',
|
||||||
|
$field->LimitSentences(1)
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'Replaced short code with this.',
|
||||||
|
$field->FirstSentence()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'Replaced short...',
|
||||||
|
$field->Summary(2)
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'Replaced short code with...',
|
||||||
|
$field->BigSummary(4)
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'Replaced short code with this. home[home]',
|
||||||
|
$field->FirstParagraph()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'Replaced <span class="highlight">short</span> <span class="highlight">code</span> with this. home',
|
||||||
|
$field->ContextSummary(500, 'short code')
|
||||||
|
);
|
||||||
|
|
||||||
ShortcodeParser::set_active('default');
|
ShortcodeParser::set_active('default');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user