This commit is contained in:
Normann Lou 2009-01-20 22:51:15 +00:00
parent 3e5ed4c1e3
commit 597e812e0a

View File

@ -42,10 +42,10 @@ class TagField extends TextField {
protected $tagTopicClass;
/**
* @var string $tagObjectField Only applies to object-based tagging.
* @var string $tagFieldName Only applies to object-based tagging.
* The fieldname for textbased tagging is inferred from the formfield name.
*/
protected $tagObjectField = 'Title';
protected $tagFieldName = 'Title';
/**
* @var string $tagFilter
@ -65,6 +65,7 @@ class TagField extends TextField {
protected static $separator_to_regex = array(
' ' => '\s',
',' => '\,',
);
/**
@ -79,9 +80,9 @@ class TagField extends TextField {
*/
public $maxSuggestionsNum = 50;
function __construct($name, $title = null, $value = null, $tagTopicClass = null, $tagObjectField = "Title") {
function __construct($name, $title = null, $value = null, $tagTopicClass = null, $tagFieldName = "Title") {
$this->tagTopicClass = $tagTopicClass;
$this->tagObjectField = $tagObjectField;
$this->tagFieldName = ($tagFieldName) ? $tagFieldName : $name;
parent::__construct($name, $title, $value);
}
@ -125,12 +126,12 @@ class TagField extends TextField {
if($this->customTags) {
$tags = $this->customTags;
} else if($tagTopicClassObj->many_many($this->Name())) {
} else if($tagTopicClassObj->many_many($this->tagFieldName)) {
$tags = $this->getObjectTags($searchString);
} else if($tagTopicClassObj->hasField($this->Name())) {
} else if($tagTopicClassObj->hasField($this->tagFieldName)) {
$tags = $this->getTextbasedTags($searchString);
} else {
user_error('TagField::suggest(): Cant find valid relation or text property with name "' . $this->Name() . '"', E_USER_ERROR);
user_error('TagField::suggest(): Cant find valid relation or text property with name "' . $this->tagFieldName . '"', E_USER_ERROR);
}
return Convert::raw2json($tags);
@ -139,9 +140,9 @@ class TagField extends TextField {
function saveInto($record) {
if($this->value) {
// $record should match the $tagTopicClass
if($record->many_many($this->Name())) {
if($record->many_many($this->tagFieldName)) {
$this->saveIntoObjectTags($record);
} elseif($record->hasField($this->Name())) {
} elseif($record->hasField($this->tagFieldName)) {
$this->saveIntoTextbasedTags($record);
} else {
user_error('TagField::saveInto(): Cant find valid field or relation to save into', E_USER_ERROR);
@ -150,10 +151,10 @@ class TagField extends TextField {
}
function setValue($value, $obj = null) {
if(isset($obj) && is_object($obj) && $obj instanceof DataObject && $obj->many_many($this->Name())) {
if(isset($obj) && is_object($obj) && $obj instanceof DataObject && $obj->many_many($this->tagFieldName)) {
//if(!$obj->many_many($this->Name())) user_error("TagField::setValue(): Cant find relationship named '$this->Name()' on object", E_USER_ERROR);
$tags = $obj->{$this->Name()}();
$this->value = implode($this->separator, array_values($tags->map('ID',$this->tagObjectField)));
$tags = $obj->{$this->tagFieldName}();
$this->value = implode($this->separator, array_values($tags->map('ID',$this->tagFieldName)));
} else {
parent::setValue($value, $obj);
}
@ -186,7 +187,7 @@ class TagField extends TextField {
if(!$record->isInDB()) $record->write();
$tagsArr = $this->splitTagsToArray($this->value);
$relationName = $this->Name();
$relationName = $this->$this->tagFieldName;
$existingTagsComponentSet = $record->$relationName();
$tagClass = $this->getTagClass();
$tagBaseClass = ClassInfo::baseDataClass($tagClass);
@ -195,13 +196,13 @@ class TagField extends TextField {
if($tagsArr) foreach($tagsArr as $tagString) {
$SQL_filter = sprintf('`%s`.`%s` = "%s"',
$tagBaseClass,
$this->tagObjectField,
$this->tagFieldName,
Convert::raw2sql($tagString)
);
$tagObj = DataObject::get_one($tagClass, $SQL_filter);
if(!$tagObj) {
$tagObj = new $tagClass();
$tagObj->{$this->tagObjectField} = $tagString;
$tagObj->{$this->tagFieldName} = $tagString;
$tagObj->write();
}
$tagsToAdd[] = $tagObj;
@ -213,7 +214,7 @@ class TagField extends TextField {
}
protected function saveIntoTextbasedTags($record) {
$tagFieldName = $this->Name();
$tagFieldName = $this->tagFieldName;
// necessary step to filter whitespace etc.
$RAW_tagsArr = $this->splitTagsToArray($this->value);
@ -233,9 +234,9 @@ class TagField extends TextField {
* Use only when storing tags in objects
*/
protected function getTagClass() {
$tagManyMany = singleton($this->getTagTopicClass())->many_many($this->Name());
$tagManyMany = singleton($this->getTagTopicClass())->many_many($this->tagFieldName);
if(!$tagManyMany) {
user_error('TagField::getTagClass(): Cant find relation with name "' . $this->Name() . '"', E_USER_ERROR);
user_error('TagField::getTagClass(): Cant find relation with name "' . $this->tagFieldName . '"', E_USER_ERROR);
}
return $tagManyMany[1];
@ -247,29 +248,29 @@ class TagField extends TextField {
$SQL_filter = sprintf("`%s`.`%s` LIKE '%%%s%%'",
$tagBaseClass,
$this->tagObjectField,
$this->tagFieldName,
Convert::raw2sql($searchString)
);
if($this->tagFilter) $SQL_filter .= ' AND ' . $this->tagFilter;
$tagObjs = DataObject::get($tagClass, $SQL_filter, $this->tagSort, "", $this->maxSuggestionsNum);
$tagArr = ($tagObjs) ? array_values($tagObjs->map('ID', $this->tagObjectField)) : array();
$tagArr = ($tagObjs) ? array_values($tagObjs->map('ID', $this->tagFieldName)) : array();
return $tagArr;
}
protected function getTextbasedTags($searchString) {
/*protected function getTextbasedTags($searchString) {
$baseClass = ClassInfo::baseDataClass($this->getTagTopicClass());
$SQL_filter = sprintf("`%s`.`%s` LIKE '%%%s%%'",
$baseClass,
$this->Name(),
$this->tagFieldName,
Convert::raw2sql($searchString)
);
if($this->tagFilter) $SQL_filter .= ' AND ' . $this->tagFilter;
$allTopicObjs = DataObject::get($this->getTagTopicClass(), $SQL_filter, $this->tagSort);
$multipleTagsArr = ($allTopicObjs) ? array_values($allTopicObjs->map('ID', $this->Name())) : array();
$multipleTagsArr = ($allTopicObjs) ? array_values($allTopicObjs->map('ID', $this->tagFieldName)) : array();
$filteredTagArr = array();
foreach($multipleTagsArr as $multipleTags) {
@ -286,6 +287,22 @@ class TagField extends TextField {
$filteredTagArr = array_unique($filteredTagArr);
return $filteredTagArr;
}*/
protected function getTextbasedTags($searchString) {
$baseClass = ClassInfo::baseDataClass($this->getTagTopicClass());
$SQL_filter = sprintf("`%s`.`%s` LIKE '%%%s%%'",
$baseClass,
$this->tagFieldName,
Convert::raw2sql($searchString)
);
if($this->tagFilter) $SQL_filter .= ' AND ' . $this->tagFilter;
$sql = "Select `".$this->tagFieldName."` From `".$this->getTagTopicClass(). "` Where ".$SQL_filter;
$map = DB::query($sql)->column();
return $map;
}
public function setTagFilter($sql) {