manual merge of fixes for CRM-13981
[civicrm-core.git] / CRM / Contribute / Form / ManagePremiums.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
232624b1 4 | CiviCRM version 4.4 |
6a488035
TO
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2013 |
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-2013
32 * $Id$
33 *
34 */
35
36/**
37 * This class generates form components for Premiums
38 *
39 */
40class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
41
42 /**
43 * Function to pre process the form
44 *
45 * @access public
46 *
355ba699 47 * @return void
6a488035
TO
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 *
355ba699 59 * @return void
6a488035
TO
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 *
355ba699 92 * @return void
6a488035
TO
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->addRule('imageUrl', 'Please enter the valid URL to display this image.', 'url');
146 $this->addElement('text', 'thumbnailUrl', ts('Thumbnail URL'));
147 $this->addRule('thumbnailUrl', 'Please enter the valid URL to display a thumbnail of this image.', 'url');
148
149 $this->add('file', 'uploadFile', ts('Image File Name'), 'onChange="select_option();"');
150
151
152 $this->add('text', 'price', ts('Market Value'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'price'), TRUE);
153 $this->addRule('price', ts('Please enter the Market Value for this product.'), 'money');
154
155 $this->add('text', 'cost', ts('Actual Cost of Product'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'cost'));
156 $this->addRule('price', ts('Please enter the Actual Cost of Product.'), 'money');
157
158 $this->add('text', 'min_contribution', ts('Minimum Contribution Amount'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'min_contribution'), TRUE);
159 $this->addRule('min_contribution', ts('Please enter a monetary value for the Minimum Contribution Amount.'), 'money');
160
161 $this->add('textarea', 'options', ts('Options'), 'rows=3, cols=60');
162
163 $this->add('select', 'period_type', ts('Period Type'), array('' => '- select -', 'rolling' => 'Rolling', 'fixed' => 'Fixed'));
164
165 $this->add('text', 'fixed_period_start_day', ts('Fixed Period Start Day'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'fixed_period_start_day'));
166
167
168 $this->add('Select', 'duration_unit', ts('Duration Unit'), array('' => '- select period -', 'day' => 'Day', 'week' => 'Week', 'month' => 'Month', 'year' => 'Year'));
169
170 $this->add('text', 'duration_interval', ts('Duration'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'duration_interval'));
171
172 $this->add('Select', 'frequency_unit', ts('Frequency Unit'), array('' => '- select period -', 'day' => 'Day', 'week' => 'Week', 'month' => 'Month', 'year' => 'Year'));
173
174 $this->add('text', 'frequency_interval', ts('Frequency'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'frequency_interval'));
665e5ec7 175
6a488035
TO
176 //Financial Type CRM-11106
177 $financialType = CRM_Contribute_PseudoConstant::financialType( );
178 $premiumFinancialType = array();
179 CRM_Core_PseudoConstant::populate(
180 $premiumFinancialType,
181 'CRM_Financial_DAO_EntityFinancialAccount',
665e5ec7 182 $all = True,
183 $retrieve = 'entity_id',
184 $filter = null,
185 'account_relationship = 8'
6a488035 186 );
665e5ec7 187
6a488035
TO
188 $costFinancialType = array();
189 CRM_Core_PseudoConstant::populate(
190 $costFinancialType,
191 'CRM_Financial_DAO_EntityFinancialAccount',
665e5ec7 192 $all = True,
193 $retrieve = 'entity_id',
194 $filter = null,
195 'account_relationship = 7'
6a488035
TO
196 );
197 $productFinancialType = array_intersect($costFinancialType, $premiumFinancialType);
198 foreach( $financialType as $key => $financialTypeName ){
199 if(!in_array( $key, $productFinancialType))
200 unset( $financialType[$key] );
201 }
202 if( count( $financialType ) ){
203 $this->assign( 'financialType', $financialType );
665e5ec7 204 }
6a488035 205 $this->add(
665e5ec7 206 'select',
207 'financial_type_id',
208 ts( 'Financial Type' ),
6a488035
TO
209 array(''=>ts('- select -')) + $financialType
210 );
665e5ec7 211
6a488035
TO
212 $this->add('checkbox', 'is_active', ts('Enabled?'));
213
214 $this->addFormRule(array('CRM_Contribute_Form_ManagePremiums', 'formRule'));
215
216 $this->addButtons(array(
217 array(
218 'type' => 'upload',
219 'name' => ts('Save'),
220 'isDefault' => TRUE,
221 ),
222 array(
223 'type' => 'cancel',
224 'name' => ts('Cancel'),
225 ),
226 )
227 );
228
229 $this->assign('productId', $this->_id);
230 }
231
232 /**
233 * Function for validation
234 *
235 * @param array $params (ref.) an assoc array of name/value pairs
236 *
237 * @return mixed true or array of errors
238 * @access public
239 * @static
240 */
fcc5922d 241 public static function formRule($params, $files) {
6a488035
TO
242 if (isset($params['imageOption'])) {
243 if ($params['imageOption'] == 'thumbnail') {
244 if (!$params['imageUrl']) {
3b67ab13 245 $errors['imageUrl'] = ts('Image URL is Required');
6a488035
TO
246 }
247 if (!$params['thumbnailUrl']) {
3b67ab13 248 $errors['thumbnailUrl'] = ts('Thumbnail URL is Required');
6a488035
TO
249 }
250 }
251 }
3b67ab13 252 // CRM-13231 financial type required if product has cost
8cc574cf 253 if (!empty($params['cost']) && empty($params['financial_type_id'])) {
3b67ab13
PN
254 $errors['financial_type_id'] = ts('Financial Type is required for product having cost.');
255 }
6a488035
TO
256 $fileLocation = $files['uploadFile']['tmp_name'];
257 if ($fileLocation != "") {
258 list($width, $height) = getimagesize($fileLocation);
259
260 if (($width < 80 || $width > 500) || ($height < 80 || $height > 500)) {
261 //$errors ['uploadFile'] = "Please Enter files with dimensions between 80 x 80 and 500 x 500," . " Dimensions of this file is ".$width."X".$height;
262 }
263 }
264
265 if (!$params['period_type']) {
266 if ($params['fixed_period_start_day'] || $params['duration_unit'] || $params['duration_interval'] ||
267 $params['frequency_unit'] || $params['frequency_interval']
268 ) {
269 $errors['period_type'] = ts('Please select the Period Type for this subscription or service.');
270 }
271 }
272
273 if ($params['period_type'] == 'fixed' && !$params['fixed_period_start_day']) {
274 $errors['fixed_period_start_day'] = ts('Please enter a Fixed Period Start Day for this subscription or service.');
275 }
276
277 if ($params['duration_unit'] && !$params['duration_interval']) {
278 $errors['duration_interval'] = ts('Please enter the Duration Interval for this subscription or service.');
279 }
280
281 if ($params['duration_interval'] && !$params['duration_unit']) {
282 $errors['duration_unit'] = ts('Please enter the Duration Unit for this subscription or service.');
283 }
284
285 if ($params['frequency_interval'] && !$params['frequency_unit']) {
286 $errors['frequency_unit'] = ts('Please enter the Frequency Unit for this subscription or service.');
287 }
288
289 if ($params['frequency_unit'] && !$params['frequency_interval']) {
290 $errors['frequency_interval'] = ts('Please enter the Frequency Interval for this subscription or service.');
291 }
292
293
294 return empty($errors) ? TRUE : $errors;
295 }
296
297 /**
298 * Function to process the form
299 *
300 * @access public
301 *
355ba699 302 * @return void
6a488035
TO
303 */
304 public function postProcess() {
305
306 if ($this->_action & CRM_Core_Action::PREVIEW) {
307 return;
308 }
309
310 if ($this->_action & CRM_Core_Action::DELETE) {
311 CRM_Contribute_BAO_ManagePremiums::del($this->_id);
312 CRM_Core_Session::setStatus(ts('Selected Premium Product type has been deleted.'), ts('Deleted'), 'info');
313 }
314 else {
315 $params = $this->controller->exportValues($this->_name);
316 $imageFile = CRM_Utils_Array::value('uploadFile', $params);
317 $imageFile = $imageFile['name'];
318
319 $config = CRM_Core_Config::singleton();
320
321 $ids = array();
322 $error = FALSE;
323 // store the submitted values in an array
324
325 // FIX ME
326 if (CRM_Utils_Array::value('imageOption', $params, FALSE)) {
327 $value = CRM_Utils_Array::value('imageOption', $params, FALSE);
328 if ($value == 'image') {
329
330 // to check wether GD is installed or not
331 $gdSupport = CRM_Utils_System::getModuleSetting('gd', 'GD Support');
332 if($gdSupport) {
333 if($imageFile) {
334 $error = false;
335 $params['image'] = $this->_resizeImage($imageFile, "_full", 200, 200);
336 $params['thumbnail'] = $this->_resizeImage($imageFile, "_thumb", 50, 50);
337 }
338 } else {
339 $error = true;
340 $params['image'] = $config->resourceBase . 'i/contribute/default_premium.jpg';
341 $params['thumbnail'] = $config->resourceBase . 'i/contribute/default_premium_thumb.jpg';
342 }
343 } elseif ($value == 'thumbnail') {
344 $params['image'] = $params['imageUrl'];
345 $params['thumbnail'] = $params['thumbnailUrl'];
346 } elseif ($value == 'default_image') {
347 $url = parse_url($config->userFrameworkBaseURL);
348 $params['image'] = $config->resourceBase . 'i/contribute/default_premium.jpg';
349 $params['thumbnail'] = $config->resourceBase . 'i/contribute/default_premium_thumb.jpg';
350 } else {
351 $params['image'] = "";
352 $params['thumbnail'] = "";
353 }
354 }
355
356 if ($this->_action & CRM_Core_Action::UPDATE) {
357 $ids['premium'] = $this->_id;
358 }
359
360 // fix the money fields
361 foreach (array(
362 'cost', 'price', 'min_contribution') as $f) {
363 $params[$f] = CRM_Utils_Rule::cleanMoney($params[$f]);
364 }
365
366 $premium = CRM_Contribute_BAO_ManagePremiums::add($params, $ids);
367 if ($error) {
368 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');
369 }
370 else {
371 CRM_Core_Session::setStatus(ts("The Premium '%1' has been saved.", array(1 => $premium->name)), ts('Saved'), 'success');
372 }
373 }
374 }
375
376 /**
377 * Resize a premium image to a different size
378 *
379 * @access private
380 *
381 * @return Path to image
382 */
383 private function _resizeImage($filename, $resizedName, $width, $height) {
384 // figure out the new filename
385 $pathParts = pathinfo($filename);
386 $newFilename = $pathParts['dirname']."/".$pathParts['filename'].$resizedName.".".$pathParts['extension'];
387
388 // get image about original image
389 $imageInfo = getimagesize($filename);
390 $widthOrig = $imageInfo[0];
391 $heightOrig = $imageInfo[1];
392 $image = imagecreatetruecolor($width, $height);
393 if($imageInfo['mime'] == 'image/gif') {
394 $source = imagecreatefromgif($filename);
395 } elseif($imageInfo['mime'] == 'image/png') {
396 $source = imagecreatefrompng($filename);
397 } else {
398 $source = imagecreatefromjpeg($filename);
399 }
400
401 // resize
402 imagecopyresized($image, $source, 0, 0, 0, 0, $width, $height, $widthOrig, $heightOrig);
403
404 // save the resized image
405 $fp = fopen($newFilename, 'w+');
406 ob_start();
407 ImageJPEG($image);
408 $image_buffer = ob_get_contents();
409 ob_end_clean();
410 ImageDestroy($image);
411 fwrite($fp, $image_buffer);
412 rewind($fp);
413 fclose($fp);
414
415 // return the URL to link to
416 $config = CRM_Core_Config::singleton();
417 return $config->imageUploadURL.basename($newFilename);
418 }
419}
420