PageRenderTime 27ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/Croogo/Model/Behavior/PublishableBehavior.php

https://github.com/kareypowell/croogo
PHP | 107 lines | 59 code | 13 blank | 35 comment | 6 complexity | 82d61708cf3d0af951b7721560b616f4 MD5 | raw file
  1. <?php
  2. App::uses('AuthComponent', 'Controller/Component');
  3. App::uses('CroogoStatus', 'Croogo.Lib');
  4. /**
  5. * Publishable Behavior
  6. *
  7. * Provides status and period filtering. Requires the following fields:
  8. * - `status` integer value from `CroogoStatus::statuses()
  9. * - `publish_start` datetime indicates the start of publishing period
  10. * - `publish_end` datetime indicates the end of publishing period
  11. *
  12. * @category Croogo.Model.Behavior
  13. * @package Croogo.Croogo.Model.Behavior
  14. * @author Rachman Chavik <rchavik@gmail.com>
  15. * @license http://www.opensource.org/licenses/mit-license.php The MIT License
  16. * @link http://www.croogo.org
  17. * @see CroogoStatus
  18. */
  19. class PublishableBehavior extends ModelBehavior {
  20. /**
  21. * Setup
  22. *
  23. * Valid options:
  24. *
  25. * `admin`: Enable/disable date filtering for users with Admin roles
  26. * `fields`: Specifies the physical field name to use
  27. *
  28. * @return void
  29. */
  30. public function setup(Model $model, $config = array()) {
  31. $this->settings[$model->alias] = Hash::merge(array(
  32. 'admin' => false,
  33. 'fields' => array(
  34. 'publish_start' => 'publish_start',
  35. 'publish_end' => 'publish_end',
  36. ),
  37. ), $config);
  38. $this->_CroogoStatus = new CroogoStatus();
  39. }
  40. /**
  41. * Get status for conditions in query based on current user's role id
  42. *
  43. * @return array Array of status
  44. */
  45. public function status(Model $model, $statusType = 'publishing', $accessType = 'public') {
  46. return $this->_CroogoStatus->status($statusType, $accessType);
  47. }
  48. /**
  49. * Filter records based on period
  50. *
  51. * @return array Options passed to Model::find()
  52. */
  53. public function beforeFind(Model $model, $query = array()) {
  54. $settings = $this->settings[$model->alias];
  55. if (!$model->Behaviors->enabled('Publishable')) {
  56. return $query;
  57. }
  58. if ($settings['admin'] === false) {
  59. if (AuthComponent::user('role_id') == 1) {
  60. return $query;
  61. }
  62. }
  63. if (!$model->hasField($settings['fields']['publish_start']) ||
  64. !$model->hasField($settings['fields']['publish_end'])
  65. ) {
  66. return $query;
  67. }
  68. $date = isset($query['date']) ? $query['date'] : date('Y-m-d H:i:s');
  69. $start = $model->escapeField($settings['fields']['publish_start']);
  70. $end = $model->escapeField($settings['fields']['publish_end']);
  71. if (is_string($query['conditions'])) {
  72. $query['conditions'] = (array)$query['conditions'];
  73. }
  74. $query['conditions'][] = array(
  75. 'OR' => array(
  76. $start => null,
  77. array(
  78. $start . ' <> ' => null,
  79. $start . ' <=' => $date,
  80. ),
  81. ),
  82. );
  83. $query['conditions'][] = array(
  84. 'OR' => array(
  85. $end => null,
  86. array(
  87. $end . ' <> ' => null,
  88. $end . ' >=' => $date,
  89. ),
  90. ),
  91. );
  92. return $query;
  93. }
  94. }