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;
                  }

               }



Reply via email to