Subversion Repositories web.active

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

<?php namespace ProcessWire;

/**
 * The Roles class serves as the $roles API variable. 
 * 
 * #pw-summary Provides management of all Role pages for access control. 
 *  
 * @method PageArray find($selector) Return the Role(s) matching the the given selector.
 * @method Role add($name) Add new Role with the given name and return it.
 * @method bool save(Role $role) Save given role.
 * @method bool delete(Role $role) Delete the given role.
 * @method array saveReady(Page $page) Hook called just before a Role is saved #pw-hooker
 * @method void saved(Page $page, array $changes = [], $values = []) Hook called after a role has been saved #pw-hooker
 * @method void added(Page $page) Hook called just after a Role is added #pw-hooker
 * @method void deleteReady(Page $page) Hook called before a Role is deleted #pw-hooker
 * @method void deleted(Page $page) Hook called after a Role is deleted #pw-hooker
 *
 */ 

class Roles extends PagesType {

    protected $guestRole = null;

    /**
     * Get the 'guest' role 
     * 
     * This is a performance optimized version of `$roles->get('guest')`.
     * 
     * #pw-internal
     * 
     * @return Role|NullPage|Page
     * @throws WireException
     * 
     */
    public function getGuestRole() {
        if($this->guestRole) return $this->guestRole; 
        $this->guestRole = parent::get((int) $this->wire('config')->guestUserRolePageID); 
        return $this->guestRole; 
    }

    /**
     * Get a Role by name, numeric ID or selector
     * 
     * @param string $selectorString Role name or selector 
     * @return Role|NullPage|null
     *
     */
    public function get($selectorString) {
        if($selectorString === 'guest') return $this->getGuestRole();
        return parent::get($selectorString);
    }
    
    /**
     * Save a Role
     *
     * #pw-group-manipulation
     *
     * @param Role|Page $page
     * @return bool True on success, false on failure
     * @throws WireException
     *
     */
    public function ___save(Page $page) {
        return parent::___save($page);
    }

    /**
     * Permanently delete a Role
     *
     * #pw-group-manipulation
     *
     * @param Role|Page $page Permission to delete
     * @param bool $recursive If set to true, then this will attempt to delete any pages below the Permission too.
     * @return bool True on success, false on failure
     * @throws WireException
     *
     */
    public function ___delete(Page $page, $recursive = false) {
        return parent::___delete($page, $recursive);
    }

    /**
     * Add a new Role with the given name and return it
     *
     * #pw-group-manipulation
     *
     * @param string $name Name of role you want to add, i.e. "hello-world"
     * @return Role|Page|NullPage Returns a Role page on success, or a NullPage on error
     *
     */
    public function ___add($name) {
        return parent::___add($name);
    }

    /**
     * Ensure that every role has at least 'page-view' permission
     * 
     * #pw-internal
     * 
     * @param Page $page
     *
     */
    protected function loaded(Page $page) {
        if(!$page->permissions->has("name=page-view")) {
            $page->permissions->add($this->wire('permissions')->get("name=page-view")); 
        }
    }
    
    /**
     * Hook called when a page and its data have been deleted
     *
     * #pw-internal
     *
     * @param Page $page
     *
     */
    public function ___deleted(Page $page) { 
        foreach($this->wire('templates') as $template) {
            /** @var Template $template */
            if(!$template->useRoles) continue;
            $template->removeRole($page, 'all'); 
            if($template->isChanged()) $template->save();
        }

        parent::___deleted($page);
    }
}