* @package app * @subpackage models.behaviors */ class CollationBehavior extends ModelBehavior { /** * Initiate behaviour for the model using specified settings. * * @param object $model Model using the behaviour * @param array $settings Settings to override for model. * * @access public */ function setup(&$model, $settings) { # # get current language # $i18n = &I18n::getInstance(); $language = $i18n->l10n->map($i18n->l10n->lang); # # get collation by language # switch ($language) { case 'pl': $collation = 'utf8_polish_ci'; default: $collation = 'utf8_general_ci'; break; } # # read settings # if (!isset($this->settings[$model->name]['fields'])) { $this->settings[$model->name]['fields'] = array(); } $this->settings[$model->name]['fields'] = array_unique(array_merge($this->settings[$model->name]['fields'], ife(is_array($settings), $settings, array()))); $this->settings[$model->name]['search'] = array(); $this->settings[$model->name]['replace'] = array(); # # setup replacements for columns # foreach ($this->settings[$model->name]['fields'] as &$field) { if (strpos($field,".") === false) { $this->settings[$model->name]['search'][] = "/({$model->name}.{$field})/"; } else { $this->settings[$model->name]['search'][] = "/({$field})/"; } $this->settings[$model->name]['replace'][] = '$1'." COLLATE {$collation}"; } } /** * Run before model is queried * * @param object $model Model * @param array $query Model query data * * @access public * @since 1.0 */ function beforeFind (&$model, &$query) { if (!empty($query['order'])) { if (is_string($query['order'])) { $query['order'] = preg_replace($this->settings[$model->name]['search'],$this->settings[$model->name]['replace'],$query['order']); } else if (is_array($query['order'])) { foreach ($query['order'] as $i => $order) { if (is_array($order)) { $_order = ""; foreach ($order as $field => $direction) { $_order .= " {$field} {$direction}"; } $order = trim ($_order); } $order = preg_replace($this->settings[$model->name]['search'],$this->settings[$model->name]['replace'],$order); $query['order'][$i] = $order; } $query['order'] = implode(" ",$query['order']); } } return $query; } } ?>