Views
Views
Views are the visual side of the Nova, they are the HTML output of the pages. Views can be located directly inside the views folder or in a sub folder, this helps with organising your views.
Views are called from controllers once called they act as included files outputting anything inside of them. They have access to any data passed to them.
The render method is used to include a view file, the method expects the path to the view. Optionally an array can be passed.
The renderTemplate is almost the same except its use is for including templates, useful for including header and footer files for your application's design. The template defined inside the TEMPLATE constant is used by default but passing the third parameter to renderTemplate containing a string can be used to use a different template folder.
For example, calling an email template can be done like this:
View::renderTemplate('header', $data, 'email');
The template folder used is dictated by the template set in the app/Config.php file via a constant.
Using a view from a controller
A view can be set inside a method, an array can optionally be created and passed to both the render and renderTemplate methods, this is useful for setting the page title and letting a header template use it.
$data['title'] = 'Welcome';
View::renderTemplate('header', $data);
View::render('Welcome/Welcome', $data);
View::renderTemplate('footer', $data);
Inside a view
Views are normal PHP files, they can contain PHP and HTML, as such any PHP logic can be used inside a view though it's recommended to use only simple logic inside a view anything more complex is better suited inside a controller.
An example of a view; looping through an array and outputting its contents:
<p>Contacts List</p>
<?php
if ($contacts) {
foreach ($contacts as $row) {
echo $row.'<br />';
}
}
?>
To return a view and store its contents use View::fetch, fetch takes 3 params:
- The view path relative to the view folder or module
- The data being passed
- Optional when loading a view from a module pass in the module name.
$content = View::fetch('Page/Show', $data, 'Pages');
echo $content;
OR
$data['content'] = View::fetch('Welcome/SubPage', $data);
View::renderTemplate('default', $data);
a new method, called 'after', which is automatically executed when the current Action return a value different of null or boolean.
This post processing ability can be very useful in the RESTful Controllers, for example doing:
public function index()
{
$data = array(
'success' = true;
...
);
return $data;
}
public function show($id)
{
$data = array(
'success' = true;
...
);
return $data;
}
public function after($data)
{
header('Content-Type: application/json');
echo json_encode($data);
}
Also, this post-processing can be very useful when it is used a Layout style rendering, to not write again and again the same snippets; as in example:
public function index()
{
$data['title'] = $this->trans('welcomeText');
$data['welcomeMessage'] = $this->trans('welcomeMessage');
// Render the View and fetch the output in a data variable.
$data['content'] = View::fetch('Welcome/Welcome', $data);
return $data;
}
public function subPage()
{
$data['title'] = $this->trans('subpageText');
$data['welcomeMessage'] = $this->trans('subpageMessage');
// Render the View and fetch the output in a data variable.
$data['content'] = View::fetch('Welcome/SubPage', $data);
return $data;
}
public function after($data)
{
View::renderTemplate('default', $data);
}
The returned value of the current Action is passed to post-processing method as a parameter.
Alternative View/Layout options:
Basic Commands
While the actual Core\View methods are static and they should call independently, the new API works with View instances, then we should build them. We have two methods of disposition, for standard Views and Templated one. A combined usage example is presented below:
return View::make('Welcome/SubPage')
->shares('title', $title)
->with('data', $data);
// OR
$page = View::make('Welcome/SubPage')->with('data', $data);
return View::makeTemplate('default')
->shares('title', $title)
->withContent($page);
View Methods can be chained. shares is a way to share a variable that is accessible to the view files, useful for settings the page title. to pass date ->with() command is used. With accepts 2 params:
- the variable name to set
- the value
Another way to set the variable is to add the name to end of ->with for example to pass a variable called contacts:
->withContacts($data)
The data can be passed to a View instance in diverse ways. The following commands are equivalent:
$page = View::make('Welcome/SubPage');
$page->with('info', $info);
$page->withInfo($info);
$page->info = $info;
$page['info'] = $info;
To note the variable name transformation by dynamic withX methods.
Also, the View instances can be nested. The following commands are equivalent:
// Add a View instance to a View's data
$view = View::make('foo')->nest('footer', 'Partials/Footer');
// Equivalent functionality using the "with" method
$view = View::make('foo')->with('footer', View::make('Partials/Footer'));
To note that nesting assumes that the nested View instance is a Standard View, not a Template one.
There is also a new shares() method, similar with actual share() but working for instances.
As rendering commands, we have:
fetch() : will render the View and return the output
render() : will render and output the View and display the output
- display() : same as display() but will send also the Headers.
Every Controller has now the ability to specify its Template and Layout, as following:
class Welcome extends Controller
{
protected $template = 'Admin';
protected $layout = 'custom';
/**
* Call the parent construct
*/
public function __construct()
{
parent::__construct();
$this->language->load('Welcome');
}
...
}
WHERE the 'default' Layout is a simple composition of your header/footer files. For details, see:app/Templates/Default/default.php
Advanced Usage
Rendering with partials (i.e. header/footer) from the standard Views location If you need to work with partials, for example blocks, header and footer files located in app/Views directory, it is very simple to do that. You have just to compose your views as following:
The following examples use a very simple Template Layout file, called:
app/Templates/Default/custom.php
Rendering with a complete custom Template living on Views folder
return Template::make('custom')
->shares('title', $title)
->with('header', View::make('Partials/Header'))
->with('content', View::make('Page/Index', $data))
->with('footer', View::make('Partials/Footer'));
OR
return Template::make('custom')
->shares('title', $title)
->withHeader(View::make('Partials/Header'))
->withContent(View::make('Page/Index', $data))
->withFooter(View::make('Partials/Footer'));
OR
return Template::make('custom')
->shares('title', $title)
->nest('header', 'Partials/Header')
->nest('content', 'Page/Index', $data)
->nest('footer', 'Partials/Footer');
OR
return Template::make('custom')
->shares('title', $title)
->with('content', View::make('Partials/Layout')
->nest('content', 'Page/Index', $data));
Rendering in the Style, but using the new API
return Template::make('custom')
->shares('title', $title)
->with('header', View::makeTemplate('header'))
->with('content', View::make('Page/Index', $data))
->with('footer', View::makeTemplate('footer'))
Rendering in the Style, but using some Views as blocks
// Views instances automatically rendered into base View rendering.
$data['latestNewsBlock'] = View::make('Articles/LatestNewsBlock')->withNews($latestNews);
$data['topVisitedBlock'] = View::make('Articles/TopVisitedBlock')->withNews($topNews);
View::share('title', $title);
View::renderTemplate('header');
View::render('Welcome/Welcome', $data); // <-- there the View instances from $data will be fetched automatically
View::renderTemplate('footer');
Views的更多相关文章
- MVC项目中,如何访问Views目录下的静态文件!
<!--注意,是system.webServer节点,而非system.web--><system.webServer> <handlers> <add na ...
- Django基础,Day4 - views 详解
在Django中,网页和其他内容是通过视图传递的.每个视图由一个简单的Python函数表示,Django将通过检查请求的URL(准确地说,是域名后面的部分URL)来选择一个视图. 例如,用户在浏览器中 ...
- Django基础,Day2 - 编写urls,views,models
编写views views:作为MVC中的C,接收用户的输入,调用数据库Model层和业务逻辑Model层,处理后将处理结果渲染到V层中去. polls/views.py: from django.h ...
- ASP.NET Core 十种方式扩展你的 Views
原文地址:http://asp.net-hacker.rocks/2016/02/18/extending-razor-views.html 作者:Jürgen Gutsch 翻译:杨晓东(Savor ...
- Create views of OpenCASCADE objects in the Debugger
Create views of OpenCASCADE objects in the Debugger eryar@163.com Abstract. The Visual Studio Natvis ...
- TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之三 Views
这个版本的TodoMVC中的视图组织划分比较细,更加易于理解,这也得益于Marionette为我们带来了丰富的视图选择,原生的backbone只有views,而Marionette则有itemview ...
- Xamarin Android.Views.WindowManagerBadTokenException: Unable to add window -- token android.os.BinderProxy
Android.Views.WindowManagerBadTokenException: Unable to add window -- token android.os.BinderProxy@ ...
- Advanced Collection Views and Building Custom Layouts
Advanced Collection Views and Building Custom Layouts UICollectionView的结构回顾 首先回顾一下Collection View的构成 ...
- Dynamic V Strongly Typed Views
Come From https://blogs.msdn.microsoft.com/rickandy/2011/01/28/dynamic-v-strongly-typed-views/ There ...
- Three ways to set specific DeviceFamily XAML Views in UWP
Three ways to set specific DeviceFamily XAML Views in UWP http://igrali.com/2015/08/02/three-ways-to ...
随机推荐
- 【转】java枚举类型enum的使用
原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...
- 重温delphi之:如何将Bitmap位图与base64字符串相互转换
先引用delphi自带的单元 uses EncdDecd; 然后就可以使用下面二个函数了: by 菩提树下的杨过 http://yjmyzz.cnblogs.com/ ///将Bitmap位图转化为b ...
- Java内存结构、类的初始化、及对象构造过程
概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的 ...
- 6.1 CUDA: pinned memory固定存储
CPU和GPU内存交互 在CUDA编程中,内存拷贝是非常费时的一个动作. 从上图我们可以看出:1. CPU和GPU之间的总线bus是PCIe,是双向传输的. 2. CPU和GPU之间的数据拷贝使用DM ...
- 【安全】requests和BeautifulSoup小试牛刀
web安全的题,为了找key随手写的程序,无处安放,姑且贴上来. # -*- coding: UTF-8 -*- __author__ = 'weimw' import requests from B ...
- Guide to make CentOS 7 the perfect desktop
原文地址: http://www.dedoimedo.com/computers/fedora-pimp.html My original review of CentOS 7 was less e ...
- 解决各大浏览器兼容问题hack
解决各大浏览器兼容问题hack,IE6/ IE7/ IE8/ IE9/ Firefox/ Opera/ Webkit/ Chrome/ Safari. 浏览器兼容是网站前端页面制作最基本的问题,通常I ...
- VS2010 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [3]”转换为“LPCTSTR”
VS2010 (VC2010)建立工程时默认的字符集是Unicode,所以在代码中使用MessageBox时需要输入Unicode,用TEXT()这个宏输入参数,否则会报错: 代码:Message ...
- 在CentOS 6.2上安装 MemcacheQ 最新版
1. 安装 yum install gcc cc make libevent libevent-devel 2. 安装Berkeley DB 下载:http://www.oracl ...
- GridView多行标题行、改造标题行、自定义标题行完美版
网上找了个找,最终还是自己做的比较靠谱,道理很简单,直接看代码 代码: /// <summary> /// =================== 两行标题行 ============ ...