Example #1
0
function calendar_display_entry($e)
{
    list($title, $meta) = calendar_meta($e);
    if (strstr($e['chamber'], 'Select Committee')) {
        print '<dt class="sc" id="cal' . $e['id'] . '">';
    } else {
        print '<li id="cal' . $e['id'] . '">';
    }
    print "{$title} ";
    if ($meta) {
        print '<span>' . join('; ', $meta) . '</span>';
    }
    if (strstr($e['chamber'], 'Select Committee')) {
        print "</dt>\n";
    } else {
        print "</li>\n";
    }
    if ($e['witnesses']) {
        print "<dd>";
        print '<a href=" $e[link_calendar] "></a>';
        print '<a href=" $e[link_external] "></a>';
        print 'Witnesses: ' . $e['witnesses'];
        print "</dd>\n";
    }
}
 function _get_data_by_search($args)
 {
     // Creates a fairly standard $data structure for the search function.
     // Will probably be rendered by the hansard_search.php template.
     // $args is an associative array with 's'=>'my search term' and
     // (optionally) 'p'=>1  (the page number of results to show) annd
     // (optionall) 'pop'=>1 (if "popular" search link, so don't log)
     global $PAGE, $hansardmajors;
     if (isset($args['s'])) {
         // $args['s'] should have been tidied up by the time we get here.
         // eg, by doing filter_user_input($s, 'strict');
         $searchstring = $args['s'];
     } else {
         $PAGE->error_message("No search string");
         return false;
     }
     // What we'll return.
     $data = array();
     $data['info']['s'] = $args['s'];
     // Allows us to specify how many results we want
     // Mainly for glossary term adding
     if (isset($args['num']) && $args['num']) {
         $results_per_page = $args['num'] + 0;
     } else {
         $results_per_page = 20;
     }
     if ($results_per_page > 1000) {
         $results_per_page = 1000;
     }
     $data['info']['results_per_page'] = $results_per_page;
     // What page are we on?
     if (isset($args['p']) && is_numeric($args['p'])) {
         $page = $args['p'];
     } else {
         $page = 1;
     }
     $data['info']['page'] = $page;
     if (isset($args['e'])) {
         $encode = 'url';
     } else {
         $encode = 'html';
     }
     // Fetch count of number of matches
     global $SEARCHENGINE;
     // For Xapian's equivalent of an SQL LIMIT clause.
     $first_result = ($page - 1) * $results_per_page;
     $data['info']['first_result'] = $first_result + 1;
     // Take account of LIMIT's 0 base.
     // Get the gids from Xapian
     $sort_order = 'date';
     if (isset($args['o'])) {
         if ($args['o'] == 'd') {
             $sort_order = 'newest';
         }
         if ($args['o'] == 'o') {
             $sort_order = 'oldest';
         } elseif ($args['o'] == 'c') {
             $sort_order = 'created';
         } elseif ($args['o'] == 'r') {
             $sort_order = 'relevance';
         }
     }
     $data['searchdescription'] = $SEARCHENGINE->query_description_long();
     $count = $SEARCHENGINE->run_count($first_result, $results_per_page, $sort_order);
     $data['info']['total_results'] = $count;
     $data['info']['spelling_correction'] = $SEARCHENGINE->get_spelling_correction();
     // Log this query so we can improve them - if it wasn't a "popular
     // query" link
     if (!isset($args['pop']) or $args['pop'] != 1) {
         global $SEARCHLOG;
         $SEARCHLOG->add(array('query' => $searchstring, 'page' => $page, 'hits' => $count));
     }
     // No results.
     if ($count <= 0) {
         $data['rows'] = array();
         return $data;
     }
     $SEARCHENGINE->run_search($first_result, $results_per_page, $sort_order);
     $gids = $SEARCHENGINE->get_gids();
     if ($sort_order == 'created') {
         $createds = $SEARCHENGINE->get_createds();
     }
     $relevances = $SEARCHENGINE->get_relevances();
     if (count($gids) <= 0) {
         // No results.
         $data['rows'] = array();
         return $data;
     }
     #if ($sort_order=='created') { print_r($gids); }
     // We'll put all the data in here before giving it to a template.
     $rows = array();
     // We'll cache the ids=>first_names/last_names of speakers here.
     $speakers = array();
     // We'll cache (sub)section_ids here:
     $hansard_to_gid = array();
     // Cycle through each result, munge the data, get more, and put it all in $data.
     for ($n = 0; $n < count($gids); $n++) {
         $gid = $gids[$n];
         $relevancy = $relevances[$n];
         $collapsed = $SEARCHENGINE->collapsed[$n];
         if ($sort_order == 'created') {
             #$created = substr($createds[$n], 0, strpos($createds[$n], ':'));
             if ($createds[$n] < $args['threshold']) {
                 $data['info']['total_results'] = $n;
                 break;
             }
         }
         if (strstr($gid, 'calendar')) {
             $id = fix_gid_from_db($gid);
             $q = $this->db->query("SELECT *, event_date as hdate, pos as hpos\n                    FROM future\n                    LEFT JOIN future_people ON id=calendar_id AND witness=0\n                    WHERE id = {$id} AND deleted=0");
             if ($q->rows() == 0) {
                 continue;
             }
             $itemdata = $q->row(0);
             # Ignore past events in places that we cover (we'll have the data from Hansard)
             if ($itemdata['event_date'] < date('Y-m-d') && in_array($itemdata['chamber'], array('Commons: Main Chamber', 'Lords: Main Chamber', 'Commons: Westminster Hall'))) {
                 continue;
             }
             list($cal_item, $cal_meta) = calendar_meta($itemdata);
             $body = $this->prepare_search_result_for_display($cal_item) . '.';
             if ($cal_meta) {
                 $body .= ' <span class="future_meta">' . join('; ', $cal_meta) . '</span>';
             }
             if ($itemdata['witnesses']) {
                 $body .= '<br><small>Witnesses: ' . $this->prepare_search_result_for_display($itemdata['witnesses']) . '</small>';
             }
             if ($itemdata['event_date'] >= date('Y-m-d')) {
                 $title = 'Upcoming Business';
             } else {
                 $title = 'Previous Business';
             }
             $itemdata['gid'] = $id;
             $itemdata['relevance'] = $relevances[$n];
             $itemdata['parent']['body'] = $title . ' &#8211; ' . $itemdata['chamber'];
             $itemdata['extract'] = $body;
             $itemdata['listurl'] = '/calendar/?d=' . $itemdata['event_date'] . '#cal' . $itemdata['id'];
             $itemdata['major'] = 'F';
         } else {
             // Get the data for the gid from the database
             $q = $this->db->query("SELECT hansard.gid, hansard.hdate,\n                    hansard.htime, hansard.section_id, hansard.subsection_id,\n                    hansard.htype, hansard.major, hansard.minor,\n                    hansard.speaker_id, hansard.hpos, hansard.video_status,\n                    epobject.epobject_id, epobject.body\n                FROM hansard, epobject\n                WHERE hansard.gid = '{$gid}'\n                    AND hansard.epobject_id = epobject.epobject_id");
             if ($q->rows() > 1) {
                 $PAGE->error_message("Got more than one row getting data for {$gid}");
             }
             if ($q->rows() == 0) {
                 # This error message is totally spurious, so don't show it
                 # $PAGE->error_message("Unexpected missing gid $gid while searching");
                 continue;
             }
             $itemdata = $q->row(0);
             $itemdata['collapsed'] = $collapsed;
             $itemdata['gid'] = fix_gid_from_db($q->field(0, 'gid'));
             $itemdata['relevance'] = $relevances[$n];
             $itemdata['extract'] = $this->prepare_search_result_for_display($q->field(0, 'body'));
             //////////////////////////
             // 2. Create the URL to link to this bit of text.
             $id_data = array('major' => $itemdata['major'], 'minor' => $itemdata['minor'], 'htype' => $itemdata['htype'], 'gid' => $itemdata['gid'], 'section_id' => $itemdata['section_id'], 'subsection_id' => $itemdata['subsection_id']);
             // We append the query onto the end of the URL as variable 's'
             // so we can highlight them on the debate/wrans list page.
             $url_args = array('s' => $searchstring);
             $itemdata['listurl'] = $this->_get_listurl($id_data, $url_args, $encode);
             //////////////////////////
             // 3. Get the speaker for this item, if applicable.
             if ($itemdata['speaker_id'] != 0) {
                 $itemdata['speaker'] = $this->_get_speaker($itemdata['speaker_id'], $itemdata['hdate']);
             }
             //////////////////////////
             // 4. Get data about the parent (sub)section.
             if ($itemdata['major'] && $hansardmajors[$itemdata['major']]['type'] == 'debate') {
                 // Debate
                 if ($itemdata['htype'] != 10) {
                     $section = $this->_get_section($itemdata);
                     $itemdata['parent']['body'] = $section['body'];
                     #                        $itemdata['parent']['listurl'] = $section['listurl'];
                     if ($itemdata['section_id'] != $itemdata['subsection_id']) {
                         $subsection = $this->_get_subsection($itemdata);
                         $itemdata['parent']['body'] .= ': ' . $subsection['body'];
                         #                            $itemdata['parent']['listurl'] = $subsection['listurl'];
                     }
                     if ($itemdata['major'] == 5) {
                         $itemdata['parent']['body'] = 'Northern Ireland Assembly: ' . $itemdata['parent']['body'];
                     } elseif ($itemdata['major'] == 6) {
                         $itemdata['parent']['body'] = 'Public Bill Committee: ' . $itemdata['parent']['body'];
                     } elseif ($itemdata['major'] == 7) {
                         $itemdata['parent']['body'] = 'Scottish Parliament: ' . $itemdata['parent']['body'];
                     }
                 } else {
                     // It's a section, so it will be its own title.
                     $itemdata['parent']['body'] = $itemdata['body'];
                     $itemdata['body'] = '';
                 }
             } else {
                 // Wrans or WMS
                 $section = $this->_get_section($itemdata);
                 $subsection = $this->_get_subsection($itemdata);
                 $body = $hansardmajors[$itemdata['major']]['title'] . ' &#8212; ';
                 if (isset($section['body'])) {
                     $body .= $section['body'];
                 }
                 if (isset($subsection['body'])) {
                     $body .= ': ' . $subsection['body'];
                 }
                 if (isset($subsection['listurl'])) {
                     $listurl = $subsection['listurl'];
                 } else {
                     $listurl = '';
                 }
                 $itemdata['parent'] = array('body' => $body, 'listurl' => $listurl);
                 if ($itemdata['htype'] == 11) {
                     # Search result was a subsection heading; fetch the first entry
                     # from the wrans/wms to show under the heading
                     $input = array('amount' => array('body' => true, 'speaker' => true), 'where' => array('hansard.subsection_id=' => $itemdata['epobject_id']), 'order' => 'hpos ASC', 'limit' => 1);
                     $ddata = $this->_get_hansard_data($input);
                     if (count($ddata)) {
                         $itemdata['body'] = $ddata[0]['body'];
                         $itemdata['extract'] = $this->prepare_search_result_for_display($ddata[0]['body']);
                         $itemdata['speaker_id'] = $ddata[0]['speaker_id'];
                         if ($itemdata['speaker_id']) {
                             $itemdata['speaker'] = $this->_get_speaker($itemdata['speaker_id'], $itemdata['hdate']);
                         }
                     }
                 } elseif ($itemdata['htype'] == 10) {
                     $itemdata['body'] = '';
                     $itemdata['extract'] = '';
                 }
             }
         }
         // End of handling non-calendar search result
         $rows[] = $itemdata;
     }
     $data['rows'] = $rows;
     return $data;
 }