I haven't had a chance to fully explore this use case, but I'll throw
out some pseudo code that might get the wheels turning.
Assuming your models might look like this:
class User implements Zend_Acl_Role_Interface {
...
public function getRoleId()
{
return $this->role; // or whatever logic to return roleid
}
}
you could then build an Acl as normal, this would describe which roles
can see which parts of the navigation.
$acl = new Zend_Acl( ... )
You could first look at the integration points that are shipped with
Zend_Nav helper:
http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial.navigation.acl
I think it might do everything you need :)
-ralph
J DeBord wrote:
I would like to display navigation based on/ who/ you are. Here is what
I've done in a view_helper, though it would be great to integrate this
into my Acl since I'm checking user roles against it every request already.
Ralph, could you elaborate a bit on : "I would probably implement the
Role & Resource_Interfaces on my models, and do the acl checks.
You could also do some kind of view iteration of the navigation object
and then pass data into a custom built ACL, I would be interested to see
if that kind of solution had merit."
Thanks a lot. It is a huge benefit having access to some of the guys at
Zend. Makes it hard to think about coding anything else.
<?php
class Zend_View_Helper_Navigation extends Zend_View_Helper_Abstract {
public function navigation() {
if(Zend_Auth::getInstance()->hasIdentity()) {
$role = Zend_Auth::getInstance()->getIdentity()->role;
} else {
$role = 'guest';
}
switch ($role) {
case 'guest' :
return null;
break;
case 'user' :
case 'admin' :
$ctrl = Zend_Controller_Front::getInstance();
$controller = $ctrl->getRequest()->getControllerName();
return $this->view->partial('navigation.phtml',
array('controller', $controller));
break;
default:
return null;
}
}
}
On Tue, Jul 14, 2009 at 7:40 PM, Ralph Schindler
<[email protected] <mailto:[email protected]>> wrote:
The question becomes what do you want to hide/show navigation based on?
Is it based on where you currently are in an application (which
controller/action/module?)
Or is it based on who you are? User/Group information? If its the
latter, I would probably implement the Role & Resource_Interfaces on
my models, and do the acl checks.
You could also do some kind of view iteration of the navigation
object and then pass data into a custom built ACL, I would be
interested to see if that kind of solution had merit.
-ralph
J DeBord wrote:
Ahh, I did not realize there was a Zend_View_Helper_Navigation.
Thus when I instantiate my Acl class it in the bootstrap it
loads Zend_View_Helper_Navigation from the library/Zend folder,
while in my layout script it is loading from my
application/views/helpers folder. Since I prefix my custom view
helpers with Zend_View_Helper and throw them into the /helpers
directory, it works in the view, but in the bootstrap, only the
library/Zend folder is being searched.
How should I get around this? Or would it just be best to rename
/my/ Navigation view helper?
Also, and perhpas more importantly, how can an Acl class even
know about what is in the application/views/helpers folder??? Hmm.
Nice catch Ralph. Thanks.
J
On Tue, Jul 14, 2009 at 5:41 PM, Ralph Schindler
<[email protected] <mailto:[email protected]>
<mailto:[email protected]
<mailto:[email protected]>>> wrote:
Hmm, are you sure that you are loading the correct object?
Where is
this code located? I notice that it implements
Zend_Acl_Resource_Interface, but there is already a class called
Zend_View_Helper_Navigation being loaded by the framework
already right?
Where is your custom code being stored?
-ralph
J DeBord wrote:
I'm experimenting with Zend_Acl and even though what I am
doing
may not be the best way to go about hiding/displaying
navigation, the error message below does not appear to be
correct:*
Catchable fatal error*: Argument 1 passed to Zend_Acl::add()
must implement interface Zend_Acl_Resource_Interface,
instance
of Zend_View_Helper_Navigation given
As you can see, Zend_View_Helper_Navigation does indeed
implement Zend_Acl_Resource_Interface
What do you guys think?
<?php
class Zend_View_Helper_Navigation extends
Zend_View_Helper_Abstract implements
Zend_Acl_Resource_Interface {
protected $resourceId = 'navigation';
public function navigation() {
return $this->view->partial('navigation.phtml',
array());
}
/**
* (non-PHPdoc)
* @see
library/Zend/Acl/Resource/Zend_Acl_Resource_Interface#getResourceId()
*/
public function getResourceId() {
return $this->_resourceId;
}
}