/**
	 * @see	wcf\system\clipboard\action\IClipboardAction::execute()
	 */
	public function execute(array $objects, $actionName) {
		if (!in_array($actionName, $this->supportedActions)) {
			throw new SystemException("Unknown clipboard action '".$actionName."'");
		}
		
		$this->objects = $objects;
		
		$item = new ClipboardEditorItem();
		$item->setName($this->getTypeName().'.'.$actionName);
		
		// set action class-related data
		if (in_array($actionName, $this->actionClassActions)) {
			$item->addParameter('actionName', $actionName);
			$item->addParameter('className', $this->getClassName());
		}
		
		// validate objects if relevant method exists and set valid object ids
		$methodName = 'validate'.ucfirst($actionName);
		if (method_exists($this, $methodName)) {
			$objectIDs = $this->$methodName();
			if (empty($objectIDs)) {
				return null;
			}
			
			$item->addParameter('objectIDs', $objectIDs);
		}
		
		return $item;
	}
 /**
  * @see	wcf\system\clipboard\action\IClipboardAction::execute()
  */
 public function execute(array $objects, $actionName, $typeData = array())
 {
     $item = new ClipboardEditorItem();
     // handle actions
     switch ($actionName) {
         case 'assignToGroup':
             $item->setName('user.assignToGroup');
             $item->setURL(LinkHandler::getInstance()->getLink('UserAssignToGroup'));
             break;
         case 'delete':
             $userIDs = $this->validateDelete($objects);
             if (!count($userIDs)) {
                 return null;
             }
             $item->addInternalData('confirmMessage', WCF::getLanguage()->getDynamicVariable('wcf.clipboard.item.user.delete.confirmMessage', array('count' => count($userIDs))));
             $item->addParameter('actionName', 'delete');
             $item->addParameter('className', 'wcf\\data\\user\\UserAction');
             $item->addParameter('objectIDs', $userIDs);
             $item->setName('user.delete');
             break;
         case 'exportMailAddress':
             $item->setName('user.exportMailAddress');
             $item->setURL(LinkHandler::getInstance()->getLink('UserEmailAddressExport'));
             break;
         case 'sendMail':
             $item->setName('user.sendMail');
             $item->setURL(LinkHandler::getInstance()->getLink('UserMail'));
             break;
         default:
             throw new SystemException("action '" . $actionName . "' is invalid");
             break;
     }
     return $item;
 }
Esempio n. 3
0
	/**
	 * Returns items for clipboard editor.
	 * 
	 * @param	string		$page
	 * @param	array		$containerData
	 * @return	array<array>
	 */
	public function getEditorItems($page, $containerData) {
		// ignore unknown pages
		if (!isset($this->pageCache[$page])) return null;
		
		// get objects
		$this->loadMarkedItems();
		if (empty($this->markedItems)) return null;
		
		// fetch action ids
		$this->loadActionCache();
		$actionIDs = array();
		foreach ($this->pageCache[$page] as $actionID) {
			if (isset($this->actionCache[$actionID])) {
				$actionIDs[] = $actionID;
			}
		}
		$actionIDs = array_unique($actionIDs);
		
		// load actions
		$actions = array();
		foreach ($actionIDs as $actionID) {
			$actionClassName = $this->actionCache[$actionID]->actionClassName;
			$actionName = $this->actionCache[$actionID]->actionName;
			if (!isset($actions[$actionClassName])) {
				// validate class
				if (!ClassUtil::isInstanceOf($actionClassName, 'wcf\system\clipboard\action\IClipboardAction')) {
					throw new SystemException("'".$actionClassName."' does not implement 'wcf\system\clipboard\action\IClipboardAction'");
				}
				
				$actions[$actionClassName] = array(
					'actions' => array(),
					'object' => new $actionClassName()
				);
			}
			
			$actions[$actionClassName]['actions'][] = $actionName;
		}
		
		// execute actions
		$editorData = array();
		foreach ($actions as $actionData) {
			// get accepted objects
			$typeName = $actionData['object']->getTypeName();
			if (!isset($this->markedItems[$typeName]) || empty($this->markedItems[$typeName])) continue;
			
			$typeData = array();
			if (isset($containerData[$typeName])) {
				$typeData = $containerData[$typeName];
			}
			
			// filter objects by type data
			$objects = $actionData['object']->filterObjects($this->markedItems[$typeName], $typeData);
			if (empty($objects)) continue;
			
			$editorData[$typeName] = array(
				'label' => $actionData['object']->getEditorLabel($objects),
				'items' => array()
			);
			
			foreach ($actionData['actions'] as $action) {
				$data = $actionData['object']->execute($objects, $action);
				if ($data === null) {
					continue;
				}
				
				$editorData[$typeName]['items'][$action] = $data;
			}
			
			// append 'unmark all' item
			if (!ClassUtil::isInstanceOf($actionData['object']->getClassName(), 'wcf\data\IClipboardAction')) {
				throw new SystemException("'".$actionData['object']->getClassName()."' does not implement 'wcf\data\IClipboardAction'");
			}
			
			$unmarkAll = new ClipboardEditorItem();
			$unmarkAll->setName('unmarkAll');
			$unmarkAll->addParameter('actionName', 'unmarkAll');
			$unmarkAll->addParameter('className', $actionData['object']->getClassName());
			
			$editorData[$typeName]['items'][] = $unmarkAll;
		}
		
		return $editorData;
	}