Example #1
0
 /**
  * Call each callback registered against $hookName in sequence.
  * The first callback that returns a value that evaluates to true
  * will interrupt processing and this function will return its return
  * value; otherwise, all callbacks will be called in sequence and the
  * return value of this call will be the value returned by the last
  * callback.
  * @param $hookName string The name of the hook to register against
  * @param $args string Hooks are called with this as the second param
  * @return mixed
  */
 function call($hookName, $args = null)
 {
     $hooks =& HookRegistry::getHooks();
     if (!isset($hooks[$hookName])) {
         return false;
     }
     foreach ($hooks[$hookName] as $hook) {
         if ($result = call_user_func($hook, $hookName, $args)) {
             break;
         }
     }
     return $result;
 }
Example #2
0
 /**
  * Call each callback registered against $hookName in sequence.
  * The first callback that returns a value that evaluates to true
  * will interrupt processing and this function will return its return
  * value; otherwise, all callbacks will be called in sequence and the
  * return value of this call will be the value returned by the last
  * callback.
  * @param $hookName string The name of the hook to register against
  * @param $args string Hooks are called with this as the second param
  * @return mixed
  */
 function call($hookName, $args = null)
 {
     // For testing only.
     // The implementation is a bit quirky as this has to work when
     // executed statically.
     if (self::rememberCalledHooks(true)) {
         // Remember the called hooks for testing.
         $calledHooks =& HookRegistry::getCalledHooks();
         $calledHooks[] = array($hookName, $args);
     }
     $hooks =& HookRegistry::getHooks();
     if (!isset($hooks[$hookName])) {
         return false;
     }
     foreach ($hooks[$hookName] as $hook) {
         if ($result = call_user_func($hook, $hookName, $args)) {
             break;
         }
     }
     return $result;
 }
 /**
  * SCENARIO OUTLINE: see FunctionalDoiExportTest::testExportUnregisteredDois().
  *
  * EXAMPLES:
  *   export plug-in   |objects                               |XML files
  *   =================|======================================|==============================================================================
  *   MedraExportPlugin|issue 1; article 1; galleys 1, 2 and 3|serial-article-as-{work,manifestation}-2.xml,serial-issue-as-manifestation.xml
  */
 public function testExportUnregisteredDois()
 {
     $this->removeRegisteredDois('MedraExportPlugin');
     $this->configurePlugin(array('exportIssuesAs' => O4DOI_ISSUE_AS_MANIFESTATION));
     // Test whether exporting updates changes correctly
     // sets the notification type.
     $pluginInstance = $this->instantiatePlugin('MedraExportPlugin');
     $hookName = 'articledao::getAdditionalFieldNames';
     HookRegistry::register($hookName, array($pluginInstance, 'getAdditionalFieldNames'));
     $articleDao = DAORegistry::getDAO('ArticleDAO');
     $testObject = $articleDao->getArticle(1);
     $testObject->setData('medra::' . DOI_EXPORT_REGDOI, '1749/t.v1i1.1');
     $articleDao->updateArticle($testObject);
     // Remove the hook.
     $hooks = HookRegistry::getHooks();
     foreach ($hooks[$hookName] as $index => $hook) {
         if (is_a($hook[0], 'MedraExportPlugin')) {
             unset($hooks[$hookName][$index]);
             break;
         }
     }
     $objects = array('issue' => 1, 'article' => 1, 'galley' => array(1, 2, 3));
     $xmlFiles = array('serial-article-as-work-2.xml', 'serial-article-as-manifestation-2.xml', 'serial-issue-as-manifestation.xml');
     parent::testExportUnregisteredDois('MedraExportPlugin', $objects, $xmlFiles);
 }
Example #4
0
 /**
  * Get usage event and pass it to the registered plugins, if any.
  */
 function getUsageEvent($hookName, $args)
 {
     // Check if we have a registration to receive the usage event.
     $hooks = HookRegistry::getHooks();
     if (array_key_exists('UsageEventPlugin::getUsageEvent', $hooks)) {
         $usageEvent = $this->_buildUsageEvent($hookName, $args);
         HookRegistry::call('UsageEventPlugin::getUsageEvent', array_merge(array($hookName, $usageEvent), $args));
     }
     return false;
 }
 /**
  * Initialize the template manager.
  */
 function initialize()
 {
     $locale = AppLocale::getLocale();
     $application = PKPApplication::getApplication();
     $router = $this->_request->getRouter();
     assert(is_a($router, 'PKPRouter'));
     $currentContext = $this->_request->getContext();
     $this->assign(array('defaultCharset' => Config::getVar('i18n', 'client_charset'), 'basePath' => $this->_request->getBasePath(), 'baseUrl' => $this->_request->getBaseUrl(), 'requiresFormRequest' => $this->_request->isPost(), 'currentUrl' => $this->_request->getCompleteUrl(), 'dateFormatTrunc' => Config::getVar('general', 'date_format_trunc'), 'dateFormatShort' => Config::getVar('general', 'date_format_short'), 'dateFormatLong' => Config::getVar('general', 'date_format_long'), 'datetimeFormatShort' => Config::getVar('general', 'datetime_format_short'), 'datetimeFormatLong' => Config::getVar('general', 'datetime_format_long'), 'timeFormat' => Config::getVar('general', 'time_format'), 'currentContext' => $currentContext, 'currentLocale' => $locale, 'pageTitle' => $application->getNameKey(), 'applicationName' => __($application->getNameKey())));
     if (is_a($router, 'PKPPageRouter')) {
         $this->assign(array('requestedPage' => $router->getRequestedPage($this->_request), 'requestedOp' => $router->getRequestedOp($this->_request)));
         // Register the jQuery script
         $min = Config::getVar('general', 'enable_minified') ? '.min' : '';
         if (Config::getVar('general', 'enable_cdn')) {
             $jquery = '//ajax.googleapis.com/ajax/libs/jquery/' . CDN_JQUERY_VERSION . '/jquery' . $min . '.js';
             $jqueryUI = '//ajax.googleapis.com/ajax/libs/jqueryui/' . CDN_JQUERY_UI_VERSION . '/jquery-ui' . $min . '.js';
         } else {
             $jquery = $this->_request->getBaseUrl() . '/lib/pkp/lib/components/jquery/jquery' . $min . '.js';
             $jqueryUI = $this->_request->getBaseUrl() . '/lib/pkp/lib/components/jquery-ui/jquery-ui' . $min . '.js';
         }
         $this->addJavaScript('jquery', $jquery, array('priority' => STYLE_SEQUENCE_CORE, 'contexts' => 'backend'));
         $this->addJavaScript('jqueryUI', $jqueryUI, array('priority' => STYLE_SEQUENCE_CORE, 'contexts' => 'backend'));
         // Register the pkp-lib JS library
         $this->registerJSLibraryData();
         $this->registerJSLibrary();
         // Load Noto Sans font from Google Font CDN
         // To load extended latin or other character sets, see:
         // https://www.google.com/fonts#UsePlace:use/Collection:Noto+Sans
         if (Config::getVar('general', 'enable_cdn')) {
             $this->addStyleSheet('pkpLibNotoSans', '//fonts.googleapis.com/css?family=Noto+Sans:400,400italic,700,700italic', array('priority' => STYLE_SEQUENCE_CORE, 'contexts' => 'backend'));
         }
         // Register the primary backend stylesheet
         if ($dispatcher = $this->_request->getDispatcher()) {
             $this->addStyleSheet('pkpLib', $dispatcher->url($this->_request, ROUTE_COMPONENT, null, 'page.PageHandler', 'css'), array('priority' => STYLE_SEQUENCE_CORE, 'contexts' => 'backend'));
         }
         // Add reading language flag based on locale
         $this->assign('currentLocaleLangDir', AppLocale::getLocaleDirection($locale));
         // If there's a locale-specific stylesheet, add it.
         if (($localeStyleSheet = AppLocale::getLocaleStyleSheet($locale)) != null) {
             $this->addStyleSheet('pkpLibLocale', $this->_request->getBaseUrl() . '/' . $localeStyleSheet, array('contexts' => array('frontend', 'backend')));
         }
         // Register colour picker assets on the appearance page
         $this->addJavaScript('spectrum', $this->_request->getBaseUrl() . '/lib/pkp/js/lib/jquery/plugins/spectrum/spectrum.js', array('contexts' => array('backend-management-settings', 'backend-admin-settings', 'backend-admin-contexts')));
         $this->addStyleSheet('spectrum', $this->_request->getBaseUrl() . '/lib/pkp/js/lib/jquery/plugins/spectrum/spectrum.css', array('contexts' => array('backend-management-settings', 'backend-admin-settings', 'backend-admin-contexts')));
         // Register recaptcha on relevant pages
         if (Config::getVar('captcha', 'recaptcha') && Config::getVar('captcha', 'captcha_on_register')) {
             $this->addJavaScript('recaptcha', 'https://www.google.com/recaptcha/api.js', array('contexts' => array('frontend-user-register', 'frontend-user-registerUser')));
         }
         // Register meta tags
         if (Config::getVar('general', 'installed')) {
             if (($this->_request->getRequestedPage() == '' || $this->_request->getRequestedPage() == 'index') && $currentContext && $currentContext->getLocalizedSetting('searchDescription')) {
                 $this->addHeader('searchDescription', '<meta name="description" content="' . $currentContext->getLocalizedSetting('searchDescription') . '">');
             }
             $this->addHeader('generator', '<meta name="generator" content="' . __($application->getNameKey()) . ' ' . $application->getCurrentVersion()->getVersionString(false) . '">', array('contexts' => array('frontend', 'backend')));
             if ($currentContext) {
                 $customHeaders = $currentContext->getLocalizedSetting('customHeaders');
                 if (!empty($customHeaders)) {
                     $this->addHeader('customHeaders', $customHeaders);
                 }
             }
         }
         if ($currentContext && !$currentContext->getEnabled()) {
             $this->addHeader('noindex', '<meta name="robots" content="noindex,nofollow">', array('contexts' => array('frontend', 'backend')));
         }
     }
     // Register custom functions
     $this->register_modifier('translate', array('AppLocale', 'translate'));
     $this->register_modifier('strip_unsafe_html', array('PKPString', 'stripUnsafeHtml'));
     $this->register_modifier('String_substr', array('PKPString', 'substr'));
     $this->register_modifier('dateformatPHP2JQueryDatepicker', array('PKPString', 'dateformatPHP2JQueryDatepicker'));
     $this->register_modifier('to_array', array($this, 'smartyToArray'));
     $this->register_modifier('compare', array($this, 'smartyCompare'));
     $this->register_modifier('concat', array($this, 'smartyConcat'));
     $this->register_modifier('strtotime', array($this, 'smartyStrtotime'));
     $this->register_modifier('explode', array($this, 'smartyExplode'));
     $this->register_modifier('assign', array($this, 'smartyAssign'));
     $this->register_function('csrf', array($this, 'smartyCSRF'));
     $this->register_function('translate', array($this, 'smartyTranslate'));
     $this->register_function('null_link_action', array($this, 'smartyNullLinkAction'));
     $this->register_function('help', array($this, 'smartyHelp'));
     $this->register_function('flush', array($this, 'smartyFlush'));
     $this->register_function('call_hook', array($this, 'smartyCallHook'));
     $this->register_function('html_options_translate', array($this, 'smartyHtmlOptionsTranslate'));
     $this->register_block('iterate', array($this, 'smartyIterate'));
     $this->register_function('page_links', array($this, 'smartyPageLinks'));
     $this->register_function('page_info', array($this, 'smartyPageInfo'));
     $this->register_function('pluck_files', array($this, 'smartyPluckFiles'));
     // Modified vocabulary for creating forms
     $fbv = $this->getFBV();
     $this->register_block('fbvFormSection', array($fbv, 'smartyFBVFormSection'));
     $this->register_block('fbvFormArea', array($fbv, 'smartyFBVFormArea'));
     $this->register_function('fbvFormButtons', array($fbv, 'smartyFBVFormButtons'));
     $this->register_function('fbvElement', array($fbv, 'smartyFBVElement'));
     $this->assign('fbvStyles', $fbv->getStyles());
     $this->register_function('fieldLabel', array($fbv, 'smartyFieldLabel'));
     // register the resource name "core"
     $coreResource = new PKPTemplateResource($this->core_template_dir);
     $this->register_resource('core', array(array($coreResource, 'fetch'), array($coreResource, 'fetchTimestamp'), array($coreResource, 'getSecure'), array($coreResource, 'getTrusted')));
     $appResource = new PKPTemplateResource($this->app_template_dir);
     $this->register_resource('app', array(array($appResource, 'fetch'), array($appResource, 'fetchTimestamp'), array($appResource, 'getSecure'), array($appResource, 'getTrusted')));
     $this->register_function('url', array($this, 'smartyUrl'));
     // ajax load into a div or any element
     $this->register_function('load_url_in_el', array($this, 'smartyLoadUrlInEl'));
     $this->register_function('load_url_in_div', array($this, 'smartyLoadUrlInDiv'));
     // load stylesheets/scripts/headers from a given context
     $this->register_function('load_stylesheet', array($this, 'smartyLoadStylesheet'));
     $this->register_function('load_script', array($this, 'smartyLoadScript'));
     $this->register_function('load_header', array($this, 'smartyLoadHeader'));
     /**
      * Kludge to make sure no code that tries to connect to the
      * database is executed (e.g., when loading installer pages).
      */
     if (!defined('SESSION_DISABLE_INIT')) {
         $application = PKPApplication::getApplication();
         $this->assign(array('isUserLoggedIn' => Validation::isLoggedIn(), 'isUserLoggedInAs' => Validation::isLoggedInAs(), 'itemsPerPage' => Config::getVar('interface', 'items_per_page'), 'numPageLinks' => Config::getVar('interface', 'page_links')));
         $user = $this->_request->getUser();
         $hasSystemNotifications = false;
         if ($user) {
             $notificationDao = DAORegistry::getDAO('NotificationDAO');
             $notifications = $notificationDao->getByUserId($user->getId(), NOTIFICATION_LEVEL_TRIVIAL);
             if ($notifications->getCount() > 0) {
                 $this->assign('hasSystemNotifications', true);
             }
             // Assign the user name to be used in the sitenav
             $this->assign(array('loggedInUsername' => $user->getUserName(), 'initialHelpState' => (int) $user->getInlineHelp()));
         }
     }
     // Load enabled block plugins and setup active sidebar variables
     PluginRegistry::loadCategory('blocks', true);
     $sidebarHooks = HookRegistry::getHooks('Templates::Common::Sidebar');
     $this->assign(array('hasSidebar' => !empty($sidebarHooks)));
 }
 /**
  * Remove registered DOIs for all out test objects.
  * @param $pluginName string
  */
 protected function removeRegisteredDois($pluginName)
 {
     // Mark all our test objects as "unregistered".
     $configurations = array('Issue' => array('IssueDAO', 'updateObject', 'getById', 1), 'Article' => array('ArticleDAO', 'updateObject', 'getArticle', 1), 'ArticleGalley' => array('ArticleGalleyDAO', 'updateGalley', 'getGalley', array(1, 2, 3)), 'SuppFile' => array('SuppFileDAO', 'updateSuppFile', 'getSuppFile', 1));
     $pluginInstance = $this->instantiatePlugin($pluginName);
     foreach ($configurations as $objectType => $configuration) {
         list($daoName, $updateMethod, $getMethod, $testIds) = $configuration;
         $dao = DAORegistry::getDAO($daoName);
         if (is_scalar($testIds)) {
             $testIds = array($testIds);
         }
         $hookName = strtolower_codesafe($daoName) . '::getAdditionalFieldNames';
         HookRegistry::register($hookName, array($pluginInstance, 'getAdditionalFieldNames'));
         foreach ($testIds as $testId) {
             // Retrieve the test object.
             $testObject = $dao->{$getMethod}($testId);
             // Remove the registered DOI.
             $testObject->setData($this->pluginId . '::' . DOI_EXPORT_REGDOI, '');
             $dao->{$updateMethod}($testObject);
         }
         $hooks = HookRegistry::getHooks();
         foreach ($hooks[$hookName] as $index => $hook) {
             if (is_a($hook[0], $pluginName)) {
                 unset($hooks[$hookName][$index]);
                 break;
             }
         }
     }
 }
 /**
  * Download a file.
  * Outputs HTTP headers and file content for download
  * @param $filePath string the location of the file to be sent
  * @param $mediaType string the MIME type of the file, optional
  * @param $inline print file as inline instead of attachment, optional
  * @return boolean
  */
 function downloadFile($filePath, $mediaType = null, $inline = false, $fileName = null)
 {
     $result = null;
     if (HookRegistry::call('FileManager::downloadFile', array(&$filePath, &$mediaType, &$inline, &$result, &$fileName))) {
         return $result;
     }
     $postDownloadHookList = array('FileManager::downloadFileFinished', 'UsageEventPlugin::getUsageEvent');
     if (is_readable($filePath)) {
         if ($mediaType === null) {
             // If the media type wasn't specified, try to detect.
             $mediaType = String::mime_content_type($filePath);
             if (empty($mediaType)) {
                 $mediaType = 'application/octet-stream';
             }
         }
         if ($fileName === null) {
             // If the filename wasn't specified, use the server-side.
             $fileName = basename($filePath);
         }
         $postDownloadHooks = null;
         $hooks = HookRegistry::getHooks();
         foreach ($postDownloadHookList as $hookName) {
             if (isset($hooks[$hookName])) {
                 $postDownloadHooks[$hookName] = $hooks[$hookName];
             }
         }
         unset($hooks);
         Registry::clear();
         // Stream the file to the end user.
         header("Content-Type: {$mediaType}");
         header('Content-Length: ' . filesize($filePath));
         header('Content-Disposition: ' . ($inline ? 'inline' : 'attachment') . "; filename=\"{$fileName}\"");
         header('Cache-Control: private');
         // Workarounds for IE weirdness
         header('Pragma: public');
         // Beware of converting to instance call
         // https://github.com/pkp/pkp-lib/commit/82f4a36db406ecac3eb88875541a74123e455713#commitcomment-1459396
         FileManager::readFile($filePath, true);
         if ($postDownloadHooks) {
             foreach ($postDownloadHooks as $hookName => $hooks) {
                 HookRegistry::setHooks($hookName, $hooks);
             }
         }
         $returner = true;
     } else {
         $returner = false;
     }
     HookRegistry::call('FileManager::downloadFileFinished', array(&$returner));
     return $returner;
 }
 /**
  * Initialize the template manager.
  */
 function initialize()
 {
     $locale = AppLocale::getLocale();
     $application = PKPApplication::getApplication();
     $router = $this->_request->getRouter();
     assert(is_a($router, 'PKPRouter'));
     $this->assign(array('defaultCharset' => Config::getVar('i18n', 'client_charset'), 'basePath' => $this->_request->getBasePath(), 'baseUrl' => $this->_request->getBaseUrl(), 'requiresFormRequest' => $this->_request->isPost(), 'currentUrl' => $this->_request->getCompleteUrl(), 'dateFormatTrunc' => Config::getVar('general', 'date_format_trunc'), 'dateFormatShort' => Config::getVar('general', 'date_format_short'), 'dateFormatLong' => Config::getVar('general', 'date_format_long'), 'datetimeFormatShort' => Config::getVar('general', 'datetime_format_short'), 'datetimeFormatLong' => Config::getVar('general', 'datetime_format_long'), 'timeFormat' => Config::getVar('general', 'time_format'), 'allowCDN' => Config::getVar('general', 'enable_cdn'), 'useMinifiedJavaScript' => Config::getVar('general', 'enable_minified'), 'toggleHelpOnText' => __('help.toggleInlineHelpOn'), 'toggleHelpOffText' => __('help.toggleInlineHelpOff'), 'currentContext' => $this->_request->getContext(), 'currentLocale' => $locale, 'pageTitle' => $application->getNameKey(), 'applicationName' => __($application->getNameKey()), 'exposedConstants' => $application->getExposedConstants(), 'jsLocaleKeys' => $application->getJSLocaleKeys()));
     if (is_a($router, 'PKPPageRouter')) {
         $this->assign(array('requestedPage' => $router->getRequestedPage($this->_request), 'requestedOp' => $router->getRequestedOp($this->_request)));
     }
     if ($dispatcher = $this->_request->getDispatcher()) {
         $this->addStyleSheet($dispatcher->url($this->_request, ROUTE_COMPONENT, null, 'page.PageHandler', 'css'), STYLE_SEQUENCE_CORE, 'backend');
     }
     // If there's a locale-specific stylesheet, add it.
     if (($localeStyleSheet = AppLocale::getLocaleStyleSheet($locale)) != null) {
         $this->addStyleSheet($this->_request->getBaseUrl() . '/' . $localeStyleSheet, 'backend');
     }
     // Register custom functions
     $this->register_modifier('translate', array('AppLocale', 'translate'));
     $this->register_modifier('strip_unsafe_html', array('String', 'stripUnsafeHtml'));
     $this->register_modifier('String_substr', array('String', 'substr'));
     $this->register_modifier('to_array', array($this, 'smartyToArray'));
     $this->register_modifier('compare', array($this, 'smartyCompare'));
     $this->register_modifier('concat', array($this, 'smartyConcat'));
     $this->register_modifier('escape', array($this, 'smartyEscape'));
     $this->register_modifier('strtotime', array($this, 'smartyStrtotime'));
     $this->register_modifier('explode', array($this, 'smartyExplode'));
     $this->register_modifier('assign', array($this, 'smartyAssign'));
     $this->register_function('translate', array($this, 'smartyTranslate'));
     $this->register_function('null_link_action', array($this, 'smartyNullLinkAction'));
     $this->register_function('flush', array($this, 'smartyFlush'));
     $this->register_function('call_hook', array($this, 'smartyCallHook'));
     $this->register_function('html_options_translate', array($this, 'smartyHtmlOptionsTranslate'));
     $this->register_block('iterate', array($this, 'smartyIterate'));
     $this->register_function('page_links', array($this, 'smartyPageLinks'));
     $this->register_function('page_info', array($this, 'smartyPageInfo'));
     $this->register_function('icon', array($this, 'smartyIcon'));
     $this->register_modifier('truncate', array($this, 'smartyTruncate'));
     // Modified vocabulary for creating forms
     $fbv = $this->getFBV();
     $this->register_block('fbvFormSection', array($fbv, 'smartyFBVFormSection'));
     $this->register_block('fbvFormArea', array($fbv, 'smartyFBVFormArea'));
     $this->register_function('fbvFormButtons', array($fbv, 'smartyFBVFormButtons'));
     $this->register_function('fbvElement', array($fbv, 'smartyFBVElement'));
     $this->assign('fbvStyles', $fbv->getStyles());
     $this->register_function('fieldLabel', array($fbv, 'smartyFieldLabel'));
     // register the resource name "core"
     $coreResource = new PKPTemplateResource($this->core_template_dir);
     $this->register_resource('core', array(array($coreResource, 'fetch'), array($coreResource, 'fetchTimestamp'), array($coreResource, 'getSecure'), array($coreResource, 'getTrusted')));
     $appResource = new PKPTemplateResource($this->app_template_dir);
     $this->register_resource('app', array(array($appResource, 'fetch'), array($appResource, 'fetchTimestamp'), array($appResource, 'getSecure'), array($appResource, 'getTrusted')));
     $this->register_function('url', array($this, 'smartyUrl'));
     // ajax load into a div or any element
     $this->register_function('load_url_in_el', array($this, 'smartyLoadUrlInEl'));
     $this->register_function('load_url_in_div', array($this, 'smartyLoadUrlInDiv'));
     // load stylesheets from a given context
     $this->register_function('load_stylesheet', array($this, 'smartyLoadStylesheet'));
     /**
      * Kludge to make sure no code that tries to connect to the
      * database is executed (e.g., when loading installer pages).
      */
     if (!defined('SESSION_DISABLE_INIT')) {
         $application = PKPApplication::getApplication();
         $currentVersion = $application->getCurrentVersion();
         $this->assign(array('isUserLoggedIn' => Validation::isLoggedIn(), 'isUserLoggedInAs' => Validation::isLoggedInAs(), 'currentVersionString' => $currentVersion->getVersionString(false), 'itemsPerPage' => Config::getVar('interface', 'items_per_page'), 'numPageLinks' => Config::getVar('interface', 'page_links')));
         $user = $this->_request->getUser();
         $hasSystemNotifications = false;
         if ($user) {
             $notificationDao = DAORegistry::getDAO('NotificationDAO');
             $notifications = $notificationDao->getByUserId($user->getId(), NOTIFICATION_LEVEL_TRIVIAL);
             if ($notifications->getCount() > 0) {
                 $this->assign('hasSystemNotifications', true);
             }
             // Assign the user name to be used in the sitenav
             $this->assign(array('loggedInUsername' => $user->getUserName(), 'initialHelpState' => (int) $user->getInlineHelp()));
         }
     }
     // Load enabled block plugins and setup active sidebar variables
     PluginRegistry::loadCategory('blocks', true);
     $leftSidebarHooks = HookRegistry::getHooks('Templates::Common::LeftSidebar');
     $rightSidebarHooks = HookRegistry::getHooks('Templates::Common::RightSidebar');
     $this->assign(array('hasLeftSidebar' => !empty($leftSidebarHooks), 'hasRightSidebar' => !empty($rightSidebarHooks)));
 }
 /**
  * Get the compiled CSS
  * @param $args array
  * @param $request PKPRequest
  */
 function css($args, $request)
 {
     header('Content-Type: text/css');
     $templateManager = TemplateManager::getManager($request);
     $name = $request->getUserVar('name');
     if (empty($name)) {
         $name = 'pkp-lib';
     }
     switch ($name) {
         // The core app stylesheet
         case 'pkp-lib':
             $cachedFile = $templateManager->getCachedLessFilePath($name);
             if (!file_exists($cachedFile)) {
                 $styles = $templateManager->compileLess($name, 'styles/index.less');
                 if (!$templateManager->cacheLess($cachedFile, $styles)) {
                     echo $styles;
                     die;
                 }
             }
         default:
             // Backwards compatibility. This hook is deprecated.
             if (HookRegistry::getHooks('PageHandler::displayCss')) {
                 $result = '';
                 $lastModified = null;
                 HookRegistry::call('PageHandler::displayCss', array($request, &$name, &$result, &$lastModified));
                 if ($lastModified) {
                     header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
                 }
                 header('Content-Length: ' . strlen($result));
                 echo $result;
                 die;
             } else {
                 $cachedFile = $templateManager->getCachedLessFilePath($name);
                 if (!file_exists($cachedFile)) {
                     // Process styles registered with the current theme
                     $styles = '';
                     $themes = PluginRegistry::loadCategory('themes', true);
                     foreach ($themes as $theme) {
                         if ($theme->isActive()) {
                             $style = $theme->getStyle($name);
                             if (!empty($style)) {
                                 // Compile and cache the stylesheet
                                 $styles = $templateManager->compileLess($name, $style['style'], array('baseUrl' => isset($style['baseUrl']) ? $style['baseUrl'] : null, 'addLess' => isset($style['addLess']) ? $style['addLess'] : null, 'addLessVariables' => isset($style['addLessVariables']) ? $style['addLessVariables'] : null));
                             }
                             break;
                         }
                     }
                     // If we still haven't found styles, fire off a hook
                     // which allows other types of plugins to handle
                     // requests
                     if (!$styles) {
                         HookRegistry::call('PageHandler::getCompiledLess', array('request' => $request, 'name' => &$name, 'styles' => &$styles));
                     }
                     // Give up if there are still no styles
                     if (!$styles) {
                         die;
                     }
                     // Try to save the styles to a cached file. If we can't,
                     // just print them out
                     if (!$templateManager->cacheLess($cachedFile, $styles)) {
                         echo $styles;
                         die;
                     }
                 }
             }
     }
     // Deliver the cached file
     header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($cachedFile)) . ' GMT');
     header('Content-Length: ' . filesize($cachedFile));
     readfile($cachedFile);
     die;
 }
 /**
  * Syncronize crontab with lazy load plugins management.
  * @param $hookName string
  * @param $args array
  * @return boolean
  * @see PluginHandler::plugin() for the hook call.
  */
 function callbackManage($hookName, $args)
 {
     $verb = $args[0];
     $plugin = $args[4];
     /* @var $plugin LazyLoadPlugin */
     // Only interested in plugins that can be enabled/disabled.
     if (!is_a($plugin, 'LazyLoadPlugin')) {
         return false;
     }
     // Only interested in enable/disable actions.
     if ($verb !== 'enable' && $verb !== 'disable') {
         return false;
     }
     // Check if the plugin wants to add its own
     // scheduled task into the cron tab.
     $hooks = HookRegistry::getHooks();
     $hookName = 'AcronPlugin::parseCronTab';
     if (!isset($hooks[$hookName])) {
         return false;
     }
     foreach ($hooks[$hookName] as $callback) {
         if ($callback[0] == $plugin) {
             $this->_parseCrontab();
             break;
         }
     }
     return false;
 }
 /**
  * Download a file.
  * Outputs HTTP headers and file content for download
  * @param $filePath string the location of the file to be sent
  * @param $mediaType string the MIME type of the file, optional
  * @param $inline print file as inline instead of attachment, optional
  * @return boolean
  */
 function downloadFile($filePath, $mediaType = null, $inline = false, $fileName = null)
 {
     $result = null;
     if (HookRegistry::call('FileManager::downloadFile', array(&$filePath, &$mediaType, &$inline, &$result, &$fileName))) {
         return $result;
     }
     $postDownloadHookList = array('FileManager::downloadFileFinished', 'UsageEventPlugin::getUsageEvent');
     if (is_readable($filePath)) {
         if ($mediaType === null) {
             // If the media type wasn't specified, try to detect.
             $mediaType = PKPString::mime_content_type($filePath);
             if (empty($mediaType)) {
                 $mediaType = 'application/octet-stream';
             }
         }
         if ($fileName === null) {
             // If the filename wasn't specified, use the server-side.
             $fileName = basename($filePath);
         }
         // Free some memory
         $postDownloadHooks = null;
         $hooks = HookRegistry::getHooks();
         foreach ($postDownloadHookList as $hookName) {
             if (isset($hooks[$hookName])) {
                 $postDownloadHooks[$hookName] = $hooks[$hookName];
             }
         }
         unset($hooks);
         Registry::clear();
         // Stream the file to the end user.
         header("Content-Type: {$mediaType}");
         header('Content-Length: ' . filesize($filePath));
         header('Content-Disposition: ' . ($inline ? 'inline' : 'attachment') . "; filename=\"{$fileName}\"");
         header('Cache-Control: private');
         // Workarounds for IE weirdness
         header('Pragma: public');
         $this->readFileFromPath($filePath, true);
         if ($postDownloadHooks) {
             foreach ($postDownloadHooks as $hookName => $hooks) {
                 HookRegistry::setHooks($hookName, $hooks);
             }
         }
         $returner = true;
     } else {
         $returner = false;
     }
     HookRegistry::call('FileManager::downloadFileFinished', array(&$returner));
     return $returner;
 }