00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 include_once( "kernel/classes/ezcontentobjecttreenode.php" );
00039
00040 class eZKeyword
00041 {
00042
00043
00044
00045 function eZKeyword( )
00046 {
00047 }
00048
00049 function attributes()
00050 {
00051 return array( 'keywords',
00052 'keyword_string',
00053 'related_objects',
00054 'related_nodes' );
00055 }
00056
00057 function hasAttribute( $name )
00058 {
00059 return in_array( $name, $this->attributes() );
00060 }
00061
00062 function &attribute( $name )
00063 {
00064 switch ( $name )
00065 {
00066 case 'keywords' :
00067 {
00068 return $this->KeywordArray;
00069 }break;
00070
00071 case 'keyword_string' :
00072 {
00073 $keywordString = $this->keywordString();
00074 return $keywordString;
00075 }break;
00076
00077 case 'related_objects' :
00078 case 'related_nodes' :
00079 {
00080 $objectList =& $this->relatedObjects();
00081 return $objectList;
00082 }break;
00083 default:
00084 {
00085 eZDebug::writeError( "Attribute '$name' does not exist", 'eZKeyword::attribute' );
00086 $retValue = null;
00087 return $retValue;
00088 }break;
00089 }
00090 }
00091
00092
00093
00094
00095 function initializeKeyword( $keywordString )
00096 {
00097 if ( !is_array( $keywordString ) )
00098 {
00099 $keywordArray = explode( ',', $keywordString );
00100 $keywordArray = array_unique ( $keywordArray );
00101 }
00102 foreach ( array_keys( $keywordArray ) as $key )
00103 {
00104 if ( trim( $keywordArray[$key] ) != '' )
00105 {
00106 $this->KeywordArray[$key] = trim( $keywordArray[$key] );
00107 }
00108 }
00109 }
00110
00111
00112
00113
00114 function store( &$attribute )
00115 {
00116 $db =& eZDB::instance();
00117
00118 $object =& $attribute->attribute( 'object' );
00119 $classID = $object->attribute( 'contentclass_id' );
00120
00121
00122 $wordArray = array();
00123 $escapedKeywordArray = array();
00124 foreach( $this->KeywordArray as $keyword )
00125 {
00126 $keyword = $db->escapeString( $keyword );
00127 $escapedKeywordArray[] = $keyword;
00128 }
00129 $wordsString = implode( '\',\'', $escapedKeywordArray );
00130 $existingWords = $db->arrayQuery( "SELECT * FROM ezkeyword WHERE keyword IN ( '$wordsString' ) AND class_id='$classID' " );
00131
00132 $newWordArray = array();
00133 $existingWordArray = array();
00134
00135 foreach ( $this->KeywordArray as $keyword )
00136 {
00137 $wordExists = false;
00138 $wordID = false;
00139 foreach ( $existingWords as $existingKeyword )
00140 {
00141 if ( $keyword == $existingKeyword['keyword'] )
00142 {
00143 $wordExists = true;
00144 $wordID = $existingKeyword['id'];
00145 break;
00146 }
00147 }
00148
00149 if ( $wordExists == false )
00150 {
00151 $newWordArray[] = $keyword;
00152 }
00153 else
00154 {
00155 $existingWordArray[] = array( 'keyword' => $keyword, 'id' => $wordID );
00156 }
00157 }
00158
00159
00160 $addRelationWordArray = array();
00161 foreach ( $newWordArray as $keyword )
00162 {
00163 $keyword = trim( $keyword );
00164 $keyword = $db->escapeString( $keyword );
00165 $db->query( "INSERT INTO ezkeyword ( keyword, class_id ) VALUES ( '$keyword', '$classID' )" );
00166
00167 $keywordID = $db->lastSerialID( 'ezkeyword' );
00168 $addRelationWordArray[] = array( 'keyword' => $keywordID, 'id' => $keywordID );
00169 }
00170
00171 $attributeID = $attribute->attribute( 'id' );
00172
00173 if ( $attributeID !== null )
00174 {
00175 $currentWordArray = $db->arrayQuery( "SELECT ezkeyword.id, ezkeyword.keyword FROM ezkeyword, ezkeyword_attribute_link
00176 WHERE ezkeyword.id=ezkeyword_attribute_link.keyword_id
00177 AND ezkeyword_attribute_link.objectattribute_id='$attributeID'" );
00178 }
00179 else
00180 $currentWordArray = array();
00181
00182 foreach ( $existingWordArray as $existingWord )
00183 {
00184 $newWord = true;
00185 foreach ( $currentWordArray as $currentWord )
00186 {
00187 if ( $existingWord['keyword'] == $currentWord['keyword'] )
00188 {
00189 $newWord = false;
00190 }
00191 }
00192
00193 if ( $newWord == true )
00194 {
00195 $addRelationWordArray[] = $existingWord;
00196 }
00197 }
00198
00199
00200 $removeWordRelationIDArray = array();
00201 foreach ( $currentWordArray as $currentWord )
00202 {
00203 $stillUsed = false;
00204 foreach ( $this->KeywordArray as $keyword )
00205 {
00206 if ( $keyword == $currentWord['keyword'] )
00207 $stillUsed = true;
00208 }
00209 if ( !$stillUsed )
00210 {
00211 $removeWordRelationIDArray[] = $currentWord['id'];
00212 }
00213 }
00214
00215 if ( count( $removeWordRelationIDArray ) > 0 )
00216 {
00217 $removeIDString = implode( ', ', $removeWordRelationIDArray );
00218 $db->query( "DELETE FROM ezkeyword_attribute_link WHERE keyword_id IN ( $removeIDString ) AND ezkeyword_attribute_link.objectattribute_id='$attributeID'" );
00219 }
00220
00221
00222
00223 foreach ( $addRelationWordArray as $keywordArray )
00224 {
00225 $db->query( "INSERT INTO ezkeyword_attribute_link ( keyword_id, objectattribute_id ) VALUES ( '" . $keywordArray['id'] ."', '" . $attribute->attribute( 'id' ) . "' )" );
00226 }
00227
00228
00229
00230
00231
00232
00233 if ( $db->databaseName() == 'oracle' )
00234 {
00235 $query =
00236 'SELECT ezkeyword.id FROM ezkeyword, ezkeyword_attribute_link ' .
00237 'WHERE ezkeyword.id=ezkeyword_attribute_link.keyword_id(+) AND ' .
00238 'ezkeyword_attribute_link.keyword_id IS NULL';
00239 }
00240 else
00241 {
00242 $query =
00243 'SELECT ezkeyword.id FROM ezkeyword LEFT JOIN ezkeyword_attribute_link ' .
00244 ' ON ezkeyword.id=ezkeyword_attribute_link.keyword_id' .
00245 ' WHERE ezkeyword_attribute_link.keyword_id IS NULL';
00246 }
00247 $unusedWordsIDs = $db->arrayQuery( $query );
00248 foreach ( $unusedWordsIDs as $wordID )
00249 $db->query( 'DELETE FROM ezkeyword WHERE id=' . $wordID['id'] );
00250 }
00251
00252
00253
00254
00255 function fetch( &$attribute )
00256 {
00257 if ( $attribute->attribute( 'id' ) === null )
00258 return;
00259
00260 $db =& eZDB::instance();
00261 $wordArray = $db->arrayQuery( "SELECT ezkeyword.keyword FROM ezkeyword_attribute_link, ezkeyword
00262 WHERE ezkeyword_attribute_link.keyword_id=ezkeyword.id AND
00263 ezkeyword_attribute_link.objectattribute_id='" . $attribute->attribute( 'id' ) ."' " );
00264
00265 $this->ObjectAttributeID = $attribute->attribute( 'id' );
00266 foreach ( array_keys( $wordArray ) as $wordKey )
00267 {
00268 $this->KeywordArray[] = $wordArray[$wordKey]['keyword'];
00269 }
00270 $this->KeywordArray = array_unique ( $this->KeywordArray );
00271 }
00272
00273
00274
00275
00276 function setKeywordArray( $keywords )
00277 {
00278 $this->KeywordArray =& $keywords;
00279 }
00280
00281
00282
00283
00284 function &keywordArray( )
00285 {
00286 return $this->KeywordArray;
00287 }
00288
00289
00290
00291
00292 function keywordString()
00293 {
00294 return implode( ', ', $this->KeywordArray );
00295 }
00296
00297
00298
00299
00300 function &relatedObjects()
00301 {
00302 $return = false;
00303 if ( $this->ObjectAttributeID )
00304 {
00305
00306 $db =& eZDB::instance();
00307
00308 $wordArray = $db->arrayQuery( "SELECT * FROM ezkeyword_attribute_link
00309 WHERE objectattribute_id='" . $this->ObjectAttributeID ."' " );
00310
00311 $keywordIDArray = array();
00312
00313 foreach ( $wordArray as $word )
00314 {
00315 $keywordIDArray[] = $word['keyword_id'];
00316 }
00317
00318 $keywordString = implode( ", ", $keywordIDArray );
00319
00320 if ( count( $keywordIDArray ) > 0 )
00321 {
00322 $objectArray = $db->arrayQuery( "SELECT DISTINCT ezcontentobject_attribute.contentobject_id FROM ezkeyword_attribute_link, ezcontentobject_attribute
00323 WHERE keyword_id IN ( $keywordString ) AND
00324 ezcontentobject_attribute.id = ezkeyword_attribute_link.objectattribute_id
00325 AND objectattribute_id <> '" . $this->ObjectAttributeID ."' " );
00326
00327 $objectIDArray = array();
00328 foreach ( $objectArray as $object )
00329 {
00330 $objectIDArray[] = $object['contentobject_id'];
00331 }
00332
00333 $aNodes =& eZContentObjectTreeNode::findMainNodeArray( $objectIDArray );
00334 foreach ( $aNodes as $key => $node )
00335 {
00336 $theObject = $node->object();
00337 if ( $theObject->canRead() )
00338 {
00339 $return[] = $node;
00340 }
00341 }
00342 }
00343 }
00344 return $return;
00345 }
00346
00347
00348 var $KeywordArray = array();
00349
00350
00351 var $ObjectAttributeID = false;
00352 }
00353
00354 ?>