WhoDidItBehavior.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. /**
  3. * PHP 5
  4. *
  5. * @copyright http://www.4webby.com
  6. * @author Daniel Vecchiato
  7. * @author Mark Scherer
  8. * @licence MIT
  9. */
  10. App::uses('CakeSession', 'Model/Datasource');
  11. App::uses('ModelBehavior', 'Model');
  12. /**
  13. * WhoDidIt Model Behavior
  14. *
  15. * Handles created_by, modified_by fields for a given model, if they exist in the model's
  16. * table scheme.
  17. * It's similar to the created, modified automagic, but it stores the id of the logged in
  18. * user in the models that have $actsAs = array('Tools.WhoDidIt').
  19. *
  20. * This is useful to track who created records, and the last user that has changed them.
  21. *
  22. * @link http://book.cakephp.org/2.0/en/models/saving-your-data.html#using-created-and-modified
  23. */
  24. class WhoDidItBehavior extends ModelBehavior {
  25. /**
  26. * Default settings for a model that has this behavior attached.
  27. *
  28. * @var array
  29. */
  30. protected $_defaults = array(
  31. 'auth_session' => 'Auth', // Name of Auth session key.
  32. 'user_model' => 'User', // Name of User model.
  33. 'created_by_field' => 'created_by', // The name of the "created_by" field in DB.
  34. 'modified_by_field' => 'modified_by', // The name of the "modified_by" field in DB.
  35. 'confirmed_by_field' => 'confirmed_by', // The name of the "confirmed_by" field in DB.
  36. 'auto_bind' => true // Automatically bind the model to the User model.
  37. );
  38. /**
  39. * Initiate WhoDidIt Behavior.
  40. *
  41. * Checks if the configured fields are available in the model.
  42. * Also binds the User model as association for each available field.
  43. *
  44. * @param Model $Model The model.
  45. * @param array $config Behavior settings you would like to override.
  46. * @return void
  47. */
  48. public function setup(Model $Model, $config = array()) {
  49. $this->settings[$Model->alias] = array_merge($this->_defaults, (array)$config);
  50. $hasFieldCreatedBy = $Model->hasField($this->settings[$Model->alias]['created_by_field']);
  51. $hasFieldModifiedBy = $Model->hasField($this->settings[$Model->alias]['modified_by_field']);
  52. $hasFieldConfirmedBy = $Model->hasField($this->settings[$Model->alias]['confirmed_by_field']);
  53. $this->settings[$Model->alias]['has_created_by'] = $hasFieldCreatedBy;
  54. $this->settings[$Model->alias]['has_modified_by'] = $hasFieldModifiedBy;
  55. $this->settings[$Model->alias]['has_confirmed_by'] = $hasFieldConfirmedBy;
  56. // Handles model binding to the User model according to the auto_bind settings (default true).
  57. if ($this->settings[$Model->alias]['auto_bind']) {
  58. if ($hasFieldCreatedBy) {
  59. $commonBelongsTo = array(
  60. 'CreatedBy' => array(
  61. 'className' => $this->settings[$Model->alias]['user_model'],
  62. 'foreignKey' => $this->settings[$Model->alias]['created_by_field']));
  63. $Model->bindModel(array('belongsTo' => $commonBelongsTo), false);
  64. }
  65. if ($hasFieldModifiedBy) {
  66. $commonBelongsTo = array(
  67. 'ModifiedBy' => array(
  68. 'className' => $this->settings[$Model->alias]['user_model'],
  69. 'foreignKey' => $this->settings[$Model->alias]['modified_by_field']));
  70. $Model->bindModel(array('belongsTo' => $commonBelongsTo), false);
  71. }
  72. if ($hasFieldConfirmedBy) {
  73. $commonBelongsTo = array(
  74. 'ConfirmedBy' => array(
  75. 'className' => $this->settings[$Model->alias]['user_model'],
  76. 'foreignKey' => $this->settings[$Model->alias]['confirmed_by_field']));
  77. $Model->bindModel(array('belongsTo' => $commonBelongsTo), false);
  78. }
  79. }
  80. }
  81. /**
  82. * Before save callback.
  83. *
  84. * Checks if at least one field is available.
  85. * Reads the current user id from the session.
  86. *
  87. * @param Model $Model The model using this behavior.
  88. * @return boolean True if the operation should continue, false if it should abort.
  89. */
  90. public function beforeSave(Model $Model, $options = array()) {
  91. if ($this->settings[$Model->alias]['has_created_by'] || $this->settings[$Model->alias]['has_modified_by']) {
  92. $AuthSession = $this->settings[$Model->alias]['auth_session'];
  93. $UserSession = $this->settings[$Model->alias]['user_model'];
  94. $userId = CakeSession::read($AuthSession . '.' . $UserSession . '.id');
  95. if ($userId) {
  96. $data = array($this->settings[$Model->alias]['modified_by_field'] => $userId);
  97. if (!$Model->exists()) {
  98. $data[$this->settings[$Model->alias]['created_by_field']] = $userId;
  99. }
  100. $Model->set($data);
  101. }
  102. }
  103. return true;
  104. }
  105. }