WhoDidItBehavior.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. /**
  3. * WhoDidIt Model Behavior for CakePHP
  4. *
  5. * Handles created_by, modified_by fields for a given Model, if they exist in the Model DB table.
  6. * It's similar to the created, modified automagic, but it stores the logged User id
  7. * in the models that actsAs = array('WhoDidIt')
  8. *
  9. * This is useful to track who created records, and the last user that has changed them
  10. *
  11. * @package behaviors
  12. * @author Daniel Vecchiato
  13. * @version 1.2
  14. * @date 01/03/2009
  15. * @copyright http://www.4webby.com
  16. * @licence MIT
  17. * @repository https://github.com/danfreak/4cakephp/tree
  18. *
  19. * enhanced/updated - 2011-07-18 ms
  20. **/
  21. class WhoDidItBehavior extends ModelBehavior {
  22. /**
  23. * Default settings for a model that has this behavior attached.
  24. *
  25. * @var array
  26. * @access protected
  27. */
  28. protected $_defaults = array(
  29. 'auth_session' => 'Auth', //name of Auth session key
  30. 'user_model' => 'User', //name of User model
  31. 'created_by_field' => 'created_by', //the name of the "created_by" field in DB (default 'created_by')
  32. 'modified_by_field' => 'modified_by', //the name of the "modified_by" field in DB (default 'modified_by')
  33. 'confirmed_by_field' => 'confirmed_by',
  34. 'auto_bind' => true //automatically bind the model to the User model (default true)
  35. );
  36. /**
  37. * Initiate WhoDidIt Behavior
  38. *
  39. * @param object $Model
  40. * @param array $config behavior settings you would like to override
  41. * @return void
  42. * @access public
  43. */
  44. public function setup(Model $Model, $config = array()) {
  45. //assign default settings
  46. $this->settings[$Model->alias] = $this->_defaults;
  47. //merge custom config with default settings
  48. $this->settings[$Model->alias] = array_merge($this->settings[$Model->alias], (array)$config);
  49. $hasFieldCreatedBy = $Model->hasField($this->settings[$Model->alias]['created_by_field']);
  50. $hasFieldModifiedBy = $Model->hasField($this->settings[$Model->alias]['modified_by_field']);
  51. $hasFieldConfirmedBy = $Model->hasField($this->settings[$Model->alias]['confirmed_by_field']);
  52. $this->settings[$Model->alias]['has_created_by'] = $hasFieldCreatedBy;
  53. $this->settings[$Model->alias]['has_modified_by'] = $hasFieldModifiedBy;
  54. $this->settings[$Model->alias]['has_confirmed_by'] = $hasFieldConfirmedBy;
  55. //handles model binding to the User model
  56. //according to the auto_bind settings (default true)
  57. if ($this->settings[$Model->alias]['auto_bind']) {
  58. if ($hasFieldCreatedBy) {
  59. $commonBelongsTo = array('CreatedBy' => array('className' => $this->settings[$Model->alias]['user_model'], 'foreignKey' => $this->settings[$Model->
  60. alias]['created_by_field']));
  61. $Model->bindModel(array('belongsTo' => $commonBelongsTo), false);
  62. }
  63. if ($hasFieldModifiedBy) {
  64. $commonBelongsTo = array('ModifiedBy' => array('className' => $this->settings[$Model->alias]['user_model'], 'foreignKey' => $this->settings[$Model->
  65. alias]['modified_by_field']));
  66. $Model->bindModel(array('belongsTo' => $commonBelongsTo), false);
  67. }
  68. if ($hasFieldConfirmedBy) {
  69. $commonBelongsTo = array('ConfirmedBy' => array('className' => $this->settings[$Model->alias]['user_model'], 'foreignKey' => $this->settings[$Model->
  70. alias]['confirmed_by_field']));
  71. $Model->bindModel(array('belongsTo' => $commonBelongsTo), false);
  72. }
  73. }
  74. }
  75. /**
  76. * Before save callback
  77. *
  78. * @param object $Model Model using this behavior
  79. * @return boolean True if the operation should continue, false if it should abort
  80. * @access public
  81. */
  82. public function beforeSave(Model $Model) {
  83. if ($this->settings[$Model->alias]['has_created_by'] || $this->settings[$Model->alias]['has_modified_by']) {
  84. $AuthSession = $this->settings[$Model->alias]['auth_session'];
  85. $UserSession = $this->settings[$Model->alias]['user_model'];
  86. if (isset($this->Session)) {
  87. $userId = $this->Session->read($AuthSession. '.' . $UserSession. '.id');
  88. } else {
  89. $userId = Set::extract($_SESSION, $AuthSession . '.' . $UserSession . '.' . 'id');
  90. }
  91. if ($userId) {
  92. $data = array($this->settings[$Model->alias]['modified_by_field'] => $userId);
  93. if (!$Model->exists()) {
  94. $data[$this->settings[$Model->alias]['created_by_field']] = $userId;
  95. }
  96. $Model->set($data);
  97. }
  98. }
  99. return true;
  100. }
  101. }