]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - modules/SugarFeed/SugarFeed.php
Release 6.1.4
[Github/sugarcrm.git] / modules / SugarFeed / SugarFeed.php
1 <?PHP
2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4  * SugarCRM is a customer relationship management program developed by
5  * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
6  * 
7  * This program is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU Affero General Public License version 3 as published by the
9  * Free Software Foundation with the addition of the following permission added
10  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
13  * 
14  * This program is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
17  * details.
18  * 
19  * You should have received a copy of the GNU Affero General Public License along with
20  * this program; if not, see http://www.gnu.org/licenses or write to the Free
21  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22  * 02110-1301 USA.
23  * 
24  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
26  * 
27  * The interactive user interfaces in modified source and object code versions
28  * of this program must display Appropriate Legal Notices, as required under
29  * Section 5 of the GNU Affero General Public License version 3.
30  * 
31  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32  * these Appropriate Legal Notices must retain the display of the "Powered by
33  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34  * technical reasons, the Appropriate Legal Notices must display the words
35  * "Powered by SugarCRM".
36  ********************************************************************************/
37
38
39 class SugarFeed extends Basic {
40         var $new_schema = true;
41         var $module_dir = 'SugarFeed';
42         var $object_name = 'SugarFeed';
43         var $table_name = 'sugarfeed';
44         var $importable = false;
45         
46                 var $id;
47                 var $name;
48                 var $date_entered;
49                 var $date_modified;
50                 var $modified_user_id;
51                 var $modified_by_name;
52                 var $created_by;
53                 var $created_by_name;
54                 var $description;
55                 var $deleted;
56                 var $created_by_link;
57                 var $modified_user_link;
58                 var $assigned_user_id;
59                 var $assigned_user_name;
60                 var $assigned_user_link;
61
62         function SugarFeed(){   
63                 parent::Basic();
64         }
65         
66     static function activateModuleFeed( $module, $updateDB = true ) {
67         if ( $module != 'UserFeed' ) { 
68             // UserFeed is a fake module, used for the user postings to the feed 
69             // Don't try to load up any classes for it
70             $fileList = SugarFeed::getModuleFeedFiles($module);
71             
72             foreach ( $fileList as $fileName ) {
73                 $feedClass = substr(basename($fileName),0,-4);
74                 
75                 require_once($fileName);
76                 $tmpClass = new $feedClass();
77                 $tmpClass->installHook($fileName,$feedClass);
78             }
79         }
80         if ( $updateDB == true ) {
81             
82             $admin = new Administration();
83             $admin->saveSetting('sugarfeed','module_'.$admin->db->quote($module),'1');
84         }
85     }
86
87     static function disableModuleFeed( $module, $updateDB = true ) {
88         if ( $module != 'UserFeed' ) { 
89             // UserFeed is a fake module, used for the user postings to the feed 
90             // Don't try to load up any classes for it
91             $fileList = SugarFeed::getModuleFeedFiles($module);
92             
93             foreach ( $fileList as $fileName ) {
94                 $feedClass = substr(basename($fileName),0,-4);
95                 
96                 require_once($fileName);
97                 $tmpClass = new $feedClass();
98                 $tmpClass->removeHook($fileName,$feedClass);            
99             }
100         }
101
102         if ( $updateDB == true ) {
103             
104             $admin = new Administration();
105             $admin->saveSetting('sugarfeed','module_'.$admin->db->quote($module),'0');
106         }
107     }
108
109     static function flushBackendCache( ) {
110         // This function will flush the cache files used for the module list and the link type lists
111         sugar_cache_clear('SugarFeedModules');
112         if ( file_exists($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed/moduleCache.php') ) {
113             unlink($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed/moduleCache.php');
114         }
115
116         sugar_cache_clear('SugarFeedLinkType');
117         if ( file_exists($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed/linkTypeCache.php') ) {
118             unlink($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed/linkTypeCache.php');
119         }
120     }
121
122
123     static function getModuleFeedFiles( $module ) {
124         $baseDirList = array('modules/'.$module.'/SugarFeeds/', 'custom/modules/'.$module.'/SugarFeeds/');
125         
126         // We store the files in a list sorted by the filename so you can override a default feed by
127         // putting your replacement feed in the custom directory with the same filename
128         $fileList = array();
129
130         foreach ( $baseDirList as $baseDir ) {
131             if ( ! file_exists($baseDir) ) {
132                 continue;
133             }
134             $d = dir($baseDir);
135             while ( $file = $d->read() ) {
136                 if ( $file{0} == '.' ) { continue; }
137                 if ( substr($file,-4) == '.php' ) {
138                     // We found one
139                     $fileList[$file] = $baseDir.$file;
140                 }
141             }
142         }
143
144         return($fileList);
145     }
146
147     static function getActiveFeedModules( ) {
148         // Stored in a cache somewhere
149         $feedModules = sugar_cache_retrieve('SugarFeedModules');
150         if ( $feedModules != null ) {
151             return($feedModules);
152         }
153
154         // Already stored in a file
155         if ( file_exists($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed/moduleCache.php') ) {
156             require_once($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed/moduleCache.php');
157             sugar_cache_put('SugarFeedModules',$feedModules);
158             return $feedModules;
159         }
160
161         // Gotta go looking for it
162         
163         $admin = new Administration();
164         $admin->retrieveSettings();
165
166         $feedModules = array();
167         if ( isset($admin->settings['sugarfeed_enabled']) && $admin->settings['sugarfeed_enabled'] == '1' ) {
168             // Only enable modules if the feed system is enabled
169             foreach ( $admin->settings as $key => $value ) {
170                 if ( strncmp($key,'sugarfeed_module_',17) === 0 ) {
171                     // It's a module setting
172                     if ( $value == '1' ) {
173                         $moduleName = substr($key,17);
174                         $feedModules[$moduleName] = $moduleName;
175                     }
176                 }
177             }
178         }
179
180
181         sugar_cache_put('SugarFeedModules',$feedModules);
182         if ( ! file_exists($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed') ) { mkdir_recursive($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed'); }
183         $fd = fopen($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed/moduleCache.php','w');
184         fwrite($fd,'<'."?php\n\n".'$feedModules = '.var_export($feedModules,true).';');
185         fclose($fd);
186
187         return $feedModules;
188     }
189
190     static function getAllFeedModules( ) {
191         // Uncached, only used from the admin panel and during installation currently
192         $feedModules = array('UserFeed'=>'UserFeed');
193
194         $baseDirList = array('modules/', 'custom/modules/');
195         foreach ( $baseDirList as $baseDir ) {
196             if ( ! file_exists($baseDir) ) {
197                 continue;
198             }
199             $d = dir($baseDir);
200             while ( $module = $d->read() ) {
201                 if ( file_exists($baseDir.$module.'/SugarFeeds/') ) {
202                     $dFeed = dir($baseDir.$module.'/SugarFeeds/');
203                     while ( $file = $dFeed->read() ) {
204                         if ( $file{0} == '.' ) { continue; }
205                         if ( substr($file,-4) == '.php' ) {
206                             // We found one
207                             $feedModules[$module] = $module;
208                         }
209                     }
210                 }
211             }
212         }
213
214         return($feedModules);
215     }
216
217     /**
218      * pushFeed2
219      * This method is a wrapper to pushFeed
220      * 
221      * @param $text String value of the feed's description
222      * @param $bean The SugarBean that is triggering the feed
223      * @param $link_type boolean value indicating whether or not feed is a link type
224      * @param $link_url String value of the URL (for link types only)
225      */
226     static function pushFeed2($text, $bean, $link_type=false, $link_url=false) {
227             self::pushFeed($text, $bean->module_dir, $bean->id 
228                                                                 ,$bean->assigned_user_id
229                                                                 ,$link_type
230                                                                 ,$link_url
231             );
232     }
233     
234         static function pushFeed($text, $module, $id,
235                 $record_assigned_user_id=false,         
236                 $link_type=false, 
237                 $link_url=false
238                 ) {
239                 $feed = new SugarFeed();
240                 if(empty($text) || !$feed->ACLAccess('save', true) )return;
241                 if(!empty($link_url)){
242             $linkClass = SugarFeed::getLinkClass($link_type);
243             if ( $linkClass !== FALSE ) {
244                 $linkClass->handleInput($feed,$link_type,$link_url);
245             }
246         }
247         $text = strip_tags(from_html($text));
248                 $text = '<b>{this.CREATED_BY}</b> ' . $text;
249                 $feed->name = substr($text, 0, 255);
250                 if(strlen($text) > 255){
251                         $feed->description = substr($text, 255, 510);
252                 }
253
254                 if ( $record_assigned_user_id === false ) {
255                         $feed->assigned_user_id = $GLOBALS['current_user']->id;
256                 } else {
257                         $feed->assigned_user_id = $record_assigned_user_id;
258                 }
259                 $feed->related_id = $id;
260                 $feed->related_module = $module;
261                 $feed->save();
262         }
263
264     static function getLinkTypes() {
265         static $linkTypeList = null;
266
267         // Fastest, already stored in the static variable
268         if ( $linkTypeList != null ) {
269             return $linkTypeList;
270         }
271
272         // Second fastest, stored in a cache somewhere
273         $linkTypeList = sugar_cache_retrieve('SugarFeedLinkType');
274         if ( $linkTypeList != null ) {
275             return($linkTypeList);
276         }
277
278         // Third fastest, already stored in a file
279         if ( file_exists($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed/linkTypeCache.php') ) {
280             require_once($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed/linkTypeCache.php');
281             sugar_cache_put('SugarFeedLinkType',$linkTypeList);
282             return $linkTypeList;
283         }
284
285         // Slow, have to actually collect the data
286         $baseDirs = array('custom/modules/SugarFeed/linkHandlers/','modules/SugarFeed/linkHandlers');
287
288         $linkTypeList = array();
289
290         foreach ( $baseDirs as $dirName ) {
291             if ( !file_exists($dirName) ) { continue; }
292             $d = dir($dirName);
293             while ( $file = $d->read() ) {
294                 if ( $file{0} == '.' ) { continue; }
295                 if ( substr($file,-4) == '.php' ) {
296                     // We found one
297                     $typeName = substr($file,0,-4);
298                     $linkTypeList[$typeName] = $typeName;
299                 }
300             }
301         }
302      
303         sugar_cache_put('SugarFeedLinkType',$linkTypeList);
304         if ( ! file_exists($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed') ) { mkdir_recursive($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed'); }
305         $fd = fopen($GLOBALS['sugar_config']['cache_dir'].'modules/SugarFeed/linkTypeCache.php','w');
306         fwrite($fd,'<'."?php\n\n".'$linkTypeList = '.var_export($linkTypeList,true).';');
307         fclose($fd);
308    
309         return $linkTypeList;
310     }
311         
312     static function getLinkClass( $linkName ) {
313         $linkTypeList = SugarFeed::getLinkTypes();
314
315         // Have to make sure the linkName is on the list, so they can't pass in linkName's like ../../config.php ... not that they could get anywhere if they did
316         if ( ! isset($linkTypeList[$linkName]) ) {
317             // No class by this name...
318             return FALSE;
319         }
320
321         if ( file_exists('custom/modules/SugarFeed/linkHandlers/'.$linkName.'.php') ) {
322             require_once('custom/modules/SugarFeed/linkHandlers/'.$linkName.'.php');
323         } else {
324             require_once('modules/SugarFeed/linkHandlers/'.$linkName.'.php');
325         }
326
327         $linkClassName = 'FeedLinkHandler'.$linkName;
328         
329         $linkClass = new $linkClassName();
330
331         return($linkClass);
332     }
333
334         function get_list_view_data(){
335                 $data = parent::get_list_view_data();
336                 if ( !isset($data['TEAM_NAME']) )
337                     $data['TEAM_NAME'] = '';
338                 $delete = '';
339                 if (ACLController::moduleSupportsACL($data['RELATED_MODULE']) && !ACLController::checkAccess($data['RELATED_MODULE'], 'view', $data['CREATED_BY'] == $GLOBALS['current_user']->id) && !ACLController::checkAccess($data['RELATED_MODULE'], 'list', $data['CREATED_BY'] == $GLOBALS['current_user']->id)){
340                         $data['NAME'] = '';
341                         return $data;
342                 }
343                 if(is_admin($GLOBALS['current_user']) || $data['CREATED_BY'] == $GLOBALS['current_user']->id)
344                 $delete = SugarThemeRegistry::current()->getImage('delete_inline', 'width="12" height="12" border="0" align="absmiddle" style="vertical-align: bottom;" onclick=\'SugarFeed.deleteFeed("'. $data['ID'] . '", "{this.id}")\'');
345                 $data['NAME'] .= $data['DESCRIPTION'];
346                 $data['NAME'] =  '<div style="padding:3px">' . html_entity_decode($data['NAME']);
347                 if(!empty($data['LINK_URL'])){
348             $linkClass = SugarFeed::getLinkClass($data['LINK_TYPE']);
349             if ( $linkClass !== FALSE ) {
350                 $data['NAME'] .= $linkClass->getDisplay($data);
351             }
352                 }
353         $data['NAME'] .= '<div class="byLineBox"><span class="byLineLeft">';
354                 $data['NAME'] .= '&nbsp;</span><div class="byLineRight"> '.  $this->getTimeLapse($data['DATE_ENTERED']) . ' &nbsp;' .$delete. '</div></div>';
355                 return  $data ;
356         }
357         
358         function getTimeLapse($startDate)
359         {
360                 $startDate = $GLOBALS['timedate']->to_db($startDate);
361                 $start = array();
362                 preg_match('/(\d+)\-(\d+)\-(\d+) (\d+)\:(\d+)\:(\d+)/', $startDate, $start);
363                 $end = gmdate('Y-m-d H:i:s');
364         $start_time = gmmktime($start[4],$start[5], $start[6], $start[2], $start[3], $start[1] );
365                 $seconds = time()- $start_time;
366                 $minutes =   $seconds/60;
367                 $seconds = $seconds % 60;
368                 $hours = floor( $minutes / 60);
369                 $minutes = $minutes % 60;
370                 $days = floor( $hours / 24);
371                 $hours = $hours % 24;
372                 $weeks = floor( $days / 7);
373                 $days = $days % 7;
374                 $result = '';
375                 if($weeks == 1){
376                         $result = translate('LBL_TIME_LAST_WEEK','SugarFeed').' ';
377                         return $result;
378                 }else if($weeks > 1){
379                         $result .= $weeks . ' '.translate('LBL_TIME_WEEKS','SugarFeed').' ';
380                         if($days > 0) { 
381                 $result .= $days . ' '.translate('LBL_TIME_DAYS','SugarFeed').' ';
382             }
383                 }else{
384                         if($days == 1){
385                                 $result = translate('LBL_TIME_YESTERDAY','SugarFeed').' ';
386                                 return $result;
387                         }else if($days > 1){
388                                 $result .= $days . ' '. translate('LBL_TIME_DAYS','SugarFeed').' ';
389                         }else{
390                                 if($hours == 1) {
391                     $result .= $hours . ' '.translate('LBL_TIME_HOUR','SugarFeed').' ';
392                 } else {
393                     $result .= $hours . ' '.translate('LBL_TIME_HOURS','SugarFeed').' ';
394                 }
395                                 if($hours < 6){
396                                         if($minutes == 1) {
397                         $result .= $minutes . ' ' . translate('LBL_TIME_MINUTE','SugarFeed'). ' ';
398                     } else {
399                         $result .= $minutes . ' ' . translate('LBL_TIME_MINUTES','SugarFeed'). ' ';
400                     }
401                                 }
402                                 if($hours == 0 && $minutes == 0) {
403                     if($seconds == 1 ) { 
404                         $result = $seconds . ' ' . translate('LBL_TIME_SECOND','SugarFeed');
405                     } else { 
406                         $result = $seconds . ' ' . translate('LBL_TIME_SECONDS','SugarFeed'); 
407                     }
408                 }
409                         }
410                 }
411                 return $result . ' ' . translate('LBL_TIME_AGO','SugarFeed');
412
413                 
414         
415     } 
416
417 }
418 ?>