mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-08-26 04:26:01 +02:00
FEATURE Added FormScaffolder for more flexible scaffolding of FieldSets from DataObject metadata API CHANGE Removed DataObject->addScaffoldRelationFields(), now in separate class FormScaffolder API CHANGE Changed parameters for DataObject->scaffoldSearchFields() to unify them with scaffoldFormFields() API CHANGE Added optional $params parameter to DataObject->getCMSFields() to be passed on to scaffoldFormFields() API CHANGE Renamed DataObject->getFormFields() to getFrontEndFields() ENHANCEMENT Added $params parameter to all DBField->scaffoldFormField() subclasses API CHANGE Added third optional parameter $object to DBField::create() to comply with ForeignKey and PrimaryKey constructors git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@64157 467b73ca-7a2a-4603-9d3b-597d59a354a9
78 lines
2.0 KiB
PHP
Executable File
78 lines
2.0 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Represents a large text field that contains HTML content.
|
|
*
|
|
* This behaves similarly to Text, but the template processor won't escape any HTML content within it.
|
|
* @package sapphire
|
|
* @subpackage model
|
|
*/
|
|
class HTMLText extends Text {
|
|
|
|
/**
|
|
* Create a summary of the content. This will either be the first paragraph, or the first $maxWords
|
|
* words, whichever is shorter
|
|
*/
|
|
public function Summary( $maxWords = 50 ) {
|
|
// split the string into tags and words
|
|
$parts = Convert::xml2array( $this->value );
|
|
|
|
// store any unmatched tags
|
|
$tagStack = array();
|
|
|
|
$pIndex = 0;
|
|
|
|
// find the first paragraph tag
|
|
for( $i = 0; $i < count( $parts ); $i++ )
|
|
if( strpos( $parts[$i], '<p' ) === 0 ) {
|
|
$pIndex = $i;
|
|
break;
|
|
}
|
|
|
|
$summary = '';
|
|
$words = 0;
|
|
|
|
// create the summary, keeping track of opening and closing tags
|
|
while( $words <= $maxWords && $pIndex < count( $parts ) ) {
|
|
if( $parts[$pIndex] == '</p>' ) {
|
|
$summary .= $parts[$pIndex];
|
|
break;
|
|
}
|
|
elseif( preg_match( '/<\/(\w+)>/', $parts[$pIndex], $endTag ) && $endTag[1] == substr( $tagStack[count($tagStack) - 1], 1, strlen( $endTag[1] ) ) ) {
|
|
array_pop( $tagStack );
|
|
$words++;
|
|
$summary .= $parts[$pIndex++];
|
|
} elseif( preg_match( '/^<\w+/', $parts[$pIndex] ) ) {
|
|
array_push( $tagStack, $parts[$pIndex] );
|
|
$words++;
|
|
$summary .= $parts[$pIndex++];
|
|
} else
|
|
$summary .= $parts[$pIndex++] . ' ';
|
|
}
|
|
|
|
// Tags that shouldn't be closed
|
|
$noClose = array("br", "img");
|
|
|
|
// make sure that the summary is well formed XHTML by closing tags
|
|
while( $openTag = array_pop( $tagStack ) ) {
|
|
preg_match( '/^<(\w+)\s+/', $openTag, $tagName );
|
|
if(sizeof($tagName) > 0) {
|
|
if(!in_array($tagName[1], $noClose)) {
|
|
$summary .= "</{$tagName[1]}>";
|
|
}
|
|
}
|
|
}
|
|
|
|
return $summary;
|
|
}
|
|
|
|
public function scaffoldFormField($title = null, $params = null) {
|
|
return new HtmlEditorField($this->name, $title);
|
|
}
|
|
|
|
public function scaffoldSearchField($title = null) {
|
|
return new TextField($this->name, $title);
|
|
}
|
|
|
|
}
|
|
|
|
?>
|