05.25 php saved
tclineks
Tags add more
 
Note
displayFields trick
  1. <?php
  2. /**
  3. * Multiple displayField trick.
  4. * Allows population of displayField with multiple fields and a pattern.
  5. */
  6. class MultipleDisplayFieldsBehavior extends ModelBehavior {
  7.  
  8.     function setup(&$model, $config = array()) {
  9.         $settings = am(array(
  10.             'fields'    => array('first_name', 'last_name'),
  11.             'pattern'   => '%s %s'
  12.         ), $config);
  13.         $this->settings[$model->name] = $settings;
  14.     }
  15.  
  16.     /**
  17.      *
  18.      */
  19.     function afterFind(&$model, $results) {
  20.         // if displayFields is set, attempt to populate
  21.         foreach ($results as $key => $val) {
  22.             $displayFieldValues = array();
  23.  
  24.             if (isset($val[$model->name])) {
  25.                 // ensure all fields are present
  26.                 $fields_present = true;
  27.                 foreach ($this->settings[$model->name]['fields'] as $field) {
  28.                     if (array_key_exists($field,$val[$model->name])) {
  29.                         $fields_present = $fields_present && true;
  30.                         $displayFieldValues[] = $val[$model->name][$field]; // capture field values
  31.                     } else {
  32.                         $fields_present = false;
  33.                         break;
  34.                     }
  35.                 }
  36.  
  37.                 // if all fields are present then set displayField based on $displayFieldValues and displayFieldPattern
  38.                 if ($fields_present) {
  39.                     $params = array_merge(array($this->settings[$model->name]['pattern']), $displayFieldValues);
  40.                     $results[$key][$model->name][$model->displayField] = call_user_func_array('sprintf', $params );
  41.                 }
  42.             }
  43.         }
  44.         return $results;
  45.     }
  46.  
  47.  
  48.     /**
  49.      * Support for virtual $displayField
  50.      * @see http://groups.google.com/group/cake-php/browse_thread/thread/d4aa1929ce4d61c7/edcacb9354ff1f7a
  51.      */
  52.     function beforeFind(&$model, &$queryData) {
  53.         //NOTE: This function required when setting $displayField to a
  54.         //      virtual field that doesn't exist, to prevent from causing
  55.         //      empty results.
  56.    
  57.         $fields = array();
  58.         if (is_array($queryData['fields'])) {
  59.             $fields = $queryData['fields'];
  60.         } else {
  61.             if ($queryData['fields'] != null) {
  62.                 if (strpos($queryData['fields'], ',')) {
  63.                     $fields = explode(',', $queryData['fields']);
  64.                 } else {
  65.                     $fields = array($queryData['fields']);
  66.                 }
  67.                 $fields = array_map('trim', $fields);
  68.             }
  69.         }
  70.         $count = count($fields);
  71.    
  72.         // Now to check for non-existant fields that might cause problems.
  73.         if ($count >= 1 && $fields[0] != '*') {
  74.             foreach ($fields as $field) {
  75.                 if ( !isset($this->_tableInfo->value[$field]) ) {
  76.                     $queryData['fields'] = '*';
  77.                     break;
  78.                 }
  79.             }
  80.         }
  81.    
  82.         return true;
  83.     }
  84. }
  85.  
  86. ?>
  87.  
  88.  
  89. // for some reason (possibly by design) behaviors aren't invoked for non-primary models, adding this to AppModel will invoke afterFind in this behavior
  90.  
  91.     function afterFind($results, $primary = false) {
  92.         if (!$primary) {
  93.             foreach($this->behaviors as $behaviorClass => $behavior) {
  94.                 if (method_exists($behavior, 'afterFind')) {
  95.                     $results = $behavior->afterFind(&$this, $results, $primary);
  96.                 }
  97.             }
  98.         }
  99.         return $results;
  100.     }
Parsed in 0.106 seconds, using GeSHi 1.0.7.14

Modify this Paste