/** * @param CM_Frontend_Render $render * @return string */ public function getMessagePublic(CM_Frontend_Render $render) { if (!$this->isPublic()) { return 'Internal server error'; } return $render->getTranslation($this->_messagePublic, $this->_messagePublicVariables); }
/** * @param CM_Frontend_Render $render * @param CM_Page_Abstract $page */ public function __construct(CM_Frontend_Render $render, CM_Page_Abstract $page) { $this->_page = $page; $documentClass = $render->getSite()->getDocument(); $document = new $documentClass(); parent::__construct($render, $document); }
public function testProcessTranslationsEnableKey() { $language = CMTest_TH::createLanguage('test'); $languageKey = CM_Model_LanguageKey::create('Hello World'); $this->assertSame(false, $languageKey->getJavascript()); $site = CM_Site_Abstract::factory(); $render = new CM_Frontend_Render(new CM_Frontend_Environment(null, null, $language)); // Check that key is *not* included in the JS translations list $versionJavascript = CM_Model_Language::getVersionJavascript(); $request = new CM_Http_Request_Get($render->getUrlResource('library-js', "translations/{$versionJavascript}.js")); $response = CM_Http_Response_Resource_Javascript_Library::createFromRequest($request, $site, $this->getServiceManager()); $response->process(); $this->assertNotContains('Hello World', $response->getContent()); // Request JS-enabling of language key via RPC call $body = CM_Params::jsonEncode(['method' => 'CM_Model_Language.requestTranslationJs', 'params' => ['Hello World']]); $request = new CM_Http_Request_Post('/rpc', null, null, $body); $response = CM_Http_Response_RPC::createFromRequest($request, $site, $this->getServiceManager()); $response->process(); CMTest_TH::reinstantiateModel($languageKey); $this->assertSame(true, $languageKey->getJavascript()); // Check that key *is* included in the JS translations list $versionJavascript = CM_Model_Language::getVersionJavascript(); $request = new CM_Http_Request_Get($render->getUrlResource('library-js', "translations/{$versionJavascript}.js")); $response = CM_Http_Response_Resource_Javascript_Library::createFromRequest($request, $site, $this->getServiceManager()); $response->process(); $this->assertContains('Hello World', $response->getContent()); }
public function testProcess() { $render = new CM_Frontend_Render(new CM_Frontend_Environment()); $request = new CM_Http_Request_Get($render->getUrlResource('library-css', 'all.css')); $response = new CM_Http_Response_Resource_Css_Library($request, $this->getServiceManager()); $response->process(); $this->assertContains('body{', $response->getContent()); }
public function getSuggestion($location, CM_Frontend_Render $render) { $names = array(); for ($level = $location->getLevel(); $level >= CM_Model_Location::LEVEL_COUNTRY; $level--) { $names[] = $location->getName($level); } return array('id' => CM_Params::jsonEncode($location->toArray()), 'name' => implode(', ', array_filter($names)), 'img' => $render->getUrlResource('layout', 'img/flags/' . strtolower($location->getAbbreviation(CM_Model_Location::LEVEL_COUNTRY)) . '.png')); }
public function testProcessTranslations() { $render = new CM_Frontend_Render(new CM_Frontend_Environment()); $request = new CM_Http_Request_Get($render->getUrlResource('library-js', 'translations/123.js')); $response = new CM_Http_Response_Resource_Javascript_Library($request, $this->getServiceManager()); $response->process(); $this->assertContains('cm.language.setAll', $response->getContent()); }
public function testProcessAfterBody() { $render = new CM_Frontend_Render(new CM_Frontend_Environment()); $request = new CM_Http_Request_Get($render->getUrlResource('vendor-js', 'after-body.js')); $response = new CM_Http_Response_Resource_Javascript_Vendor($request, $this->getServiceManager()); $response->process(); $this->assertContains('function()', $response->getContent()); $this->assertContains('jQuery', $response->getContent()); }
public function testProcess() { $render = new CM_Frontend_Render(new CM_Frontend_Environment()); $url = $render->getUrlResource('layout', 'img/logo.png', ['root' => true]); $this->assertSame(1, substr_count(parse_url($url, PHP_URL_PATH), '/')); $request = $this->createRequest($url); $response = $this->processRequest($request); $this->assertContains('Content-Type: image/png', $response->getHeaders()); }
public function testCaching() { $debug = new CM_Debug(true); $flag = '<img class="flag" src="' . $this->_render->getUrlResource('layout', 'img/flags/fo.png') . '" title="countryFoo" />'; $expected = '<span class="function-location contains-flag">cityFoo, stateFoo, countryFoo' . $flag . '</span>'; $this->_assertSame($expected, array('location' => $this->_location)); $debug->setEnabled(false); $this->assertEmpty($debug->getStats()); }
/** * @param CM_Frontend_Render $render * @param string|null $urlPage * @param array $urlParams * @param CM_Frontend_ViewResponse $component * @param int $page * @param string[] $linkParams * @param Smarty_Internal_Template $template * @return string */ function _smarty_function_paging_link(CM_Frontend_Render $render, $urlPage, array $urlParams, CM_Frontend_ViewResponse $component, $page, array $linkParams, Smarty_Internal_Template $template) { if (empty($urlPage)) { $javascript = 'cm.views["' . $component->getAutoId() . '"].reload(' . json_encode(array('page' => $page)) . ')'; $linkParams['onclick'] = $javascript . ';return false;'; } else { $linkParams['href'] = $render->getUrlPage($urlPage, array_merge($urlParams, array('page' => $page))); } return smarty_function_link($linkParams, $template); }
public function testRenderCrossSite() { $smarty = new Smarty(); $render = new CM_Frontend_Render(); $siteOther = $this->getMockSite('CM_Site_Abstract', null, ['urlCdn' => 'http://cdn.other.com']); $renderOther = new CM_Frontend_Render(new CM_Frontend_Environment($siteOther)); $template = $smarty->createTemplate('string:'); $template->assignGlobal('render', $render); $this->assertContains($renderOther->getUrlResource('layout', 'img/foo.png'), smarty_function_img(['path' => 'foo.png', 'site' => $siteOther], $template)); }
public function testProcess() { $site = CM_Site_Abstract::factory(); $render = new CM_Frontend_Render(new CM_Frontend_Environment()); $request = new CM_Http_Request_Get($render->getUrlResource('library-css', 'all.css')); $response = CM_Http_Response_Resource_Css_Library::createFromRequest($request, $site, $this->getServiceManager()); $response->process(); $this->assertContains('Cache-Control: max-age=31536000', $response->getHeaders()); $this->assertContains('Expires: ' . gmdate('D, d M Y H:i:s \\G\\M\\T', time() + 31536000), $response->getHeaders()); $this->assertContains('body{', $response->getContent()); }
/** * @param CM_Frontend_Render $render * @param string $path * @throws CM_Exception_Invalid * @return string */ public static final function getClassnameByPath(CM_Frontend_Render $render, $path) { $path = (string) $path; $pathTokens = explode('/', $path); array_shift($pathTokens); // Rewrites code-of-honor to CodeOfHonor foreach ($pathTokens as &$pathToken) { $pathToken = CM_Util::camelize($pathToken); } return $render->getClassnameByPartialClassname('Page_' . implode('_', $pathTokens)); }
public function addVariables() { foreach (array_reverse($this->_render->getSite()->getModules()) as $moduleName) { foreach (array_reverse($this->_render->getSite()->getThemes()) as $theme) { $file = new CM_File($this->_render->getThemeDir(true, $theme, $moduleName) . 'variables.less'); if ($file->exists()) { $this->add($file->read()); } } } }
public function testRenderCrossSite() { $smarty = new Smarty(); $render = new CM_Frontend_Render(); $siteOther = $this->getMockSite('CM_Site_Abstract', null, ['urlCdn' => 'http://cdn.other.com']); $renderOther = new CM_Frontend_Render(new CM_Frontend_Environment($siteOther)); $template = $smarty->createTemplate('string:'); $template->assignGlobal('render', $render); $this->assertSame($renderOther->getUrlResource('layout', 'foo'), smarty_function_resourceUrl(array('path' => 'foo', 'type' => 'layout', 'site' => $siteOther), $template)); $this->assertSame($renderOther->getUrlStatic('foo'), smarty_function_resourceUrl(array('path' => 'foo', 'type' => 'static', 'site' => $siteOther), $template)); }
public function testProcess() { $render = new CM_Frontend_Render(new CM_Frontend_Environment()); $url = $render->getUrlServiceWorker(); $this->assertSame(1, substr_count(parse_url($url, PHP_URL_PATH), '/')); $request = $this->createRequest($url); $response = $this->processRequest($request); $this->assertContains('Content-Type: application/x-javascript', $response->getHeaders()); $this->assertContains('Cache-Control: max-age=31536000', $response->getHeaders()); $this->assertContains('Expires: ' . gmdate('D, d M Y H:i:s \\G\\M\\T', time() + 31536000), $response->getHeaders()); $this->assertContains('self.addEventListener("install"', $response->getContent()); }
public function testUrlFont() { $render = new CM_Frontend_Render(); $css = new CM_Asset_Css($render, "body { src: url(urlFont('file.eot')); }"); $url = $render->getUrlStatic('/font/file.eot'); $expected = <<<EOD body { src: url('{$url}'); } EOD; $this->assertEquals($expected, $css->get()); }
public function testProcessAfterBody() { $site = CM_Site_Abstract::factory(); $render = new CM_Frontend_Render(new CM_Frontend_Environment()); $request = new CM_Http_Request_Get($render->getUrlResource('vendor-js', 'after-body.js')); $response = CM_Http_Response_Resource_Javascript_Vendor::createFromRequest($request, $site, $this->getServiceManager()); $response->process(); $this->assertContains('Cache-Control: max-age=31536000', $response->getHeaders()); $this->assertContains('Expires: ' . gmdate('D, d M Y H:i:s \\G\\M\\T', time() + 31536000), $response->getHeaders()); $this->assertContains('function()', $response->getContent()); $this->assertContains('jQuery', $response->getContent()); }
/** * @param CM_Frontend_Render $render * @return string */ function smarty_helper_resourceJs_libraryDebug(CM_Frontend_Render $render) { $paths = CM_Asset_Javascript_Library::getIncludedPaths($render->getSite()); $content = ''; foreach ($paths as $path) { $path = str_replace(DIR_ROOT, '/', $path); $path = str_replace(DIRECTORY_SEPARATOR, '/', $path); $path .= '?' . CM_App::getInstance()->getDeployVersion(); $content .= '<script type="text/javascript" src="' . $path . '"></script>' . PHP_EOL; } $content .= smarty_helper_resourceJs('library', 'library.js?debug=true', $render); return $content; }
public function testNonexistentFile() { $site = $this->getMockSite(); $render = new CM_Frontend_Render(new CM_Frontend_Environment($site)); $url = $render->getUrlResource('layout', 'nonExistent.css'); $request = new CM_Http_Request_Get($url, ['host' => $site->getHost()]); try { $this->processRequest($request); } catch (CM_Exception_Nonexistent $ex) { $this->assertSame('Invalid filename', $ex->getMessage()); $this->assertSame(['path' => '/nonExistent.css'], $ex->getMetaInfo()); } }
public function setUp() { $smarty = new Smarty(); $render = new CM_Frontend_Render(); $formMock = $this->getMockForAbstractClass('CM_Form_Abstract', array(), '', true, true, true, array('getAction')); $actionMock = $this->getMockForAbstractClass('CM_FormAction_Abstract', array($formMock), '', true, true, true, array('getName')); $actionMock->expects($this->any())->method('getName')->will($this->returnValue('Create')); $formMock->expects($this->any())->method('getAction')->will($this->returnValue($actionMock)); /** @var CM_Form_Abstract $formMock */ $render->getGlobalResponse()->treeExpand(new CM_Frontend_ViewResponse($formMock)); $this->_template = $smarty->createTemplate('string:'); $this->_template->assignGlobal('render', $render); }
public function testProcessNonexistentUser() { $user = $this->getMockUser(); $mail = new CM_Mail_ExampleMailable($user); $site = CM_Site_Abstract::factory(); $render = new CM_Frontend_Render(new CM_Frontend_Environment($site)); $request = new CM_Http_Request_Get($render->getUrlEmailTracking($mail), ['host' => $site->getHost()]); $response = CM_Http_Response_EmailTracking::createFromRequest($request, $site, $this->getServiceManager()); $user->delete(); try { $response->process(); $this->fail('Expected exception not thrown'); } catch (CM_Exception_Nonexistent $e) { $this->assertSame(CM_Exception::WARN, $e->getSeverity()); } }
/** * @param CM_Frontend_Render $render * @return array */ private function _getEmoticonData(CM_Frontend_Render $render) { $cacheKey = CM_CacheConst::Usertext_Filter_EmoticonList . '_fixedHeight:' . (string) $this->_fixedHeight; $cache = CM_Cache_Local::getInstance(); if (($emoticons = $cache->get($cacheKey)) === false) { $emoticons = array('codes' => array(), 'htmls' => array()); $fixedHeight = ''; if (null !== $this->_fixedHeight) { $fixedHeight = ' height="' . $this->_fixedHeight . '"'; } /** @var CM_Emoticon $emoticon */ foreach (new CM_Paging_Emoticon_All() as $emoticon) { foreach ($emoticon->getCodes() as $code) { $emoticons['codes'][] = $code; $emoticons['htmls'][] = '<img src="' . $render->getUrlResource('layout', 'img/emoticon/' . $emoticon->getFileName()) . '" class="emoticon emoticon-' . $emoticon->getName() . '" title="' . $emoticon->getDefaultCode() . '"' . $fixedHeight . ' />'; } } $cache->set($cacheKey, $emoticons); } return $emoticons; }
public function generateFavicon() { $faviconConfigList = $this->_getFaviconConfigList(); $this->_getStreamOutput()->writeln('Generating favicons'); $themeDirStructList = Functional\map(CM_Site_Abstract::getAll(), function (CM_Site_Abstract $site) { $render = new CM_Frontend_Render(new CM_Frontend_Environment($site)); return ['render' => $render, 'themeDir' => new CM_File($render->getThemeDir(true))]; }); $themeDirStructList = Functional\unique($themeDirStructList, function (array $themeDirStruct) { /** @var CM_File $themeDir */ $themeDir = $themeDirStruct['themeDir']; return $themeDir->getPath(); }); //filter site aliases foreach ($themeDirStructList as $themeDirStruct) { /** @var CM_Frontend_Render $render */ $render = $themeDirStruct['render']; /** @var CM_File $themeDir */ $themeDir = $themeDirStruct['themeDir']; $svgFile = $themeDir->joinPath('resource', 'img', self::FAVICON_SVG_FILENAME); if ($svgFile->exists()) { foreach ($faviconConfigList as $outputFilename => $config) { $backgroundWidth = (int) $config['width']; $backgroundHeight = (int) $config['height']; $backgroundColor = false === $config['transparent'] ? $render->getLessVariable(self::FAVICON_BACKGROUND_LESS_VARIABLE) : 'transparent'; $background = new Imagick(); $background->newPseudoImage($backgroundWidth, $backgroundHeight, 'canvas:' . $backgroundColor); $backgroundImage = new CM_Image_Image($background); $iconSize = (int) (min($backgroundWidth, $backgroundHeight) * (double) $config['iconSize']); $iconImage = CM_Image_Image::createFromSVGWithSize($svgFile->read(), $iconSize, $iconSize); $backgroundImage->compositeImage($iconImage, ($backgroundWidth - $iconSize) / 2, ($backgroundHeight - $iconSize) / 2); $backgroundImage->setFormat(CM_Image_Image::FORMAT_PNG); $targetFile = $themeDir->joinPath('resource', 'img', 'meta', $outputFilename); $targetFile->ensureParentDirectory(); $targetFile->write($backgroundImage->getBlob()); $this->_getStreamOutput()->writeln('Generated ' . $targetFile->getPath()); } } } }
/** * @return Smarty */ private function _getSmarty() { if (!isset(self::$_smarty)) { self::$_smarty = new Smarty(); self::$_smarty->setTemplateDir(DIR_ROOT); self::$_smarty->setCompileDir(CM_Bootloader::getInstance()->getDirTmp() . 'smarty/'); self::$_smarty->_file_perms = 0666; self::$_smarty->_dir_perms = 0777; self::$_smarty->compile_check = CM_Bootloader::getInstance()->isDebug(); self::$_smarty->caching = false; self::$_smarty->error_reporting = error_reporting(); } $pluginDirs = array(SMARTY_PLUGINS_DIR); foreach ($this->getSite()->getModules() as $moduleName) { $pluginDirs[] = CM_Util::getModulePath($moduleName) . 'library/' . $moduleName . '/SmartyPlugins'; } self::$_smarty->setPluginsDir($pluginDirs); self::$_smarty->loadFilter('pre', 'translate'); return self::$_smarty; }
/** * @expectedException CM_Exception_Invalid * @expectedExceptionMessage Invalid non-numeric value */ public function testNonNumeric() { $render = new CM_Frontend_Render(); $render->parseTemplateContent('{numberDecimal value="foo"}'); }
public function testParseTemplateContent() { $viewer = CM_Model_User::createStatic(); $render = new CM_Frontend_Render(); $render->getEnvironment()->setViewer($viewer); $content = '{$viewer->getId()} {$foo} normal-text'; $expected = $viewer->getId() . ' bar normal-text'; $this->assertSame($expected, $render->parseTemplateContent($content, ['foo' => 'bar'])); }
/** * @param CM_Frontend_Render $render * @return string */ public function translate(CM_Frontend_Render $render) { return $render->getTranslation($this->_phrase, $this->_variables); }
public function testRenderPage() { $urlPage = $this->_render->getUrlPage('CM_Page_Example', ['foo' => '12']); $this->assertRegExp('#<a.*href="' . preg_quote($urlPage) . '".*>.*Click me.*</a>#', smarty_function_button_link(['label' => 'Click me', 'page' => 'CM_Page_Example', 'foo' => '12'], $this->_template)); }
public function testGetLayoutPath() { $render = new CM_Frontend_Render(); $this->assertSame('layout/default/resource/img/favicon.svg', $render->getLayoutPath('resource/img/favicon.svg')); }