PageRenderTime 51ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/public_html/plugins/version/views/helpers/log.php

https://bitbucket.org/southsidehealth/southsidehealth
PHP | 217 lines | 212 code | 5 blank | 0 comment | 2 complexity | 6d4dd82ad2dad8393066e883e1bd30c3 MD5 | raw file
Possible License(s): Apache-2.0, GPL-3.0, LGPL-2.1
  1. <?php
  2. class LogHelper extends AppHelper {
  3. var $helpers = array('Text');
  4. var $format = "{date} - {who} - modified {Person.name}'s record, {changes}";
  5. var $tags = array(
  6. 'date' => ''
  7. );
  8. function __construct() {
  9. //$this->Text = new TextHelper;
  10. }
  11. function __getModels($data) {
  12. $aliases = array();
  13. foreach ($data as $key => $model) {
  14. if (is_array($model)) {
  15. if (!is_numeric($key)) {
  16. $aliases[] = $key;
  17. }
  18. $aliases = array_merge($aliases, $this->__getModels($model));
  19. }
  20. }
  21. return $aliases;
  22. }
  23. function __getAliases($data) {
  24. $models = $this->__getModels($data);
  25. $aliases = array();
  26. foreach ($models as $model) {
  27. if (ClassRegistry::isKeySet(Inflector::underscore($model))) {
  28. $m = ClassRegistry::getObject(Inflector::underscore($model));
  29. } else {
  30. $m = ClassRegistry::init($model);
  31. }
  32. if (method_exists($model, 'aliases')) {
  33. $schema = $m->aliases($data);
  34. $aliases[$model] = $schema[$model]['name'];
  35. foreach ($schema[$model]['fields'] as $k => $v) {
  36. if (strstr($v, '{')) {
  37. $aliases[$model.'.'.$k] = $v;
  38. } else {
  39. if ($v) {
  40. $aliases[$model.'.'.$k] = $model.'.'.$v;
  41. } else {
  42. $aliases[$model.'.'.$k] = null;
  43. }
  44. }
  45. }
  46. } else {
  47. $schema = $m->schema();
  48. foreach ($schema as $k => $v) {
  49. $aliases[$model.'.'.$k] = $model.'.'.$k;
  50. }
  51. }
  52. }
  53. return $aliases;
  54. }
  55. function __interpolate($str, $data, $n = null) {
  56. preg_match_all('/\{[A-Z0-9a-z\._\[\]]+\}/', $str, $tokens);
  57. $tokens = $tokens[0];
  58. foreach ($tokens as $t) {
  59. if (strstr($t, '[n]')) {
  60. $t = str_replace(array('{', '}'), null, $t);
  61. $nt = str_replace(array('{', '}'), null, $t);
  62. $nt = str_replace('[n]', $n, $nt);
  63. $str = str_replace('{'.$t.'}', Set::extract($data, $nt), $str);
  64. } else {
  65. $t = str_replace(array('{', '}'), null, $t);
  66. $str = str_replace('{'.$t.'}', Set::extract($data, $t), $str);
  67. }
  68. }
  69. return $str;
  70. }
  71. function toText($new, $old, $diff) {
  72. $format = $this->format;
  73. $aliases = $this->__getAliases(array_merge($new, $old));
  74. preg_match_all('/\{[A-Z0-9a-z\._]+\}/', $format, $tokens);
  75. $tokens = $tokens[0];
  76. $vars = array();
  77. foreach ($tokens as $t) {
  78. $vars[] = str_replace(array('{', '}'), '', $t);
  79. }
  80. foreach ($vars as $v) {
  81. if (array_key_exists($v, $aliases)) {
  82. $format = str_replace('{'.$v.'}', Set::extract($new, $aliases[$v]), $format);
  83. } else {
  84. if ($value = Set::extract($new, $v)) {
  85. $format = str_replace('{'.$v.'}', $value, $format);
  86. }
  87. }
  88. }
  89. $changes = array(
  90. 'added' => array(),
  91. 'modified' => array(),
  92. 'deleted' => array()
  93. );
  94. $stack = array();
  95. foreach ($diff as $op => $model) {
  96. foreach ($model as $name => $data) {
  97. $stack[] = $name;
  98. $i = 0;
  99. foreach ($data as $k => $d) {
  100. $i++;
  101. if (!is_array($d)) {
  102. if (array_key_exists($name, $aliases)) {
  103. $name = $this->__interpolate($aliases[$name], $new);
  104. }
  105. $stack[] = $k;
  106. $alias = implode('.', $stack);
  107. if (array_key_exists($alias, $aliases) && $aliases[$alias]) {
  108. $changes[$op][$i][$name][] = $this->__interpolate($aliases[$alias], $new);
  109. } elseif (array_key_exists($alias, $aliases) && !$aliases[$alias]) {
  110. //
  111. } else {
  112. $changes[$op][$i][$name][] = $k;
  113. }
  114. array_pop($stack);
  115. } elseif (is_numeric($k)) {
  116. if (array_key_exists($name, $aliases)) {
  117. $name = $this->__interpolate($aliases[$name], $new, $k);
  118. }
  119. foreach ($d as $nestedKey => $nestedData) {
  120. $i++;
  121. if (!is_array($nestedData)) {
  122. $stack[] = $nestedKey;
  123. $alias = implode('.', $stack);
  124. if (array_key_exists($alias, $aliases) && $aliases[$alias]) {
  125. $changes[$op][$i][$name][] = $this->__interpolate($aliases[$alias], $new, $k);
  126. } elseif (array_key_exists($alias, $aliases) && !$aliases[$alias]) {
  127. //
  128. } else {
  129. $changes[$op][$i][$name][] = $nestedKey;
  130. }
  131. array_pop($stack);
  132. }
  133. }
  134. }
  135. }
  136. array_pop($stack);
  137. }
  138. }
  139. $str = '';
  140. foreach ($changes as $op => $data) {
  141. if ($data) {
  142. $str .= $op;
  143. }
  144. $i = 0;
  145. $icount = count($data);
  146. foreach ($data as $k => $v) {
  147. foreach ($v as $alias => $d) {
  148. $i++;
  149. $str .= " $alias ";
  150. $tmp = array();
  151. foreach ($d as $e) {
  152. $tmp[] = $e;
  153. }
  154. $str .= $this->Text->toList($tmp);
  155. if ($i != $icount) {
  156. $str .= ', ';
  157. }
  158. }
  159. }
  160. }
  161. $format = str_replace('{changes}', $str, $format);
  162. return $format;
  163. }
  164. function alias($diff) {
  165. $aliases = $this->__getAliases($diff);
  166. extract($this->__getMeta());
  167. $aliased = array(
  168. 'added' => array(),
  169. 'modified' => array(),
  170. 'deleted' => array()
  171. );
  172. foreach ($diff as $op => $data) {
  173. foreach ($data as $key => $d) {
  174. if (is_array($d)) {
  175. if (array_key_exists($key, $aliases)) {
  176. $parent = $aliases[$key];
  177. } else {
  178. $parent = strtolower(str_replace('_', ' ', "$key's "));
  179. }
  180. foreach ($d as $k => $z) {
  181. if (array_key_exists($key.'.'.$k, $aliases)) {
  182. $aliased[$op][$parent][$aliases[$key.'.'.$k]] = $z;
  183. } else {
  184. $aliased[$op][$parent][strtolower(str_replace('_', ' ', $k))] = $z;
  185. }
  186. }
  187. }
  188. }
  189. }
  190. return $aliased;
  191. }
  192. }
  193. ?>