| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <sect1 id="zend.view.helpers" xmlns:xi="http://www.w3.org/2001/XInclude">
- <title>View Helpers</title>
- <para>
- In your view scripts, often it is necessary to perform certain
- complex functions over and over: e.g., formatting a date,
- generating form elements, or displaying action links. You can
- use helper classes to perform these behaviors for you.
- </para>
- <para>
- A helper is simply a class. Let's say we want a helper named 'fooBar'.
- By default, the class is prefixed with 'Zend_View_Helper_'
- (you can specify a custom prefix when setting a helper path), and the
- last segment of the class name is the helper name; this segment should
- be TitleCapped; the full class name is then:
- <classname>Zend_View_Helper_FooBar</classname>. This class should contain at the
- minimum a single method, named after the helper, and camelCased:
- <methodname>fooBar()</methodname>.
- </para>
- <note>
- <title>Watch the Case</title>
- <para>
- Helper names are always camelCased, i.e., they never begin with an
- uppercase character. The class name itself is MixedCased, but the
- method that is actually executed is camelCased.
- </para>
- </note>
- <note>
- <title>Default Helper Path</title>
- <para>
- The default helper path always points to the Zend Framework view
- helpers, i.e., 'Zend/View/Helper/'. Even if you call
- <methodname>setHelperPath()</methodname> to overwrite the existing paths, this
- path will be set to ensure the default helpers work.
- </para>
- </note>
- <para>
- To use a helper in your view script, call it using
- <command>$this->helperName()</command>. Behind the scenes,
- <classname>Zend_View</classname> will load the
- <classname>Zend_View_Helper_HelperName</classname> class, create an object
- instance of it, and call its <methodname>helperName()</methodname> method. The
- object instance is persistent within the <classname>Zend_View</classname>
- instance, and is reused for all future calls to
- <command>$this->helperName()</command>.
- </para>
- <sect2 id="zend.view.helpers.initial">
- <title>Initial Helpers</title>
- <para>
- <classname>Zend_View</classname> comes with an initial set of helper classes,
- most of which relate to form element generation and perform
- the appropriate output escaping automatically. In addition, there
- are helpers for creating route-based <acronym>URL</acronym>s and <acronym>HTML</acronym>
- lists, as well as declaring variables. The currently shipped helpers include:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>declareVars()</methodname>: Primarily for use when using
- <methodname>strictVars()</methodname>, this helper can be used to declare
- template variables that may or may not already be set in the
- view object, as well as to set default values. Arrays passed as
- arguments to the method will be used to set default values;
- otherwise, if the variable does not exist, it is set to an empty string.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>fieldset($name, $content, $attribs)</methodname>: Creates an
- <acronym>XHTML</acronym> fieldset. If <varname>$attribs</varname> contains a
- 'legend' key, that value will be used for the fieldset legend. The
- fieldset will surround the <varname>$content</varname> as provided to
- the helper.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>form($name, $attribs, $content)</methodname>: Generates an
- <acronym>XHTML</acronym> form. All <varname>$attribs</varname> are escaped and
- rendered as <acronym>XHTML</acronym> attributes of the form tag. If
- <varname>$content</varname> is present and not a boolean
- <constant>FALSE</constant>, then that content is rendered within the start and
- close form tags; if <varname>$content</varname> is a boolean
- <constant>FALSE</constant> (the default), only the opening form tag is
- generated.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>formButton($name, $value, $attribs)</methodname>: Creates an
- <button /> element.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>formCheckbox($name, $value, $attribs, $options)</methodname>:
- Creates an <input type="checkbox" /> element.
- </para>
- <para>
- By default, when no $value is provided and no $options are
- present, '0' is assumed to be the unchecked value, and '1'
- the checked value. If a $value is passed, but no $options
- are present, the checked value is assumed to be the value
- passed. The unchecked value is implemented by rendering a
- hidden input element before rendering the checkbox.
- </para>
- <para>
- $options should be an array. If the array is indexed, the
- first value is the checked value, and the second the
- unchecked value; all other values are ignored. You may also
- pass an associative array with the keys 'checked' and
- 'unChecked'. The key 'disableHidden' can be set to true to
- prevent rendering of the hidden field for the unchecked value.
- </para>
- <para>
- If $options has been passed, if $value matches the checked
- value, then the element will be marked as checked. You may
- also mark the element as checked or unchecked by passing a
- boolean value for the attribute 'checked'.
- </para>
- <para>
- The above is probably best summed up with some examples:
- </para>
- <programlisting language="php"><![CDATA[
- // '1' and '0' as checked/unchecked options; not checked
- echo $this->formCheckbox('foo');
- // '1' and '0' as checked/unchecked options; checked
- echo $this->formCheckbox('foo', null, array('checked' => true));
- // 'bar' and '0' as checked/unchecked options; not checked
- echo $this->formCheckbox('foo', 'bar');
- // 'bar' and '0' as checked/unchecked options; checked
- echo $this->formCheckbox('foo', 'bar', array('checked' => true));
- // 'bar' and 'baz' as checked/unchecked options; unchecked
- echo $this->formCheckbox('foo', null, null, array('bar', 'baz'));
- // 'bar' and 'baz' as checked/unchecked options; unchecked
- echo $this->formCheckbox('foo', null, null, array(
- 'checked' => 'bar',
- 'unChecked' => 'baz'
- ));
- // 'bar' and 'baz' as checked/unchecked options; checked
- echo $this->formCheckbox('foo', 'bar', null, array('bar', 'baz'));
- echo $this->formCheckbox('foo',
- null,
- array('checked' => true),
- array('bar', 'baz'));
- // 'bar' and 'baz' as checked/unchecked options; unchecked
- echo $this->formCheckbox('foo', 'baz', null, array('bar', 'baz'));
- echo $this->formCheckbox('foo',
- null,
- array('checked' => false),
- array('bar', 'baz'));
- ]]></programlisting>
- <para>
- In all cases, the markup prepends a hidden element with the
- unchecked value; this way, if the value is unchecked, you
- will still get a valid value returned to your form.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>formErrors($errors, $options)</methodname>: Generates an
- <acronym>XHTML</acronym> unordered list to show errors.
- <varname>$errors</varname> should be a string or an array of strings;
- <varname>$options</varname> should be any attributes you want
- placed in the opening list tag.
- </para>
- <para>
- You can specify alternate opening, closing, and separator
- content when rendering the errors by calling several methods
- on the helper:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setElementStart($string)</methodname>; default is
- '<ul class="errors"%s"><li>', where %s
- is replaced with the attributes as specified in
- <varname>$options</varname>.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setElementSeparator($string)</methodname>; default
- is '</li><li>'.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setElementEnd($string)</methodname>; default is
- '</li></ul>'.
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>
- <methodname>formFile($name, $attribs)</methodname>: Creates an
- <input type="file" /> element.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>formHidden($name, $value, $attribs)</methodname>: Creates an
- <input type="hidden" /> element.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>formImage($name, $value, $attribs)</methodname>: Creates an
- <input type="image" /> element.
- </para>
- <programlisting language="php"><![CDATA[
- echo $this->formImage(
- 'foo',
- 'bar',
- array(
- 'src' => 'images/button.png',
- 'alt' => 'Button',
- )
- );
- // Output: <input type="image" name="foo" id="foo" src="images/button.png" value="bar" alt="Button" />
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <methodname>formLabel($name, $value, $attribs)</methodname>: Creates a
- <label> element, setting the <property>for</property> attribute to
- <varname>$name</varname>, and the actual label text to
- <varname>$value</varname>. If <emphasis>disable</emphasis> is passed in
- <property>attribs</property>, nothing will be returned.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>formMultiCheckbox($name, $value, $attribs, $options,
- $listsep)</methodname>: Creates a list of checkboxes.
- <varname>$options</varname> should be an associative array, and may be
- arbitrarily deep. <varname>$value</varname> may be a single value or
- an array of selected values that match the keys in the
- <varname>$options</varname> array. <varname>$listsep</varname> is an
- <acronym>HTML</acronym> break ("<br />") by default. By default, this
- element is treated as an array; all checkboxes share the same name, and are
- submitted as an array.
- </para>
- <programlisting language="php"><![CDATA[
- // Using list separator ($listsep):
- echo '<ul><li>';
- echo $view->formMultiCheckbox(
- 'foo',
- 2,
- array(
- 'class' => 'baz',
- ),
- array(
- 1 => 'One',
- 2 => 'Two',
- 3 => 'Three',
- ),
- "</li>\n<li>"
- );
- echo '</li></ul>';
- /*
- Output:
- <ul>
- <li>
- <label for="foo-1">
- <input type="checkbox" name="foo[]" id="foo-1" value="1" class="baz" />One
- </label>
- </li>
- <li>
- <label for="foo-2">
- <input type="checkbox" name="foo[]" id="foo-2" value="2" checked="checked" class="baz" />Two
- </label>
- </li>
- <li>
- <label for="foo-3">
- <input type="checkbox" name="foo[]" id="foo-3" value="3" class="baz" />Three</label>
- </li>
- </ul>
- */
- // Using options for label elements:
- echo $this->formMultiCheckbox(
- 'foo',
- 2,
- array(
- 'label_placement' => 'prepend',
- 'label_class' => 'baz',
- ),
- array(
- 1 => 'One',
- 2 => 'Two',
- 3 => 'Three',
- )
- );
- /*
- Output:
- <label class="baz" for="foo-1">
- One<input type="checkbox" name="foo[]" id="foo-1" value="1" />
- </label>
- <br />
- <label class="baz" for="foo-2">
- Two<input type="checkbox" name="foo[]" id="foo-2" value="2" checked="checked" />
- </label>
- <br />
- <label class="baz" for="foo-3">
- Three<input type="checkbox" name="foo[]" id="foo-3" value="3" />
- </label>
- */
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <methodname>formNote($name, $value = null)</methodname>: Creates a
- simple text note. (e.g. as element for headlines in a
- <classname>Zend_Form</classname> object)
- </para>
- <programlisting language="php"><![CDATA[
- echo $this->formNote(null, 'This is an example text.');
- // Output: This is an example text.
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <methodname>formPassword($name, $value, $attribs)</methodname>: Creates an
- <input type="password" /> element.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>formRadio($name, $value, $attribs, $options, $listsep)</methodname>:
- Creates a series of <input type="radio" /> elements, one
- for each of the $options elements. In the $options array, the
- element key is the radio value, and the element value is the
- radio label. The $value radio will be preselected for you.
- </para>
- <programlisting language="php"><![CDATA[
- // Using list separator ($listsep)
- echo '<ul><li>';
- echo $this->formRadio(
- 'foo',
- 2,
- array(
- 'class' => 'baz',
- ),
- array(
- 1 => 'One',
- 2 => 'Two',
- 3 => 'Three',
- ),
- "</li>\n<li>"
- );
- echo '</li></ul>';
- /*
- Output:
- <ul>
- <li>
- <label for="foo-1">
- <input type="radio" name="foo" id="foo-1" value="1" class="baz" />One
- </label>
- </li>
- <li>
- <label for="foo-2">
- <input type="radio" name="foo" id="foo-2" value="2" checked="checked" class="baz" />Two
- </label>
- </li>
- <li>
- <label for="foo-3">
- <input type="radio" name="foo" id="foo-3" value="3" class="baz" />Three
- </label>
- </li>
- </ul>
- */
- // Using options for label elements:
- echo $this->formRadio(
- 'foo',
- 2,
- array(
- 'label_placement' => 'prepend',
- 'label_class' => 'baz',
- ),
- array(
- 1 => 'One',
- 2 => 'Two',
- 3 => 'Three',
- )
- );
- /*
- Output:
- <label class="baz" for="foo-1">
- One<input type="radio" name="foo" id="foo-1" value="1" />
- </label>
- <br />
- <label class="baz" for="foo-2">
- Two<input type="radio" name="foo" id="foo-2" value="2" checked="checked" />
- </label>
- <br />
- <label class="baz" for="foo-3">
- Three<input type="radio" name="foo" id="foo-3" value="3" />
- </label>
- */
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <methodname>formReset($name, $value, $attribs)</methodname>: Creates an
- <input type="reset" /> element.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>formSelect($name, $value, $attribs, $options)</methodname>:
- Creates a <select>...</select> block, with one
- <option>one for each of the $options elements. In the
- $options array, the element key is the option value, and the
- element value is the option label. The $value option(s) will be
- preselected for you.
- </para>
- <programlisting language="php"><![CDATA[
- // Using option groups:
- echo $view->formSelect(
- 'foo',
- 2,
- array(
- 'class' => 'baz',
- ),
- array(
- 1 => 'One',
- 'Two' => array(
- '2.1' => 'One',
- '2.2' => 'Two',
- '2.3' => 'Three',
- ),
- 3 => 'Three',
- )
- );
- /*
- Output:
- <select name="foo" id="foo" class="baz">
- <option value="1" label="One">One</option>
- <optgroup id="foo-optgroup-Two" label="Two">
- <option value="2.1" label="One">One</option>
- <option value="2.2" label="Two">Two</option>
- <option value="2.3" label="Three">Three</option>
- </optgroup>
- <option value="3" label="Three">Three</option>
- </select>
- */
- // First example with 'multiple' option:
- echo $this->formSelect(
- 'foo[]',
- 2,
- null,
- array(
- 1 => 'One',
- 2 => 'Two',
- 3 => 'Three',
- )
- );
- /*
- Output:
- <select name="foo[]" id="foo" multiple="multiple">
- <option value="1" label="One">One</option>
- <option value="2" label="Two" selected="selected">Two</option>
- <option value="3" label="Three">Three</option>
- </select>
- */
- // Second example with 'multiple' option:
- echo $this->formSelect(
- 'foo',
- array(
- 1,
- 2,
- ),
- array(
- 'multiple' => true,
- ),
- array(
- 1 => 'One',
- 2 => 'Two',
- 3 => 'Three',
- )
- );
- /*
- Output:
- <select name="foo[]" id="foo" multiple="multiple">
- <option value="1" label="One" selected="selected">One</option>
- <option value="2" label="Two" selected="selected">Two</option>
- <option value="3" label="Three">Three</option>
- </select>
- */
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <methodname>formSubmit($name, $value, $attribs)</methodname>: Creates an
- <input type="submit" /> element.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>formText($name, $value, $attribs)</methodname>: Creates an
- <input type="text" /> element.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>formTextarea($name, $value, $attribs)</methodname>: Creates a
- <textarea>...</textarea> block.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>url($urlOptions, $name, $reset, $encode)</methodname>: Creates a
- <acronym>URL</acronym> string based on a named route.
- <varname>$urlOptions</varname> should be an associative array of key/value pairs
- used by the particular route.
- </para>
- <programlisting language="php"><![CDATA[
- // Using without options: (current request is: user/id/1)
- echo $this->url();
- // Output: user/info/id/1
- // Set URL options:
- echo $this->url(
- array('controller' => 'user', 'action' => 'info', 'username' => 'foobar')
- );
- // Output: user/info/username/foobar
- // Using a route:
- $router->addRoute(
- 'user',
- new Zend_Controller_Router_Route(
- 'user/:username',
- array(
- 'controller' => 'user',
- 'action' => 'info',
- )
- )
- );
- echo $this->url(array('name' => 'foobar'), 'user');
- // Output: user/foobar
- // Using reset: (current request is: user/id/1)
- echo $this->url(array('controller' => 'user', 'action' => 'info'), null, false);
- // Output: user/info/id/1
- echo $this->url(array('controller' => 'user', 'action' => 'info'), null, true);
- // Output: user/info
- // Using encode:
- echo $this->url(
- array('controller' => 'user', 'action' => 'info', 'username' => 'John Doe'), null, true, false
- );
- // Output: user/info/username/John Doe
- echo $this->url(
- array('controller' => 'user', 'action' => 'info', 'username' => 'John Doe'), null, true, false
- );
- // Output: user/info/username/John+Doe
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <methodname>serverUrl($requestUri = null)</methodname>: Helper
- for returning the current server URL (optionally with request URI).
- </para>
- <programlisting language="php"><![CDATA[
- // Current server URL in the example is: http://www.example.com/foo.html
- echo $this->serverUrl();
- // Output: http://www.example.com
- echo $this->serverUrl(true);
- // Output: http://www.example.com/foo.html
- echo $this->serverUrl('/foo/bar');
- // Output: http://www.example.com/foo/bar
- echo $this->serverUrl()->getHost();
- // Output: www.example.com
- echo $this->serverUrl()->getScheme();
- // Output: http
- $this->serverUrl()->setHost('www.foo.com');
- $this->serverUrl()->setScheme('https');
- echo $this->serverUrl();
- // Output: https://www.foo.com
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <methodname>htmlList($items, $ordered, $attribs, $escape)</methodname>:
- generates unordered and ordered lists based on the <varname>$items</varname>
- passed to it. If <varname>$items</varname> is a multidimensional
- array, a nested list will be built. If the <varname>$escape</varname>
- flag is <constant>TRUE</constant> (default), individual items will be escaped
- using the view objects registered escaping mechanisms; pass a
- <constant>FALSE</constant> value if you want to allow markup in your lists.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Using these in your view scripts is very easy, here is an example.
- Note that you all you need to do is call them; they will load
- and instantiate themselves as they are needed.
- </para>
- <programlisting language="php"><![CDATA[
- // inside your view script, $this refers to the Zend_View instance.
- //
- // say that you have already assigned a series of select options under
- // the name $countries as array('us' => 'United States', 'il' =>
- // 'Israel', 'de' => 'Germany').
- ?>
- <form action="action.php" method="post">
- <p><label>Your Email:
- <?php echo $this->formText('email', 'you@example.com', array('size' => 32)) ?>
- </label></p>
- <p><label>Your Country:
- <?php echo $this->formSelect('country', 'us', null, $this->countries) ?>
- </label></p>
- <p><label>Would you like to opt in?
- <?php echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) ?>
- </label></p>
- </form>
- ]]></programlisting>
- <para>
- The resulting output from the view script will look something like this:
- </para>
- <programlisting language="php"><![CDATA[
- <form action="action.php" method="post">
- <p><label>Your Email:
- <input type="text" name="email" value="you@example.com" size="32" />
- </label></p>
- <p><label>Your Country:
- <select name="country">
- <option value="us" selected="selected">United States</option>
- <option value="il">Israel</option>
- <option value="de">Germany</option>
- </select>
- </label></p>
- <p><label>Would you like to opt in?
- <input type="hidden" name="opt_in" value="no" />
- <input type="checkbox" name="opt_in" value="yes" checked="checked" />
- </label></p>
- </form>
- ]]></programlisting>
- <xi:include href="Zend_View-Helpers-Action.xml" />
- <xi:include href="Zend_View-Helpers-BaseUrl.xml" />
- <xi:include href="Zend_View-Helpers-Currency.xml" />
- <xi:include href="Zend_View-Helpers-Cycle.xml" />
- <xi:include href="Zend_View-Helpers-Partial.xml" />
- <xi:include href="Zend_View-Helpers-Placeholder.xml" />
- <xi:include href="Zend_View-Helpers-Doctype.xml" />
- <xi:include href="Zend_View-Helpers-Gravatar.xml" />
- <xi:include href="Zend_View-Helpers-HeadLink.xml" />
- <xi:include href="Zend_View-Helpers-HeadMeta.xml" />
- <xi:include href="Zend_View-Helpers-HeadScript.xml" />
- <xi:include href="Zend_View-Helpers-HeadStyle.xml" />
- <xi:include href="Zend_View-Helpers-HeadTitle.xml" />
- <xi:include href="Zend_View-Helpers-HtmlObject.xml" />
- <xi:include href="Zend_View-Helpers-InlineScript.xml" />
- <xi:include href="Zend_View-Helpers-RenderToPlaceholder.xml" />
- <xi:include href="Zend_View-Helpers-Json.xml" />
- <xi:include href="Zend_View-Helpers-Navigation.xml" />
- <xi:include href="Zend_View-Helpers-TinySrc.xml" />
- <xi:include href="Zend_View-Helpers-Translate.xml" />
- <xi:include href="Zend_View-Helpers-UserAgent.xml" />
- </sect2>
- <sect2 id="zend.view.helpers.paths">
- <title>Helper Paths</title>
- <para>
- As with view scripts, your controller can specify a stack of paths
- for <classname>Zend_View</classname> to search for helper classes. By default,
- <classname>Zend_View</classname> looks in "Zend/View/Helper/*" for helper
- classes. You can tell <classname>Zend_View</classname> to look in other
- locations using the <methodname>setHelperPath()</methodname> and
- <methodname>addHelperPath()</methodname> methods. Additionally, you can
- indicate a class prefix to use for helpers in the path provided, to
- allow namespacing your helper classes. By default, if no class
- prefix is provided, 'Zend_View_Helper_' is assumed.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- // Set path to /path/to/more/helpers, with prefix 'My_View_Helper'
- $view->setHelperPath('/path/to/more/helpers', 'My_View_Helper');
- ]]></programlisting>
- <para>
- In fact, you can "stack" paths using the
- <methodname>addHelperPath()</methodname> method. As you add paths to the stack,
- <classname>Zend_View</classname> will look at the most-recently-added path for
- the requested helper class. This allows you to add to (or even
- override) the initial distribution of helpers with your own custom
- helpers.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- // Add /path/to/some/helpers with class prefix 'My_View_Helper'
- $view->addHelperPath('/path/to/some/helpers', 'My_View_Helper');
- // Add /other/path/to/helpers with class prefix 'Your_View_Helper'
- $view->addHelperPath('/other/path/to/helpers', 'Your_View_Helper');
- // now when you call $this->helperName(), Zend_View will look first for
- // "/path/to/some/helpers/HelperName" using class name
- // "Your_View_Helper_HelperName", then for
- // "/other/path/to/helpers/HelperName.php" using class name
- // "My_View_Helper_HelperName", and finally for
- // "Zend/View/Helper/HelperName.php" using class name
- // "Zend_View_Helper_HelperName".
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.view.helpers.custom">
- <title>Writing Custom Helpers</title>
- <para>
- Writing custom helpers is easy; just follow these rules:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- While not strictly necessary, we recommend either implementing
- <classname>Zend_View_Helper_Interface</classname> or extending
- <classname>Zend_View_Helper_Abstract</classname> when creating your
- helpers. Introduced in 1.6.0, these simply define a
- <methodname>setView()</methodname> method; however, in upcoming releases, we
- plan to implement a strategy pattern that will simplify much of
- the naming schema detailed below. Building off these now will
- help you future-proof your code.
- </para>
- </listitem>
- <listitem>
- <para>
- The class name must, at the very minimum, end with the helper
- name itself, using MixedCaps. E.g., if you were writing a
- helper called "specialPurpose", the class name would minimally
- need to be "SpecialPurpose". You may, and should, give the class
- name a prefix, and it is recommended that you use 'View_Helper'
- as part of that prefix: "My_View_Helper_SpecialPurpose". (You
- will need to pass in the prefix, with or without the trailing
- underscore, to <methodname>addHelperPath()</methodname> or
- <methodname>setHelperPath()</methodname>).
- </para>
- </listitem>
- <listitem>
- <para>
- The class must have a public method that matches the
- helper name; this is the method that will be called when
- your template calls "$this->specialPurpose()". In our
- "specialPurpose" helper example, the required method
- declaration would be "public function specialPurpose()".
- </para>
- </listitem>
- <listitem>
- <para>
- In general, the class should not echo or print or otherwise
- generate output. Instead, it should return values to be
- printed or echoed. The returned values should be escaped
- appropriately.
- </para>
- </listitem>
- <listitem>
- <para>
- The class must be in a file named after the helper class. Again
- using our "specialPurpose" helper example, the file has to be
- named "SpecialPurpose.php".
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Place the helper class file somewhere in your helper path stack, and
- <classname>Zend_View</classname> will automatically load, instantiate,
- persist, and execute it for you.
- </para>
- <para>
- Here is an example of our <classname>SpecialPurpose</classname> helper code:
- </para>
- <programlisting language="php"><![CDATA[
- class My_View_Helper_SpecialPurpose extends Zend_View_Helper_Abstract
- {
- protected $_count = 0;
- public function specialPurpose()
- {
- $this->_count++;
- $output = "I have seen 'The Jerk' {$this->_count} time(s).";
- return htmlspecialchars($output);
- }
- }
- ]]></programlisting>
- <para>
- Then in a view script, you can call the <classname>SpecialPurpose</classname>
- helper as many times as you like; it will be instantiated once, and
- then it persists for the life of that <classname>Zend_View</classname>
- instance.
- </para>
- <programlisting language="php"><![CDATA[
- // remember, in a view script, $this refers to the Zend_View instance.
- echo $this->specialPurpose();
- echo $this->specialPurpose();
- echo $this->specialPurpose();
- ]]></programlisting>
- <para>
- The output would look something like this:
- </para>
- <programlisting language="php"><![CDATA[
- I have seen 'The Jerk' 1 time(s).
- I have seen 'The Jerk' 2 time(s).
- I have seen 'The Jerk' 3 time(s).
- ]]></programlisting>
- <para>
- Sometimes you will need access to the calling <classname>Zend_View</classname>
- object -- for instance, if you need to use the registered encoding,
- or want to render another view script as part of your helper. To get
- access to the view object, your helper class should have a
- <methodname>setView($view)</methodname> method, like the following:
- </para>
- <programlisting language="php"><![CDATA[
- class My_View_Helper_ScriptPath
- {
- public $view;
- public function setView(Zend_View_Interface $view)
- {
- $this->view = $view;
- }
- public function scriptPath($script)
- {
- return $this->view->getScriptPath($script);
- }
- }
- ]]></programlisting>
- <para>
- If your helper class has a <methodname>setView()</methodname> method, it will be
- called when the helper class is first instantiated, and passed the
- current view object. It is up to you to persist the object in your
- class, as well as determine how it should be accessed.
- </para>
- <para>
- If you are extending <classname>Zend_View_Helper_Abstract</classname>, you do
- not need to define this method, as it is defined for you.
- </para>
- </sect2>
- <sect2 id="zend.view.helpers.registering-concrete">
- <title>Registering Concrete Helpers</title>
- <para>
- Sometimes it is convenient to instantiate a view helper, and then register it with the
- view. As of version 1.10.0, this is now possible using the
- <methodname>registerHelper()</methodname> method, which expects two arguments: the
- helper object, and the name by which it will be registered.
- </para>
- <programlisting language="php"><![CDATA[
- $helper = new My_Helper_Foo();
- // ...do some configuration or dependency injection...
- $view->registerHelper($helper, 'foo');
- ]]></programlisting>
- <para>
- If the helper has a <methodname>setView()</methodname> method, the view object will call
- this and inject itself into the helper on registration.
- </para>
- <note>
- <title>Helper name should match a method</title>
- <para>
- The second argument to <methodname>registerHelper()</methodname> is the name of the
- helper. A corresponding method name should exist in the helper; otherwise,
- <classname>Zend_View</classname> will call a non-existent method when invoking the
- helper, raising a fatal <acronym>PHP</acronym> error.
- </para>
- </note>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|