• Symfony2框架实战教程——第五天:KnpMenuBundle创建菜单项+结合Twitter Boostrap3


    做界面最好从交互比较多的页面入手,目前交互元素比较丰富的,有新闻列表页和新闻显示页。

    为了开发快速,但也不会让界面太难看,我打算直接用Twitter Boostrap3了。

    如果是看过我前几期文章的同学一定能猜得到,我一定又要说:“是的,像boostrap3这种常用的前端开发框架,相应的Bundle也是有的”。没错!这次我向大家推荐MopaBootstrapBundle,里面包含了使用LESS/SASS编译Boostrap CSS,支持让Symfony2框架以及常见Bundle比如我们的用过的KnpPaginatorBundle在模板渲染阶段自动使用Bootstrap的标签形式输出。还是会给大家的开发带来一定的方便。

    当然,其他的选择也是有的,目前我们公司的项目采用的就是直接用Bower来安装项目需要的各种js/css。

    不过且慢,对于我们这种小应用来说,为了更快的开发速度,我打算采取直接引入第三方网站提供的js和css公共库镜像。最近我做一些小站都会采用这种方式,除了不用去维护这些静态文件,也能天然实现“JS/CSS应Cookie Free“这样的最佳实践。

    目前H5的页面已经非常流行了,也为了我们能快速出页面,我想直接使用HTML5应该都没意见吧。好吧,说到这里……我又有要推荐的:HTML5 boilerplate。Boilerplate就是样板文件的意思,不是直接用,而是给大家做参考用的。那么我们就把它复制到我们的模板中。

    可能大家已经注意到了,在app/Resources/views目录里面有一个base.html.twig。目前我们接触过的模板文件,开头第一句都是

    大家都知道子类继承父类,都需要extends一下,这里是一个意思。

    这里有些同学可能又注意到,有的模板文件在base.html.twig之前,会有两个冒号::,出现这种情况的模板文件应该都是使用DoctrineBundle的代码生成工具生成的。冒号在指定模板路径的时候,是有特殊含义的,这里我们先不用管它,因为Symfony2.6已经推荐忽略这两个冒号的写法。

    好的,现在我们将HTML5 Boilerplate项目里src目录下的index.html里的代码拷贝到app/Resources/views/base.html.twig,并做一些调整:

    因为教程只是为了演示目的,保持文章尽可能小的篇幅,我把一些浏览器检验,Google统计代码之类的东西,都已经删除掉了。实际项目中,你最好每行代码都过一遍。

    然后我们把boostrap3所需要的js和css加载进来,这里我们采用百度提供的公共代码库:

    注意我写的镜像路径是//开头,这样写的好处是,如果你的网站是支持HTTPS访问,那么静态文件镜像地址也是https开头,防止浏览器出现“安全链接中包含不安全链接”的提示。当然,也得确认镜像提供网站是否支持https访问。

    添加上我们的Logo,感觉首页已经有点像模像样了呢:

    接下来是添加导航栏里的菜单项:目前只有一项——新闻。我们可以按照Boostrap3的方式开始码代码,不过需要注意的是,如果当前正在新闻栏目的页面,新闻菜单还应该是选中的状态。先不要着急想如何解决这个问题,因为又有现成的Bundle实现了这个需求:KnpMenuBundle

    注册Bundle:

    创建菜单的类:

    最后在模板文件里使用KnpMenuBundle来渲染菜单:

    并在自定义css文件里添加如下样式:

    这样我们就得到了一个崭新的导航条!注意,KnpMenu已经帮我们自动处理好了当前菜单的选中状态:

    screenshot symfony2 bootstrap3 navbar

    OK,让我们点进“新闻页面”,好吧,虽然比之前好了一些,但依然还有太多改进的空间:

    另外base模板依然需要保留body block:

    刷新页面看几看效果,页码显示还是太简陋,还好KnpBundle里自带了bootstrap3风格的模板,我们来设置使用它:

    虽然依然很简单,但是不是要比以前好看多了呢?

    symfony screenshot news list

    好吧,我突然觉得前端要写的代码还真多,所以还是分成两天来说好了

    可能有的小伙伴改着改着base.html.twig的代码就乱了,这里我把最后的base模板都发上来

  • 相关阅读:
    flex space-between最后一行对齐问题的解决方案
    如何在父级下访问v-slot的值——vuejs
    flex下省略号的问题解决
    Typescript使用字符串联合类型代替枚举类型
    flex三个对齐属性的记忆方式
    JS中的slice()和splice()的区别以及记忆方式
    JS中的call,apply和bind及记忆方式
    Vue 还是 React 还是 Angular ?
    利用ES6的Promise.all实现至少请求多长时间
    .net core <environment> 不起作用
  • 原文地址:https://www.cnblogs.com/Jerry-blog/p/4919097.html
Copyright © 2020-2023  润新知