diff --git a/gulliver/system/class.headPublisher.php b/gulliver/system/class.headPublisher.php index 12448210d..3ed7132d2 100644 --- a/gulliver/system/class.headPublisher.php +++ b/gulliver/system/class.headPublisher.php @@ -409,7 +409,11 @@ class headPublisher { * later, when we use the includeExtJs function, all the files in this array will be included in the output * if the second argument is true, the file will not be minified, this is useful for debug purposes. * + * Feature added - + * - Hook to find javascript registered from plugins and load them + * * @author Fernando Ontiveros + * @author Erik Amaru Ortiz * @access public * @return string */ @@ -456,6 +460,45 @@ class headPublisher { file_put_contents ( $cacheFilename, $content ); } } + + //hook for registered javascripts from plugins + $oPluginRegistry = & PMPluginRegistry::getSingleton(); + $pluginJavascripts = $oPluginRegistry->getRegisteredJavascriptBy($filename); + if (count($pluginJavascripts) > 0) { + if ($debug) { + foreach ($pluginJavascripts as $pluginJsFile) { + if (substr($pluginJsFile, -3) != '.js') { + $pluginJsFile .= '.js'; + } + + if (file_exists(PATH_PLUGINS . $pluginJsFile)) { + $jsPluginCacheName = str_replace ( '/', '_', str_replace('.js', '', $pluginJsFile) ); + $cacheFilename = PATH_C . 'ExtJs' . PATH_SEP . $jsPluginCacheName; + file_put_contents ( $cacheFilename, file_get_contents ( PATH_PLUGINS . $pluginJsFile ) ); + } + } + } + else { + foreach ($pluginJavascripts as $pluginJsFile) { + if (substr($pluginJsFile, -3) !== '.js') { + $pluginJsFile .= '.js'; + } + if (file_exists(PATH_PLUGINS . $pluginJsFile)) { + $mtime = filemtime ( PATH_PLUGINS . $pluginJsFile ); + $jsPluginCacheName = md5 ( $mtime . $pluginJsFile ); + $cacheFilename = PATH_C . 'ExtJs' . PATH_SEP . $jsPluginCacheName . '.js'; + + if (! file_exists ( $cacheFilename )) { + require_once (PATH_THIRDPARTY . 'jsmin/jsmin.php'); + $content = JSMin::minify ( file_get_contents ( PATH_PLUGINS . $pluginJsFile ) ); + file_put_contents ( $cacheFilename, $content ); + } + } + } + } + $this->extJsScript [] = '/extjs/' . $jsPluginCacheName; + } + //end hook for registered javascripts from plugins $this->extJsScript [] = '/extjs/' . $cacheName; } diff --git a/workflow/engine/classes/class.plugin.php b/workflow/engine/classes/class.plugin.php index 3529383fd..11322cfae 100644 --- a/workflow/engine/classes/class.plugin.php +++ b/workflow/engine/classes/class.plugin.php @@ -572,7 +572,7 @@ class PMPlugin { $oPluginRegistry =& PMPluginRegistry::getSingleton(); $oPluginRegistry->registerCaseSchedulerPlugin( $this->sNamespace, $sActionId, $sActionForm, $sActionSave, $sActionExecute, $sActionGetFields ); } -/** + /** * With this function we can register a Dashboard Page for Cases Dashboard * @param string $sPage * @return void @@ -581,4 +581,26 @@ class PMPlugin { $oPluginRegistry =& PMPluginRegistry::getSingleton(); $oPluginRegistry->registerTaskExtendedProperty ( $this->sNamespace, $sPage, $sName, $sIcon ); } + + /** + * Register a plugin javascript to run with core js script at same runtime + * @param string $coreJsFile + * @param array/string $pluginJsFile + * @return void + */ + function registerJavascript($sCoreJsFile, $pluginJsFile) { + $oPluginRegistry =& PMPluginRegistry::getSingleton(); + $oPluginRegistry->registerJavascript($this->sNamespace, $sCoreJsFile, $pluginJsFile); + } + + /** + * Unregister a plugin javascript + * @param string $coreJsFile + * @param array/string $pluginJsFile + * @return void + */ + function unregisterJavascript($sCoreJsFile, $pluginJsFile) { + $oPluginRegistry =& PMPluginRegistry::getSingleton(); + $oPluginRegistry->unregisterJavascript($this->sNamespace, $sCoreJsFile, $pluginJsFile); + } } \ No newline at end of file diff --git a/workflow/engine/classes/class.pluginRegistry.php b/workflow/engine/classes/class.pluginRegistry.php index 2dbffbe7d..0d48990b6 100644 --- a/workflow/engine/classes/class.pluginRegistry.php +++ b/workflow/engine/classes/class.pluginRegistry.php @@ -90,6 +90,11 @@ class PMPluginRegistry { private $_aCaseSchedulerPlugin = array(); private $_aTaskExtendedProperties = array(); + /** + * Registry a plugin javascript to include with js core at same runtime + */ + private $_aJavascripts = array(); + static private $instance = NULL; /** @@ -228,7 +233,7 @@ class PMPluginRegistry { * * @param unknown_type $sNamespace */ - function disablePlugin($sNamespace ) + function disablePlugin($sNamespace) { $found = false; foreach ( $this->_aPluginDetails as $namespace=>$detail ) { @@ -305,7 +310,8 @@ class PMPluginRegistry { unset ( $this->_aTaskExtendedProperties[ $key ] ); } - + //unregistering javascripts from this plugin + $this->unregisterJavascripts($sNamespace); } /** @@ -537,6 +543,108 @@ class PMPluginRegistry { return $this->_aCSSStyleSheets; } + /** + * Register a plugin javascript to run with core js script at same runtime + * + * @param string $sNamespace + * @param string $coreJsFile + * @param array/string $pluginJsFile + */ + function registerJavascript($sNamespace, $sCoreJsFile, $pluginJsFile) { + + foreach ($this->_aJavascripts as $i=>$js) { + if ($sCoreJsFile == $js->sCoreJsFile && $sNamespace == $js->sNamespace) { + if (is_string($pluginJsFile)) { + if (!in_array($pluginJsFile, $this->_aJavascripts[$i]->pluginJsFile)) { + $this->_aJavascripts[$i]->pluginJsFile[] = $pluginJsFile; + } + } else if (is_array($pluginJsFile)) { + $this->_aJavascripts[$i]->pluginJsFile = array_unique(array_merge($pluginJsFile, $this->_aJavascripts[$i]->pluginJsFile)); + } else { + throw new Exception('Invalid third param, $pluginJsFile should be a string or array - '. gettype($pluginJsFile). ' given.'); + } + return $this->_aJavascripts[$i]; + } + } + + $js = new StdClass(); + $js->sNamespace = $sNamespace; + $js->sCoreJsFile = $sCoreJsFile; + $js->pluginJsFile = Array(); + + if (is_string($pluginJsFile)) { + $js->pluginJsFile[] = $pluginJsFile; + } else if (is_array($pluginJsFile)){ + $js->pluginJsFile = array_merge($js->pluginJsFile, $pluginJsFile); + } else { + throw new Exception('Invalid third param, $pluginJsFile should be a string or array - '. gettype($pluginJsFile). ' given.'); + } + + $this->_aJavascripts[] = $js; + } + + /** + * return all plugin javascripts + * + * @return array + */ + function getRegisteredJavascript() { + return $this->_aJavascripts; + } + + + /** + * return all plugin javascripts + * @param string $sCoreJsFile + * @param string $sNamespace + * @return array + */ + function getRegisteredJavascriptBy($sCoreJsFile, $sNamespace='') { + $scripts = array(); + + if ($sNamespace == '') { + foreach ($this->_aJavascripts as $i=>$js) { + if ($sCoreJsFile == $js->sCoreJsFile) { + $scripts = array_merge($scripts, $this->_aJavascripts[$i]->pluginJsFile); + } + } + } else { + foreach ($this->_aJavascripts as $i=>$js) { + if ($sCoreJsFile == $js->sCoreJsFile && $sNamespace == $js->sNamespace) { + $scripts = array_merge($scripts, $this->_aJavascripts[$i]->pluginJsFile); + } + } + } + return $scripts; + } + + + /** + * return all dashboard pages + * @param string $sNamespace + * @param string $sCoreJsFile + * @return array + */ + function unregisterJavascripts($sNamespace, $sCoreJsFile='') { + if ($sCoreJsFile == '') { // if $sCoreJsFile=='' unregister all js from this namespace + foreach ($this->_aJavascripts as $i=>$js) { + if ($sNamespace == $js->sNamespace) { + unset($this->_aJavascripts[$i]); + } + } + // Re-index when all js were unregistered + $this->_aJavascripts = array_values($this->_aJavascripts); + } else { + foreach ($this->_aJavascripts as $i=>$js) { + if ($sCoreJsFile == $js->sCoreJsFile && $sNamespace == $js->sNamespace) { + unset($this->_aJavascripts[$i]); + // Re-index for each js that was unregistered + $this->_aJavascripts = array_values($this->_aJavascripts); + } + } + } + } + /** * Register a reports class in the singleton