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