1: <?php
2:
3: /**
4: * Saved search modules
5: * @package modules
6: * @subpackage savedsearches
7: */
8:
9: if (!defined('DEBUG_MODE')) { die(); }
10:
11: /**
12: * @subpackage savedsearches/handler
13: */
14: class Hm_Handler_save_searches_data extends Hm_Handler_Module {
15: public function process() {
16: $name = array_key_exists('search_name', $this->request->get) ? $this->request->get['search_name'] : '';
17: $searches = new Hm_Saved_Searches($this->user_config->get('saved_searches', array()));
18: $params = $name ? $searches->get($name, array()) : array();
19: $url_search = get_search_from_url($this->request);
20: $diff = array_diff_assoc($params, $url_search);
21: if (count($diff) > 0) {
22: $this->out('search_param_update', true);
23: }
24: $this->out('search_name', $name);
25: $this->out('search_params', $params);
26: }
27: }
28:
29: /**
30: * @subpackage savedsearches/handler
31: */
32: class Hm_Handler_saved_search_folder_data extends Hm_Handler_Module {
33: public function process() {
34: $this->out('saved_searches', $this->user_config->get('saved_searches', array()));
35: }
36: }
37:
38: /**
39: * @subpackage savedsearches/handler
40: */
41: class Hm_Handler_update_search extends Hm_Handler_Module {
42: public function process() {
43: list($success, $form) = $this->process_form(array('search_name'));
44: if ($success) {
45: $data = get_search_from_post($this->request);
46: $searches = new Hm_Saved_Searches($this->user_config->get('saved_searches', array()));
47: if ($searches->update($form['search_name'], $data)) {
48: $this->session->record_unsaved('Updated a search');
49: $this->user_config->set('saved_searches', $searches->dump());
50: $this->session->set('user_data', $this->user_config->dump());
51: $this->out('updated_search', true);
52: Hm_Msgs::add('Saved search updated', 'info');
53: }
54: else {
55: Hm_Msgs::add('Unable to update the search paramaters', 'danger');
56: }
57: }
58: }
59: }
60:
61: /**
62: * @subpackage savedsearches/handler
63: */
64: class Hm_Handler_delete_search extends Hm_Handler_Module {
65: public function process() {
66: list($success, $form) = $this->process_form(array('search_name'));
67: if ($success) {
68: $searches = new Hm_Saved_Searches($this->user_config->get('saved_searches', array()));
69: if ($searches->delete($form['search_name'])) {
70: $this->session->record_unsaved('Deleted a search');
71: $this->user_config->set('saved_searches', $searches->dump());
72: $this->session->set('user_data', $this->user_config->dump());
73: $this->out('deleted_search', true);
74: }
75: }
76: }
77: }
78:
79:
80: /**
81: * @subpackage savedsearches/handler
82: */
83: class Hm_Handler_update_save_search_label extends Hm_Handler_Module {
84: public function process() {
85: list($success, $form) = $this->process_form(array('search_name', 'search_terms_label', 'old_search_terms_label'));
86: if ($success) {
87: $searches = new Hm_Saved_Searches($this->user_config->get('saved_searches', array()));
88: if ($searches->rename($form['old_search_terms_label'], $form['search_terms_label'])) {
89: $this->session->record_unsaved('Update a saved search label');
90: $this->user_config->set('saved_searches', $searches->dump());
91: $this->session->set('user_data', $this->user_config->dump());
92: $this->out('new_saved_search_label', $form['search_terms_label']);
93: $this->out('update_save_search_label', true);
94: Hm_Msgs::add('Saved search label updated');
95: }
96: }
97: }
98: }
99:
100: /**
101: * @subpackage savedsearches/handler
102: */
103: class Hm_Handler_save_search extends Hm_Handler_Module {
104: public function process() {
105: list($success, $form) = $this->process_form(array('search_name'));
106: if ($success) {
107: $data = get_search_from_post($this->request);
108: $searches = new Hm_Saved_Searches($this->user_config->get('saved_searches', array()));
109: if ($searches->add($form['search_name'], $data)) {
110: $this->session->record_unsaved('Saved a search');
111: $this->user_config->set('saved_searches', $searches->dump());
112: $this->session->set('user_data', $this->user_config->dump());
113: $this->out('saved_search', true);
114: Hm_Msgs::add('Search saved', 'success');
115: }
116: else {
117: Hm_Msgs::add('You already have a search by that name', 'warning');
118: }
119: }
120: }
121: }
122:
123: /**
124: * @subpackage savedsearches/output
125: */
126: class Hm_Output_search_name_fld extends Hm_Output_Module {
127: protected function output() {
128: $name = $this->get('search_name', '');
129: return '<input type="hidden" class="search_name" name="search_name" value="'.$this->html_safe($name).'" />';
130: }
131: }
132:
133: /**
134: * @subpackage savedsearches/output
135: */
136: class Hm_Output_filter_saved_search_result extends Hm_Output_Module {
137: protected function output() {
138: if ($this->get('saved_search') || $this->get('updated_search') || $this->get('deleted_search') || $this->get('update_save_search_label')) {
139: $this->out('saved_search_result', 1);
140: }
141: else {
142: $this->out('saved_search_result', 0);
143: }
144: }
145: }
146:
147: /**
148: * @subpackage savedsearches/output
149: */
150: class Hm_Output_update_search_icon extends Hm_Output_Module {
151: protected function output() {
152: if ($this->get('search_param_update')) {
153: return '<a href="" class="update_search" title="'.$this->trans('Update saved search').'"><i class="bi bi-check-circle-fill"></i></a>';
154: }
155: }
156: }
157:
158:
159: /**
160: * @subpackage savedsearches/output
161: */
162: class Hm_Output_update_search_label_icon extends Hm_Output_Module {
163: protected function output() {
164: $style = '';
165: if (!$this->get('search_name')) {
166: $style = 'style="display: none;"';
167: }
168: $res = '<a href="" class="update_search_label" title="'.$this->trans('Update saved search label').'"><i class="bi bi-pencil-fill"></i></a>' . update_search_label_field($this->get('search_name'), $this);
169: return $res;
170: }
171: }
172:
173: /**
174: * @subpackage savedsearches/output
175: */
176: class Hm_Output_delete_search_icon extends Hm_Output_Module {
177: protected function output() {
178: $style = '';
179: if (!$this->get('search_name')) {
180: $style = 'style="display: none;"';
181: }
182: return '<a href="" '.$style.' class="delete_search btn btn-light" title="'.$this->trans('Delete saved search').'"><i class="bi bi-x-circle-fill"></i></a>';
183: }
184: }
185:
186: /**
187: * @subpackage savedsearches/output
188: */
189: class Hm_Output_save_search_icon extends Hm_Output_Module {
190: protected function output() {
191: $name = $this->get('search_name', '');
192: if (!$name) {
193: return '<a style="display: none;" href="" class="save_search" title="'.$this->trans('Save search').'"><i class="bi bi-check-circle-fill"></i></a>';
194: }
195: }
196: }
197:
198: /**
199: * @subpackage savedsearches/output
200: */
201: class Hm_Output_save_searches_form extends Hm_Output_Module {
202: protected function output() {
203: $name = $this->get('search_name', '');
204: if (!$name) {
205: return '<form style="display: none;" class="saved_searches_form"><input type="text" placeholder="'.$this->trans('Search Name').
206: '" class="new_search_name" name="search_name" value="" />'.
207: '<input type="submit" class="save_search" value="'.$this->trans('Save').'" /></form>';
208: }
209: }
210: }
211:
212: /**
213: * @subpackage savedsearches/output
214: */
215: class Hm_Output_search_folders extends Hm_Output_Module {
216: protected function output() {
217: $res = '';
218: $details = $this->get('saved_searches', array());
219: if (!empty($details)) {
220: foreach ($details as $name => $args) {
221: $url = sprintf('?page=search&amp;search_terms=%s&amp;search_fld=%s&amp;search_since=%s&amp;search_name=%s',
222: $this->html_safe(urlencode($args[0])),
223: $this->html_safe(urlencode($args[2])),
224: $this->html_safe(urlencode($args[1])),
225: $this->html_safe(urlencode($name))
226: );
227: $res .= '<li class="menu_search_'.$this->html_safe($name).'"><a class="unread_link" href="'.$url.'">';
228: if (!$this->get('hide_folder_icons')) {
229: $res .= '<i class="bi bi-search account_icon"></i> ';
230: }
231: $res .= $this->html_safe($name).'</a></li>';
232: }
233: $this->append('folder_sources', array('search_folders', $res));
234: }
235: }
236: }
237:
238: /**
239: * @subpackage savedsearches/lib
240: */
241: class Hm_Saved_Searches {
242:
243: private $searches;
244:
245: public function __construct($data) {
246: $this->searches = $data;
247: }
248: public function dump() {
249: ksort($this->searches);
250: return $this->searches;
251: }
252: public function update($name, $search) {
253: if (array_key_exists($name, $this->searches)) {
254: $this->searches[$name] = $search;
255: return true;
256: }
257: return false;
258: }
259: public function add($name, $search) {
260: if (!array_key_exists($name, $this->searches)) {
261: $this->searches[$name] = $search;
262: return true;
263: }
264: return false;
265: }
266: public function get($name, $default=false) {
267: if (array_key_exists($name, $this->searches)) {
268: return $this->searches[$name];
269: }
270: return $default;
271: }
272: public function delete($del_name) {
273: $new_searches = array();
274: $old_searches = $this->searches;
275: foreach ($old_searches as $name => $vals) {
276: if ($name !== $del_name) {
277: $new_searches[$name] = $vals;
278: }
279: }
280: $this->searches = $new_searches;
281: return count($new_searches) !== count($old_searches);
282: }
283: public function rename($old_name, $new_name) {
284: if(array_key_exists($old_name, $this->searches)) {
285: $this->searches[$new_name] = $this->searches[$old_name];
286: unset($this->searches[$old_name]);
287: return true;
288: }
289: return false;
290: }
291: }
292:
293: /**
294: * @subpackage savedsearches/functions
295: */
296: if (!hm_exists('get_search_from_post')) {
297: function get_search_from_post($request) {
298: return array(
299: array_key_exists('search_terms', $request->post) ? $request->post['search_terms'] : '',
300: array_key_exists('search_since', $request->post) ? $request->post['search_since'] : DEFAULT_SEARCH_SINCE,
301: array_key_exists('search_fld', $request->post) ? $request->post['search_fld'] : DEFAULT_SEARCH_FLD,
302: array_key_exists('search_name', $request->post) ? $request->post['search_name'] : '',
303: );
304: }}
305:
306: /**
307: * @subpackage savedsearches/functions
308: */
309: if (!hm_exists('get_search_from_url')) {
310: function get_search_from_url($request) {
311: return array(
312: array_key_exists('search_terms', $request->get) ? $request->get['search_terms'] : '',
313: array_key_exists('search_since', $request->get) ? $request->get['search_since'] : DEFAULT_SEARCH_SINCE,
314: array_key_exists('search_fld', $request->get) ? $request->get['search_fld'] : DEFAULT_SEARCH_FLD,
315: array_key_exists('search_name', $request->get) ? $request->get['search_name'] : '',
316: );
317: }}
318: