先週、イベント情報のXMLフィードを検索するスクリプトの作成について質問しました。
質問は、コードを書いたら戻ってくるという提案で締めくくられました。
私は今それをやったので、私がやったことを投稿して、これに正しい方法でアプローチしたかどうか尋ねたいと思いました。
検索したいパラメータは次のとおりです。
id-一致するid属性を持つ特定のイベントの情報を返します。
q-イベントノートの任意の場所で一致を返す一般的な検索クエリ
キーワード、会場、チケット、開始時間-これらの特定の要素内で一致するものを探します
program_list、performer_list-これらの要素の子で一致するものを探します(各イベントには複数のパフォーマーがいます)
dateFrom、dateTo-日付範囲の検索を許可します。
サンプルイベントは次のとおりです。
<event id="69399">
<starttimeunixtime>1349791200</starttimeunixtime>
<endtimeunixtime>1350507600</endtimeunixtime>
<starttime>2012-10-09 15:00:00</starttime>
<endtime>2012-10-17 22:00:00</endtime>
<formatted_startdate>09 October 2012</formatted_startdate>
<formatted_enddate>17 October 2012</formatted_enddate>
<formatted_starttime>3:00pm</formatted_starttime>
<formatted_endtime>10:00pm</formatted_endtime>
<venue>Royal Albert Hall</venue>
<title>A concert of Music</title>
<performer_list>
<performer_7>
<performer>A.N. Other</performer>
<instrument>Viola</instrument>
</performer_7>
</performer_list>
<program_list>
<program_8>
<program>Beethoven</program>
<program_work>Symphony No. 2</program_work>
</program_8>
</program_list>
<description><![CDATA[<p>This is the description This is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the description</p>]]></description>
<shortDescription><![CDATA[<p>This is the short description This is the short description This is the short description This is the short description This is the short description This is the short description This is the short description This is the short description </p>]]></shortDescription>
<eventType>Highlights</eventType>
<keywords>orchestra</keywords>
<ticketInfo><![CDATA[<p>This is the ticket info </p>]]></ticketInfo>
<ticketed>YES</ticketed>
</event>
そして、これが私のスクリプトです:
<?
//Load events XML
$events=simplexml_load_file('events.xml');
//If single event find that info
if(isset($_GET['id'])):
$id=preg_replace("/[^0-9]/","",$_GET['id']);
$query='@id="'.$id.'"';
$outputtype="singleevent";
//Allow for a general search that will search all fields
elseif(isset($_GET['q'])):
$searchterm=strtolower(preg_replace("/[^A-Za-z0-9\s:-]/","",$_GET['q']));
$query.='contains(translate(.,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"), "'.$searchterm.'") and ';
echo $query;
$query= substr_replace($query, "", -5);
//Otherwise build a query to do the search.
elseif (!empty($_GET)):
foreach($_GET as $key => $value):
//Remove unwanted characters from userinput
$searchterm=strtolower(preg_replace("/[^A-Za-z0-9\s:-]/","",$value));
//Do a simple search
//Xpath doesn't support case insensitive searching, so I'm using the Xpath translate function, which swaps uppercase letters for their lowercase counterpart.
if($key=='keywords' || $key=='venue' || $key=='ticketed' || $key=='starttime'):
$query.='contains(translate('.$key.',"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"), "'.$searchterm.'") and ';
endif;
// Do a search of composite fields
if($key=='program_list' || $key=='performer_list'):
$query.='contains(translate('.$key.'/*,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"), "'.$searchterm.'") and ';
endif;
// Allow for a date range query (we might have dateFrom, dateTo or both!)
if($key=='dateFrom'):
$query.='endtimeunixtime > '.strtotime($searchterm. "00:00:00").' and ';
endif;
if($key=='dateTo'):
$query.='starttimeunixtime < '.strtotime($searchterm." 23:59:59").' and ';
endif;
endforeach;
// Remove final 'and' from query
$query=substr_replace($query, "", -5);
//End of Query Builder
endif;
// If there is no query, then show all events.
if($query==""):
$query='*';
endif;
//Query XML
$events=($events->xpath('event['.$query.']'));
//Use $events to generate pages
?>
必要に応じて機能するようですが、将来的にXMLでこれを頻繁に行う必要があるため、誰かが代替方法のフィードバック/提案を持っているかどうか疑問に思っていました。ありがとう!