Beispiel #1
0
 /**
  * @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);
 }
Beispiel #2
0
 /**
  * @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);
 }
Beispiel #3
0
 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());
 }
Beispiel #4
0
 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());
 }
Beispiel #5
0
 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'));
 }
Beispiel #6
0
 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());
 }
Beispiel #7
0
 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());
 }
Beispiel #8
0
 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());
 }
Beispiel #10
0
/**
 * @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);
}
Beispiel #11
0
 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));
 }
Beispiel #12
0
 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());
 }
Beispiel #13
0
 /**
  * @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));
 }
Beispiel #14
0
 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));
 }
Beispiel #16
0
 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());
 }
Beispiel #17
0
    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());
    }
Beispiel #18
0
 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());
 }
Beispiel #19
0
/**
 * @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;
}
Beispiel #20
0
 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());
     }
 }
Beispiel #21
0
 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);
 }
Beispiel #22
0
 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());
     }
 }
Beispiel #23
0
 /**
  * @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;
 }
Beispiel #24
0
 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());
             }
         }
     }
 }
Beispiel #25
0
 /**
  * @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"}');
 }
Beispiel #27
0
 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']));
 }
Beispiel #28
0
 /**
  * @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));
 }
Beispiel #30
0
 public function testGetLayoutPath()
 {
     $render = new CM_Frontend_Render();
     $this->assertSame('layout/default/resource/img/favicon.svg', $render->getLayoutPath('resource/img/favicon.svg'));
 }