00001 <?php
00008 class TKSDRResourceResultSet extends TKNullBox {
00009
00010 private $result = null;
00011 private $params = array('searchBox' => true, 'metadataLink' => null, 'contributorImage' => true, 'projectContext' => true);
00012 private $contributorIcons = array();
00013
00014 const NEWTAB = true;
00015
00016
00021 public function layoutPage() {
00022 if (($this->result == null) || ($this->result->SearchResults == null)) {
00023 $this->add(new TKLabel('No Results'));
00024 return false;
00025 }
00026 if ($this->params['projectContext']) {
00027 $this->bufferContributorIcons();
00028 }
00029 $this->add($this->layoutSearchBox());
00030 $nextPrev = $this->layoutNextPrev();
00031 if ($nextPrev != null)
00032 $this->add($nextPrev);
00033 $this->add($this->layoutResults());
00034 $nextPrev = $this->layoutNextPrev();
00035 if ($nextPrev != null)
00036 $this->add($nextPrev);
00037 $this->add($this->layoutSearchBox());
00038 }
00039
00040
00041
00049 public function __construct($result, $params = array()) {
00050 parent::__construct();
00051 $this->result = $result;
00052 if (count($params) > 0) {
00053 foreach($params as $key=>$value)
00054 $this->params[$key] = $value;
00055 }
00056
00057 }
00058
00064 public function layoutResults() {
00065 $results = $this->result->SearchResults;
00066 $resultsTbl = new TKTable();
00067 $resultsTbl->class = 'ResultSet-Table';
00068 $results->rewind();
00069 if ($results->count()==0) {
00070 $resultsTbl->addLabel('
00071 <br/>
00072 Your search did not match any resources.
00073 <br/><br/>
00074 Suggestions:
00075 <ul>
00076 <li>Make sure all words are spelled correctly.</li>
00077 <li>Try different keywords.</li>
00078 <li>Try more general keywords.</li>
00079 <li>Try fewer keywords.</li>
00080 </ul>');
00081 }
00082 for ($i = 0; $i < $results->count(); $i++) {
00083 $result = $results->current();
00084 $resultsTbl->add($this->layoutResult($result, $i));
00085 $resultsTbl->addRow();
00086 $results->next();
00087 }
00088 return $resultsTbl;
00089 }
00090
00096 public function layoutResult($result, $i) {
00097 $request = $this->result->getServiceRequest();
00098
00099
00100
00101 $evenOddClass = ($i % 2 == 0) ? 'ResultSet-ItemEven' : 'ResultSet-ItemOdd';
00102
00103
00104 $metadataLink = $result->resourceIdentifier;
00105
00106
00107 $resultTitle = new TKNullBox();
00108 $interType = '';
00109 if (array_key_exists('interType', $this->params) && $this->params['interType'] == true) {
00110 if (strpos($metadataLink, '/activities/'))
00111 $interType = '<span class="ResultSet-Activity">(Activity)</span>';
00112 else if (strpos($metadataLink, '/discussions/'))
00113 $interType = '<span class="ResultSet-Discussion">(Discussion)</span>';
00114 else if (strpos($metadataLink, '/lessons/'))
00115 $interType = '<span class="ResultSet-Lesson">(Lesson)</span>';
00116 }
00117
00118 $title = $result->title;
00119 $descrip = $result->description;
00120 $terms = explode(' ', $request->getConstraint('ss'));
00121 foreach ($terms as $term) {
00122 if ($term != '') {
00123 $title = $this->wrapFoundTerms($term, $title);
00124 $descrip = $this->wrapFoundTerms($term, $descrip);
00125 }
00126 }
00127 $titleText = '<a href="'
00128 . $result->resourceIdentifier
00129 . '" target="_blank" >'
00130 . $title . '</a> ' . $interType;
00131
00132 $resultTitle->addLabel($titleText);
00133 $resultTitle->class = array('ResultSet-ItemTitle');
00134 $resultDescription = new TKLabel($descrip . '<br />');
00135 $resultDescription->class = array('ResultSet-ItemDescription');
00136 $resultDescripLink = new TKNullBox();
00137 $resultDescripLink->add($resultDescription);
00138 if ($this->params['metadataLink'] != null) {
00139 $reviewString = '';
00140 $metadataLink = $this->params['metadataLink'] . $result->cserdId;
00141 $ratingImage = SDRHelpers::getRatingImageTag($result->averageReviewRating);
00142 $ratingText = SDRHelpers::getRatingText($result->averageReviewRating);
00143 $ratingText = $ratingText == '' ? '' : '<span class= "ratingText">(' . $ratingText . ')</div>';
00144 $resultLink = new TKLabel('<a href="'
00145 . $metadataLink
00146 . '">Reviews and Metadata' . $reviewString . '</a> '
00147 . $ratingImage . $ratingText);
00148 $resultDescripLink->add($resultLink);
00149 }
00150
00151
00152 $resultBox = new TKNullBox();
00153 $resultBox->class = array($evenOddClass);
00154
00155
00156 if ($this->params['projectContext']) {
00157 $projectContext = new TKNullBox();
00158 $projectContext->addLabel( '<img style="float:right" src="'
00159 . $result->projectContext->brand_image_url
00160 . '" alt="' . $result->projectContext->brand_altText . '" />');
00161 if ($this->params['contributorImage']) {
00162 $projectContext->addLabel($this->contributorIconForURL($result->resourceIdentifier));
00163 }
00164 $resultBox->add($projectContext);
00165 }
00166
00167 $resultBox->add($resultTitle);
00168 $resultBox->add($resultDescripLink);
00169 return $resultBox;
00170 }
00171
00177 public function layoutStatsBox() {
00178 $request = $this->result->getServiceRequest();
00179 $results = $this->result->SearchResults;
00180
00181 $start = $results->resultsInfo->numSkipped + 1;
00182 $total = $results->resultsInfo->totalNumResults;
00183 $end = min($start + $results->resultsInfo->numReturned - 1, $total);
00184
00185 $sbox = new TKTable();
00186 $sbox->addLabel('<b>' . strip_tags($request->toString()) . '</b>');
00187 if ($total == 0)
00188 $sbox->addLabel('No Results');
00189 else
00190 $sbox->addLabel('Results: <b>' . $start . '-' . $end . ' </b>of<b> ' . $total . '</b>');
00191 $sbox->class = array('ResultSet-StatsBox');
00192 return $sbox;
00193 }
00194
00195
00202 public function layoutSearchBox() {
00203 $request = $this->result->getServiceRequest();
00204 $results = $this->result->SearchResults;
00205 $constraints = $request->constraintsToString();
00206
00207 $sbox = new TKTable(False);
00208 $sbox->addRow('statbox','ResultSet-SearchRow');
00209 $sbox->addText('<b>' . $request->typeToString() . ' Results</b>');
00210
00211 if ($this->params['searchBox']) {
00212 $form = new TKForm(SDRHelpers::urlParser(), 'get');
00213 $tb=$form->addFormInput('text', 'ss', $request->getConstraint('ss'));
00214 $tb->size='30';
00215 $form->addLabel(' ');
00216 $form->addFormInput('submit', '', 'Search');
00217 $sbox->add($form,array('style' => array('float' => 'right')));
00218 $sbox->addRow('statbox','ResultSet-StatsBox');
00219 }
00220 else if ($constraints != '') {
00221 $sbox->addText('');
00222 $sbox->addRow('statbox','ResultSet-StatsBox');
00223 }
00224
00225 $request = $this->result->getServiceRequest();
00226 $results = $this->result->SearchResults;
00227
00228 $start = $results->resultsInfo->numSkipped + 1;
00229 $total = $results->resultsInfo->totalNumResults;
00230 $end = min($start + $results->resultsInfo->numReturned -1, $total);
00231 $sbox->addLabel($constraints)->class = "ResultSet-Query";
00232
00233
00234 $addArgs = array();
00235 $removeArgs = array();
00236 $displayLabel = '';
00237 $rp = $request->getNumResultsPerPage();
00238 if($rp != '10000') {
00239 $addArgs['displayall'] = '';
00240 $displayLabel = 'Display all';
00241 }
00242 else {
00243 $removeArgs['displayall'] = '';
00244 $displayLabel = 'Display as pages';
00245 }
00246 $displayLink = SDRHelpers::urlParser($addArgs, $removeArgs);
00247 $toggleDisplay = '<span style="margin-left: 1em;"><a href="' . $displayLink . '">'
00248 .$displayLabel . '</a></span>';
00249
00250
00251 if ($total == 0)
00252 $sbox->addText('No Results',array('style' => array('float' => 'right')));
00253 else {
00254 $sbox->addText('Results: <b>' . $start . '-' . $end . ' </b>of<b> ' . $total . '</b>' .
00255 $toggleDisplay, array('style' => array('float' => 'right')));
00256 }
00257 $sbox->class = array('ResultSet-Table', 'ResultSet-SearchBox');
00258 return $sbox;
00259 }
00260
00266 public function layoutNextPrev() {
00267 $request = $this->result->getServiceRequest();
00268 $results = $this->result->SearchResults;
00269
00270 $numSkipped = $results->resultsInfo->numSkipped;
00271 $numReturned = $results->resultsInfo->numReturned;
00272 $total = $results->resultsInfo->totalNumResults;
00273
00274 $arrowsBox = new TKNullBox();
00275 $arrowsBox->class = array('ResultSet-NextPrevBox');
00276 $leftArrowBox = new TKNullBox();
00277 $leftArrowBox->class = array('ResultSet-PrevPage');
00278 $rightArrowBox = new TKNullBox();
00279 $rightArrowBox->class = array('ResultSet-NextPage');
00280
00281 $hasArrows = false;
00282 $nextURL = SDRHelpers::urlParser(array('sr'=> $numSkipped + $numReturned));
00283 $prevURL = SDRHelpers::urlParser(array('sr'=> $numSkipped - $numReturned));
00284
00285 if (($numSkipped + $numReturned) < $total) {
00286 $rightLabel = new TKLabel("<a href='$nextURL'>Next $numReturned Results →</a>");
00287 $rightArrowBox->add($rightLabel);
00288 $arrowsBox->add($rightArrowBox);
00289 $hasArrows = true;
00290 }
00291
00292
00293 if (($numSkipped) > 0) {
00294 $leftLabel = new TKLabel("<a href='$prevURL'>← Prev $numReturned Results</a>");
00295 $leftArrowBox->add($leftLabel);
00296 $arrowsBox->add($leftArrowBox);
00297 $hasArrows = true;
00298 } else {
00299 $arrowsBox->addLabel(' ');
00300 }
00301
00302
00303 return $hasArrows ? $arrowsBox : null;
00304 }
00305
00314 public function bufferContributorIcons() {
00315 $imageDir = SnapDirectory::lookup('//sdr/contributors/');
00316 $contents = $imageDir->listContents();
00317
00318 foreach($contents as $resource) {
00319 $imageName = $resource->getCanonicalShortName();
00320 $contributor = str_replace("_dot_", ".", $imageName);
00321 $this->contributorIcons[$imageName] = $contributor;
00322 }
00323 }
00324
00334 public function contributorIconForURL($url) {
00335 foreach ($this->contributorIcons as $imageName => $contributor) {
00336 if (stripos($url, $contributor)) {
00337
00338 $basePath = SDRHelpers::SNAPDIR . "contributors/";
00339
00340 return <<<END
00341 <div style='float:right; cursor:pointer;' onclick="location.href='http://$contributor';" >
00342 <img style='max-height:35px;' src='$basePath/$imageName' alt='$contributor'/>
00343 </div>
00344 END;
00345 }
00346 }
00347
00348 return '';
00349 }
00350
00351 protected function wrapFoundTerms($term, $data) {
00352 return preg_replace("/($term)/i", "<span class=\"highlightedSearchTerm\">$1</span>", $data);
00353 }
00354
00355
00356 public function render() {
00357 $this->layoutPage();
00358 return parent::render();
00359 }
00360 }
00361 ?>