/models/behaviors/defaultable.php

https://github.com/asecondwill/syrup · PHP · 122 lines · 89 code · 14 blank · 19 comment · 25 complexity · 862255ee709c640b190e85a76601ac39 MD5 · raw file

  1. <?php
  2. class DefaultableBehavior extends ModelBehavior {
  3. /**
  4. * Setup behavior
  5. *
  6. * @param object $model Model
  7. * @param array $settings Settings
  8. */
  9. public function setup($model, $settings = array()) {
  10. if (!isset($this->settings[$model->alias])) {
  11. $this->settings[$model->alias] = array();
  12. }
  13. if (!empty($settings)) {
  14. if (empty($settings['find']) && empty($settings['save'])) {
  15. $settings = array('find' => $settings, 'save' => $settings);
  16. }
  17. $default = array('find'=>null, 'save'=>null);
  18. $settings = array_intersect_key(array_merge($default, $settings), $default);
  19. }
  20. $this->settings[$model->alias] = array_merge($this->settings[$model->alias], (array) $settings);
  21. }
  22. /**
  23. * Before find callback
  24. *
  25. * @param object $model Model using this behavior
  26. * @param array $query Data used to execute this query, i.e. conditions, order, etc.
  27. * @return bool True if the operation should continue, false if it should abort
  28. */
  29. public function beforeFind($model, $query) {
  30. $result = parent::beforeFind($model, $query);
  31. if (empty($this->settings[$model->alias]['find']) || (isset($query['defaultable']) && $query['defaultable'] === false) || $result === false) {
  32. return $result;
  33. } else if (is_array($result)) {
  34. $query = $result;
  35. }
  36. $Db = ConnectionManager::getDataSource($model->useDbConfig);
  37. $defaultConditions = array();
  38. foreach($this->settings[$model->alias]['find'] as $field => $fieldValue) {
  39. $fields = array(
  40. $Db->name($model->alias) . '.' . $Db->name($field),
  41. $Db->name($field),
  42. $model->alias . '.' . $field,
  43. $field
  44. );
  45. $include = true;
  46. if (!empty($query['conditions'])) {
  47. foreach(Set::flatten((array) $query['conditions']) as $key => $value) {
  48. $condition = is_numeric($key) ? $value : $key;
  49. foreach($fields as $field) {
  50. if (
  51. preg_match('/^((not|or)\.)?' . preg_quote($field) . '/i', $condition) ||
  52. preg_match('/^((not|or)\.)?' . preg_quote($model->alias . '.' . $field) . '/i', $condition) ||
  53. preg_match('/[^A-Z0-9_]+' . preg_quote($field) . '[^A-Z0-9_]+/i', $condition) ||
  54. preg_match('/[^A-Z0-9_]+' . preg_quote($model->alias . '.' . $field) . '[^A-Z0-9_]+/i', $condition)
  55. ) {
  56. $include = false;
  57. break;
  58. }
  59. }
  60. if (!$include) {
  61. break;
  62. }
  63. }
  64. }
  65. if ($include) {
  66. $defaultConditions[$model->alias . '.' . $field] = $fieldValue;
  67. }
  68. }
  69. if (!empty($defaultConditions)) {
  70. if (empty($query['conditions'])) {
  71. $query['conditions'] = array();
  72. } else if (!is_array($query['conditions'])) {
  73. $query['conditions'] = (array) $query['conditions'];
  74. }
  75. $query['conditions'] = array_merge($query['conditions'], $defaultConditions);
  76. $result = $query;
  77. }
  78. return $result;
  79. }
  80. /**
  81. * Before save callback
  82. *
  83. * @param object $model Model using this behavior
  84. * @return bool True if the operation should continue, false if it should abort
  85. */
  86. public function beforeSave($model) {
  87. $result = parent::beforeSave($model);
  88. if (empty($this->settings[$model->alias]['save']) || $result === false || $model->exists()) {
  89. return $result;
  90. }
  91. $defaults = array();
  92. foreach($model->schema() as $field => $properties) {
  93. $defaults[$field] = $properties['default'];
  94. }
  95. $data = array();
  96. foreach($this->settings[$model->alias]['save'] as $field => $fieldValue) {
  97. if (!isset($model->data[$model->alias][$field]) || $model->data[$model->alias][$field] == $defaults[$field]) {
  98. $data[$field] = $fieldValue;
  99. }
  100. }
  101. if (!empty($data)) {
  102. $this->_addToWhitelist($model, array_keys($data));
  103. $model->data[$model->alias] = array_merge($model->data[$model->alias], $data);
  104. }
  105. return $result;
  106. }
  107. }
  108. ?>