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 ...
随机推荐
- 缓存你的BITMAP对象
在app中通常最占内存.占流量的元素就是图片了,图片往往又无处不在,特别是伴随着list,GridView或者ViewPager出现,这些图片随着你的滑动操作,时而出现在你的屏幕中,时而消失在屏幕之外 ...
- nopcommerce商城系统--源代码结构和架构
这个文档是让开发者了解nopcommerce解决方案结构的指南.这是新的nopcommerce开发者学习nopcommerce代码的相关文档.首先,nopCommerce源代码是很容易得到的.它是一个 ...
- Web API 依赖注入与扩展
与 MVC 类似, Web API 提供了System.Web.Http.Services.IDependencyResolver 接口来实现依赖注入, 我们可以很容易的用 Unity 来实现这个接口 ...
- FZU 2105-Digits Count(线段树延时标记)
题意: 每次操作区间每个数进行一种(&或|.或^ )给定的一个数,到sum时统计给定区间的和. 分析: 这个题让我觉得我的思维很不活跃,对懒惰标记理解,还远远不够,通过这道题我对懒惰标记加深了 ...
- 关于hibernate映射过程中的笔记
MySQL遇到check the manual that corresponds to your MySQL server version for the right syntax错误 You hav ...
- hive 配置mysql元数据库
在 hive的配置文件hive-site.xml中 <?xml version="1.0"?> <!-- Licensed to the Apache Softw ...
- Stm32外围模块编程初始化步骤
Stm32外围模块编程初始化步骤: 一.外部中断 1)初始化 IO 口为输入. 这一步设置你要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要 ...
- MFC定时器
比较简单,在程序中可以找到原型. 在程序中我们经常要使用定时刷新的功能,典型的应用是在信息管理系统中表单要跟着数据库中的数据变动.MFC提供了定时器来完成这个功能. ================= ...
- 8.1.C++ AMP简介
C++ AMP是专为设计支持C++的异构并行模型. 全程是: Accelerator Massive Parallelism 下面是一个Vector C++ AMP的代码,通过这段代码来解释C++ A ...
- 13个不容错过的Java项目
今天我们将整理一大波干货满满的Java示例代码与能力展示素材. GitHub可谓一座程序开发的大宝库,有些素材值得fork,有些则能帮助我们改进自有代码或者学习编程技能.无论如何,开发工作当中我们几乎 ...