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