前面四章我们简单地介绍了如何用laravel4.2构建一个基本博客的服务端代码,包括了数据库配置、控制器配置、路由配置和模型设计,这些都是该博客的后端部分,也是整个博客得以架构起来的基础,体现了整个博客运行、路由、运算的所有逻辑,在这些逻辑之上,展现出我们要展现给用户的界面和功能。
接下来,我们简要介绍一下页面的设计。我们一开始设立的目标很简单,用户可以po图片在博客上,博客分为标题、图片、描述、以及它的所有评论,删除图片时会把该图片对应的所有信息都依次删除。但是所有的页面数量并不少,而且这部分代码算是最多了,基本都是时间活儿,慢慢修改和调整。
先介绍一下home页面,主页面:
主页面生成的逻辑:
在BaseController.php中,有一句
protected $layout = 'master';然后所有的Controller类都继承自这个控制器基类,这表明我们所有的控制器的主页面都是由master.blade.php指定的,路由到任意一个控制器时,都会把这个master界面作为主界面
1#......master.blade.php
<!DOCTYPE html> <html class="no-js" lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> @section('title') <title>{{{$title}}}</title> <!-- using {{$title}} is bad here eg:</title><script>alert('hello')</script> --> @show {{ HTML::style('assets/css/foundation.css') }} {{ HTML::style('assets/css/custom.css') }} </head> <body> <div class="row main"> <div class="small-12 large-12 column" id="masthead"> <header> <nav class="top-bar" data-topbar> <ul class="title-area"> <!-- Title Area --> <li class="name"></li> <!-- Remove the class "menu-icon" to get rid of menu icon. Take out "Menu" to just have icon alone --> <li class="toggle-topbar menu-icon"><a href="#"><span>Menu</span></a></li> </ul> <section class="top-bar-section"> <ul class="left"> <li class="{{(strcmp(URL::full(), URL::to('/')) == 0) ? 'active' : ''}}"><a href="{{URL::to('/')}}">Home</a></li> </ul> <ul class="right"> @if(Auth::check()) <li class="{{ (strpos(URL::current(), URL::to('admin/dash-board'))!== false) ? 'active' : '' }}"> {{HTML::link('admin/dash-board','Dashboard')}} </li> <li class="{{ (strpos(URL::current(), URL::to('logout'))!== false) ? 'active' : '' }}" > {{HTML::link('logout','Logout')}} </li> @else <li class="{{ (strpos(URL::current(), URL::to('login'))!== false) ? 'active' : '' }}"> {{HTML::link('login','Login')}} </li> @endif </ul> </section> </nav> <div class="sub-header"> <hgroup> <h1>{{HTML::link('/','Picture Blog')}}</h1> <h2>A simple blog about a set of pictures with description and comments to them.</h2> <h2>using Laravel 4.2</h2> </hgroup> </div> </header> </div> <div class="row"> <span style="white-space:pre"> </span><div class="small-12 large-12 column"> <span style="white-space:pre"> </span>{{$main}} </div> </div> <div class="row"> <div class="small-12 large-12 column"> <footer class="site-footer"></footer> </div> </div> </div> {{ HTML::script('./assets/js/vendor/jquery.js') }} {{ HTML::script('./assets/js/foundation.min.js') }} <script> $(document).foundation(); </script> {{ HTML::script('./assets/js/vendor/custom.modernizr.js') }} </body> </html>
基本上,在master这个view里,我们定义了title($title由页面生成时代码指定),topbar,sub-header,footer,算是主页的全部修饰,之后所有页面,都会带上这些修饰。倘若我们需要在某个页面中不使用这个模板来修饰,也可以在相关的控制器中重新指定$layout来修改默认布局。
具体每一个html类怎么定义它们的属性,都写在几个css文件中,这些都可以自行设计,或者参考我之后放出的代码。
有读者会发现效果和我第一章放出的参考链接uncletoo 很像,因为是学习阶段,页面设计这块我基本都参考了源码,但为了更好地对页面设计有个了解,我对每一个模块都作了自己的修改,至少能知道怎么看代码,怎么修改,以及套上一些自己的想法。
蓝色的部分,以及topbar都是master中定义的模板,那中间的部分又是什么呢?
其实我们进入首页链接的时候,就已经放出一个路由'/',在routes.php中有初始路由的定向:
Route::controller('/', 'BlogController');
由于初始路由之后没有其他信息了,它默认调用index,即BlogController的getIndex()方法
public function getIndex() { $pictures = Picture::orderBy('id', 'desc')->paginate(10); $pictures->getFactory()->setViewName('pagination::simple'); $this->layout->title = 'Home Page | Picture Wall Blog'; $this->layout->main = View::make('home')->nest('content', 'index', compact('pictures')); }首先它定义了一个分页机制,每一页10张图片的信息
它赋值了title的值(详见master.blade.php中的header部分{{{$title}}}),$this->layout->main代表master模板中的
<div class="row"> {{$main}} </div>它被一个新生成的view替代:home:
2#......home.blade.php:
{{-- home page --}} <div class="small-8 large-8 column"> <div class="content"> {{$content}} </div> </div> <div class="small-4 large-4 column"> <aside class="sidebar"> @include('sidebar') </aside> </div>nest函数代表了将其中的$content部分替代为index。compach是一个php函数,用来把变量和它的值构成一个数组,表示index需要使用的数据集pictures:
3#......index.blade.php:
对每一个图片,我们都显示一个块来显示它们
@if(!empty($notFound)) <p>Sorry nothing found for your query!</p> @else @foreach($pictures as $picture) <article class="picture"> <header class="picture-header"> <h1 class="picture-title"> {{link_to_route('picture.show',$picture->title,$picture->id)}} </h1> <div class="clearfix"> <span class="left date">{{explode(' ',$picture->created_at)[0]}}</span> <span class="right label">{{$picture->comment_count}} comments </span> </div> </header> <div> {{HTML::image($picture['image'],$picture['image'])}} </div> <div class="picture-description"> <p>{{$picture->description}}</p> </div> <footer class="picture-footer"> <hr> </footer> </article> @endforeach {{$pictures->links()}} @endif
好了,博客的实现就全部介绍到这里,感谢uncletoo博客教程,让我学到了很多,实现好每一个模块之后我会放出源码!
源码下载地址