summaryrefslogblamecommitdiffstats
path: root/application/modules/user/controllers/GroupController.php
blob: 39053aecfdc1e53c889f2c31674ac1568b51ff42 (plain) (tree)
1
2
3
4
5
6
7
8
9



                                                         
                                      
                                            
                                           
                                             
                                       
                                     
                                    
                                           
                              
                        
 


                                                              







                                                                                               
 


                                                                                                           

                                                                        

                                                                    
                               




                                     

                                               
                                          















                                                                                           
 














                                                                                           
                                            




                                                                                                                              
                                                                    





                                                                                



                                   

                                              
                                          
                        














                                                                                                         

                                                                                                                     
                                                                                  
                                                                         


                                                                  
                                


















                                                                                                    
                                                                           
                                                                                           

                                                                                                    
                                                                           









                                                                                                    

                                                                        







                                                
                                   
                                                                             
                                                  
                        

                                                                


                                                                              

                                      
                                                                   

                               

                                                                                                                                                                                 






                                                                                                  
                                                                                
                                                                             
                                                                                        







                                                                                            
                                                                        


                                       
                                                  
         
 

                                    

                                                                                 
                                          
                        
                                                                
                                                                     


                                                                              
                 
                                                                                               
                                                  
 



                                                                         





                                                                                                      

                                                                                                    
                                  
                         





                                                                                                             
                   
 
                                                                                                        
                                                                                                      


                                                                                                 

                                                                                                                 

                                                                                  
                                                                            

                                                            


                                                            

                                                                                 
                                                                          









                                                                                                                                                                                         

                                 
                 








                                                                                                   



                                    

                                                  





















                                                                                                    
                                            
                                                                                                   
                        
                                                                                                          


                                                                                   


                                                                                                                       
                                                                                           


















                                                                                            

                                              
                                                  
 


                                                                


                                                                              










                                                                                    





                                                                                                                                                               
                                
                                                                        

                               


                                                   




                                           

                                                    
                                                  
                        












                                                                                                  
                                                                                                
                                                                 
                                                     
                             
                                                                                 
 
                                                        
 

                                                                        











                                                                                                    
 

                                                                          
                                                                   
 












                                                                                                                                                                                                  
                                 




















































































                                                                                                                                                

                 
 
<?php

class User_GroupController extends Zend_Controller_Action
{
	protected $groupMapper = null;
	protected $groupGroupsMapper = null;
	protected $membershipMapper = null;
	protected $groupRequestMapper = null;
	protected $personmapper = null;
	protected $rolemapper = null;
	protected $groupList = null;
	protected $userIDsNamespace = null;
	protected $membership;
	protected $page;

	public function init()
	{
		if (Zend_Auth::getInstance()->hasIdentity()) {
			$this->userIDsNamespace = Zend_Session::namespaceGet('userIDs');
			$this->groupMapper = new Application_Model_GroupMapper();
			$this->groupGroupsMapper = new Application_Model_GroupGroupsMapper();
			$this->membershipMapper = new Application_Model_MembershipMapper();
			$this->groupRequestMapper = new Application_Model_GroupRequestMapper();
			$this->personmapper = new Application_Model_PersonMapper();
			$this->rolemapper = new Application_Model_RoleMapper();
			$this->groupList = $this->groupMapper->fetchAll();

			$userIDsNamespace = Zend_Session::namespaceGet('userIDs');
			$this->membership = new Application_Model_Membership();
			$this->membershipMapper->find($userIDsNamespace['membershipID'],$this->membership);
			
			$this->page = $this->_request->getParam('page');
		} else {
			$this->_helper->redirector('login', 'auth');
			return;
		}
	}

	public function indexAction()
	{
		// ACL show overview
		if(!Pbs_Acl::checkRight('gso'))
		$this->_redirect('/user');
		
		$result = $this->_request->getParam('deleteresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('delete',$result);
		}
		$result = $this->_request->getParam('modifyresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('modify',$result);
		}
		$result = $this->_request->getParam('addresult');
		if($result != ""){
			$pbsNotifier = new Pbs_Notifier();
			$this->view->notification = $pbsNotifier->notify('create',$result);
		}

		$this->view->groupList = $this->groupList;

		// Search
		$search = $this->_request->getParam('search');
		$mySearch = new Pbs_Search();
		$mySearch->setSearchTerm($search);
		$mySearch->setModule('group');
		if($search != ''){
			$this->view->search = $mySearch->getSearchTerm();
			$this->view->groupList = $mySearch->search($this->view->groupList);
		}
		$this->view->searchform = $mySearch->searchForm();

		// Pagination
		$pagination = new Pbs_Pagination();
		$pagination->setPerPage(10);
		$pagination->setElement($this->view->groupList);
		$pagination->setRequestPage($this->_request->getParam('page'));
		$pagination->setPageUrl('/user/group/index'.((isset($this->view->search))?'/search/'.$this->view->search:''));

		$this->view->groupList = $pagination->getElements();
		$this->view->pagination = $pagination->pagination();
		$this->view->page 		= $pagination->getRequestPage();
		$this->view->userIDsNamespace = $this->userIDsNamespace;
	}

	public function searchAction(){
		$this->_redirect('/user/group/index/search/'.($_GET['search']));
	}

	public function addAction()
	{
		// ACL create new group
		if(!Pbs_Acl::checkRight('gc'))
		$this->_redirect('/user');
			
		if (!isset($_POST["add"])){
			$addForm = new user_Form_GroupAdd(array('grouplist' => $this->groupList));
		} else {
			$addForm = new user_Form_GroupAdd(array('grouplist' => $this->groupList),$_POST);

			if ($addForm->isValid($_POST)) {
				$group = new Application_Model_Group($_POST);
				try {
					$this->groupMapper->save($group);
				} catch(Zend_Exception $e)
				{
					echo "Caught exception: " . get_class($e) . "<br/>";
					echo "Message: " . $e->getMessage() . "<br/>";
					return;
				}
				$groupID = $this->groupMapper->getDbTable()->getDefaultAdapter()->lastInsertId();
				$membership = $this->membershipMapper->find($this->userIDsNamespace['membershipID']);
				// setting the actually used role in the new group
				$roleID = $this->membership->getRoleID();
				$membership->setID();
				$membership->setGroupID($groupID);
				$membership->setRoleID($roleID);
				
				try {
					$this->membershipMapper->save($membership);
				} catch(Zend_Exception $e)
				{
					echo "Caught exception: " . get_class($e) . "<br/>";
					echo "Message: " . $e->getMessage() . "<br/>";
					return;
				}
				foreach($rightroleslist as $rightroles) {
					$rightroles->setRoleID($roleID);
					try {
						$rightrolesMapper->save($rightroles);
					} catch(Zend_Exception $e)
					{
						echo "Caught exception: " . get_class($e) . "<br/>";
						echo "Message: " . $e->getMessage() . "<br/>";
						return;
					}
				}
				if($_POST['superordinatedGroupID'] != -1) {
					$groupgroups = new Application_Model_GroupGroups();
					#print_a($this->membership->getGroupID(),$this->membership);
					$groupgroups->setParentID($this->membership->getGroupID());
					$groupgroups->setGroupID($groupID);
					try {
						$this->groupGroupsMapper->save($groupgroups);
					} catch(Zend_Exception $e)
					{
						echo "Caught exception: " . get_class($e) . "<br/>";
						echo "Message: " . $e->getMessage() . "<br/>";
						return;
					}

				}
				$this->_helper->redirector('', 'group');
				return;
			}
		}

		$this->view->addForm = $addForm;
	}

	public function editAction()
	{
		// ACL edit a group
		if(!Pbs_Acl::checkRight('geo') && !Pbs_Acl::checkRight('ge'))
			$this->_redirect('/user');
			
		$groupID = $this->_request->getParam('groupID');
		if(!isset($groupID)) {
			if(count($this->userIDsNamespace) > 0) {
				$groupID = $this->userIDsNamespace['groupID'];
			}
		}
		if(!isset($groupID)) {
			$this->_helper->redirector('add', 'group');
			return;
		}
		if((!Pbs_Acl::checkRight('geo') && $groupID == $this->membership->getGroupID()) || ( !Pbs_Acl::checkRight('ge') && $groupID != $this->membership->getGroupID() ))
			$this->_redirect('/user/group/index/page/'.$this->page.'/deleteresult/forbidden');
		if (!isset($_POST["save"])){
			$group = $this->groupMapper->find($groupID);
			$_POST['title'] = $group->getTitle();
			$_POST['description'] = $group->getDescription();
			$editForm = new user_Form_GroupEdit(array('groupID' => $groupID));
		} else {
			$editForm = new user_Form_GroupEdit(array('groupID' => $groupID), $_POST);
			if ($editForm->isValid($_POST)) {			
				$group = new Application_Model_Group($_POST);
				$group->setID($groupID);				
				try {
					$this->groupMapper->save($group);
				} catch(Zend_Exception $e)
				{
					echo "Caught exception: " . get_class($e) . "<br/>";
					echo "Message: " . $e->getMessage() . "<br/>";
					return;
				}
				$this->_helper->redirector('', 'group');
				return;
			}
		}
		$this->view->editForm = $editForm;
	}

	public function showAction()
	{
		// ACL create new group
		if(!Pbs_Acl::checkRight('gsdo') && !Pbs_Acl::checkRight('gsdog'))
		$this->_redirect('/user');
			
		$groupID = $this->_request->getParam('groupID');
		if($groupID == '' || !Pbs_Acl::checkRight('gsdog')) {
			if(count($this->userIDsNamespace) > 0) {
				$groupID = $this->userIDsNamespace['groupID'];
			}
		}
		if($groupID == $this->membership->getGroupID() && !Pbs_Acl::checkRight('gsdo'))
			$this->_redirect('/user');

		$this->view->usergroup = $this->membership->getGroupID();
		$this->view->requestgroup = $groupID;
		// ACL is he allowed to see the requests of a group ?
		// TODO: THERE IS NO RIGHT TO EDIT A GROUP
		# if(Pbs_Acl::checkRight('')){
		$groupRequests = $this->groupRequestMapper->findBy(array('groupID' => $groupID),true);
		if(isset($groupRequests)) {
			foreach($groupRequests as $groupRequest) {
				$person = $this->personmapper->find($groupRequest['personID']);
				$groupRequestList[] = array(
						'grouprequestID' => $groupRequest['grouprequestID'],
						'person' => $person
				);
			}
			if(is_array($groupRequestList)) {
				$this->view->groupRequestList = $groupRequestList;
			}
			// TODO: expand with al inherit roles
			$this->view->roleList = $this->rolemapper->findBy(array('groupID' => $groupID),true);
		}
		# }

		if(Pbs_Acl::checkRight('gsmg') || Pbs_Acl::checkRight('gsmgo')){			
			$members = $this->membershipMapper->findBy(array('groupID' => $groupID),true);
			if(isset($members)) {
				foreach($members as $member) {
					$person = $this->personmapper->find($member['personID']);
					$membership_tmp = $this->membershipMapper->find($member['membershipID']);
					$role = $this->rolemapper->find($membership_tmp->getRoleID());
					$membersList[] = array(
					'membershipID' => $member['membershipID'],
					'suspended' => $member['suspended'],
					'person' => $person,
					'role' => $role
					);
				}
				if(is_array($membersList)) {
					// Member Pagination
					$memberPagination = new Pbs_Pagination();
					$memberPagination->setPerPage(10);
					$memberPagination->setElement($membersList);
					$memberPagination->setRequestPage($this->_request->getParam('page'));
					if($this->_request->getParam('groupID')) {
						$memberPagination->setPageUrl('/user/group/show/groupID/' . $groupID . ((isset($this->view->search))?'/search/'.$this->view->search:''));
					} else {
						$memberPagination->setPageUrl('/user/group/show'.((isset($this->view->search))?'/search/'.$this->view->search:''));
					}
					$this->view->membersList = $memberPagination->getElements();
					$this->view->memberPagination = $memberPagination->pagination($pageurl);
					$this->view->page 		= $memberPagination->getRequestPage();
				}
			}
		}
		$groupgroups = $this->groupGroupsMapper->findBy(array('groupID' => $groupID),true);
		if(is_object($groupgroups)) {
			$parentGroup = $this->groupMapper->find($groupgroups->getParentID());
			$this->view->$parentGroup = $parentGroup;
		}
		$group = $this->groupMapper->find($groupID);
		$this->view->userIDsNamespace = $this->userIDsNamespace;
		$this->view->group = $group;
		$this->view->groupID = $groupID;
	}

	public function linkAction()
	{
		if(!Pbs_Acl::checkRight('glk'))
			$this->_redirect('/user');
			
		$linkableGroups = $this->groupList;
		$groupGroupsMapper = new Application_Model_GroupGroupsMapper();	
		$childs = array();
		$parents = array();	
		$childs = 	$groupGroupsMapper->getChildGroups($this->membership->getGroupID());
		$parents = $groupGroupsMapper->getParentGroups($this->membership->getGroupID());
		#print_a($childs,$parents);
		foreach($linkableGroups as $i => $group){
			#print_a($group->getID());
			if(isset($childs[1]) && in_array($group->getID(),$childs[1])){
				unset($linkableGroups[$i]);
			}
			if(count($parents) > 0){
				foreach($parents as $d){
					if(in_array($group->getID(),$d)){
						unset($linkableGroups[$i]);
					}
				}
			}
		}
		#print_a($linkableGroups);
		if (!isset($_POST["link"])){
			$linkForm = new user_Form_GroupLink(array('grouplist' => $linkableGroups));
		} else {
			$linkForm = new user_Form_GroupLink(array('grouplist' => $linkableGroups),$_POST);

			if ($linkForm->isValid($_POST)) {
				$groupgroups = new Application_Model_GroupGroups();
				if($_POST['superordinatedGroupID'] == $_POST['groupID'] || $_POST['groupID'] == 1) {
					$this->_redirect('/user/group/index/page/'.$this->page.'/addresult/forbidden');
				}
				$groupgroups->setParentID($this->membership->getGroupID());
				$groupgroups->setGroupID($_POST['groupID']);
				try {
					$this->groupGroupsMapper->save($groupgroups);
				} catch(Zend_Exception $e)
				{
					echo "Caught exception: " . get_class($e) . "<br/>";
					echo "Message: " . $e->getMessage() . "<br/>";
					return;
				}
				$this->_helper->redirector('', 'group');
				return;
			}
		}

		$this->view->linkForm = $linkForm;
	}

	public function deleteAction()
	{
		// ACL delete a group
		if(!Pbs_Acl::checkRight('gd'))
			$this->_redirect('/user');

		$this->_helper->viewRenderer->setNoRender();
		$groupID = $this->_request->getParam('groupID');
		if(!isset($groupID)) {
			if(count($this->userIDsNamespace) > 0) {
				$groupID = $this->userIDsNamespace['groupID'];
			}
		}
		if (isset($groupID)){
			$group = $this->groupMapper->find($groupID);
			try {
				$this->groupMapper->delete($group);
			} catch(Zend_Exception $e)
			{
				echo "Caught exception: " . get_class($e) . "<br/>";
				echo "Message: " . $e->getMessage() . "<br/>";
				return;
			}
			if($_SERVER['HTTP_REFERER']) {
				if(strpos($_SERVER['HTTP_REFERER'], '/user/group/show') !== false && strpos($_SERVER['HTTP_REFERER'], '/groupID/') === false) {
					$this->_helper->redirector('changemembership', 'person');
				} else {
					$this->_helper->redirector('', 'group');
				}
			} else {
				$this->_helper->redirector('', 'group');
			}
			return;
		} else {
			$this->_redirect('/user/');
			return;
		}
	}

	public function grantpersonAction()
	{
		// ACL grant a membership to request
		if(!Pbs_Acl::checkRight('gam'))
			$this->_redirect('/user');
			
		$this->_helper->viewRenderer->setNoRender();
		if(isset($_POST['grouprequestID']) && isset($_POST['roleID'])) {
			$groupRequest = $this->groupRequestMapper->find($_POST['grouprequestID']);
			try {
				$this->groupRequestMapper->delete($groupRequest);
			} catch(Zend_Exception $e)
			{
				echo "Caught exception: " . get_class($e) . "<br/>";
				echo "Message: " . $e->getMessage() . "<br/>";
				return;
			}
			$membership = new Application_Model_Membership();
			$membership->setGroupID($groupRequest->getGroupID());
			$membership->setPersonID($groupRequest->getPersonID());			
			$membership->setRoleID($_POST['roleID']);
			$membership->setSuspended(0);
			try {
				$id = $this->membershipMapper->save($membership);

				$membership->setID($id);

				$newMember = new Pbs_NewMember();
				$newMember->createDefaults($membership);
			} catch(Zend_Exception $e)
			{
				echo "Caught exception: " . get_class($e) . "<br/>";
				echo "Message: " . $e->getMessage() . "<br/>";
				return;
			}
			$this->_redirect("/user/group/show/groupID/" . $groupRequest->getGroupID());
		}
	}

	public function revokepersonAction()
	{

		$this->_helper->viewRenderer->setNoRender();
		$membershipID = $this->_request->getParam('membershipID');
		$rr = $this->membershipMapper->find($membershipID);

		if(($rr->getGroupID() == $this->membership->getGroupID && Pbs_Acl::checkRight('gdmo') ) || ( $rr->getGroupID() != $this->membership->getGroupID && Pbs_Acl::checkRight('gdmog'))){
			if(isset($membershipID)) {
				$membership = $this->membershipMapper->find($membershipID);
				if(isset($membership)) {
					try {
						$this->membershipMapper->delete($membership);
					} catch(Zend_Exception $e)
					{
						echo "Caught exception: " . get_class($e) . "<br/>";
						echo "Message: " . $e->getMessage() . "<br/>";
						return;
					}
					$this->_redirect("/user/group/show/groupID/" . $membership->getGroupID());
				}
			}
		}
	}

	public function declineAction()
	{
		if(!Pbs_Acl::checkRight('gdm')) {
			$this->_redirect('/user');
		}
		$this->_helper->viewRenderer->setNoRender();
		$grouprequestID = $this->_request->getParam('grouprequestID');
		if(isset($grouprequestID)) {
			$groupRequest = $this->groupRequestMapper->find($grouprequestID);
			if($groupRequest->getGroupID() != $this->userIDsNamespace['groupID']) {
				$pbsNotifier = new Pbs_Notifier();
				$this->view->notification = $pbsNotifier->notify('Not allowed to decline this grouprequest', 'forbidden');
				return;
			}
			try {
				$this->groupRequestMapper->delete($groupRequest);
			} catch(Zend_Exception $e)
			{
				echo "Caught exception: " . get_class($e) . "<br/>";
				echo "Message: " . $e->getMessage() . "<br/>";
				return;
			}
			$this->_redirect("/user/group/show/groupID");
		}
	}

	public function suspendmembershipAction()
	{
		if(!Pbs_Acl::checkRight('gsm')) {
			$this->_redirect('/user');
		}
		$this->_helper->viewRenderer->setNoRender();
		$membershipID = $this->_request->getParam('membershipID');
		if(isset($membershipID)) {
			$membership = $this->membershipMapper->find($membershipID);
			$membership->setSuspended(1);
			if(isset($membership)) {
				if($membership->getGroupID() != $this->userIDsNamespace['groupID']) {
					$pbsNotifier = new Pbs_Notifier();
					$this->view->notification = $pbsNotifier->notify('Not allowed to suspend this membership', 'forbidden');
					return;
				}
				try {
					$this->membershipMapper->save($membership);
				} catch(Zend_Exception $e)
				{
					echo "Caught exception: " . get_class($e) . "<br/>";
					echo "Message: " . $e->getMessage() . "<br/>";
					return;
				}
				$this->_redirect("/user/group/show/");
			}
		}
	}

	public function resumemembershipAction()
	{
		if(!Pbs_Acl::checkRight('gsm')) {
			$this->_redirect('/user');
		}
		$this->_helper->viewRenderer->setNoRender();
		$membershipID = $this->_request->getParam('membershipID');
		if(isset($membershipID)) {
			$membership = $this->membershipMapper->find($membershipID);
			$membership->setSuspended(0);
			if(isset($membership)) {
				if($membership->getGroupID() != $this->userIDsNamespace['groupID']) {
					$pbsNotifier = new Pbs_Notifier();
					$this->view->notification = $pbsNotifier->notify('Not allowed to resume this membership', 'forbidden');
					return;
				}
				try {
					$this->membershipMapper->save($membership);
				} catch(Zend_Exception $e)
				{
					echo "Caught exception: " . get_class($e) . "<br/>";
					echo "Message: " . $e->getMessage() . "<br/>";
					return;
				}
				$this->_redirect("/user/group/show/");
			}
		}
	}
}