NamedScopeBehavior.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. App::uses('ModelBehavior', 'Model');
  3. // basic code taken and modified/fixed from https://github.com/netguru/namedscopebehavior
  4. /**
  5. * Edited - Mark Scherer
  6. * - its now "scope" instead of "scopes" (singular and now analogous to "contain" etc)
  7. * - corrected syntax, indentation
  8. * - now probably cake2.x ready (awaiting tests)
  9. */
  10. class NamedScopeBehavior extends ModelBehavior {
  11. protected $_defaults = array(
  12. 'scope' => array()
  13. );
  14. public function setup(Model $Model, $settings = array()) {
  15. $this->settings[$Model->alias] = $settings + $this->_defaults;
  16. }
  17. public function beforeFind(Model $Model, $queryData) {
  18. $scopes = array();
  19. // passed as scopes
  20. if (!empty($queryData['scope'])) {
  21. $scope = !is_array($queryData['scope']) ? array($queryData['scope']) : $queryData['scope'];
  22. $scopes = array_merge($scopes, $scope);
  23. }
  24. // passed as conditions['scope']
  25. if (is_array($queryData['conditions']) && !empty($queryData['conditions']['scope'])) {
  26. $scope = !is_array($queryData['conditions']['scope']) ? array($queryData['conditions']['scope']) : $queryData['conditions']['scope'];
  27. unset($queryData['conditions']['scope']);
  28. $scopes = array_merge($scopes, $scope);
  29. }
  30. // if there are scopes defined, we need to get rid of possible condition set earlier by find() method if model->id was set
  31. if (!empty($scopes) && !empty($Model->id) && !empty($queryData['conditions']["`{$Model->alias}`.`{$Model->primaryKey}`"]) && $queryData['conditions']["`{$Model->alias}`.`{$Model->primaryKey}`"] ==
  32. $Model->id) {
  33. unset($queryData['conditions']["`{$Model->alias}`.`{$Model->primaryKey}`"]);
  34. }
  35. $queryData['conditions'][] = $this->_conditions($scopes, $Model->alias);
  36. return $queryData;
  37. }
  38. /**
  39. * NamedScopeBehavior::scope()
  40. *
  41. * @param Model $Model
  42. * @param string $name
  43. * @param mixed $value
  44. * @return mixed
  45. */
  46. public function scope(Model $Model, $name = null, $value = null) {
  47. if ($name === null) {
  48. return $this->settings[$Model->alias]['scope'];
  49. }
  50. if (in_array($name, $this->settings[$Model->alias]['scope'])) {
  51. continue;
  52. }
  53. $this->settings[$Model->alias]['scope'][$name] = $value;
  54. }
  55. /**
  56. * NamedScopeBehavior::_conditions()
  57. *
  58. * @param array $scopes
  59. * @param string $modelName
  60. * @return array
  61. */
  62. protected function _conditions(array $scopes, $modelName) {
  63. $conditions = array();
  64. foreach ($scopes as $scope) {
  65. if (strpos($scope, '.')) {
  66. list($scopeModel, $scope) = explode('.', $scope);
  67. } else {
  68. $scopeModel = $modelName;
  69. }
  70. if (!empty($this->settings[$scopeModel]['scope'][$scope])) {
  71. $conditions[] = array($this->settings[$scopeModel]['scope'][$scope]);
  72. }
  73. }
  74. return $conditions;
  75. }
  76. }