1717use Joomla \CMS \Language \Text ;
1818use Joomla \CMS \MVC \Model \ListModel ;
1919use Joomla \Component \SWJProjects \Administrator \Helper \KeysHelper ;
20+ use Joomla \Uri \Uri ;
2021use Joomla \Utilities \ArrayHelper ;
2122use function array_merge ;
2223use function array_unique ;
@@ -74,11 +75,14 @@ public function __construct($config = [])
7475 // Add the ordering filtering fields whitelist
7576 if (empty ($ config ['filter_fields ' ]))
7677 {
77- $ config ['filter_fields ' ] = [
78- 'id ' , 'v.id ' ,
79- 'published ' , 'state ' , 'k.state ' ,
80- 'project ' , 'project_id ' , 'k.project_id ' , 'p.id ' ,
81- ];
78+ $ config ['filter_fields ' ] = [
79+ 'id ' , 'k.id ' ,
80+ 'published ' , 'state ' , 'k.state ' ,
81+ 'project ' , 'project_id ' , 'k.project_id ' , 'p.id ' ,
82+ 'email ' ,'k.email ' ,
83+ 'domain ' ,'k.domain ' ,
84+ 'order ' , 'k.order '
85+ ];
8286 }
8387
8488 parent ::__construct ($ config );
@@ -208,7 +212,7 @@ public function getProjects($pks = null)
208212 *
209213 * @since 1.6.0
210214 */
211- public function getUsers ($ pks = null )
215+ public function getUsers ($ pks = null ): array
212216 {
213217 if ($ this ->_users === null ) $ this ->_users = [];
214218
@@ -295,7 +299,7 @@ protected function getStoreId($id = '')
295299 }
296300
297301 /**
298- * Build an sql query to load versions list.
302+ * Build SQL query to load versions list.
299303 *
300304 * @return DatabaseQuery Database query to load versions list.
301305 *
@@ -305,14 +309,14 @@ protected function getListQuery()
305309 {
306310 $ db = $ this ->getDatabase ();
307311 $ query = $ db ->getQuery (true )
308- ->select (array ( 'k.* ' ) )
312+ ->select ([ 'k.* ' ] )
309313 ->from ($ db ->quoteName ('#__swjprojects_keys ' , 'k ' ));
310314
311315 // Filter by published state
312316 $ published = $ this ->getState ('filter.published ' );
313317 if (is_numeric ($ published ))
314318 {
315- $ query ->where ('k.state = ' . ( int ) $ published );
319+ $ query ->where ($ db -> quoteName ( 'k.state ' ). ' = ' . $ db -> quote (( int ) $ published) );
316320 }
317321 elseif ($ published === '' )
318322 {
@@ -328,28 +332,46 @@ protected function getListQuery()
328332 $ query ->where ('( ' . implode (' OR ' , $ sql ) . ') ' );
329333 }
330334
331- // Filter by search
332- $ search = $ this ->getState ('filter.search ' );
333- if (!empty ($ search ))
334- {
335- if (stripos ($ search , 'id: ' ) === 0 )
336- {
337- $ query ->where ('k.id = ' . (int ) substr ($ search , 3 ));
338- }
339- else
340- {
341- $ sql = [];
342- $ columns = ['k.key ' , 'k.note ' ];
343-
344- foreach ($ columns as $ column )
345- {
346- $ sql [] = $ db ->quoteName ($ column ) . ' LIKE '
347- . $ db ->quote ('% ' . str_replace (' ' , '% ' , $ db ->escape (trim ($ search ), true ) . '% ' ));
348- }
349-
350- $ query ->where ('( ' . implode (' OR ' , $ sql ) . ') ' );
351- }
352- }
335+ // Filter by search
336+ $ search = $ this ->getState ('filter.search ' );
337+ if (!empty ($ search ))
338+ {
339+ if (stripos ($ search , 'id: ' ) === 0 )
340+ {
341+ $ query ->where ($ db ->quoteName ('k.id ' ).' = ' . $ db ->quote ((int ) substr ($ search , 3 )));
342+ }
343+ elseif (stripos ($ search , 'd: ' ) === 0 )
344+ {
345+ $ domain = (new Uri ())->setHost (substr ($ search , 2 ))->getHost ();
346+ $ query ->where ($ db ->quoteName ('k.domain ' ).' = ' . $ db ->quote ($ domain ));
347+ $ query ->where ($ db ->quoteName ('k.note ' ).' LIKE ' . $ db ->quote ('% ' . str_replace (' ' , '% ' , $ db ->escape (trim ($ domain ), true ) . '% ' )));
348+ }
349+ elseif (stripos ($ search , 'e: ' ) === 0 || str_contains ($ search ,'@ ' ))
350+ {
351+ if (stripos ($ search , 'e: ' ) === 0 ) {
352+ $ search = substr ($ search , 2 );
353+ }
354+
355+ $ query ->where ($ db ->quoteName ('k.email ' ).' = ' . $ db ->quote ($ search ));
356+ }
357+ elseif (stripos ($ search , 'o: ' ) === 0 )
358+ {
359+ $ query ->where ($ db ->quoteName ('k.order ' ).' = ' . $ db ->quote (substr ($ search , 2 )));
360+ }
361+ else
362+ {
363+ $ sql = [];
364+ $ columns = ['k.key ' , 'k.note ' , 'k.email ' , 'k.domain ' , 'k.order ' ];
365+
366+ foreach ($ columns as $ column )
367+ {
368+ $ sql [] = $ db ->quoteName ($ column ) . ' LIKE '
369+ . $ db ->quote ('% ' . str_replace (' ' , '% ' , $ db ->escape (trim ($ search ), true ) . '% ' ));
370+ }
371+
372+ $ query ->where ('( ' . implode (' OR ' , $ sql ) . ') ' );
373+ }
374+ }
353375
354376 // Group by
355377 $ query ->group (['k.id ' ]);
0 commit comments