‘ 2.* ’ 目录归档
Zend framework 2 多语言配置
Zend Framework 2 默认支持国际化I18n,直接在Zend Studio里建的工程,也是默认就开启了多语言配置,只需要更改 ‘locale’ => ‘en_US’ 就可以修改网站显示language目录下面的.mo里的语言。但是没有找到语言切换相关的配置,比如根据浏览器的语言自动切换语言显示,或者根据用户指定的语言显示…
配置 module.config.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
//此处省略N行代码 'service_manager' => array( 'allow_override' => true, 'factories' => array( 'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory' ), 'aliases' => array( 'translator' => 'MvcTranslator' ) ), 'translator' => array( 'locale' => 'en_US', 'translation_file_patterns' => array( array( 'type' => 'gettext', 'base_dir' => __DIR__ . '/../language', 'pattern' => '%s.mo' ) ), // 由于一种语言,有多种表现形式,日语可以是ja,ja-jp,简单中文zh,zh-CN,这里归纳一下 // abbr,与框架Library同级resource下语言目录名称,看起来像缩写 // include,语言包含的形式 // 此处我的网站使用三种语言:zh_CN, en_US, zh_TW,有更多语言往后面加 'correspond' => array( 'zh_CN' => array( 'abbr' => 'zh', 'include' => array( 'zh', 'zh-CN' ) ), 'en_US' => array( 'abbr' => 'en', 'include' => array( 'en', 'en-US' ) ), 'zh_TW' => array( 'abbr' => 'zh_TW', 'include' => array( 'zh-TW' ) ) ) ), //此处省略N行代码 |
语言初始化在框架加载的时就可以做了,所以可以直接在 Module.php bootstrap里写。这里有一个优先级的问题[……]
DBShop使用Gzip方式压缩页面
在模块中的module.php文件中加如下代码
1 2 3 4 5 6 7 |
public function onBootstrap($e) { //页面压缩性能设置 if(defined('DBSHOP_ADMIN_COMPRESS') and defined('DBSHOP_FRONT_COMPRESS') and (DBSHOP_ADMIN_COMPRESS == 'true' or DBSHOP_FRONT_COMPRESS == 'true')) { $app->getEventManager()->attach("finish", array($this, "compressOutput"), 100); } } |
然后在该文件中加入compressOutput方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public function compressOutput($e) { $matches = $e->getRouteMatch(); if(!$matches) return; $controller = $matches->getParam('controller'); //前台压缩处理开启 if(DBSHOP_ADMIN_COMPRESS == 'false' and DBSHOP_FRONT_COMPRESS == 'true') { if (false === strpos($controller, __NAMESPACE__)) return; } //后台压缩处理开启 if(DBSHOP_ADMIN_COMPRESS == 'true' and DBSHOP_FRONT_COMPRESS == 'false') { if (false !== strpos($controller, __NAMESPACE__)) return; } $response = $e->getResponse(); $content = $response->getBody(); if(@strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) { header('Content-Encoding: gzip'); $content = gzencode($content, 9); } $response->setContent($content); } |
这是DBShop程序的处理方式,没有写的多么的复杂,简单易懂就可以了。
ZF2的配置信息缓存设置
我们是这样处理的,在config/application.config.php 中加入如下代码
1 2 3 4 5 6 7 8 9 10 11 12 |
return array( 'module_listener_options' => array( 'config_glob_paths' => array('config/autoload/{*}.php'), 'module_paths' => array('./module', './vendor'), /*系统配置信息缓存设置*/ 'config_cache_enabled' => true, 'config_cache_key' => md5('config'.__FILE__), 'module_map_cache_enabled' => true, 'module_map_cache_key' => md5('module_map'.__FILE__), 'cache_dir' => "./data/cache/modulecache", ) ); |
其中注释下面的是添加内容,因为我这个文件把其他内容都提出去了,所以只放了这点内容,根据你的情况加入相关内容即可。需要注意的是
./data/cache/modulecache 这个目录必须存在,如果不存在请手动创建。
另外
1 |
'config_cache_key' => md5('config'.__FILE__), |
1 |
'module_map_cache_key' => md5('module_map'.__FILE__), |
这两句中,后面之所以使用名称+__FILE__方式来计算MD[……]
拥有多个layout情况下,禁止输出它的处理方式
当项目中存在有多个layout情况下的时候(这种情况蛮多的,前台后台这就是两个了)。
我们假设后台使用的是默认layout,那么前台我是这样处理的,写在module.php文件中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public function onBootstrap($e) { $app = $e->getParam('application'); $app->getEventManager()->attach('dispatch', array($this, 'setLayout')); } public function setLayout($e) { $matches = $e->getRouteMatch(); $controller = $matches->getParam('controller'); if (false === strpos($controller, __NAMESPACE__)) { return; } $viewModel = $e->getViewModel(); $viewModel->setTemplate('site/layout'); } |
这样是可以使用当前设置的layout了,假如我在这个模块的下面的页面显示中想通过ajax调用其中的一个Action显示,只显示对应的模板内容,而不显示layout,我们该如何做呢。
可能你会说,使用如下代码
1 2 3 4 5 6 |
$viewModel = new ViewModel(); $viewModel->setTerminal(true); $array = array(); ………… return $viewModel->setVariables($array); |
这在系统中只有一个默认layout下是没问题的,当时超过一个[……]
ZendFromework 2 在 IIS 上设置重写
请参考下面链接内容里的设置方式进行设置,不用设置MS SQL ,看设置 URL Rewrite 即可
http://akrabat.com/winphp-challenge/zend-framework-url-rewriting-in-iis7/
DBShop 系统是基于ZF2写的,所以上面的也适用于DBShop在IIS下的重写。
ZendFramework 2 使用技巧
1、指定使用模板文件
在Controller文件中,有时我们需要指定使用某个模板这个时候就需要下面的设置了
1 2 3 4 5 6 7 8 |
$view = new ViewModel(); $view->setTemplate('/xxxx/xxx.phtml'); $array = array(); ………… $view->setVariables($array); |
2、接收POST或GET的FROM内容
1 2 3 4 5 6 7 |
$this->request->getPost()->toArray(); //以数组形式接收POST过来的内容 $this->request->getPost('timestamp');//接收单独POST过来的值 $this->request->getQuery()->toArray(); //以数组形式接收GET过来的内容 $this->request->getQuery('timestamp');//接收单独GET过来的值 |
3、controller中获取网站url
1 |
$this->getRequest()->getServer('HTTP_HOST').$this->url()->fromRoute('frontorder/default/order_page', array('action'=>'index')); |
如果获取相对路径
1 |
$this->url()->fromRoute('frontorder/default/order_page', array('action'=>'index')); |
4、在模板中获取网站url
1 |
$this->serverUrl(); |
如果包含[……]
How to use Imagick with zf2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
public function uploadAction() { $request = $this->getRequest(); if ($request->isPost()) { $adapter = new \Zend\File\Transfer\Adapter\Http(); $adapter->addValidator('Size', false, array('min' => UPLOAD_IMAGE_MIN_SIZE, 'max' => UPLOAD_IMAGE_MAX_SIZE)); $adapter->addValidator('MimeType', true, array('image/jpeg')); $adapter->addValidator('Count', false, array('min' =>1, 'max' => 1)); $adapter->addValidator('IsImage', false, 'jpeg'); $adapter->setDestination(UPLOAD_IMAGE_PATH . '/' . IMAGE_PATH_DEFAULT); foreach($adapter->getFileInfo() as $file => $info) { if ($adapter->isValid($file)) { $name = $adapter->getFileName($file); $fileName = CUSTOMER_ID . '_' . time() . '_' . $info['name']; $imageDefault = UPLOAD_IMAGE_PATH . '/' . IMAGE_PATH_DEFAULT . '/' . $fileName; $imageMedium = UPLOAD_IMAGE_PATH . '/' . IMAGE_PATH_MEDIUM . '/' . $fileName; $imageSmall = UPLOAD_IMAGE_PATH . '/' . IMAGE_PATH_SMALL . '/' . $fileName; $adapter->addFilter( new \Zend\Filter\File\Rename(array('target' => $imageDefault, 'overwrite' => true)), null, $file ); if ($adapter->receive($file)) { $image = new \Imagick(); /** * process with medium */ $image->readImage($imageDefault); $imageprops = $image->getImageGeometry(); if ($imageprops['width'] <= UPLOAD_SIZE_MEDIUM_WIDTH && $imageprops['height'] <= UPLOAD_SIZE_MEDIUM_HEIGHT) { $image->writeImage($imageMedium); } else { $image->resizeImage(UPLOAD_SIZE_MEDIUM_WIDTH, UPLOAD_SIZE_MEDIUM_HEIGHT, $image::FILTER_LANCZOS, 0.9, true); $image->writeImage($imageMedium); } /** * process with small */ $image->readImage($imageDefault); $imageprops = $image->getImageGeometry(); if ($imageprops['width'] <= UPLOAD_SIZE_SMALL_WIDTH && $imageprops['height'] <= UPLOAD_SIZE_SMALL_HEIGHT) { $image->writeImage($imageSmall); } else { $image->resizeImage(UPLOAD_SIZE_SMALL_WIDTH, UPLOAD_SIZE_SMALL_HEIGHT, $image::FILTER_LANCZOS, 0.9, true); $image->writeImage($imageSmall); } } } } } die; } |