Writing and maintaining HTML markup can quickly become a tedious task because of the naming conventions and numerous attributes that have to be taken into consideration. Phalcon deals with this complexity by offering Phalcon\Tag, which in turn offers view helpers to generate HTML markup.
This component can be used in a plain HTML+PHP view or in a Volt
template.
本指南不是一个完整的视图助手使用文档,完整说明请查看 Phalcon\Tag。
Phalcon provides Phalcon\Tag::setDoctype()
helper to set document type of the content. Document type setting may affect HTML output produced by other tag helpers.
For example, if you set XHTML document type family, helpers that return or output HTML tags will produce self-closing tags to follow valid XHTML standard.
Available document type constants in Phalcon\Tag namespace are:
Constant | Document type |
---|---|
HTML32 | HTML 3.2 |
HTML401_STRICT | HTML 4.01 Strict |
HTML401_TRANSITIONAL | HTML 4.01 Transitional |
HTML401_FRAMESET | HTML 4.01 Frameset |
HTML5 | HTML 5 |
XHTML10_STRICT | XHTML 1.0 Strict |
XHTML10_TRANSITIONAL | XHTML 1.0 Transitional |
XHTML10_FRAMESET | XHTML 1.0 Frameset |
XHTML11 | XHTML 1.1 |
XHTML20 | XHTML 2.0 |
XHTML5 | XHTML 5 |
Setting document type.
<?php
use Phalcon\Tag;
$this->tag->setDoctype(Tag::HTML401_STRICT);
?>
Getting document type.
<?= $this->tag->getDoctype() ?>
<html>
<!-- your HTML code -->
</html>
The following HTML will be produced.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<!-- your HTML code -->
</html>
A real common task in any web application or website is to produce links that allow us to navigate from one page to another. When they are internal URLs we can create them in the following manner:
<!-- for the default route -->
<?= $this->tag->linkTo("products/search", "Search") ?>
<!-- with CSS attributes -->
<?= $this->tag->linkTo(array('products/edit/10', 'Edit', 'class' => 'edit-btn')) ?>
<!-- for a named route -->
<?= $this->tag->linkTo(array(array('for' => 'show-product', 'title' => 123, 'name' => 'carrots'), 'Show')) ?>
Actually, all produced URLs are generated by the component Phalcon\Mvc\Url (or service “url” failing)
Forms in web applications play an essential part in retrieving user input. The following example shows how to implement a simple search form using view helpers:
<!-- Sending the form by method POST -->
<?= $this->tag->form("products/search") ?>
<label for="q">Search:</label>
<?= $this->tag->textField("q") ?>
<?= $this->tag->submitButton("Search") ?>
<?= $this->tag->endForm() ?>
<!-- Specifying another method or attributes for the FORM tag -->
<?= $this->tag->form(array("products/search", "method" => "get")); ?>
<label for="q">Search:</label>
<?= $this->tag->textField("q"); ?>
<?= $this->tag->submitButton("Search"); ?>
<?= $this->tag->endForm() ?>
This last code will generate the following HTML:
<form action="/store/products/search/" method="get">
<label for="q">Search:</label>
<input type="text" id="q" value="" name="q" />
<input type="submit" value="Search" />
</form>
Phalcon also provides a form builder to create forms in an object-oriented manner.
Phalcon provides a series of helpers to generate form elements such as text fields, buttons and more. The first parameter of each helper is always the name of the element to be generated. When the form is submitted, the name will be passed along with the form data. In a controller you can get these values using the same name by using the getPost()
and getQuery()
methods on the request object ($this->request
).
<?php echo $this->tag->textField("username") ?>
<?php echo $this->tag->textArea(array(
"comment",
"This is the content of the text-area",
"cols" => "6",
"rows" => 20
)) ?>
<?php echo $this->tag->passwordField(array(
"password",
"size" => 30
)) ?>
<?php echo $this->tag->hiddenField(array(
"parent_id",
"value"=> "5"
)) ?>
Generating select boxes (select box) is easy, especially if the related data is stored in PHP associative arrays. The helpers for select elements are Phalcon\Tag::select()
and Phalcon\Tag::selectStatic()
.
Phalcon\Tag::select()
has been was specifically designed to work with Phalcon\Mvc\Model, while Phalcon\Tag::selectStatic()
can with PHP arrays.
<?php
// Using data from a resultset
echo $this->tag->select(
array(
"productId",
Products::find("type = 'vegetables'"),
"using" => array("id", "name")
)
);
// Using data from an array
echo $this->tag->selectStatic(
array(
"status",
array(
"A" => "Active",
"I" => "Inactive",
)
)
);
echo $this->tag->select(array(
'robotid',
Rbots::find(),
'using' => ['id', function($robot) {
return $item->name.'('.$$robot->id.')';
}],
'value' => $this->requset('robotid'),
'useEmpey' => true,
'class' => 'form-control',
));
The following HTML will generated:
<select id="productId" name="productId">
<option value="101">Tomato</option>
<option value="102">Lettuce</option>
<option value="103">Beans</option>
</select>
<select id="status" name="status">
<option value="A">Active</option>
<option value="I">Inactive</option>
</select>
You can add an “empty” option to the generated HTML:
<?php
// Creating a Select Tag with an empty option
echo $this->tag->select(
array(
"productId",
Products::find("type = 'vegetables'"),
"using" => array("id", "name"),
"useEmpty" => true
)
);
Produces this HTML:
<select id="productId" name="productId">
<option value="">Choose..</option>
<option value="101">Tomato</option>
<option value="102">Lettuce</option>
<option value="103">Beans</option>
</select>
<?php
// Creating a Select Tag with an empty option with default text
echo $this->tag->select(
array(
'productId',
Products::find("type = 'vegetables'"),
'using' => array('id', "name"),
'useEmpty' => true,
'emptyText' => 'Please, choose one...',
'emptyValue' => '@'
)
);
<select id="productId" name="productId">
<option value="@">Please, choose one..</option>
<option value="101">Tomato</option>
<option value="102">Lettuce</option>
<option value="103">Beans</option>
</select>
All the helpers accept an array as their first parameter which can contain additional HTML attributes for the element generated.
<?php $this->tag->textField(
array(
"price",
"size" => 20,
"maxlength" => 30,
"placeholder" => "Enter a price"
)
) ?>
The following HTML is generated:
<input type="text" name="price" id="price" size="20" maxlength="30"
placeholder="Enter a price" />
It is a good programming principle for MVC frameworks to set specific values for form elements in the view.
You can set those values directly from the controller using Phalcon\Tag::setDefault()
.
This helper preloads a value for any helpers present in the view. If any helper in the view has
a name that matches the preloaded value, it will use it, unless a value is directly assigned on the helper in the view.
<?php
use Phalcon\Mvc\Controller;
class ProductsController extends Controller
{
public function indexAction()
{
$this->tag->setDefault("color", "Blue");
}
}
At the view, a selectStatic helper matches the same index used to preset the value. In this case “color”:
<?php
echo $this->tag->selectStatic(
array(
"color",
array(
"Yellow" => "Yellow",
"Blue" => "Blue",
"Red" => "Red"
)
)
);
This will generate the following select tag with the value “Blue” selected:
<select id="color" name="color">
<option value="Yellow">Yellow</option>
<option value="Blue" selected="selected">Blue</option>
<option value="Red">Red</option>
</select>
A special feature that the Phalcon\Tag helpers have is that they keep the values of form helpers between requests. This way you can easily show validation messages without losing entered data.
Every form helper supports the parameter “value”. With it you can specify a value for the helper directly. When this parameter is present, any preset value using setDefault() or via request will be ignored.
所有的表单方法都支持参数 value。你可以直接设置一个明确的值给表单方法。当这个值被明确设定的时候,任何通过 setDefault() 或者通过 请求(request) 所设置的值将被直接忽略。
Phalcon\Tag offers helpers to change dynamically the document title from the controller. The following example demonstrates just that:
<?php
use Phalcon\Mvc\Controller;
class PostsController extends Controller
{
public function initialize()
{
$this->tag->setTitle("Your Website");
}
public function indexAction()
{
$this->tag->prependTitle("Index of Posts - ");
}
}
<html>
<head>
<?php echo $this->tag->getTitle(); ?>
</head>
<body>
</body>
</html>
The following HTML will generated:
<html>
<head>
<title>Index of Posts - Your Website</title>
</head>
<body>
</body>
</html>
设置标题分隔符,用以连接追加或前置的标题内容:
<?php
use Phalcon\Mvc\Controller;
class PostsController extends Controller
{
public function initialize()
{
$this->tag->setTitle("Your");
$this->tag->appendTitle("Website");
$this->tag->setTitleSeparator(' - ');
}
public function indexAction()
{
$this->tag->prependTitle("Index of Posts");
}
}
<html>
<head>
<?php echo $this->tag->getTitle(); ?>
</head>
<body>
</body>
</html>
将生成如下的 HTML 内容:
<html>
<head>
<title>Index of Posts - Your - Website</title>
</head>
<body>
</body>
</html>
Phalcon\Tag also provide helpers to generate tags such as script, link or img. They aid in quick and easy generation of the static resources of your application
<?php
// Generate <img src="/your-app/img/hello.gif">
echo $this->tag->image("img/hello.gif");
// Generate <img alt="alternative text" src="/your-app/img/hello.gif">
echo $this->tag->image(
array(
"img/hello.gif",
"alt" => "alternative text"
)
);
<?php
// Generate <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Rosario" type="text/css">
echo $this->tag->stylesheetLink("http://fonts.googleapis.com/css?family=Rosario", false);
// Generate <link rel="stylesheet" href="/your-app/css/styles.css" type="text/css">
echo $this->tag->stylesheetLink("css/styles.css");
<?php
// Generate <script src="http://localhost/javascript/jquery.min.js" type="text/javascript"></script>
echo $this->tag->javascriptInclude("http://localhost/javascript/jquery.min.js", false);
// Generate <script src="/your-app/javascript/jquery.min.js" type="text/javascript"></script>
echo $this->tag->javascriptInclude("javascript/jquery.min.js");
Phalcon offers a generic HTML helper that allows the generation of any kind of HTML element. It is up to the developer to produce a valid HTML element name to the helper.
<?php
// Generate
// <canvas id="canvas1" width="300" class="cnvclass">
// This is my canvas
// </canvas>
echo $this->tag->tagHtml("canvas", array("id" => "canvas1", "width" => "300", "class" => "cnvclass"), false, true, true);
echo "This is my canvas";
echo $this->tag->tagHtmlClose("canvas");
Phalcon\Tag is available via the ‘tag’ service, this means you can access it from any part of the application where the services container is located:
<?php echo $this->tag->linkTo('pages/about', 'About') ?>
You can easily add new helpers to a custom component replacing the service ‘tag’ in the services container:
<?php
use Phalcon\Tag;
class MyTags extends Tag
{
// ...
// Create a new helper
static public function myAmazingHelper($parameters)
{
// ...
}
// Override an existing method
static public function textField($parameters)
{
// ...
}
}
Then change the definition of the service ‘tag’:
<?php
$di['tag'] = function () {
return new MyTags();
};
You can easily create your own helpers. First, start by creating a new folder within the same directory as your controllers and models. Give it a title that is relative to what you are creating. For our example here, we can call it “customhelpers”. Next we will create a new file titled MyTags.php
within this new directory. At this point, we have a structure that looks similar to : /app/customhelpers/MyTags.php
. In MyTags.php
, we will extend the Phalcon\Tag and implement your own helper. Below is a simple example of a custom helper:
<?php
use Phalcon\Tag;
class MyTags extends Tag
{
/**
* Generates a widget to show a HTML5 audio tag
*
* @param array
* @return string
*/
static public function audioField($parameters)
{
// Converting parameters to array if it is not
if (!is_array($parameters)) {
$parameters = array($parameters);
}
// Determining attributes "id" and "name"
if (!isset($parameters[0])) {
$parameters[0] = $parameters["id"];
}
$id = $parameters[0];
if (!isset($parameters["name"])) {
$parameters["name"] = $id;
} else {
if (!$parameters["name"]) {
$parameters["name"] = $id;
}
}
// Determining widget value,
// \Phalcon\Tag::setDefault() allows to set the widget value
if (isset($parameters["value"])) {
$value = $parameters["value"];
unset($parameters["value"]);
} else {
$value = self::getValue($id);
}
// Generate the tag code
$code = '<audio id="'.$id.'" value="'.$value.'" ';
foreach ($parameters as $key => $attributeValue) {
if (!is_integer($key)) {
$code.= $key.'="'.$attributeValue.'" ';
}
}
$code.=" />";
return $code;
}
}
After creating our custom helper, we will autoload the new directory that contains our helper class from our “index.php” located in the public directory.
<?php
use Phalcon\Loader;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault();
use Phalcon\Exception as PhalconException;
try {
$loader = new Loader();
$loader->registerDirs(array(
'../app/controllers',
'../app/models',
'../app/customhelpers' // Add the new helpers folder
))->register();
$di = new FactoryDefault();
// Assign our new tag a definition so we can call it
$di->set('MyTags', function () {
return new MyTags();
});
$application = new Application($di);
echo $application->handle()->getContent();
} catch (PhalconException $e) {
echo "PhalconException: ", $e->getMessage();
}
Now you are ready to use your new helper within your views:
<body>
<?php
echo MyTags::audioField(
array(
'name' => 'test',
'id' => 'audio_test',
'src' => '/path/to/audio.mp3'
)
);
?>
</body>