/** * @param CM_Model_User|string|null $recipient * @param array|null $tplParams * @param CM_Site_Abstract|null $site * @throws CM_Exception_Invalid */ public function __construct($recipient = null, array $tplParams = null, CM_Site_Abstract $site = null) { if ($this->hasTemplate()) { $this->setRenderLayout(true); } if ($tplParams) { foreach ($tplParams as $key => $value) { $this->setTplParam($key, $value); } } if (!is_null($recipient)) { if (is_string($recipient)) { $this->addTo($recipient); } elseif ($recipient instanceof CM_Model_User) { $this->_recipient = $recipient; $this->addTo($this->_recipient->getEmail()); $this->setTplParam('recipient', $recipient); } else { throw new CM_Exception_Invalid('Invalid Recipient defined.'); } } if (!$site && $this->_recipient) { $site = $this->_recipient->getSite(); } if (!$site) { $site = CM_Site_Abstract::factory(); } $this->_site = $site; $this->setTplParam('siteName', $this->_site->getName()); $this->setSender($this->_site->getEmailAddress(), $this->_site->getName()); }
/** * @param string $pattern * @param CM_Site_Abstract $site * @return string[] */ public static function rglobLibraries($pattern, CM_Site_Abstract $site) { $paths = array(); foreach ($site->getModules() as $moduleName) { $libraryPath = CM_Util::getModulePath($moduleName) . 'library/' . $moduleName . '/'; $paths = array_merge($paths, CM_Util::rglob($pattern, $libraryPath)); } return $paths; }
/** * @param CM_Site_Abstract $site * @return string * @throws CM_Exception_Invalid */ private function _getAppClassName(CM_Site_Abstract $site) { foreach ($site->getModules() as $moduleName) { $file = new CM_File(DIR_ROOT . CM_Bootloader::getInstance()->getModulePath($moduleName) . 'library/' . $moduleName . '/App.js'); if ($file->exists()) { return $moduleName . '_App'; } } throw new CM_Exception_Invalid('No App class found'); }
public function __construct(CM_Site_Abstract $site) { $content = ''; foreach (array_reverse($site->getModules()) as $moduleName) { $libraryPath = DIR_ROOT . CM_Bootloader::getInstance()->getModulePath($moduleName) . 'client-vendor/after-body/'; foreach (CM_Util::rglob('*.js', $libraryPath) as $path) { $content .= (new CM_File($path))->read() . ';' . PHP_EOL; } } $this->_content = $content; }
protected function _getEmoticonImg($emoticonCode, $height = null) { $emoticon = CM_Emoticon::findByCode($emoticonCode); if (!$emoticon) { throw new CM_Exception_Invalid('Cannot find emoticon for code `' . $emoticonCode . '`.'); } $urlCdn = $this->_mockSite->getUrlCdn(); $siteType = $this->_mockSite->getId(); $deployVersion = CM_App::getInstance()->getDeployVersion(); $heightAttribute = $height ? ' height="' . $height . '"' : ''; return '<img src="' . $urlCdn . '/layout/' . $siteType . '/' . $deployVersion . '/img/emoticon/' . $emoticon->getFileName() . '" class="emoticon emoticon-' . $emoticon->getName() . '" title="' . $emoticon->getDefaultCode() . '"' . $heightAttribute . ' />'; }
/** * @param CM_Site_Abstract $site * @param string $zoneName * @return mixed * @throws CM_Exception_Invalid */ protected function _getZone(CM_Site_Abstract $site, $zoneName) { $cacheKey = CM_CacheConst::AdproviderZones . '_siteId:' . $site->getId(); $cache = CM_Cache_Local::getInstance(); if (false === ($zones = $cache->get($cacheKey))) { $zones = CM_Config::get()->CM_Adprovider->zones; if (isset($site->getConfig()->CM_Adprovider->zones)) { $zones = array_merge($zones, $site->getConfig()->CM_Adprovider->zones); } $cache->set($cacheKey, $zones); } if (!array_key_exists($zoneName, $zones)) { throw new CM_Exception_Invalid('Zone `' . $zoneName . '` not configured.'); } return $zones[$zoneName]; }
/** * @param CM_Site_Abstract $site * @param string $zoneName * @return array * @throws CM_Exception_Invalid */ protected function _getZoneData(CM_Site_Abstract $site, $zoneName) { $cacheKey = CM_CacheConst::AdproviderZones . '_siteId:' . $site->getId(); $cache = CM_Cache_Local::getInstance(); if (false === ($zones = $cache->get($cacheKey))) { $zones = CM_Config::get()->CM_Adprovider->zones; if (isset($site->getConfig()->CM_Adprovider->zones)) { $zones = array_merge($zones, $site->getConfig()->CM_Adprovider->zones); } $cache->set($cacheKey, $zones); } if (!array_key_exists($zoneName, $zones)) { return null; } return $zones[$zoneName]; }
public function __construct(CM_Http_Request_Abstract $request, CM_Service_Manager $serviceManager) { $this->_request = clone $request; $this->_site = CM_Site_Abstract::findByRequest($this->_request); $this->_request->popPathLanguage(); $this->setServiceManager($serviceManager); }
public function testTrackPageView() { $viewer = CMTest_TH::createUser(); $environment = new CM_Frontend_Environment(CM_Site_Abstract::factory(), $viewer); $client = new CMService_AdWords_Client(); $pushConversion = new ReflectionMethod($client, '_pushConversion'); $pushConversion->setAccessible(true); $pushConversion->invoke($client, $viewer, CMService_AdWords_Conversion::fromJson('{"google_conversion_id":123456,"google_conversion_language":"en","google_conversion_format":"1","google_conversion_color":"666666","google_conversion_label":"label","google_remarketing_only":true,"google_conversion_value":123,"google_conversion_currency":"USD","google_custom_params":{"a":1,"b":2}}')); $pushConversion->invoke($client, $viewer, CMService_AdWords_Conversion::fromJson('{"google_conversion_id":789}')); $this->assertSame('', $client->getJs()); $this->assertSame(<<<EOD <script type="text/javascript" src="//www.googleadservices.com/pagead/conversion_async.js" charset="utf-8"></script> EOD , $client->getHtml($environment)); $client->trackPageView($environment, '/'); $this->assertSame(<<<EOD window.google_trackConversion({"google_conversion_id":123456,"google_conversion_language":"en","google_conversion_format":"1","google_conversion_color":"666666","google_conversion_label":"label","google_remarketing_only":true,"google_conversion_value":123,"google_conversion_currency":"USD","google_custom_params":{"a":1,"b":2}});window.google_trackConversion({"google_conversion_id":789}); EOD , $client->getJs()); $this->assertSame(<<<EOD <script type="text/javascript" src="//www.googleadservices.com/pagead/conversion_async.js" charset="utf-8"></script><script type="text/javascript"> /* <![CDATA[ */ window.google_trackConversion({"google_conversion_id":123456,"google_conversion_language":"en","google_conversion_format":"1","google_conversion_color":"666666","google_conversion_label":"label","google_remarketing_only":true,"google_conversion_value":123,"google_conversion_currency":"USD","google_custom_params":{"a":1,"b":2}});window.google_trackConversion({"google_conversion_id":789}); //]]> </script> EOD , $client->getHtml($environment)); }
public function fillCaches() { /** @var CM_Asset_Javascript_Abstract[] $assetList */ $assetList = array(); $debug = CM_Bootloader::getInstance()->isDebug(); $siteList = CM_Site_Abstract::getAll(); $languageList = new CM_Paging_Language_Enabled(); foreach ($siteList as $site) { $render = new CM_Frontend_Render(new CM_Frontend_Environment($site)); $assetList[] = new CM_Asset_Javascript_Internal($site, $debug); $assetList[] = new CM_Asset_Javascript_Library($site, $debug); $assetList[] = new CM_Asset_Javascript_Vendor_BeforeBody($site, $debug); $assetList[] = new CM_Asset_Javascript_Vendor_AfterBody($site, $debug); $assetList[] = new CM_Asset_Css_Vendor($render, $debug); $assetList[] = new CM_Asset_Css_Library($render, $debug); /** @var CM_Model_Language $language */ foreach ($languageList as $language) { $assetList[] = new CM_Asset_Javascript_Translations($site, $debug, $language); } } /** @var CM_Model_Language $language */ foreach ($languageList as $language) { $language->getTranslations()->getItemsRaw(); $language->getTranslations(true)->getItemsRaw(); } foreach ($assetList as $asset) { $asset->get(); } CM_Bootloader::getInstance()->getModules(); }
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()); }
/** * @return CM_Site_Abstract */ public function getSite() { $site = $this->_site; if (null === $site) { $site = CM_Site_Abstract::factory(); } return $site; }
public function testProcessingInvalidMethod() { $body = CM_Params::jsonEncode(['method' => 'foo']); $request = new CM_Http_Request_Post('/rpc/' . CM_Site_Abstract::factory()->getType(), null, null, $body); $response = new CM_Http_Response_RPC($request, $this->getServiceManager()); $response->process(); $responseData = CM_Params::jsonDecode($response->getContent()); $this->assertSame(['error' => ['type' => 'CM_Exception_InvalidParam', 'msg' => 'Internal server error', 'isPublic' => false]], $responseData); }
public function testFactory() { try { CM_Site_Abstract::factory(9999); $this->fail('Factory returned non-configured site'); } catch (CM_Class_Exception_TypeNotConfiguredException $ex) { $this->assertContains('Site with type `9999` not configured', $ex->getMessage()); } }
public function testFactory() { try { CM_Site_Abstract::factory(9999); $this->fail('Factory returned non-configured site'); } catch (CM_Class_Exception_TypeNotConfiguredException $ex) { $this->assertSame('Site with given type is not configured', $ex->getMessage()); $this->assertSame(['siteType' => 9999], $ex->getMetaInfo()); } }
public function testProcessHostRedirect() { $site = CM_Site_Abstract::factory(); $response = CMTest_TH::createResponsePageEmbed('/mock7', array('host' => $site->getHost())); $response->process(); $this->assertNull($response->getRedirectUrl()); $response = CMTest_TH::createResponsePageEmbed('/mock7', array('host' => 'incorrect-host.org')); $response->process(); $this->assertSame($site->getUrl() . '/mock7', $response->getRedirectUrl()); }
public function testProcessHostRedirect_parameter() { $site = CM_Site_Abstract::factory(); $location = CMTest_TH::createLocation(); $locationEncoded = CM_Params::encode($location, true); $query = http_build_query(['location' => $locationEncoded]); $response = CMTest_TH::createResponsePage('/mock5?' . $query, array('host' => 'incorrect-host.org')); $response->process(); $siteUrl = 'http://' . $site->getHost(); $this->assertContains('Location: ' . $siteUrl . '/mock5?' . $query, $response->getHeaders()); }
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()); }
public function testSetNull() { $environment = new CM_Frontend_Environment(); $this->assertEquals(CM_Site_Abstract::factory(), $environment->getSite()); $this->assertNull($environment->getViewer()); $this->assertNull($environment->getLanguage()); $this->assertSame('en', $environment->getLocale()); $this->assertEquals(CM_Bootloader::getInstance()->getTimeZone(), $environment->getTimeZone()); $this->assertSame(CM_Bootloader::getInstance()->isDebug(), $environment->isDebug()); $this->assertNull($environment->getLocation()); }
public function testProcessMissingParameter() { $site = CM_Site_Abstract::factory(); $request = new CM_Http_Request_Get('/emailtracking', ['host' => $site->getHost()]); $response = CM_Http_Response_EmailTracking::createFromRequest($request, $site, $this->getServiceManager()); try { $response->process(); $this->fail('Expected exception not thrown'); } catch (CM_Exception_InvalidParam $e) { $this->assertSame(CM_Exception::WARN, $e->getSeverity()); } }
public function testLoadPageRedirectLanguage() { $site = CM_Site_Abstract::factory(); CMTest_TH::createLanguage('en'); $viewer = CMTest_TH::createUser(); $environment = new CM_Frontend_Environment(null, $viewer); $component = new CM_Page_View_Ajax_Test_Mock(); $response = $this->getResponseAjax($component, 'loadPage', ['path' => '/en' . CM_Page_View_Ajax_Test_Mock::getPath()], $environment); $this->assertViewResponseSuccess($response); $responseDecoded = CM_Params::jsonDecode($response->getContent()); $this->assertSame($site->getUrl() . CM_Page_View_Ajax_Test_Mock::getPath(), $responseDecoded['success']['data']['url']); }
public function testSetSite() { $siteDefault = CM_Site_Abstract::factory(); $user = CMTest_TH::createUser(); $this->assertEquals($siteDefault, $user->getSite()); $type = $siteDefault->getType() + 1; $site = $this->getMockBuilder('CM_Site_Abstract')->setMethods(array('getType'))->getMock(); $site->expects($this->any())->method('getType')->will($this->returnValue($type)); CM_Config::get()->CM_Site_Abstract->types[$type] = get_class($site); $user->setSite($site); $this->assertEquals($site, $user->getSite()); }
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 string[] $sourceMainPaths * @param bool $generateSourceMaps * @throws CM_Exception */ protected function _appendSourceMainBrowserify($sourceMainPaths, $generateSourceMaps) { if ($generateSourceMaps && !$this->_js->isEmpty()) { throw new CM_Exception('Cannot generate source maps when output container already contains code.'); } $sourcePaths = []; foreach (array_reverse($this->_site->getModules()) as $moduleName) { $sourcePaths[] = $this->_getPathInModule($moduleName, 'client-vendor/source'); } $content = $this->_browserify($sourceMainPaths, $sourcePaths, $generateSourceMaps); $this->_js->append($content); }
public function testSetNull() { $defaultCurrency = CM_Model_Currency::create('840', 'USD'); $environment = new CM_Frontend_Environment(); $this->assertEquals(CM_Site_Abstract::factory(), $environment->getSite()); $this->assertNull($environment->getViewer()); $this->assertNull($environment->getLanguage()); $this->assertSame('en', $environment->getLocale()); $this->assertEquals(CM_Bootloader::getInstance()->getTimeZone(), $environment->getTimeZone()); $this->assertSame(CM_Bootloader::getInstance()->isDebug(), $environment->isDebug()); $this->assertNull($environment->getLocation()); $this->assertEquals($defaultCurrency, $environment->getCurrency()); $this->assertNull($environment->getClientDevice()); }
public function testNonexistentAjaxMethodException() { /** @var CM_View_Abstract|PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMockForAbstractClass('CM_View_Abstract'); $site = CM_Site_Abstract::factory(); $request = $this->createRequestAjax($view, 'someReallyBadMethod', ['params' => 'foo']); $response = CM_Http_Response_View_Ajax::createFromRequest($request, $site, $this->getServiceManager()); $exception = $this->catchException(function () use($response) { $response->process(); }); $this->assertInstanceOf('CM_Exception_Invalid', $exception); /** @var CM_Exception_Invalid $exception */ $this->assertSame('Method not found', $exception->getMessage()); $this->assertSame(['method' => 'ajax_someReallyBadMethod'], $exception->getMetaInfo()); }
/** * @param CM_Site_Abstract[]|null $siteList */ public function __construct(array $siteList = null) { if (null === $siteList) { $siteList = CM_Site_Abstract::getAll(); } usort($siteList, function (CM_Site_Abstract $site1, CM_Site_Abstract $site2) { $length1 = mb_strlen($site1->getUrl()); $length2 = mb_strlen($site2->getUrl()); if ($length1 == $length2) { return 0; } return $length1 > $length2 ? -1 : 1; }); $this->_siteList = $siteList; }
public function testProcessEmoticon() { $deployVersion = CM_App::getInstance()->getDeployVersion(); $siteType = CM_Site_Abstract::factory()->getType(); $usertext = new CM_Usertext_Usertext(new CM_Frontend_Render()); $expectedValuePlain = "<img src=\"http://cdn.default.dev/layout/" . $siteType . "/" . $deployVersion . "/img/emoticon/cold_sweat.png\" class=\"emoticon emoticon-cold_sweat\" title=\":cold_sweat:\" />"; $expectedValueMarkdown = "<p><img src=\"http://cdn.default.dev/layout/" . $siteType . "/" . $deployVersion . "/img/emoticon/cold_sweat.png\" class=\"emoticon emoticon-cold_sweat\" title=\":cold_sweat:\" /></p>"; $usertext->setMode('escape'); $this->assertSame('<3', $usertext->transform('<3')); $usertext->setMode('oneline'); $this->assertSame($expectedValuePlain, $usertext->transform(':-\\\\')); $usertext->setMode('simple'); $this->assertSame($expectedValuePlain, $usertext->transform(':-\\\\')); $usertext->setMode('markdown'); $this->assertSame($expectedValueMarkdown, $usertext->transform(':-\\\\')); $usertext->setMode('markdownPlain'); $this->assertContains($expectedValuePlain, $usertext->transform(':-\\\\')); }
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()); } } } }
public function fillCaches() { /** @var CM_Asset_Javascript_Abstract[] $assetList */ $assetList = array(); $languageList = new CM_Paging_Language_Enabled(); foreach (CM_Site_Abstract::getAll() as $site) { $assetList[] = new CM_Asset_Javascript_Internal($site); $assetList[] = new CM_Asset_Javascript_Library($site); $assetList[] = new CM_Asset_Javascript_VendorAfterBody($site); $assetList[] = new CM_Asset_Javascript_VendorBeforeBody($site); foreach ($languageList as $language) { $render = new CM_Frontend_Render(new CM_Frontend_Environment($site, null, $language)); $assetList[] = new CM_Asset_Css_Vendor($render); $assetList[] = new CM_Asset_Css_Library($render); } } foreach ($languageList as $language) { $assetList[] = new CM_Asset_Javascript_Translations($language); } foreach ($assetList as $asset) { $asset->get(true); } CM_Bootloader::getInstance()->getModules(); }