Matt
Thanks for your patience and persistance :)
That indeed worked. I utilised the first method. As I am basically
creating an area for global helpers - actually mostly for Facebook
Common Tasks such as there Form rendering and other components such as
the Wall.
Is there a repository of Helpers that other users have created? i would
find this very helpful to either draw from or submit too - this kind of
thing would not need to be monitored very much as the code snippets
would be small and isolated I would think in most cases.
Again thank you
Cheers
Ian
Matthew Weier O'Phinney wrote:
-- Ian Warner <[EMAIL PROTECTED]> wrote
(on Monday, 21 January 2008, 12:24 PM +0000):
However still no joy, this is my stack output for the view - and I assume
if the new path was registered correctly then it would show up in here
<snip>
Registering the path - tried in controller and a few other places.
$view = new Zend_View();
// Add /other/path/to/helpers with class prefix 'Your_View_Helper'
$view->addHelperPath('D:\AWebEnvironment\htdocs\Site_Template\library\Common\Components',
'Common_Components');
My helper class taken from the example.
<?php
class Common_Components_SpecialPurpose
{
protected $_count = 0;
public function specialPurpose()
{
$this->_count++;
$output = "I have you {$this->_count} time(s).";
return htmlspecialchars($output);
}
}
The above looks good...
Ok having debugged the View files in the Framework it seems that I am
instantiating the View class adding the helpers - below is an output of
_path
<snip -- path looked good>
but then the view is getting instantiated again somewhere and killing my
adding paths with its own SetPath
Same output of _path
[helper] => Array
(
[0] => Array
(
[prefix] => Zend_View_Helper_
[dir] => sites\admintrianglesolutions\views\helpers\
)
[1] => Array
(
[prefix] => Zend_View_Helper_
[dir] =>
D:\AWebEnvironment\ZendFramework-1.0.3\library\Zend\View\Helper\
)
)
So its basicalyl getting overwritten later on. Should this happen?
I am not calling new Zend_View anywhere else in my code - so it must be
when the viewRenderer is automatically instantiated
I see what's going on. Yes, the ViewRenderer instantiates its own view
unless it is provided one -- so if you want to add a global helper path,
you need to tell the ViewRenderer. (The view object is not a singleton,
so if you set the helper path on one instance, it doesn't propagate to
other instances.)
You have a couple of ways of doing this. In your bootstrap, you can
create your view object, and inject it into the ViewRenderer:
$view = new Zend_View();
$view->addHelperPath('path/to/Common/Components/', 'Common_Components');
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')
->setView($view);
(I broke the last statement over two lines to make it readable.)
The next option is to take the view out of the ViewRenderer and alter
it. The method for doing so varies, based on whether the ViewRenderer
will have initialized the view object or not. The ViewRenderer first
initializes its view when its internal init() method is called -- which
is triggered the first time a controller is dispatched.
So, let's say you want to do the above in an early running plugin -- in
which case the view won't have been initialized. Here's one example of
how that might work:
class ViewPlugin extends Zend_Controller_Plugin_Abstract
{
public function dispatchLoopStartup(Zend_Controller_Request_Abstract
$request)
{
$viewRenderer =
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')
$viewRenderer->initView();
$viewRenderer->view->addHelperPath(
'path/to/Common/Components',
'Common_Components');
}
}
If you wanted to set it from within a controller or an action helper,
the view will have been initialized, and you can just do the following:
$viewRenderer =
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')
$viewRenderer->view->addHelperPath(
'path/to/Common/Components',
'Common_Components');
Hope that helps.
Matthew Weier O'Phinney wrote:
-- Ian Warner <[EMAIL PROTECTED]> wrote
(on Sunday, 20 January 2008, 07:54 PM +0000):
$view = new Zend_View();
// Add /other/path/to/helpers with class prefix
'Your_View_Helper'
$view->setHelperPath('D:\AWebEnvironment\htdocs\Site_Template\library\Zend\View\Helper',
'Common_Components');
I have tried the above and also with addHelperPath and still no luck -
tried this on my ubuntu machine also.
whats the naming convention for helpers, the docs dont give any advice on
what the actual file name should be
Not to be mean, but they *do* spell it out, several times:
http://framework.zend.com/manual/en/zend.view.helpers.html
Second paragraph: "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:
Zend_View_Helper_FooBar."
And further in that same page:
37.4.3. Writing Custom Helpers
Writing custom helpers is easy; just follow these rules:
* The class name must, at the very minimum, end with the
helper name itself, using CamelCaps. 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 addHelperPath() or setHelperPath()). There's also one
other place it's mentioned, in the section detailing
helper paths.
So, in your example, if you have the prefix "Common_Components" as your
view helper class prefix, and your library code is in
"D:\AWebEnvironment\htdocs\Site_Template\Library\', the most logical
place to put these helpers would be in the "Common\Components\"
subdirectory of that location, and you would then add the following path
to your view helper paths:
$view->addHelperPath('D:\AWebEnvironment\htdocs\Site_Template\Library\Common\Components\',
'Common_Components');
If you then have a "foo" helper, it would be in the 'Foo.php'
file in that directory, and have the class name Common_Components_Foo.
Hope that helps.
Matthew Weier O'Phinney wrote:
-- Ian Warner <[EMAIL PROTECTED]> wrote
(on Sunday, 20 January 2008, 01:00 PM +0000):
Sorry I should have said that I tried that also.
Still no luck
I use code like the following code regularly:
$view->addHelperPath('path/to/My/View/Helper', 'My_View_Helper');
and it works fine. Can you send me the code you used when trying
addHelperPath()?
Pieter wrote:
Hi Ian,
I think that you should use the $view->addHelperPath() function.
Regards,
Pieter Kokx
Ian Warner schreef:
hi
I am having real trouble trying to set helper paths.
I assume I can place this anywhere in my code structure - I have
tried in bootstrap / controllers and a few other places
Pathing - I think I have this correct below though I although I have
changed this any which way but loose.
$view = new Zend_View();
// Add /other/path/to/helpers with class prefix
'Your_View_Helper'
$view->setHelperPath('D:\AWebEnvironment\htdocs\Site_Template\library\Zend\View\Helper',
'Common_Components');
I have this when I throw the stack in the view.
[_path:private] => Array
(
[script] => Array
(
[0] =>
sites\admintrianglesolutions\views\scripts\
)
[helper] => Array
(
[0] => Array
(
[prefix] => Zend_View_Helper_
[dir] =>
sites\admintrianglesolutions\views\helpers\
)
[1] => Array
(
[prefix] => Zend_View_Helper_
[dir] =>
D:\AWebEnvironment\ZendFramework-1.0.3\library\Zend\View\Helper\
)
)