CRM-14689 fix - Configure contribution page: On Behalf profile notice and Edit /...
[civicrm-core.git] / CRM / Contribute / Form / ManagePremiums.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
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. |
13 | |
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. |
18 | |
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 +--------------------------------------------------------------------+
26 */
27
28 /**
29 *
30 * @package CRM
31 * @copyright CiviCRM LLC (c) 2004-2014
32 * $Id$
33 *
34 */
35
36 /**
37 * This class generates form components for Premiums
38 *
39 */
40 class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
41
42 /**
43 * Function to pre process the form
44 *
45 * @access public
46 *
47 * @return void
48 */
49 public function preProcess() {
50 parent::preProcess();
51 }
52
53 /**
54 * This function sets the default values for the form. Manage Premiums that in edit/view mode
55 * the default values are retrieved from the database
56 *
57 * @access public
58 *
59 * @return void
60 */
61 function setDefaultValues() {
62 $defaults = parent::setDefaultValues();
63 if ($this->_id) {
64 $params = array('id' => $this->_id);
65 CRM_Contribute_BAO_ManagePremiums::retrieve($params, $tempDefaults);
66 $imageUrl = (isset($tempDefaults['image'])) ? $tempDefaults['image'] : "";
67 if (isset($tempDefaults['image']) && isset($tempDefaults['thumbnail'])) {
68 $defaults['imageUrl'] = $tempDefaults['image'];
69 $defaults['thumbnailUrl'] = $tempDefaults['thumbnail'];
70 $defaults['imageOption'] = 'thumbnail';
71 // assign thumbnailUrl to template so we can display current image in update mode
72 $this->assign('thumbnailUrl', $defaults['thumbnailUrl']);
73 }
74 else {
75 $defaults['imageOption'] = 'noImage';
76 }
77 if (isset($tempDefaults['thumbnail']) && isset($tempDefaults['image'])) {
78 $this->assign('thumbURL', $tempDefaults['thumbnail']);
79 $this->assign('imageURL', $tempDefaults['image']);
80 }
81 if (isset($tempDefaults['period_type'])) {
82 $this->assign('showSubscriptions', TRUE);
83 }
84 }
85
86 return $defaults;
87 }
88
89 /**
90 * Function to build the form
91 *
92 * @return void
93 * @access public
94 */
95 public function buildQuickForm() {
96 //parent::buildQuickForm( );
97
98 if ($this->_action & CRM_Core_Action::PREVIEW) {
99 CRM_Contribute_BAO_Premium::buildPremiumPreviewBlock($this, $this->_id);
100
101 $this->addButtons(array(
102 array(
103 'type' => 'next',
104 'name' => ts('Done with Preview'),
105 'isDefault' => TRUE,
106 ),
107 )
108 );
109
110 return;
111 }
112
113 if ($this->_action & CRM_Core_Action::DELETE) {
114 $this->addButtons(array(
115 array(
116 'type' => 'next',
117 'name' => ts('Delete'),
118 'isDefault' => TRUE,
119 ),
120 array(
121 'type' => 'cancel',
122 'name' => ts('Cancel'),
123 ),
124 )
125 );
126 return;
127 }
128
129 $this->applyFilter('__ALL__', 'trim');
130 $this->add('text', 'name', ts('Name'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'name'), TRUE);
131 $this->addRule('name', ts('A product with this name already exists. Please select another name.'), 'objectExists', array('CRM_Contribute_DAO_Product', $this->_id));
132 $this->add('text', 'sku', ts('SKU'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'sku'));
133
134 $this->add('textarea', 'description', ts('Description'), 'rows=3, cols=60');
135
136 $image['image'] = $this->createElement('radio', NULL, NULL, ts('Upload from my computer'), 'image', 'onclick="add_upload_file_block(\'image\');');
137 $image['thumbnail'] = $this->createElement('radio', NULL, NULL, ts('Display image and thumbnail from these locations on the web:'), 'thumbnail', 'onclick="add_upload_file_block(\'thumbnail\');');
138 $image['default_image'] = $this->createElement('radio', NULL, NULL, ts('Use default image'), 'default_image', 'onclick="add_upload_file_block(\'default\');');
139 $image['noImage'] = $this->createElement('radio', NULL, NULL, ts('Do not display an image'), 'noImage', 'onclick="add_upload_file_block(\'noImage\');');
140
141 $this->addGroup($image, 'imageOption', ts('Premium Image'));
142 $this->addRule('imageOption', ts('Please select an option for the premium image.'), 'required');
143
144 $this->addElement('text', 'imageUrl', ts('Image URL'));
145 $this->addElement('text', 'thumbnailUrl', ts('Thumbnail URL'));
146
147 $this->add('file', 'uploadFile', ts('Image File Name'), 'onChange="select_option();"');
148
149
150 $this->add('text', 'price', ts('Market Value'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'price'), TRUE);
151 $this->addRule('price', ts('Please enter the Market Value for this product.'), 'money');
152
153 $this->add('text', 'cost', ts('Actual Cost of Product'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'cost'));
154 $this->addRule('price', ts('Please enter the Actual Cost of Product.'), 'money');
155
156 $this->add('text', 'min_contribution', ts('Minimum Contribution Amount'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'min_contribution'), TRUE);
157 $this->addRule('min_contribution', ts('Please enter a monetary value for the Minimum Contribution Amount.'), 'money');
158
159 $this->add('textarea', 'options', ts('Options'), 'rows=3, cols=60');
160
161 $this->add('select', 'period_type', ts('Period Type'), array('' => '- select -', 'rolling' => 'Rolling', 'fixed' => 'Fixed'));
162
163 $this->add('text', 'fixed_period_start_day', ts('Fixed Period Start Day'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'fixed_period_start_day'));
164
165 $this->add('Select', 'duration_unit', ts('Duration Unit'), array('' => '- select period -') + CRM_Core_SelectValues::getPremiumUnits());
166
167 $this->add('text', 'duration_interval', ts('Duration'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'duration_interval'));
168
169 $this->add('Select', 'frequency_unit', ts('Frequency Unit'), array('' => '- select period -') + CRM_Core_SelectValues::getPremiumUnits());
170
171 $this->add('text', 'frequency_interval', ts('Frequency'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'frequency_interval'));
172
173 //Financial Type CRM-11106
174 $financialType = CRM_Contribute_PseudoConstant::financialType( );
175 $premiumFinancialType = array();
176 CRM_Core_PseudoConstant::populate(
177 $premiumFinancialType,
178 'CRM_Financial_DAO_EntityFinancialAccount',
179 $all = True,
180 $retrieve = 'entity_id',
181 $filter = null,
182 'account_relationship = 8'
183 );
184
185 $costFinancialType = array();
186 CRM_Core_PseudoConstant::populate(
187 $costFinancialType,
188 'CRM_Financial_DAO_EntityFinancialAccount',
189 $all = True,
190 $retrieve = 'entity_id',
191 $filter = null,
192 'account_relationship = 7'
193 );
194 $productFinancialType = array_intersect($costFinancialType, $premiumFinancialType);
195 foreach( $financialType as $key => $financialTypeName ){
196 if(!in_array( $key, $productFinancialType))
197 unset( $financialType[$key] );
198 }
199 if( count( $financialType ) ){
200 $this->assign( 'financialType', $financialType );
201 }
202 $this->add(
203 'select',
204 'financial_type_id',
205 ts( 'Financial Type' ),
206 array(''=>ts('- select -')) + $financialType
207 );
208
209 $this->add('checkbox', 'is_active', ts('Enabled?'));
210
211 $this->addFormRule(array('CRM_Contribute_Form_ManagePremiums', 'formRule'));
212
213 $this->addButtons(array(
214 array(
215 'type' => 'upload',
216 'name' => ts('Save'),
217 'isDefault' => TRUE,
218 ),
219 array(
220 'type' => 'cancel',
221 'name' => ts('Cancel'),
222 ),
223 )
224 );
225
226 $this->assign('productId', $this->_id);
227 }
228
229 /**
230 * Function for validation
231 *
232 * @param array $params (ref.) an assoc array of name/value pairs
233 *
234 * @param $files
235 *
236 * @return mixed true or array of errors
237 * @access public
238 * @static
239 */
240 public static function formRule($params, $files) {
241 if (isset($params['imageOption'])) {
242 if ($params['imageOption'] == 'thumbnail') {
243 if (!$params['imageUrl']) {
244 $errors['imageUrl'] = ts('Image URL is Required');
245 }
246 if (!$params['thumbnailUrl']) {
247 $errors['thumbnailUrl'] = ts('Thumbnail URL is Required');
248 }
249 }
250 }
251 // CRM-13231 financial type required if product has cost
252 if (!empty($params['cost']) && empty($params['financial_type_id'])) {
253 $errors['financial_type_id'] = ts('Financial Type is required for product having cost.');
254 }
255 $fileLocation = $files['uploadFile']['tmp_name'];
256 if ($fileLocation != "") {
257 list($width, $height) = getimagesize($fileLocation);
258
259 if (($width < 80 || $width > 500) || ($height < 80 || $height > 500)) {
260 //$errors ['uploadFile'] = "Please Enter files with dimensions between 80 x 80 and 500 x 500," . " Dimensions of this file is ".$width."X".$height;
261 }
262 }
263
264 if (!$params['period_type']) {
265 if ($params['fixed_period_start_day'] || $params['duration_unit'] || $params['duration_interval'] ||
266 $params['frequency_unit'] || $params['frequency_interval']
267 ) {
268 $errors['period_type'] = ts('Please select the Period Type for this subscription or service.');
269 }
270 }
271
272 if ($params['period_type'] == 'fixed' && !$params['fixed_period_start_day']) {
273 $errors['fixed_period_start_day'] = ts('Please enter a Fixed Period Start Day for this subscription or service.');
274 }
275
276 if ($params['duration_unit'] && !$params['duration_interval']) {
277 $errors['duration_interval'] = ts('Please enter the Duration Interval for this subscription or service.');
278 }
279
280 if ($params['duration_interval'] && !$params['duration_unit']) {
281 $errors['duration_unit'] = ts('Please enter the Duration Unit for this subscription or service.');
282 }
283
284 if ($params['frequency_interval'] && !$params['frequency_unit']) {
285 $errors['frequency_unit'] = ts('Please enter the Frequency Unit for this subscription or service.');
286 }
287
288 if ($params['frequency_unit'] && !$params['frequency_interval']) {
289 $errors['frequency_interval'] = ts('Please enter the Frequency Interval for this subscription or service.');
290 }
291
292
293 return empty($errors) ? TRUE : $errors;
294 }
295
296 /**
297 * Function to process the form
298 *
299 * @access public
300 *
301 * @return void
302 */
303 public function postProcess() {
304
305 if ($this->_action & CRM_Core_Action::PREVIEW) {
306 return;
307 }
308
309 if ($this->_action & CRM_Core_Action::DELETE) {
310 CRM_Contribute_BAO_ManagePremiums::del($this->_id);
311 CRM_Core_Session::setStatus(ts('Selected Premium Product type has been deleted.'), ts('Deleted'), 'info');
312 }
313 else {
314 $params = $this->controller->exportValues($this->_name);
315 $imageFile = CRM_Utils_Array::value('uploadFile', $params);
316 $imageFile = $imageFile['name'];
317
318 $config = CRM_Core_Config::singleton();
319
320 $ids = array();
321 $error = FALSE;
322 // store the submitted values in an array
323
324 // FIX ME
325 if (CRM_Utils_Array::value('imageOption', $params, FALSE)) {
326 $value = CRM_Utils_Array::value('imageOption', $params, FALSE);
327 if ($value == 'image') {
328
329 // to check wether GD is installed or not
330 $gdSupport = CRM_Utils_System::getModuleSetting('gd', 'GD Support');
331 if($gdSupport) {
332 if($imageFile) {
333 $error = false;
334 $params['image'] = $this->_resizeImage($imageFile, "_full", 200, 200);
335 $params['thumbnail'] = $this->_resizeImage($imageFile, "_thumb", 50, 50);
336 }
337 } else {
338 $error = true;
339 $params['image'] = $config->resourceBase . 'i/contribute/default_premium.jpg';
340 $params['thumbnail'] = $config->resourceBase . 'i/contribute/default_premium_thumb.jpg';
341 }
342 } elseif ($value == 'thumbnail') {
343 $params['image'] = $params['imageUrl'];
344 $params['thumbnail'] = $params['thumbnailUrl'];
345 } elseif ($value == 'default_image') {
346 $url = parse_url($config->userFrameworkBaseURL);
347 $params['image'] = $config->resourceBase . 'i/contribute/default_premium.jpg';
348 $params['thumbnail'] = $config->resourceBase . 'i/contribute/default_premium_thumb.jpg';
349 } else {
350 $params['image'] = "";
351 $params['thumbnail'] = "";
352 }
353 }
354
355 if ($this->_action & CRM_Core_Action::UPDATE) {
356 $ids['premium'] = $this->_id;
357 }
358
359 // fix the money fields
360 foreach (array(
361 'cost', 'price', 'min_contribution') as $f) {
362 $params[$f] = CRM_Utils_Rule::cleanMoney($params[$f]);
363 }
364
365 $premium = CRM_Contribute_BAO_ManagePremiums::add($params, $ids);
366 if ($error) {
367 CRM_Core_Session::setStatus(ts('No thumbnail of your image was created because the GD image library is not currently compiled in your PHP installation. Product is currently configured to use default thumbnail image. If you have a local thumbnail image you can upload it separately and input the thumbnail URL by editing this premium.'), ts('Notice'), 'alert');
368 }
369 else {
370 CRM_Core_Session::setStatus(ts("The Premium '%1' has been saved.", array(1 => $premium->name)), ts('Saved'), 'success');
371 }
372 }
373 }
374
375 /**
376 * Resize a premium image to a different size
377 *
378 * @access private
379 *
380 * @param $filename
381 * @param $resizedName
382 * @param $width
383 * @param $height
384 *
385 * @return Path to image
386 */
387 private function _resizeImage($filename, $resizedName, $width, $height) {
388 // figure out the new filename
389 $pathParts = pathinfo($filename);
390 $newFilename = $pathParts['dirname']."/".$pathParts['filename'].$resizedName.".".$pathParts['extension'];
391
392 // get image about original image
393 $imageInfo = getimagesize($filename);
394 $widthOrig = $imageInfo[0];
395 $heightOrig = $imageInfo[1];
396 $image = imagecreatetruecolor($width, $height);
397 if($imageInfo['mime'] == 'image/gif') {
398 $source = imagecreatefromgif($filename);
399 } elseif($imageInfo['mime'] == 'image/png') {
400 $source = imagecreatefrompng($filename);
401 } else {
402 $source = imagecreatefromjpeg($filename);
403 }
404
405 // resize
406 imagecopyresized($image, $source, 0, 0, 0, 0, $width, $height, $widthOrig, $heightOrig);
407
408 // save the resized image
409 $fp = fopen($newFilename, 'w+');
410 ob_start();
411 ImageJPEG($image);
412 $image_buffer = ob_get_contents();
413 ob_end_clean();
414 ImageDestroy($image);
415 fwrite($fp, $image_buffer);
416 rewind($fp);
417 fclose($fp);
418
419 // return the URL to link to
420 $config = CRM_Core_Config::singleton();
421 return $config->imageUploadURL.basename($newFilename);
422 }
423 }
424