3 class OptionsBehavior extends ModelBehavior {
5 var $settings = array();
6 var $defaultSettings = array(
7 'setupProperty' => true,
8 'defaultOption' => false,
9 'optionName' => 'options',
12 var $defaultQuery = array(
13 'conditions' => null, 'fields' => null, 'joins' => array(), 'limit' => null,
14 'offset' => null, 'order' => null, 'page' => null, 'group' => null, 'callbacks' => true
17 function setup(&$Model, $settings = array()) {
18 $this->settings = array_merge($this->defaultSettings, (array)$settings);
19 $optionName = $this->settings['optionName'];
20 if ($this->settings['setupProperty']) {
21 if (empty($Model->{$optionName})) {
22 $Model->{$optionName} = array();
24 if (empty($Model->defaultOption)) {
25 $Model->defaultOption = $this->settings['defaultOption'];
31 function beforeFind(&$Model, $query = array()) {
32 if (isset($query['options'])) {
33 $options = $query['options'];
34 unset($query['options']);
36 $query = Set::merge($this->defaultQuery, $this->options($Model, $options), Set::filter($query));
41 function options(&$Model, $type = null){
42 $args = func_get_args();
43 if (func_num_args() > 2) {
49 if (is_array($type)) {
50 foreach ($type as $t) {
51 $option = Set::merge($option, $this->options($Model, $t));
54 $optionName = $this->settings['optionName'];
55 $option = isset($Model->{$optionName}[$type]) ? $Model->{$optionName}[$type] : array();
57 if ($Model->defaultOption) {
58 $default = $this->_getDefault($Model->defaultOption, $Model->{$optionName});
61 if (isset($option[$optionName]) && !empty($option[$optionName])) {
62 $options = $this->_intelligentlyMerge(array(), $option[$optionName], $Model->{$optionName});
63 unset($option['options']);
65 $option = Set::merge($default, $options, $option);
70 function _getDefault($defaultOption, $options) {
72 if ($defaultOption === true && !empty($options['default'])) {
73 $default = $options['default'];
74 } elseif (is_array($defaultOption)) {
75 $default = $this->_intelligentlyMerge($default, $defaultOption, $options);
76 } elseif (!empty($options[$defaultOption])) {
77 $default = $this->_intelligentlyMerge($default, $options[$defaultOption], $options);
82 function _intelligentlyMerge($data, $merges, $options) {
83 $merges = (array)$merges;
84 if (Set::numeric(array_keys($merges))) {
85 foreach($merges as $merge) {
86 if (!empty($options[$merge])) {
87 $data = $this->_intelligentlyMerge($data, $options[$merge], $options);
91 $optionName = $this->settings['optionName'];
92 if (array_key_exists($optionName, $merges)) {
93 $data = $this->_intelligentlyMerge($data, $merges[$optionName], $options);
94 unset($merges[$optionName]);
96 $data = Set::merge($data, $merges);