69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/*
 | 
						|
 * Name: Autocomplete
 | 
						|
 * Author: Daku <admin@codeanimu.net>
 | 
						|
 * Description: Adds autocomplete to search & tagging.
 | 
						|
 */
 | 
						|
 | 
						|
class AutoComplete extends Extension
 | 
						|
{
 | 
						|
    public function get_priority(): int
 | 
						|
    {
 | 
						|
        return 30;
 | 
						|
    } // before Home
 | 
						|
 | 
						|
    public function onPageRequest(PageRequestEvent $event)
 | 
						|
    {
 | 
						|
        global $page, $database;
 | 
						|
 | 
						|
        if ($event->page_matches("api/internal/autocomplete")) {
 | 
						|
            if (!isset($_GET["s"])) {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            $page->set_mode("data");
 | 
						|
            $page->set_type("application/json");
 | 
						|
 | 
						|
            $s = strtolower($_GET["s"]);
 | 
						|
            if (
 | 
						|
                $s == '' ||
 | 
						|
                $s[0] == '_' ||
 | 
						|
                $s[0] == '%' ||
 | 
						|
                strlen($s) > 32
 | 
						|
            ) {
 | 
						|
                $page->set_data("{}");
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            //$limit = 0;
 | 
						|
            $cache_key = "autocomplete-$s";
 | 
						|
            $limitSQL = "";
 | 
						|
            $SQLarr = ["search"=>"$s%"];
 | 
						|
            if (isset($_GET["limit"]) && $_GET["limit"] !== 0) {
 | 
						|
                $limitSQL = "LIMIT :limit";
 | 
						|
                $SQLarr['limit'] = $_GET["limit"];
 | 
						|
                $cache_key .= "-" . $_GET["limit"];
 | 
						|
            }
 | 
						|
 | 
						|
            $res = $database->cache->get($cache_key);
 | 
						|
            if (!$res) {
 | 
						|
                $res = $database->get_pairs(
 | 
						|
                    $database->scoreql_to_sql("
 | 
						|
					SELECT tag, count
 | 
						|
					FROM tags
 | 
						|
					WHERE SCORE_STRNORM(tag) LIKE SCORE_STRNORM(:search)
 | 
						|
					AND count > 0
 | 
						|
					ORDER BY count DESC
 | 
						|
					$limitSQL"),
 | 
						|
                    $SQLarr
 | 
						|
                );
 | 
						|
                $database->cache->set($cache_key, $res, 600);
 | 
						|
            }
 | 
						|
 | 
						|
            $page->set_data(json_encode($res));
 | 
						|
        }
 | 
						|
 | 
						|
        $this->theme->build_autocomplete($page);
 | 
						|
    }
 | 
						|
}
 |