Squiz Matrix  4.12.2
 All Data Structures Namespaces Functions Variables Pages
parameter_map.inc
1 <?php
17 require_once SQ_INCLUDE_PATH.'/asset_attribute.inc';
18 require_once dirname(dirname(__FILE__)).'/serialise/serialise.inc';
19 
20 define('SQ_PARAM_MAP_DEFAULT_ATTRIBUTE', 'assetid');
21 define('SQ_PARAM_MAP_ATTR_OPTION_KEYWORD', 'keyword');
22 define('SQ_PARAM_MAP_DEFAULT_KEYWORD', 'asset_assetid');
23 
56 {
57 
58 
66  function Asset_Attribute_Parameter_Map($attributeid=0, $value=NULL)
67  {
68  if (!isset($this->_params['parameters'])) {
69  $this->_params['parameters'] = Array();
70  }
71  if ($value == NULL) $value = Array();
72  $this->Asset_Attribute_Serialise($attributeid, $value);
73 
74  // TODO: Investigate efficiency of unserialising once vs. every time the value is needed.
75 
76  }//end constructor
77 
78 
88  function setParameter($code, $label)
89  {
90  $this->_params['parameters'][$code] = $label;
91 
92  }//end setParameter()
93 
94 
104  function moveParameter($old_code, $new_code)
105  {
106  if (!isset($this->_params['parameters'][$old_code])) {
107  return;
108  }
109 
110  if (isset($this->_params['parameters'][$new_code])) {
111  trigger_error('Cannot Rename Parameter. Code conflict.', E_USER_WARNING);
112  return;
113  }
114 
115 
116  $this->_params['parameters'][$new_code] = $this->_params['parameters'][$old_code];
117  unset($this->_params['parameters'][$old_code]);
118 
119  $value = unserialize($this->value);
120  if (isset($value[$old_code])) {
121  $value[$new_code] = $value[$old_code];
122  unset($value[$old_code]);
123  $this->value = serialize($value);
124  }
125 
126  }//end moveParameter()
127 
128 
137  function unsetParameter($code)
138  {
139  $value = unserialize($this->value);
140  unset($this->_params['parameters'][$code]);
141  unset($value[$code]);
142  $this->value = serialize($value);
143  $this->processed = $this->setValue($value);
144 
145  }//end unsetParameter()
146 
147 
157  function paint($prefix, $read_only=FALSE)
158  {
159  $value = @unserialize($this->value);
160 
161  ?>
162 
163  <table border="0" cellpadding="0" cellspacing="0" class="sq-backend-table">
164  <tr>
165  <th><?php echo translate('parameter'); ?></th>
166  <th><?php echo translate('source'); ?></th>
167  </tr>
168  <?php
169 
170  $source_types = $this->_getSourceTypes();
171  if (!empty($value)) {
172  foreach ($value as $parameter => $sources) {
173  ?>
174  <tr>
175  <td><?php echo $this->_params['parameters'][$parameter]; ?></td>
176  <td>
177  <table border="0" cellpadding="5" cellspacing="0" class="sq-backend-table">
178  <?php
179  foreach ($sources as $index => $details) {
180  $source_type = $details['source'];
181  if (!isset($source_types[$source_type])) continue;
182 
183  $one_source_prefix = $prefix.'['.$parameter.']['.$index.']';
184  ?>
185  <tr>
186  <td style="width:30ex"><strong><?php echo $source_types[$source_type]; ?></strong></td>
187  <td><?php $this->_printSourceInterface($one_source_prefix, $details, $read_only); ?></td>
188  <td style="text-align:right">
189  <?php
190  if (!$read_only) {
191  check_box($one_source_prefix.'[delete]');
192  echo '<label for="'.$one_source_prefix.'[delete]">'.translate('delete').'</label>';
193  }
194  ?>
195  </td>
196  </tr>
197  <?php
198  }
199  ?>
200  </table>
201  </td>
202  </tr>
203  <?php
204  }//end foreach
205  }//end if
206 
207  if (!$read_only) {
208  ?>
209  <tr>
210  <td><?php $this->_printParameterChooser($prefix.'[new][0]'); ?></td>
211  <td><?php $this->_printNewSourceChooser($prefix.'[new][0]'); ?></td>
212  </tr>
213  <?php
214  }
215  ?>
216  </table>
217  <?php
218 
219  }//end paint()
220 
221 
230  function _printNewSourceChooser($prefix)
231  {
232  combo_box($prefix.'[source]', $this->_getSourceTypes(), FALSE, Array());
233 
234  }//end _printNewSourceChooser()
235 
236 
247  function _printSourceInterface($prefix, $data, $read_only=TRUE)
248  {
249  $source_type = array_get_index($data, 'source');
250 
251  if (!$read_only) {
252  hidden_field($prefix.'[source]', $source_type);
253 
254  }
255  switch ($source_type) {
256  case 'ASSET':
257  case 'CURRENT_SITE':
258  case 'USER':
259  $attribute = array_get_index($data, 'attribute', SQ_PARAM_MAP_DEFAULT_ATTRIBUTE);
260  $keyword = array_get_index($data, 'keyword', SQ_PARAM_MAP_DEFAULT_KEYWORD);
261  if ($read_only) {
262  if (is_null($attribute)) {
263  echo translate('not_configured');
264  } else {
265  echo $attribute;
266  if ($attribute == SQ_PARAM_MAP_ATTR_OPTION_KEYWORD) {
267  echo ' - '.(empty($keyword) ? translate('not_configured') : $keyword);
268  }
269  }
270  } else {
271  $options = Array(
272  'assetid' => translate('asset_id'),
273  SQ_PARAM_MAP_ATTR_OPTION_KEYWORD => translate('keyword'),
274  );
275  combo_box($prefix.'[attribute]', $options, FALSE, $attribute, 0, 'onchange="document.getElementById(\''.$prefix.'[keyword]\').style.visibility = (this.value == \'keyword\') ? \'\' : \'hidden\'"');
276  text_box($prefix.'[keyword]', $keyword, '', '', FALSE, ($attribute == SQ_PARAM_MAP_ATTR_OPTION_KEYWORD) ? '' : 'style="visibility: hidden"');
277  }
278  break;
279 
280  case 'SET_VALUE':
281  $value = array_get_index($data, 'value');
282  if ($read_only) {
283  if (is_null($value)) {
284  echo translate('not_configured');
285  } else {
286  echo htmlspecialchars($value);
287  }//end if
288  } else {
289  text_box($prefix.'[value]', $value);
290  }//end if
291  break;
292 
293  default:
294  $value = array_get_index($data, 'index');
295  if ($read_only) {
296  if (is_null($value)) {
297  echo translate('not_configured');
298  } else {
299  echo $value;
300  }
301  } else {
302  text_box($prefix.'[index]', $value);
303  }
304 
305 
306  }//end switch
307 
308  }//end _printSourceInterface()
309 
310 
319  function _printParameterChooser($prefix)
320  {
321  combo_box($prefix.'[parameter]', Array(''=>'-- '.translate('new_mapping').' --')+$this->_params['parameters'], FALSE, Array());
322 
323  }//end _printParameterChooser()
324 
325 
334  function process($prefix)
335  {
336  $value = Array();
337  if (isset($_POST[$prefix]) && is_array($_POST[$prefix])) {
338  foreach ($_POST[$prefix] as $index => $details) {
339  if ($index == 'new') continue;
340  $value[$index] = $details;
341  foreach ($details as $j => $fields) {
342  if (in_array($fields['source'], Array('ASSET', 'USER', 'CURRENT_SITE'))) {
343  unset($value[$index][$j]['index']);
344 
345  // clean the keyword and set default value
346  if (array_get_index($value[$index][$j], 'attribute', '') == SQ_PARAM_MAP_ATTR_OPTION_KEYWORD) {
347  $value[$index][$j]['keyword'] = preg_replace('/(^%|%$)/', '', trim(array_get_index($value[$index][$j], 'keyword', '')));
348  if (empty($value[$index][$j]['keyword'])) {
349  $value[$index][$j]['keyword'] = SQ_PARAM_MAP_DEFAULT_KEYWORD;
350  }
351  }
352  } else {
353  unset($value[$index][$j]['keyword']);
354  unset($value[$index][$j]['attribute']);
355  }
356 
357  if (isset($fields['delete'])) {
358  unset($value[$index][$j]);
359  if (empty($value[$index])) unset($value[$index]);
360  }
361 
362  }//end foreach
363 
364  }//end foreach ($_POST[$prefix])
365  foreach ($_POST[$prefix]['new'] as $new_mapping) {
366  if (empty($new_mapping['parameter'])) continue;
367 
368  $param = $new_mapping['parameter'];
369  unset($new_mapping['parameter']);
370 
371  $value[$param][] = $new_mapping;
372  }
373 
374 
375  if (!$this->validateValue($value)) return FALSE;
376  $this->processed = $this->setValue($value);
377 
378  }//end if (is_array())
379 
380  }//end process()
381 
382 
391  function getParameterValue($parameter)
392  {
393  // TODO: Check why we need to unserialize every time (see constructor)
394  $value = unserialize($this->value);
395 
396  if (!isset($value[$parameter])) return NULL;
397  foreach ($value[$parameter] as $rule) {
398  switch ($rule['source']) {
399  case 'GET':
400  if (!empty($rule['index']) && isset($_GET[$rule['index']])) {
401  return $_GET[$rule['index']];
402  }
403  break;
404 
405  case 'POST':
406  if (!empty($rule['index']) && isset($_POST[$rule['index']])) {
407  return $_POST[$rule['index']];
408  }
409  break;
410 
411  // this is for storing data in session
412  // note that it is stored in a particular part of global session variable
413  case 'SESSION':
414  if (!empty($rule['index']) && isset($_SESSION[SQ_SESSION_SANDBOX_INDEX][$rule['index']])) {
415  return $_SESSION[SQ_SESSION_SANDBOX_INDEX][$rule['index']];
416  }
417  break;
418 
419  case 'GLOBALS':
420  if (isset($_SESSION[SQ_SESSION_SANDBOX_INDEX][$rule['index']]) && (!empty($_SESSION[SQ_SESSION_SANDBOX_INDEX][$rule['index']]))) {
421  return $_SESSION[SQ_SESSION_SANDBOX_INDEX][$rule['index']];
422  } else if (isset($_POST[$rule['index']]) && (!empty($_POST[$rule['index']]))) {
423  return $_POST[$rule['index']];
424  } else if (isset($_GET[$rule['index']]) && (!empty($_GET[$rule['index']]))) {
425  return $_GET[$rule['index']];
426  } else {
427  return '';
428  }
429  break;
430 
431  case 'SET_VALUE':
432  if (isset($rule['value'])) {
433  return replace_global_keywords($rule['value']);
434  }//end if
435  break;
436 
437  case 'ASSET':
438  case 'USER':
439  case 'CURRENT_SITE':
440  $assetid = $this->_getRelevantAssetid($rule['source']);
441  if (empty($assetid)) return NULL;
442  switch (array_get_index($rule, 'attribute')) {
443  case SQ_PARAM_MAP_ATTR_OPTION_KEYWORD:
444  $asset = $GLOBALS['SQ_SYSTEM']->am->getAsset($assetid);
445  if (!empty($asset)) {
446  $keyword = array_get_index($rule, 'keyword', '');
447  // default to the assetid if no keyword is defined
448  if ($keyword == '') {
449  $keyword = SQ_PARAM_MAP_DEFAULT_KEYWORD;
450  }
451  return $asset->getKeywordReplacement($keyword);
452  }
453  break;
454 
455  case 'assetid':
456  default:
457  return $assetid;
458  break;
459  }
460  break;
461 
462  }//end switch ($rule['source'])
463 
464  }//end foreach ($value[$parameter])
465 
466  return NULL;
467 
468  }//end getParameterValue()
469 
470 
479  function _getRelevantAssetid($source)
480  {
481  $default = NULL;
482  switch ($source) {
483  case 'ASSET':
484  // current asset
485  if (SQ_IN_LIMBO) {
486  return $_REQUEST['limbo_assetid'];
487  } else {
488  if (isset($GLOBALS['SQ_SYSTEM']->frontend_asset->id) && !empty($GLOBALS['SQ_SYSTEM']->frontend_asset->id)) {
489  return $GLOBALS['SQ_SYSTEM']->frontend_asset->id;
490  } else {
491  $curr_asset = $GLOBALS['SQ_SYSTEM']->getGlobalDefine('CURRENT_ASSET', NULL);
492  if (!is_null($curr_asset)) return $curr_asset->id;
493  return $default;
494  }
495  }
496  break;
497 
498  case 'USER':
499  return $GLOBALS['SQ_SYSTEM']->currentUserId();
500  break;
501 
502  case 'CURRENT_SITE':
503  $current_site_id = NULL;
504  if ($GLOBALS['SQ_SYSTEM']->isGlobalDefineSet('CURRENT_SITE')) {
505  $current_site_id = $GLOBALS['SQ_SYSTEM']->getGlobalDefine('CURRENT_SITE')->id;
506  } else {
507  if ($GLOBALS['SQ_SYSTEM']->isGlobalDefineSet('CURRENT_ASSET')) {
508  $asset_url = $GLOBALS['SQ_SYSTEM']->getGlobalDefine('CURRENT_ASSET')->getURL();
509  $protocol_pos = strpos($asset_url, '://');
510  if ($protocol_pos !== FALSE) {
511  $asset_url = substr($asset_url, $protocol_pos + 3);
512  }//end if
513  } else {
514  $asset_url = current_url(FALSE, TRUE);
515  }//end if
516  $asset_lineage = $GLOBALS['SQ_SYSTEM']->am->getLineageFromURL(NULL, $asset_url);
517  if (isset($asset_lineage[0])) {
518  $current_site_id = $asset_lineage[0]['assetid'];
519  }//end if
520  }//end if
521  return $current_site_id;
522  break;
523  }
524  return $default;
525 
526  }//end _getRelevantAssetid()
527 
528 
535  function getParameters()
536  {
537  return array_keys(unserialize($this->value));
538 
539  }//end getParameters()
540 
541 
548  function _getSourceTypes()
549  {
550  // TODO: Implement Generic Asset Chooser
551  // Should allow any asset to be selected and data to be extracted from it based on what the asset makes available
552  // 'ASSET_ANY' => 'Any Asset (Paint Asset Chooser)',
553 
554  return Array(
555  'GET' => 'GET '.translate('variable_name'),
556  'POST' => 'POST '.translate('variable_name'),
557  'SESSION' => 'SESSION '.translate('variable_name'),
558  'ASSET' => translate('current_asset'),
559  'USER' => translate('current_user'),
560  'CURRENT_SITE' => translate('current_site'),
561  'SET_VALUE' => translate('set_value'),
562  'GLOBALS' => translate('super_global'),
563  );
564 
565  }//end _getSourceTypes()
566 
567 
568 }//end class
569 
570 ?>