Visual Studio Community 2013语言包安装问题

最近微软免费发布了Visual Studio Community 2013版本,相当于功能完整的Visual Studio 2013,作为一名软粉赶紧下载安装,如果觉得在线安装慢,也可以下载离线安装包。安装完后默认是英文的,还需要安装简体中文语言包,语言包不太大,所以没有离线安装包,下载在线安装文件,名为“vs_langpack.exe”。

点击安装,会开始下载语言文件,请耐心等待,如果半天下载进度条都不动,又确认网没问题,可以重启下系统试试,注意windows 8下用重启,关机再开机不行,除非关闭了快速开机选项。下载安装完成并在visual studio把语言设置为简体中文(Tools->Options->Environment->Region)后,启动visual studio可能会弹出以下错误提示,如下图:

Microsoft Visual Studio 检测到已安装的语言资源版本不匹配

安装出错

这时不用着急,将下载到的语言包安装文件“vs_langpack.exe”创建一个快捷方式,然后在快捷方式上单击鼠标右键,选择属性,并在如下对话框中的“目标”一项最后面加上“ /Uninstall”(注意前面有一个空格),如下图红线所示,并点确定保存:

uninstall

双击快捷方式,会出现以下界面,点击“修复”

vs

系统开始修复语言包的安装,安装过程中还会出现上面显示的错误对话框,不用管它点确定即可。修复完成后再启动visual studio看看是不是不再报错了!

 

 

jQuery ajaxStart无效

在使用jQuery开发时,希望所有ajax请求发起时显示一个loading图标,默认情况下loading图标是隐藏的,html如下,css这里省略。

之前在javascript中我们这样写:

后来将jquery升级到2.x版本时,发现ajaxStart不起作用了,去网上查了下,从jQuery 1.9开始有一些变化:

在jQuery 1.9中,全局Ajax事件(ajaxStart, ajaxStop, ajaxSend, ajaxComplete, ajaxError, and ajaxSuccess)只在document节点上触发。

因此,原来的语句需要改成以下写法:

不过经测试,在jQuery 1.10和1.11中老的写法依然可用,可能是jQuery做了兼容,而在jQuery 2.x中,就必须使用新的写法才有效果。

Zend Framework 2检查登录跳转到登录页

在开发一些网站时,有些模块需要用户登录后方可访问,没有登录的话则跳转到登录页提示用户登录或注册。假设现在已有可判断用户是否登录的方法,那么如何在该模块的所有Controller和action中加上登录权限判断呢?

很容易想到的是所有需要登录权限判断的Controller都继承一个父Controller,在这个父Controller中添加一个方法,在未登录的情况下使用以下方式跳转。

这种方法还是比较麻烦,好在Zend Framework 2提供了很强大的事件机制,我们可以在真正进入action前就判断权限,然后做出相应的动作。

首先打开需要校验登录的模块的Module.php文件,里面有一个onBootstrap方法:

事件执行的先后顺序如下表:

事件名 对应MvcEvent中的常量 说明
bootstrap MvcEvent::EVENT_BOOTSTRAP 应用程序启动,创建ViewManager,此时session已能获取
route MvcEvent::EVENT_ROUTE 匹配路由,此时能够通过MvcEvent->getRouteMatch()获得匹配到的路由
dispatch MvcEvent::EVENT_DISPATCH 将匹配中的路由请求分发到controller和action
dispatch.error MvcEvent::EVENT_DISPATCH_ERROR 请求分发到action失败
render MvcEvent::EVENT_RENDER 准备数据渲染视图层,此时可以MvcEvent->getViewModel()来获取视图
render.error MvcEvent::EVENT_RENDER_ERROR 渲染失败
finish MvcEvent::EVENT_FINISH 整个请求任务结束

如果使用session的方式来判断是否登录,那么在onBootstrap方法中就可以做到了。这里要做的就是如果没登录,我们就要将页面跳转到登录页面,当然,如果用户本来访问的就是登录页,就不能再跳转了,以免出现死循环。这个例子中我们配置的登录页路由名称为login,对应的Controller和acion分别为Application\Controller\PassportController和loginAction,代码如下:

 

还有一种方法,可以不做页面跳转,而是直接在路由时将原来匹配上的路由修改成登录页的路由,代码如下:

这种方法有个问题在于虽然展示了登录页,但url并没有变成登录页的url(/login),而是保留了用户请求的url,这样就会对搜索引擎不够友好,爬虫爬任何url都会返回登录页,且并没有发生302跳转,搜索引擎可能会认为全是重复页面。

还有更多方法吗,希望在下方评论中留下你的意见!

Zend Framework 2多域名多模块部署

使用Zend Framework 2进行开发,有时我们想要将不同的域名指向不同的模块。比如:

  • 访问www.fynas.com指向到网站主功能Application模块;
  • 访问blog.fynas.com指向到网站博客功能Blog模块。

要实现这种需求,其实有多种办法,这里介绍两种供参考,这两种方法都先要求两个域名均指向一个ip上的同一个web server,请在域名提供商处设置好。

第一种方案:web server虚拟主机配置不同域名指向不同目录

这种情况下典型的zend framework目录结构如下:

首先我们可以看到public(因为zend framework官方工具生成的入口文件夹就叫public,所以我们此处与之保持一致便于理解)和blog两个平行的目录,且目录下的内容结构也差不多,都包含一个入口文件index.php和几个静态资源文件夹。来看一下两个目录下的index.php的区别,以下是默认的public/index.php的代码:

而blog/index.php的代码与上面只需要改一下最后一句,变成:

看到这里,我们也注意到config目录下有两个配置文件——application.config.php和blog.config.php,没错,这正是上面两个不同的index.php分别加载的配置文件。下面两段代码分别是application.config.php和blog.config.php的module配置代码:

可以看到两个的module配置加载了不同的模块。

接下来配置不同的域名指向不同的目录,以apache为例,在vhosts.conf文件中配置如下:

最后不要忘了在public和blog目录下都放置一个.htaccess文件,两边内容一样,使用zend framework官方示例的即可:

到此为止,就可以实现刚开始提出的需求了。

 

第二种方案:.htaccess将不同域名请求转发到不同入口文件

这种方案与上种方案有很多地方是类似的,这里介绍不同的地方。老规矩,先上目录结构:

从目录结构上来看,简单了一些,没有前一种方案中与public平级的blog目录了,取而代之的是在public目录下新建了一个入口文件blog.php,而blog.php的代码与方案一中blog/index.php的代码一样,这里不再重复。

webserver的配置也简单一些,所有域名请求都指向到public目录:

要.htaccess文件配置相对就复杂一些,如下:

 

好了,至此两种方法都介绍完了,当然这两种方法也不局限于不同域名配置不同模块,不同路径配置不同模块也可以参考。通过module.config.php中配置路由的方式来将不同路径指向不同的模块可能会存在view_manager相互覆盖导致多个模块无法使用多个布局的问题,详细可见《Zend Framework 2 module.config.php配置详解》。遇到问题吗?请在下方留言讨论吧!

Zend Framework 2 module.config.php配置详解

先列一下zendframework 2中一会要讲到的配置相关的典型的目录结构:

先来看ZendSkeletonApplication(Skeleton是骨架,搭架子的意思)生成的入口文件public/index.php的默认代码

直接看最后一行:

该行表明入口文件加载了我们开头列出的config/application.config.php文件,并以此文件的配置信息来启动应用。接下来我们再来看看config/application.config.php的代码,为了简化,这里删除了默认被注释掉的部分:

这段代码注意两个地方,第一是在‘module’部分添加了一个Blog模块,因为后面要分析该模块的配置文件与Application模块的关系;第二是全局配置及本机配置路径,全局配置(config/autoload/global.php)一般用来存放一些全局的配置,如新浪微博登录的appkey,本机配置(config/autoload/local.php)用来存放与本机相关的配置,如数据库的用户名,端口等信息,涉及敏感信息的请不要把该文件上传到公用的git、svn等源码库中。

接下来是要重点讲的各模块的配置文件,他们位于各module之下,一般命名为module.config.php,里面包含路由,服务管理,多语言,控制器,视图管理等部分,这里以module/Application/module.config.php为例,介绍下常用的多语言,控制器和视图管理部分,路由是用得最多的,网上也很多相关资料,这里暂不解释。

多语言很简单,locale项配置当前语言,zh_CN表明使用简体中文,translation_file_patterns项配置了语言文件所在的位置:

控制器项配置了Service至实际Controller的映射,Service在路由配置及serviceLocator->get()中使用,为了好记,一般key和value只差Controller几个字符而已。。。

最后来看视图配置,直接在代码中的注释看吧

对于view_manager的配置值得一提的有几点:

1、doctype配置后,需要在layout模板开头加上以下代码才能起作用:

2、如果几个模块的module.config.php都配置了template_map项,不同的key会merge,相同的key会相互覆盖,以最后一个加载的为准,加载的顺序与config/application.config.php中“modules”的配置一致。比如这个例子中,module/Blog/config/module.config.php中的template_map如果也配置如下值:

那么Application与Blog模块的布局就都会变成由Blog模块下的布局文件决定。这一点对于新手可能不好理解,我猜想官方这样做,意思是application.config.php对应一个子系统,该文件加载的module是该子系统的模块,一个子系统所对应的布局模板应该是一致的。如果需要实现不同子系统,可以用另一种方式来实现,可参考《Zend Framework 2多域名多模块部署》

3、template_path_stack项配置了模板路径库,在Controller中View->setTemplate($path)调用时,$path将会在该配置下的所有路径下寻找,直到找到为止,都找不到就会报错。不同模块的该配置值会merge,先加载的模块的路径会在前面。

好了,一些常用的配置就说到这了,有什么可以讨论的请在下方留言吧~