⌈⌋ ⎇ branch:  freshcode


Artifact [78c24d47d5]

Artifact 78c24d47d5875a7653405fd4cf9afcc8c8422a01:

  • File page_search.php — part of check-in [92d96d21cf] at 2014-07-11 16:00:57 on branch trunk — Introduce search/ function. (user: mario size: 2152)

<?php
/**
 * type: page
 * title: Search function
 * description: Scans packages for description, tags, license, user names
 * license: AGPL
 * version 0.1
 * 
 * Builds a search query from multiple input params:
 *   → ?user=
 *   → ?tags[]= or ?tag=
 *   → ?license=
 *   → ?q= for actual text search
 *
 */


// Bypass hybrid db() function to directly invoke $db{} wrapper with list of params
global $db;


include("template/header.php");
?> <section id=main> <?php


// Display form
if ($_GET->no("tag,tags,user,license,q")) {

    include("template/search_form.php");

}

// Actual search request
else {

    #-- Collect search terms
    $WHERE = "";
    $params = array();

    // List from ?tags[]= or single ?tag=
    if ($tags = array_filter(array_merge($_GET->array->words["tags"], $_GET->words->p_csv["tag"]))) {
        $WHERE .= " AND tags.tag IN (??)";
        $params[] = $tags;
    }
    // Select specific ?user=
    if ($user = $_GET->words["user"]) {
        $WHERE .= " AND submitter LIKE ?";
        $params[] = "$user%";
    }
    // Only ?license= results
    if ($license = $_GET->words["license"]) {
        $WHERE .= " AND license = ?";
        $params[] = $license;
    }
    // And finally the actual ?q= search string // Note switch to FTS
    if ($q = $_GET->text["q"]) {
        $WHERE .= " AND description LIKE ?";
        $params[] = "%$q%";
    }


    // Run SQL
    #db()->test = 1;
    $result = $db("
        SELECT release.name AS name, title, SUBSTR(description,1,500) AS description,
               version, image, homepage, download, submitter, release.tags AS tags,
               license, state, t_published, flag, hidden, deleted, MAX(t_changed)
          FROM release
     LEFT JOIN tags ON release.name = tags.name
         WHERE NOT deleted AND flag < 5
               $WHERE
      GROUP BY release.name
      ORDER BY t_published DESC, t_changed DESC
         LIMIT 100
    ", $params);



    // Show sidebar + long project description
    foreach ($result as $entry) {
        prepare_output($entry);
        include("template/search_entry.php");
    }

}


include("template/bottom.php");

?>