3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.4 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2013 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
29 * Redefine the upload action.
32 * @copyright CiviCRM LLC (c) 2004-2013
36 class CRM_Core_QuickForm_Action_Upload
extends CRM_Core_QuickForm_Action
{
39 * the array of uploaded file names
42 protected $_uploadNames;
45 * The directory to store the uploaded files
48 protected $_uploadDir;
53 * @param object $stateMachine reference to state machine object
54 * @param string $uploadDir directory to store the uploaded files
55 * @param array $uploadNames element names of the various uploadable files
59 */ function __construct(&$stateMachine, $uploadDir, $uploadNames) {
60 parent
::__construct($stateMachine);
62 $this->_uploadDir
= $uploadDir;
63 $this->_uploadNames
= $uploadNames;
67 * upload and move the file if valid to the uploaded directory
69 * @param object $page the CRM_Core_Form object
70 * @param object $data the QFC data container
71 * @param string $pageName the name of the page which index the data container with
72 * @param string $uploadName the name of the uploaded file
77 function upload(&$page, &$data, $pageName, $uploadName) {
78 // make sure uploadName exists in the QF array
79 // else we skip, CRM-3427
80 if (empty($uploadName) ||
81 !isset($page->_elementIndex
[$uploadName])
86 // get the element containing the upload
87 $element = &$page->getElement($uploadName);
88 if ('file' == $element->getType()) {
89 if ($element->isUploadedFile()) {
90 // rename the uploaded file with a unique number at the end
91 $value = $element->getValue();
93 $newName = CRM_Utils_File
::makeFileName($value['name']);
94 $status = $element->moveUploadedFile($this->_uploadDir
, $newName);
96 CRM_Core_Error
::statusBounce(ts('We could not move the uploaded file %1 to the upload directory %2. Please verify that the \'Temporary Files\' setting points to a valid path which is writable by your web server.', array(1 => $value['name'], 2 => $this->_uploadDir
)));
98 if (!empty($data['values'][$pageName][$uploadName]['name'])) {
99 @unlink
($this->_uploadDir
. $data['values'][$pageName][$uploadName]);
102 $data['values'][$pageName][$uploadName] = array(
103 'name' => $this->_uploadDir
. $newName,
104 'type' => $value['type'],
111 * Processes the request.
113 * @param object $page CRM_Core_Form the current form-page
114 * @param string $actionName Current action name, as one Action object can serve multiple actions
119 function perform(&$page, $actionName) {
120 // like in Action_Next
121 $page->isFormBuilt() or $page->buildForm();
123 // so this is a brain-seizure moment, so hang tight (real tight!)
124 // the above buildForm potentially changes the action function with different args
125 // so basically the rug might have been pulled from us, so we actually just check
126 // and potentially call the right one
127 // this allows standalong form uploads to work nicely
128 $page->controller
->_actions
['upload']->realPerform($page, $actionName);
131 function realPerform(&$page, $actionName) {
132 $pageName = $page->getAttribute('name');
133 $data = &$page->controller
->container();
134 $data['values'][$pageName] = $page->exportValues();
135 $data['valid'][$pageName] = $page->validate();
137 if (!$data['valid'][$pageName]) {
138 return $page->handle('display');
141 foreach ($this->_uploadNames
as $name) {
142 $this->upload($page, $data, $pageName, $name);
145 $state = &$this->_stateMachine
->getState($pageName);
147 return $page->handle('display');
150 // the page is valid, process it before we jump to the next state
151 $page->mainProcess();
153 // check if destination is set, if so goto destination
154 $destination = $this->_stateMachine
->getDestination();
156 $destination = urldecode($destination);
157 CRM_Utils_System
::redirect($destination);
160 return $state->handleNextState($page);