Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

265 lines
8.7KB

  1. <?php
  2. /**
  3. * Copyright Souke (2018)
  4. *
  5. * contact@souke.fr
  6. *
  7. * Ce logiciel est un programme informatique servant à aider les producteurs
  8. * à distribuer leur production en circuits courts.
  9. *
  10. * Ce logiciel est régi par la licence CeCILL soumise au droit français et
  11. * respectant les principes de diffusion des logiciels libres. Vous pouvez
  12. * utiliser, modifier et/ou redistribuer ce programme sous les conditions
  13. * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
  14. * sur le site "http://www.cecill.info".
  15. *
  16. * En contrepartie de l'accessibilité au code source et des droits de copie,
  17. * de modification et de redistribution accordés par cette licence, il n'est
  18. * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
  19. * seule une responsabilité restreinte pèse sur l'auteur du programme, le
  20. * titulaire des droits patrimoniaux et les concédants successifs.
  21. *
  22. * A cet égard l'attention de l'utilisateur est attirée sur les risques
  23. * associés au chargement, à l'utilisation, à la modification et/ou au
  24. * développement et à la reproduction du logiciel par l'utilisateur étant
  25. * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
  26. * manipuler et qui le réserve donc à des développeurs et des professionnels
  27. * avertis possédant des connaissances informatiques approfondies. Les
  28. * utilisateurs sont donc invités à charger et tester l'adéquation du
  29. * logiciel à leurs besoins dans des conditions permettant d'assurer la
  30. * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
  31. * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
  32. *
  33. * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
  34. * pris connaissance de la licence CeCILL, et que vous en avez accepté les
  35. * termes.
  36. */
  37. namespace common\components;
  38. use common\helpers\GlobalParam;
  39. class ActiveRecordCommon extends \yii\db\ActiveRecord
  40. {
  41. const SEARCH_QUERY = 'query';
  42. const SEARCH_ALL = 'all';
  43. const SEARCH_ONE = 'one';
  44. const SEARCH_COUNT = 'count';
  45. public ?string $redirect_url = '';
  46. public function equal($record): bool
  47. {
  48. return $this->id == $record->id;
  49. }
  50. public function populateFieldObject($fieldIdentifier, $fieldObject, $object)
  51. {
  52. $this->{$fieldIdentifier} = $object ? $object->id : null;
  53. $this->populateRelation($fieldObject, $object);
  54. }
  55. public function triggerEvent(string $event, array $attributes)
  56. {
  57. $event = new $event();
  58. foreach($attributes as $key => $value) {
  59. $event->$key = $value;
  60. }
  61. $this->trigger($event::NAME, $event);
  62. }
  63. /**
  64. * Méthode générique de recherche utilisée pour tous les modèles. Elle a
  65. * pour but de construire la requête et de retourner le résultat.
  66. *
  67. * @param array $params
  68. * @param array $options
  69. * @return mixed
  70. * @throws NotFoundHttpException
  71. */
  72. public static function searchBy($params = [], $options = [])
  73. {
  74. $class = get_called_class();
  75. $repositoryClass = str_replace('\\Model\\', '\\Repository\\', $class).'Repository';
  76. $repository = $repositoryClass::getInstance();
  77. if(method_exists($repository , 'getDefaultOptionsSearch')) {
  78. $default_options = $repository->getDefaultOptionsSearch();
  79. } else {
  80. throw new \ErrorException('La méthode "getDefaultOptionsSearch" n\'est '
  81. . 'pas définie dans la classe "' . $repositoryClass . '"');
  82. }
  83. $options = array_merge($default_options, $options);
  84. $pk = $class::primaryKey();
  85. $pk = $class::tableName() . '.' . $pk[0];
  86. if (isset($options['attribute_id_producer']) && strlen($options['attribute_id_producer'])
  87. && !isset($params[$options['attribute_id_producer']])
  88. && !\Yii::$app->user->isGuest
  89. && !isset($options['ignore_id_producer'])
  90. ) {
  91. $params[$options['attribute_id_producer']] = GlobalParam::getCurrentProducerId();
  92. }
  93. if (!isset($options['type_search'])) {
  94. $options['type_search'] = self::SEARCH_ALL;
  95. }
  96. if($class == 'common\models\PointSale' && !isset($options['status'])) {
  97. $params['status'] = 1;
  98. }
  99. $records = $class::find();
  100. // With
  101. if (is_array($options['with']) && count($options['with'])) {
  102. $records = $records->with($options['with']);
  103. }
  104. // Join with
  105. if (is_array($options['join_with']) && count($options['join_with'])) {
  106. $records = $records->joinWith($options['join_with']);
  107. }
  108. // Conditions
  109. if (isset($options['conditions'])) {
  110. if (is_array($options['conditions'])) {
  111. if (count($options['conditions'])) {
  112. foreach ($options['conditions'] as $condition) {
  113. $records = $records->andWhere($condition);
  114. }
  115. }
  116. } else {
  117. if (strlen($options['conditions'])) {
  118. $records = $records->andWhere($options['conditions']);
  119. }
  120. }
  121. }
  122. // Params
  123. if (isset($options['params']) && is_array($options['params']) && count($options['params'])) {
  124. $records = $records->params($options['params']);
  125. }
  126. // Paramètres
  127. if (is_array($params) && count($params)) {
  128. foreach ($params as $key => $val) {
  129. if (strpos($key, '.') === false) {
  130. unset($params[$key]);
  131. $key = $class::tableName() . '.' . $key;
  132. $params[$key] = $val;
  133. }
  134. $records = $records->andWhere([$key => $val]);
  135. }
  136. }
  137. if (!isset($params[$pk])) {
  138. // Orderby
  139. if (isset($options['orderby']) && strlen($options['orderby'])) {
  140. $records = $records->orderBy($options['orderby']);
  141. }
  142. // Limit
  143. if (isset($options['limit']) && is_numeric($options['limit'])
  144. && $options['limit'] > 0) {
  145. $records = $records->limit($options['limit']);
  146. }
  147. }
  148. if (isset($options['groupby'])) {
  149. $records = $records->groupBy($options['groupby']);
  150. }
  151. if (isset($options['as_array'])) {
  152. $records = $records->asArray();
  153. }
  154. if ($options['type_search'] == self::SEARCH_QUERY) {
  155. self::groupByPrimaryKey($class, $records);
  156. return $records;
  157. } elseif ($options['type_search'] == self::SEARCH_ALL) {
  158. return $records->all();
  159. } elseif ($options['type_search'] == self::SEARCH_ONE) {
  160. $record = $records->one();
  161. if ($record) {
  162. return $record;
  163. }
  164. } elseif ($options['type_search'] == self::SEARCH_COUNT) {
  165. self::groupByPrimaryKey($class, $records);
  166. return $records->count();
  167. }
  168. return null;
  169. }
  170. public static function groupByPrimaryKey($class, $records)
  171. {
  172. $primaryKey = static::primaryKey();
  173. $records = $records->groupBy($class::tableName() . '.' . $primaryKey[0]);
  174. }
  175. public static function searchQuery($params = [], $options = [])
  176. {
  177. $options['type_search'] = self::SEARCH_QUERY;
  178. return self::searchDispatch($params, $options);
  179. }
  180. /**
  181. * Recherche un enregistrement.
  182. *
  183. * @param array $params
  184. * @param array $options
  185. * @return mixed
  186. */
  187. public static function searchOne($params = [], $options = [])
  188. {
  189. $options['type_search'] = self::SEARCH_ONE;
  190. return self::searchDispatch($params, $options);
  191. }
  192. /**
  193. * Recherche tous les enregistrements.
  194. *
  195. * @param array $params
  196. * @param array $options
  197. * @return mixed
  198. */
  199. public static function searchAll($params = [], $options = [])
  200. {
  201. $options['type_search'] = self::SEARCH_ALL;
  202. return self::searchDispatch($params, $options);
  203. }
  204. /**
  205. * Recherche et compte le nombre de résultats.
  206. *
  207. * @param array $params
  208. * @param array $options
  209. * @return integer
  210. */
  211. public static function searchCount($params = [], $options = [])
  212. {
  213. $options['type_search'] = self::SEARCH_COUNT;
  214. return self::searchDispatch($params, $options);
  215. }
  216. /**
  217. * Appelle la méthode 'search' de la classe appellante.
  218. *
  219. * @param array $params
  220. * @param array $options
  221. * @return mixed
  222. */
  223. public static function searchDispatch($params = [], $options = [])
  224. {
  225. $class = get_called_class();
  226. return $class::searchBy($params, $options);
  227. }
  228. }