Projet

Général

Profil

Paste
Télécharger (14,9 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / commerce_price_flexyformatter / commerce_price_flexyformatter.module @ 74f6bef0

1
<?php
2
/**
3
 * @file
4
 * Add a new Price formatter that allow more options on how
5
 * to display prices. 
6
 */
7
 
8
/**
9
 * Implements hook_theme().
10
 */
11
function commerce_price_flexyformatter_theme() {
12
  return array(
13
    'commerce_price_flexyformatter_selected_amount' => array(
14
      'variables' => array(),
15
    ),
16
  );
17
}
18

    
19
/**
20
 * Implements hook_field_formatter_info().
21
 */
22
function commerce_price_flexyformatter_field_formatter_info() {
23
  return array(
24
    'commerce_price_flexyformatter_selected_amount' => array(
25
      'label' => t('Formatted amount with selected components'),
26
      'field types' => array('commerce_price'),
27
      'settings' => array(
28
        'base' => array('selection' => array('base_price' => 'base_price'), 'weight' => 0, 'calc' => 'default'),
29
        'reference1' => array('class' => '.flexy-striked', 'weight' => -10, 'calc' => 'default'),
30
        'reference2' => array('weight' => 10, 'calc' => 'default'),
31
        // need this to load all price components, hoping will not be changed
32
        'calculation' => 'calculated_sell_price',
33
      ),
34
    ),
35
  );
36
}
37

    
38
/**
39
 * Implements hook_field_formatter_settings_form().
40
 */
41
function commerce_price_flexyformatter_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
42
  $settings = $instance['display'][$view_mode]['settings'];
43

    
44
  $element = array();
45
  $defaults = array();
46
  $reference1_defaults = $reference2_defaults = array();
47
  $methods = array('default' => 'actual values',
48
                    'reference1' => 'calculated on reference1 selected components',
49
                    'reference2' => 'calculated on reference2 selected components');
50
  // Get all the price component types
51
  $options = commerce_price_component_titles();
52
  
53
  foreach ($settings['base']['selection'] as $key => $value) {
54
    if ($value != '0') { $defaults[] = $key; }
55
  }
56
  foreach ($settings['reference1']['selection'] as $key => $value) {
57
    if ($value != '0') { $reference1_defaults[] = $key; }
58
  }
59
  foreach ($settings['reference2']['selection'] as $key => $value) {
60
    if ($value != '0') { $reference2_defaults[] = $key; }
61
  }
62

    
63
  $element['base']['selection'] = array(
64
    '#type' => 'checkboxes',
65
    '#options' => $options,
66
    '#default_value' => $defaults,
67
  );
68
  $element['base']['label'] = array(
69
    '#type' => 'textfield',
70
    '#title' => t('Label'),
71
    '#default_value' => $settings['base']['label'],
72
    '#size' => 20,
73
  );
74
  $element['base']['class'] = array(
75
    '#type' => 'textfield',
76
    '#title' => t('Custom class'),
77
    '#default_value' => $settings['base']['class'],
78
    '#size' => 20,
79
  );
80
  $element['base']['calc'] = array(
81
    '#type' => 'radios',
82
    '#options' => $methods,
83
    '#title' => t('Tax calculation method'),
84
    '#default_value' => $settings['base']['calc'],
85
  );
86
  $element['base']['weight'] = array(
87
    '#type' => 'textfield',
88
    '#title' => t('Weight'),
89
    '#default_value' => $settings['base']['weight'],
90
    '#size' => 6,
91
  );
92
  $element['reference1'] = array (
93
    '#type' => 'fieldset',
94
    '#title' => t('1st reference amount'),
95
    '#collapsible' => TRUE,
96
    '#collapsed' => ($settings['reference1']['enabled']? FALSE : TRUE),
97
  );
98
  $element['reference1']['enabled'] = array(
99
    '#title' => t('Enable'),
100
    '#type' => 'checkbox',
101
    '#default_value' => $settings['reference1']['enabled'],
102
  );
103
  $element['reference1']['selection'] = array(
104
    '#type' => 'checkboxes',
105
    '#options' => $options,
106
    '#default_value' => $reference1_defaults,
107
  );
108
  $element['reference1']['label'] = array(
109
    '#type' => 'textfield',
110
    '#title' => t('Label'),
111
    '#default_value' => $settings['reference1']['label'],
112
    '#size' => 20,
113
  );
114
  $element['reference1']['class'] = array(
115
    '#type' => 'textfield',
116
    '#title' => t('Custom class'),
117
    '#default_value' => $settings['reference1']['class'],
118
    '#size' => 20,
119
  );
120
  $element['reference1']['calc'] = array(
121
    '#type' => 'radios',
122
    '#options' => $methods,
123
    '#title' => t('Tax calculation method'),
124
    '#default_value' => $settings['reference1']['calc'],
125
  );
126
  $element['reference1']['weight'] = array(
127
    '#type' => 'textfield',
128
    '#title' => t('Weight'),
129
    '#default_value' => $settings['reference1']['weight'],
130
    '#size' => 6,
131
  );
132
  $element['reference2'] = array (
133
    '#type' => 'fieldset',
134
    '#title' => t('2nd reference amount'),
135
    '#collapsible' => TRUE,
136
    '#collapsed' => ($settings['reference2']['enabled']? FALSE : TRUE),
137
  );
138
  $element['reference2']['enabled'] = array(
139
    '#title' => t('Enable'),
140
    '#type' => 'checkbox',
141
    '#default_value' => $settings['reference2']['enabled'],
142
  );
143
  $element['reference2']['selection'] = array(
144
    '#type' => 'checkboxes',
145
    '#options' => $options,
146
    '#default_value' => $reference2_defaults,
147
  );
148
  $element['reference2']['label'] = array(
149
    '#type' => 'textfield',
150
    '#title' => t('Label'),
151
    '#default_value' => $settings['reference2']['label'],
152
    '#size' => 20,
153
  );
154
  $element['reference2']['class'] = array(
155
    '#type' => 'textfield',
156
    '#title' => t('Custom class'),
157
    '#default_value' => $settings['reference2']['class'],
158
    '#size' => 20,
159
  );
160
  $element['reference2']['calc'] = array(
161
    '#type' => 'radios',
162
    '#options' => $methods,
163
    '#title' => t('Tax calculation method'),
164
    '#default_value' => $settings['reference2']['calc'],
165
  );
166
  $element['reference2']['weight'] = array(
167
    '#type' => 'textfield',
168
    '#title' => t('Weight'),
169
    '#default_value' => $settings['reference2']['weight'],
170
    '#size' => 6,
171
  );
172

    
173
  return $element;
174
}
175

    
176
/**
177
 * Implements hook_field_formatter_settings_summary().
178
 */
179
function commerce_price_flexyformatter_field_formatter_settings_summary($field, $instance, $view_mode) {
180
  $display = $instance['display'][$view_mode];
181
  $settings = $display['settings'];
182

    
183
  $summary = array();
184
  $types = commerce_price_component_titles();
185
  $methods = array('default' => 'actual values',
186
                    'reference1' => 'calculated on reference1 selected components',
187
                    'reference2' => 'calculated on reference2 selected components');
188
  $components['list'] = '';
189
  $components['count'] = 0;
190
  foreach($settings['base']['selection'] as $key => $value) {
191
    if ($value != '0') {
192
      $components['count']++;
193
      if ($components['count'] > 1) {$components['list'] .= ', ';}
194
      $components['list'] .= $types[$key];
195
    }
196
  }
197
  if ($components['count'] == 0) {
198
    $summary[] = t('No components selected');
199
  }
200
  else {
201
    $description = ($settings['base']['label']?$settings['base']['label'].' - selected ':'Selected ') .
202
                   format_plural($components['count'], 'component is !list', 'components are !list', array('!list' => $components['list'])) .
203
                   ' - ' . t('weight: ') . $settings['base']['weight'] . ' - ' . t('tax ') . $methods[$settings['base']['calc']] .'.';
204
    $summary[] = $description;
205
    if ($settings['reference1']['enabled']) {
206
      $reference['list'] = '';
207
      $reference['count'] = 0;
208
      foreach($settings['reference1']['selection'] as $key => $value) {
209
        if ($value != '0') {
210
          $reference['count']++;
211
          if ($reference['count'] > 1) {$reference['list'] .= ', ';}
212
          $reference['list'] .= $types[$key];
213
        }
214
      }
215
      $description = ($settings['reference1']['label']?$settings['reference1']['label'].' - selected ':'1st reference amount enabled with selected ') .
216
                     format_plural($reference['count'], 'component is !list', 'components are !list', array('!list' => $reference['list'])) .
217
                     ' - ' . t('weight: ') . $settings['reference1']['weight'] . ' - ' . t('tax ') . 
218
                     $methods[$settings['reference1']['calc']] .'.';
219
     $summary[] = $description;
220
    }
221
    else {
222
      $summary[] = t('1st reference amount not enabled.');
223
    }
224
    if ($settings['reference2']['enabled']) {
225
      $reference['list'] = '';
226
      $reference['count'] = 0;
227
      foreach($settings['reference2']['selection'] as $key => $value) {
228
        if ($value != '0') {
229
          $reference['count']++;
230
          if ($reference['count'] > 1) {$reference['list'] .= ', ';}
231
          $reference['list'] .= $types[$key];
232
        }
233
      }
234
      $description = ($settings['reference2']['label']?$settings['reference2']['label'].' - selected ':'2nd reference amount enabled with selected ') .
235
                     format_plural($reference['count'], 'component is !list', 'components are !list', array('!list' => $reference['list'])) .
236
                     ' - ' . t('weight: ') . $settings['reference2']['weight'] . ' - ' . t('tax ') . 
237
                     $methods[$settings['reference2']['calc']] .'.';
238
     $summary[] = $description;
239
    }
240
    else {
241
      $summary[] = t('2nd reference amount not enabled.');
242
    }
243
  }
244

    
245
  return implode('<br />', $summary);
246
}
247
/**
248
 * Implements hook_field_formatter_prepare_view().
249
 */
250
function commerce_price_flexyformatter_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
251
  // why I need to repeat all that ???
252

    
253
  // Allow other modules to prepare the item values prior to formatting.
254
  foreach(module_implements('commerce_price_field_formatter_prepare_view') as $module) {
255
    $function = $module . '_commerce_price_field_formatter_prepare_view';
256
    $function($entity_type, $entities, $field, $instances, $langcode, $items, $displays);
257
  }
258
}
259

    
260
/**
261
 * Implements hook_field_formatter_view().
262
 */
263
function commerce_price_flexyformatter_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
264
  $element = array();
265
  // Loop through each price value in this field.
266
  foreach ($items as $delta => $item) {
267
    // Do not render a price if the amount is NULL (i.e. non-zero empty value).
268
    if (is_null($item['amount'])) {
269
      // TODO: Consider if we should render as N/A or something indicating a
270
      // price was not available as opposed to just leaving a blank.
271
      continue;
272
    }
273
    // Theme the display of the price based on the display type.
274
    switch ($display['type']) {
275

    
276
      case 'commerce_price_flexyformatter_selected_amount':
277
        // Build an array of component display titles and their prices.
278
        $tax_base = array('reference1' => 0, 'reference2' => 0);        
279
        $amount = $reference1_amount = $reference2_amount = 0;
280

    
281
        // calc tax base
282
        foreach ($item['data']['components'] as $key => $component) {
283
          if (!isset($component['price']['data']['tax_rate'])) {
284
           if (isset($display['settings']['reference1']['selection'][$component['name']]) 
285
             && $display['settings']['reference1']['selection'][$component['name']] != '0') {
286
              $tax_base['reference1'] += $component['price']['amount'];
287
           }
288
           if (isset($display['settings']['reference2']['selection'][$component['name']]) 
289
             && $display['settings']['reference2']['selection'][$component['name']] != '0') {
290
              $tax_base['reference2'] += $component['price']['amount'];
291
            }
292
          }
293
        }
294
        $amount = commerce_price_flexyformatter_amount_calc($item['data']['components'],$display['settings']['base'],$tax_base);
295
        if (isset($display['settings']['reference1']['enabled']) && $display['settings']['reference1']['enabled']) {
296
          $reference1_amount = commerce_price_flexyformatter_amount_calc($item['data']['components'],$display['settings']['reference1'],$tax_base);
297
        }
298
        if (isset($display['settings']['reference2']['enabled']) && $display['settings']['reference2']['enabled']) {
299
          $reference2_amount = commerce_price_flexyformatter_amount_calc($item['data']['components'],$display['settings']['reference2'],$tax_base);
300
        }
301

    
302
        $element[$delta] = array(
303
          '#markup' => theme('commerce_price_flexyformatter_selected_amount', 
304
            array(
305
              'base' => array(
306
                'amount' => $amount,
307
                'label' => (isset($display['settings']['base']['label'])?$display['settings']['base']['label']:null),
308
                'class' => (isset($display['settings']['base']['class'])?$display['settings']['base']['class']:null),
309
                'weight' => (isset($display['settings']['base']['weight'])?$display['settings']['base']['weight']:null),
310
              ),
311
              'reference1' => array(
312
                'amount' => (isset($reference1_amount)?$reference1_amount:null),
313
                'label' => (isset($display['settings']['reference1']['label'])?$display['settings']['reference1']['label']:null),
314
                'class' => (isset($display['settings']['reference1']['class'])?$display['settings']['reference1']['class']:null),
315
                'weight' => (isset($display['settings']['reference1']['weight'])?$display['settings']['reference1']['weight']:null),
316
                'enabled' => (isset($display['settings']['reference1']['enabled'])?$display['settings']['reference1']['enabled']:0),
317
              ),
318
              'reference2' => array(
319
                'amount' => (isset($reference2_amount)?$reference2_amount:null),
320
                'label' => (isset($display['settings']['reference2']['label'])?$display['settings']['reference2']['label']:null),
321
                'class' => (isset($display['settings']['reference2']['class'])?$display['settings']['reference2']['class']:null),
322
                'weight' => (isset($display['settings']['reference2']['weight'])?$display['settings']['reference2']['weight']:null),
323
                'enabled' => (isset($display['settings']['reference2']['enabled'])?$display['settings']['reference2']['enabled']:0),
324
              ),
325
              'currency_code' => $item['currency_code'],
326
            )
327
          ),
328
        );
329
      break;
330
    }
331
  }
332
  return $element;
333
}
334

    
335
/**
336
 * Themes flexyformatted price.
337
 *
338
 * @param $variables
339
 */
340
function theme_commerce_price_flexyformatter_selected_amount($variables) {
341
  $output = '';
342
  uasort($variables, 'drupal_sort_weight');
343
  drupal_add_css(drupal_get_path('module', 'commerce_price_flexyformatter') . '/commerce_price_flexyformatter.css');
344
  foreach ($variables as $key => $variable) {
345
   if (is_numeric($variable['weight']) && ($key == 'base' || $variable['enabled'])) {
346
    $output .= '<span class=flexy-item' . ($variable['class']?' ' . $variable['class']:'') . '><span class"flexy-title">' . $variable['label'] . '</span><span class="flexy-amount">' . commerce_currency_format($variable['amount'], $variables['currency_code']) . '</span></span> ';
347
   }
348
  }
349

    
350
  return $output; 
351
}
352
/**
353
 * Calculate amount to be displayed.
354
 *
355
 * @param array $components
356
 * @param array $settings
357
 * @param array $tax_base
358
 */
359

    
360
function commerce_price_flexyformatter_amount_calc($components,$settings,$tax_base) {
361
  $amount = 0;
362
  foreach ($components as $key => $component) {
363
    if (isset($settings['selection'][$component['name']]) && $settings['selection'][$component['name']] != '0') {
364
      if (!isset($component['price']['data']['tax_rate'])
365
        or (isset($settings['calc']) 
366
          and $settings['calc'] == 'default')) {
367
        $amount += $component['price']['amount'];
368
      } else {
369
        $amount += $component['price']['data']['tax_rate']['rate'] * $tax_base[$settings['calc']];
370
      }
371
    }
372
  }
373
  return $amount;
374
}