Back to vBulletin 3.0 Add-Ons

Advanced Search (search by exact date range)
Mod Version: 2.00, by why-not

This modification is in the archives.
vB Version: 3.0.3 Rating: (0 vote - 0 average) Installs: 4
Released: 21 Jan 2005 Last Update: Never Downloads: 9
Not Supported  

This is a very simple but powerful mod that allows you to add the option to allow users to
search by (date range) instead of just using the default limited vB options! This allows for
much better control of search results, allowing for exact searches by date range!

INSTALLER SUPPORTS

supports : vB 3.0.3, 3.0.4, 3.0.5, 3.0.6
language : English (US)
OS support: Linux/Unix/Windows (because of line endings)

The installer....

1. The installer will (install and or uninstall) this mod, with install and uninstall tester!

2. What it will install...

A. Installs the Admin Panel (Advance Date Option)

This allows for the administrator to configure the date range format from the Admin Panel! (dynamic control)

1/2/3 -> mm/dd/yyyy
3.2.1 -> yyyy.dd.mm
2-1-3 -> dd-mm-yyyy

B. Installs a full error control handler...

This gives members helpful information when a search error is encounted!

C. Auto loads the language phrases!

The installer checks the datastore and language groups, making sure all data to run the Advance Search
is present, if not it updates the caches so the language phrases are auto loaded!

D. Installs a (smart search date relevance control)

The relevance control, is designed to allow each member to search for results based on their own time zone!
The control also uses a cache system, so searches can be loaded into the exsiting vB search table, but are
indexed by the date and not by the standard vB search control! This allows for each search to be more unique
in regards to the query matching the starting and ending date range!

E. Add the option to the users search pref control

NOTES:

Each directory contains a read_me files, giving detailed information about that install process!

Other Notes!

Time to install : 2 minutes!
Test Installer : YES
Test Uninstaller: YES
Auto Installer : YES
Auto Uninstaller: YES
DB CHANGES : NONE

SCRIPT CHANGES : 1 script 'search.php' -> adds (1) main function 'q_builder()', and replaces and adds
(8) sections of code within the rest of 'search.php'!

The template 'search_forums' is the only thing you must install via the Admin Panel!

Images showing the control are below!

Any questions, just ask! I have been overseas for a while, but I am back now, so I will always
be around to help anyone needing help with installing this!

Here is the step by step install, for the template and the search.php script! Also a simple DB installer for the admin panel and language phrases!

EDITING and INSTALLING THE TEMPLATE

go to your Admin Panel

left nav -> left click -> Styles & Templates

scroll down to -> Search in Templates -> left click

right window -> select box -> Search in Style

select the style to add this Advanced Search Option to...

in the -> tex box -> Search for Text

enter -> search_forums

check the -> radio button -> Search Titles Only -> check -> yes

click the submit button -> Find

Style Manager Opens!

left click on the template -> search_forums

The template should now be open!

Notes:

Because you may have edited this template, we will search, add and replace by finding code patterns that we will add the Advanced Search Option before or after the code pattern that we are looking for...

1. ADD

FIND THIS

Code:
				<legend>$vbphrase[find_posts_from]</legend>
				<div style="padding:$stylevar[formspacer]px">

REPLACE WITH

Code:
				<legend>$vbphrase[find_posts_from]</legend>
				<div style="padding:$stylevar[formspacer]px"><label for='s_opt_one'><input type='radio' name='find_opt' value='0' id="s_opt_one" $find_optchecked[0]/>$vbphrase[find_opt_one]</label></div>
				<div align='center'>

FIND THIS

Code:
						<option value="before" $beforeafterselected[before]>$vbphrase[and_older]</option>
					</select>
				</div>
			</fieldset>

REPLACE WITH

Code:
						<option value="before" $beforeafterselected[before]>$vbphrase[and_older]</option>
					</select></div><div style="padding:$stylevar[formspacer]px"><label for='s_opt_two'><input type='radio' name='find_opt' value='1' id="s_opt_two" $find_optchecked[1]/>$vbphrase[find_opt_two]</label></div><div width='100%' style="text-align: center">
<table width='100%' cellpadding='1' cellspacing='0' align='center'>
 <tr>
  <td width='50%'>$vbphrase[find_date_one]</td>
  <td width='50%'>$vbphrase[find_date_two]</td>
 </tr>
 <tr>
  <td width='50%'><input type='text' class='bginput' style='font-size:11px' name='soptdate' size='10' value='$soptdate' maxlength='10' /></td>
  <td width='50%'><input type='text' class='bginput' style='font-size:11px' name='eoptdate' size='10' value='$eoptdate' maxlength='10' /></td>
 </tr>
 <tr>
  <td colspan='2' height='18'>$vbphrase[date_format]$conf_dformat</td>
 </tr>
</table>
</div>
			</fieldset>

FIND THIS

Code:
						<select style="width:100%" name="forumchoice[]" size="13" multiple="multiple">

REPLACE WITH

Code:
						<select style="width:100%" name="forumchoice[]" size="18" multiple="multiple">


All done with the template edits!

click the 'Save' button to save the changes!

Go back to the Admin Panel!

Now lets install the changes to 'search.php'...

NOTE: Make a backup of 'search.php', NOW!!!

EDITING search.php

Notes: Each Find This contains line numbers for REF!

open -> 'vB install folder/search.php'

FIND THIS Starting @ -> line 64

Code:
64	$globalize = array(
65		'query' => STR,
66		'searchuser' => STR,
67		'exactname' => INT,
68		'starteronly' => INT,
69		'forumchoice',
70		'childforums' => INT,
71		'titleonly' => INT,
72		'showposts' => INT,
73		'searchdate' => STR,
74		'beforeafter' => STR,
75		'sortby' => STR,
76		'sortorder' => STR,
77		'replyless' => INT,
78		'replylimit' => INT,
79		'searchthread' => INT,
80		'searchthreadid' => INT,
81		'saveprefs' => INT
82	);
REPLACE WITH

Code:
$globalize = array(
	'query' => STR,
	'searchuser' => STR,
	'exactname' => INT,
	'starteronly' => INT,
	'forumchoice',
	'childforums' => INT,
	'titleonly' => INT,
	'showposts' => INT,
	'searchdate' => STR,
	'beforeafter' => STR,
	'sortby' => STR,
	'sortorder' => STR,
	'replyless' => INT,
	'replylimit' => INT,
	'searchthread' => INT,
	'searchthreadid' => INT,
	'saveprefs' => INT,
	'find_opt' => INT,
	'soptdate' => STR,
	'eoptdate' => STR
);

FIND THIS Starting @ -> line 139

Code:
139		globalize($_REQUEST, array(
140			'query' => STR,
141			'searchuser' => STR,
142			'forumid' => STR,
143			'forumchoice'
144		));
REPLACE WITH

Code:
	globalize($_REQUEST, array(
		'query' => STR,
		'searchuser' => STR,
		'forumid' => STR,
		'soptdate' => STR,
		'eoptdate' => STR,
		'forumchoice'
	));

FIND THIS Starting @ -> line 163

Code:
163			$prefs  = array(
164				'exactname' => 1,
165				'starteronly' => 0,
166				'childforums' => 1,
167				'showposts' => 0,
168				'titleonly' => 0,
169				'searchdate' => 0,
170				'beforeafter' => 'after',
171				'sortby' => 'lastpost',
172				'sortorder' => 'descending',
173				'replyless' => 0,
174				'replylimit' => 0
175			);
REPLACE WITH

Code:
		$prefs  = array(
			'exactname' => 1,
			'starteronly' => 0,
			'childforums' => 1,
			'showposts' => 0,
			'titleonly' => 0,
			'searchdate' => 0,
			'beforeafter' => 'after',
			'sortby' => 'lastpost',
			'sortorder' => 'descending',
			'replyless' => 0,
			'replylimit' => 0,
			'find_opt' => 0
		);

FIND THIS @ -> line 188

Code:
188			if ($varname != 'query' AND $varname != 'searchuser')
REPLACE WITH

Code:
		if ($varname != 'query' AND $varname != 'searchuser' AND $varname != 'eoptdate' AND $varname != 'soptdate')

FIND THIS Starting @ -> line 198

Code:
198		$query = htmlspecialchars_uni($query);
199		$searchuser = htmlspecialchars_uni($searchuser);
REPLACE WITH

Code:
	$query = htmlspecialchars_uni($query);
	$searchuser = htmlspecialchars_uni($searchuser);
	$soptdate = htmlspecialchars_uni($soptdate);
	$eoptdate = htmlspecialchars_uni($eoptdate);
	$conf_dformat = str_replace ( '1', 'mm', str_replace ( '2', 'dd', str_replace ( '3', 'yyyy', $vboptions['searchdateformat'] ) ) );

FIND THIS @ -> line 395

Code:
395		$searchhash = md5(strtolower(iif($phrasequery, '"' . $query . '"', $query)) . "||" . strtolower($searchuser) . "||$exactname||$starteronly||$forumchoice||$childforums||$titleonly||$showposts||$searchdate||$beforeafter||$replyless||$replylimit||$searchthreadid");
REPLACE WITH

Code:
	$searchhash = md5(strtolower(iif($phrasequery, '"' . $query . '"', $query)) . "||" . strtolower($searchuser) . "||$exactname||$starteronly||$forumchoice||$childforums||$titleonly||$showposts||" . ( $find_opt > 0 ? $soptdate . chr ( 124 ) . chr ( 124 ) . $eoptdate : $searchdate . chr ( 124 ) . chr ( 124 ) . $beforeafter ) . "||$replyless||$replylimit||$searchthreadid");

FIND THIS Starting @ -> line 1101

Code:
1101		if ($searchdate != 'lastvisit')
1102		{
1103			$searchdate = intval($searchdate);
1104		}
REPLACE WITH

Code:
	if ( $find_opt == 0 )
	{
		if ($searchdate != 'lastvisit')
		{
			$searchdate = intval($searchdate);
		}

FIND THIS Starting @ -> line 1137

Code:
1137			unset($datecut);
1138		}
REPLACE WITH

Code:
		unset($datecut);
	}
}
else
{
		$fdo = q_builder ( $soptdate, $eoptdate, $bbuserinfo['tzoffset'], $vboptions['searchdateformat'] );
		if ( $fdo[0] == true )
		{
			$postQueryLogic[] = $fdo[1];
		}
		else
		{
			eval ( print_standard_error ( 'error_' . $fdo[1] ) );
		}
		unset ( $fdo );
}

FIND THIS Starting @ -> line 2339

Code:
2339				$prefs = addslashes(serialize(array(
2340					'exactname' => $exactname,
2341					'starteronly' => $starteronly,
2342					'childforums' => $childforums,
2343					'showposts' => $showposts,
2344					'titleonly' => $titleonly,
2345					'searchdate' => $searchdate,
2346					'beforeafter' => $beforeafter,
2347					'sortby' => $sortby,
2348					'sortorder' => $sortorder,
2349					'replyless' => $replyless,
2350					'replylimit' => $replylimit
2351				)));
REPLACE WITH

Code:
			$prefs = addslashes(serialize(array(
				'exactname' => $exactname,
				'starteronly' => $starteronly,
				'childforums' => $childforums,
				'showposts' => $showposts,
				'titleonly' => $titleonly,
				'searchdate' => $searchdate,
				'beforeafter' => $beforeafter,
				'sortby' => $sortby,
				'sortorder' => $sortorder,
				'replyless' => $replyless,
				'replylimit' => $replylimit,
				'find_opt' => $find_opt
			)));

FIND THIS @ -> line 2403 ( the end of the 'search'php' file!

Code:
2403	?>
REPLACE WITH

Code:
function q_builder ( $start, $end, $ut, $tf )
{
	$errors = array ( 0 => array ( 1 => 'srmissing', 2 => 'ermissing', 3 => 'brmissing' ), 1 => array ( 1 => 'srinvalid', 2 => 'erinvalid', 3 => 'brinvalid' ), 2 => array ( 1 => 'srwindows', 2 => 'erwindows', 3 => 'brwindows' ), 3 => array ( 1 => 'sraftered', 2 => 'srgreater' ) );
	$time = array ( 1 => '(0+[1-9]{1}|1+[1-2]{1})', 2 => '(0+[1-9]{1}|1+[0-9]{1}|2+[0-9]{1}|3+[0-1]{1})', 3 => '(19+[0-9]{2}|20+[0-9]{2})' );
	$seperator = ( $tf[1] == chr ( 47 ) || $tf[1] == chr ( 46 ) ? chr ( 92 ) . $tf[1] : $tf[1] );
	$vt = '^' . $time[$tf[0]] . $seperator . $time[$tf[2]] . $seperator . $time[$tf[4]] . '+$';
	$out = array ();
	$ref = 0;
	if ( empty ( $start ) )
	{
		$erro += 1;
	}
	if ( empty ( $end ) )
	{
		$erro += 2;
	}
	if ( empty ( $erro ) )
	{
		$ref = 1;
		if ( !preg_match ( "/" . $vt . "/", $start ) )
		{
			$erro += 1;
		}
		if ( !preg_match ( "/" . $vt . "/", $end ) )
		{
			$erro += 2;
		}
		if ( empty ( $erro ) )
		{
			$ref = 2;
			$daa = explode ( $tf[1], $start );
			$dab = explode ( $tf[1], $end );
			for ( $i = 0; $i <= 2; $i++ )
			{
				if ( $tf[$x] == 1 )
				{
					$rma = $daa[$i];
					$rmb = $dab[$i];
				} else if ( $tf[$x] == 2 )
				{
					$rda = $daa[$i];
					$rdb = $dab[$i];
				} else if ( $tf[$x] == 3 )
				{
					$rya = $daa[$i];
					$ryb = $dab[$i];
				}
				$x += 2;
			}
			$sday = @gmmktime ( 0, 0, 0, $rma, $rda, $rya );
			$eday = @gmmktime ( 0, 0, 0, $rmb, $rdb, $ryb );
			if ( $sday < 0 )
			{
				$erro += 1;
			}
			if ( $eday < 0 )
			{
				$erro += 2;
			}
			if ( empty ( $erro ) )
			{
				$ref = 3;
				$eday += 86400;
				$st = substr ( $ut, 0, 1 );
				if ( $st != '0' )
				{
					$st = ( $st == '-' ? '+' : '-' ) . substr ( $ut, 1 );
				}
				$sday = ( $sday + ( 3600 * $st ) );
				$eday = ( $eday + ( 3600 * $st ) );
				if ( $sday > $eday )
				{
					$erro += 1;
				} else if ( ( gmmktime ( 0, 0, 0, date ( 'n' ), date ( 'j' ), date ( 'Y' ) ) + ( 3600 * $st ) ) < $sday )
				{
					$erro += 2;
				}
				if ( empty ( $erro ) )
				{
					$out[] = true;
					$out[] = 'post.dateline >= ' . $sday . ' AND post.dateline <= ' . $eday;
					return ( $out );
				}
			}
		}
	}
	$out[] = false;
	$out[] = $errors[$ref][$erro];
	return ( $out );
}
?>

ALL DONE with 'search.php'....

Save changes close 'search.php'

Now copy this script and place it in the vB install directory!

Then run it from your browser!

https://www.site.com/install.php

After delete this script!

Code:
<?php
	// install the admin panel, and language phrases!
	include_once ( './includes/config.php' );
	function add_mod_search ( $db_sys, $name, $pass, $dbn, $tab )
	{
		$insert = array ( 
		"setting VALUES ('searchdateformat', 'datetime', '1/2/3', '1/2/3', '', 90, 0, 1);", 
		"adminhelp VALUES ('', 'options', 'options', 'searchdateformat', 316, 1);", 
		"phrase VALUES ('', -1, 'setting_searchdateformat_desc', 'The date format allowed to be entered in the advance search form...<br /><br /><strong>1</strong> = Month<br /><strong>2</strong> = Day<br /><strong>3</strong> = Year<br /><br >The (Month, Day, Year) separator can be one of the following.<br /><br /><strong>comma</strong> = <strong>1,2,3</strong><br /><strong>period</strong> = <strong>1.2.3</strong><br /><strong>hyphen</strong> = <strong>1-2-3</strong><br /><strong>forward slash</strong> = <strong>1/2/3</strong>', 5000);", 
		"phrase VALUES ('', -1, 'setting_searchdateformat_title', 'Advance Search (Date Range Format)', 5000);", "phrase VALUES ('', -1, 'options_options_searchdateformat_text', 'This is the format of dates allowed to be entered in the <strong>Advance Search</strong> (Date Range) option. This allows for members to refine their search results. This also uses each members timezone setting, so that the search only returns exact dates matching each members time zone. If a guest or member is not in a active session and is using the advance search, then the configured board time will be used!', 6000);", 
		"phrase VALUES ('', -1, 'options_options_searchdateformat_title', 'Advance Search (Date Range Format)', 6000);", 
		"phrase VALUES ('', -1, 'date_format', '<strong>Date Format:</strong> ', 40);", 
		"phrase VALUES ('', -1, 'find_date_one', 'Starting Date', 40);", 
		"phrase VALUES ('', -1, 'find_date_two', 'Ending Date', 40);", 
		"phrase VALUES ('', -1, 'find_opt_one', 'Find posts by a predefined selected option!', 40);", 
		"phrase VALUES ('', -1, 'find_opt_two', 'Find posts by a specific inputted date range!', 40);", 
		"phrase VALUES ('', 1, 'date_format', '<strong>Date Format:</strong> ', 40);", 
		"phrase VALUES ('', 1, 'find_date_one', 'Starting Date', 40);", 
		"phrase VALUES ('', 1, 'find_date_two', 'Ending Date', 40);", 
		"phrase VALUES ('', 1, 'find_opt_one', 'Find posts by a predefined selected option!', 40);", 
		"phrase VALUES ('', 1, 'find_opt_two', 'Find posts by a specific inputted date range!', 40);", 
		"phrase VALUES ('', -1, 'srmissing', 'The <strong>Starting Date Range</strong> was not entered, use your browser back button to add a starting date or change the <strong>Find Threads</strong> option to not use a date range.', 1000);", 
		"phrase VALUES ('', -1, 'ermissing', 'The <strong>Ending Date Range</strong> was not entered, use your browser back button to add a starting date or change the <strong>Find Threads</strong> option to not use a date range.', 1000);", 
		"phrase VALUES ('', -1, 'brmissing', 'Both the <strong>Starting</strong> and <strong>Ending</strong> date range were not entered, use your browser back button to add both starting and ending dates or change the <strong>Find Threads</strong> option to not use a date range.', 1000);", 
		"phrase VALUES ('', -1, 'srinvalid', 'The <strong>Starting Date Range</strong> entered was invalid, use your browser back button to correct the starting date range...', 1000);", 
		"phrase VALUES ('', -1, 'erinvalid', 'The <strong>Ending Date Range</strong> entered was invalid, use your browser back button to correct the ending date range...', 1000);", 
		"phrase VALUES ('', -1, 'brinvalid', 'Both the <strong>Starting</strong> and <strong>Ending</strong> date range you entered were invalid, use your browser back button to correct the starting and ending date ranges...', 1000);", 
		"phrase VALUES ('', -1, 'srwindows', 'The <strong>Starting Date Range</strong> entered is out of range, Valid dates are from the creation of ths forum to the present day, please correct the starting date and then try your search again.', 1000);", 
		"phrase VALUES ('', -1, 'erwindows', 'The <strong>Ending Date Range</strong> entered is out of range, Valid dates are from the creation time of ths forum to the present day, please correct the ending date and then try your search again.', 1000);", 
		"phrase VALUES ('', -1, 'brwindows', 'Both the <strong>Starting</strong> and <strong>Ending</strong> date range entered are out of range, Valid dates are from the creation time of ths forum to the present day, please correct the starting and ending dates and then try your search again.', 1000);", 
		"phrase VALUES ('', -1, 'sraftered', 'The <strong>Starting Date Range</strong> entered is after the <strong>Ending Date Range</strong>, the starting date must be a date that is before the ending date. Please correct the starting or ending date range, then try you request again', 1000);", 
		"phrase VALUES ('', -1, 'srgreater', 'The <strong>Starting Date Range</strong> entered is greater than today! The date range can be any date up until today! Please correct the starting date range, then try you request again', 1000);"
		 );
		$con = mysql_connect ( $db_sys, $name, $pass ) or die ( mysql_error () );
		mysql_select_db ( $dbn, $con ) or die ( mysql_error () );
		for ( $z = 0; $z < sizeof ( $insert ); $z++ )
		{
			$sql = "INSERT INTO " . $tab . $insert[$z];
			mysql_query ( $sql ) or die ( mysql_error () );
		}
			$sql = "SELECT data FROM " . $tab . "datastore WHERE title = 'options'";
			$rq = mysql_query ( $sql ) or die ( mysql_error () );
			$row = mysql_fetch_assoc ( $rq );
			$temp = unserialize ( $row['data'] );
			$temp['searchdateformat'] = '1/2/3';
			$sql = "UPDATE " . $tab . "datastore SET data = '" . addslashes ( serialize ( $temp ) ) . "' WHERE title = 'options'";
			mysql_query ( $sql ) or die ( mysql_error () );
			$sql = "SELECT phrasegroup_search FROM " . $tab . "language WHERE languageid = '1'";
			$rq = mysql_query ( $sql ) or die ( mysql_error () );
			$row = mysql_fetch_assoc ( $rq );
			$temp = unserialize ( $row['phrasegroup_search'] );
			$temp['date_format'] = '<strong>Date Format:</strong> ';
			$temp['find_date_one'] = 'Starting Date';
			$temp['find_date_two'] = 'Ending Date';
			$temp['find_opt_one'] = 'Find posts by a predefined selected option!';
			$temp['find_opt_two'] = 'Find posts by a specific inputted date range!';
			$sql = "UPDATE " . $tab . "language SET phrasegroup_search = '" . addslashes ( serialize ( $temp ) ) . "' WHERE languageid = '1'";
			mysql_query ( $sql ) or die ( mysql_error () );
			echo 'ALL DONE, delete this file now!';
	}
	add_mod_search ( $servername, $dbusername, $dbpassword, $dbname, $tableprefix );
?>

After the install is done, you will find the Advance Search Control in the Admin Panel!

vBulletin Options >> Date and Time Options >> at the bottom!

You now have the 'Advanced Search By Date Range', installed on your forum!

C, ya...

Sonia

Download

This modification is archived and cannot be downloaded.

Screenshots

     

Similar Mods

Advanced Search (search by exact date range) vBulletin 3.0 Beta Releases

vblts.ru supports vBulletin®, 2022-2024