From 320e84a4ef2bd261bed2f532379a987fcc14be02 Mon Sep 17 00:00:00 2001 From: Penny Leach <mjollnir@titania.local> Date: Sun, 18 Jun 2006 20:56:08 +1200 Subject: [PATCH] more work on breakfast! --- include/breakfast.inc.php | 62 +++++- include/tpl/htaccess_rewrite.tpl | 2 +- .../admin.inc.php | 2 +- plugins/serendipity_plugin_breakfast/lib.php | 197 ++++++++++++++---- .../serendipity_plugin_breakfast.php | 31 ++- templates/sgn/style.css | 7 +- 6 files changed, 238 insertions(+), 63 deletions(-) diff --git a/include/breakfast.inc.php b/include/breakfast.inc.php index e09b4a5..bdcab45 100644 --- a/include/breakfast.inc.php +++ b/include/breakfast.inc.php @@ -1,8 +1,66 @@ <?php -$serendipity['smarty']->assign('content_message',' -<h3 class="serendipity_date">breakfast</h3>'); +require_once(S9Y_INCLUDE_PATH.'/plugins/serendipity_plugin_breakfast/lib.php'); +$cafe = 0; +if (!empty($_REQUEST['cafe'])) { + $cafe = $_REQUEST['cafe']; +} +$person = 0; +if (!empty($_REQUEST['person'])) { + $person = $_REQUEST['person']; +} +$meal = 0; +if (!empty($_REQUEST['meal'])) { + $meal = $_REQUEST['meal']; +} +$date = 0; +if (!empty($_REQUEST['date'])) { + $date = $_REQUEST['date']; +} +$output = '<h3 class="serendipity_date">breakfast</h3> +<p>For some time, I have been going out for weekly Sunday breakfast with a group of people that ranges somewhere between 5 and 10 in number. After awhile, we decided we needed some sort of rating system. Since I already sometimes <a href="http://she.geek.nz/archives/198-breakfast-with-mischief-bad-group.html">write</a> <a href="http://she.geek.nz/archives/228-aro-cafe.html">about</a> <a href="http://she.geek.nz/archives/240-highlights-of-the-weekend.html">breakfast</a> here already, I thought I would make it more official and write a s9y plugin for it.</p> +<p>So here it is:</p> +<p>So far, you can check out the most recent breakfast only</p>'; +/* +<p><form action="?" method="post">Filter by: '.breakfast_cafe_dropdown($cafe).', '.breakfast_people_dropdown($person).', '.breakfast_meal_dropdown($meal).', '.breakfast_date_dropdown($date).'<input type="submit" value="Go!" /></form></p> +<p><a href="?">Or, just the most recent breakfast</a></p>'; +if (empty($cafe) && empty($person) && empty($meal) && empty($date)) { // just the most recent +*/ + $latest = breakfast_get_complete(); +/* +} else { + $latest = breakfast_get_complete(false,$date,$cafe,$person,$meal); +} +*/ +$dates = array_keys($latest); +$latest = $latest[$dates[0]]; +$output .= '<p><b>Most recent breakfast</b>: '.$latest['cafe'].' on '.$latest['nicedate'].' with '.$latest['num'].' people</p> + '.((!empty($latest['overallcomment'])) ? '<p>'.$latest['overallcomment'].'</p>' : '').' + <table cellpadding="2" cellspacing="1" bgcolor="black" class="data">'; +$categories = array(); +$tabledata = ''; +foreach ($latest['attendees'] as $person) { + $tabledata .= '<tr><td>'.((!empty($person['alias'])) ? $person['alias'] : $person['name']).'</td><td>'.$person['meal'].'</td>'; + foreach ($person['scores'] as $category => $score) { + if (!array_key_exists($category,$categories)) { + $categories[$category] = $score['weight']; + } + $tabledata .= '<td>'.$score['score'].'</td>'; + } + $tabledata .= '<td>'.$person['totals']['scores'].'%</td>'; + $tabledata.= '</tr>'; + if (!empty($person['comment'])) { + $tabledata .= '<tr><td colspan="'.(count($categories)+3).'">'.$person['comment'].'</td></tr>'; + } +} +$output .= '<tr><td colspan="2">'; +foreach ($categories as $cat => $weight) { + $output .= '<td>'.$cat.' ('.$weight.')</td>'; +} +$output .= '<td>Total</td></tr></tr>'.$tabledata.'</table>'; + +$serendipity['smarty']->assign('content_message',$output); ?> diff --git a/include/tpl/htaccess_rewrite.tpl b/include/tpl/htaccess_rewrite.tpl index 9962b31..eaec9ed 100644 --- a/include/tpl/htaccess_rewrite.tpl +++ b/include/tpl/htaccess_rewrite.tpl @@ -28,7 +28,7 @@ RewriteRule ^{PAT_CSS} {indexFile}?url=/$1 [L,QSA] RewriteRule ^index\.(html?|php.+) {indexFile}?url=index.html [L,QSA] RewriteRule ^htmlarea/(.*) htmlarea/$1 [L,QSA] RewriteRule ^{PAT_ABOUT} {indexFile}?url=/{PAT_ABOUT}/ [L,QSA] -RewriteRule ^{PAT_BREAKFAST} {indexFile}?url=/{PAT_BREAKFAST}/ [L,QSA] +RewriteRule ^{PAT_BREAKFAST}/?(.*) {indexFile}?url=/{PAT_BREAKFAST}/$1 [L,QSA] RewriteRule (.*\.html?) {indexFile}?url=/$1 [L,QSA] <Files *.tpl.php> diff --git a/plugins/serendipity_plugin_breakfast/admin.inc.php b/plugins/serendipity_plugin_breakfast/admin.inc.php index 15ec874..dc9e88e 100644 --- a/plugins/serendipity_plugin_breakfast/admin.inc.php +++ b/plugins/serendipity_plugin_breakfast/admin.inc.php @@ -91,7 +91,7 @@ echo ' $personid = $_GET['person'.$i]; } if (!empty($_GET['meal_free'.$i])) { - $sql = 'INSERT INTO mbg_meal (cafe, name) VALUES ('.$cafeid.',\''.$_GET['meal_free'.$i].'\');'; + $sql = 'INSERT INTO mbg_meal (name) VALUES (\''.$_GET['meal_free'.$i].'\');'; serendipity_db_query($sql); $mealid = serendipity_db_insert_id(); } else { diff --git a/plugins/serendipity_plugin_breakfast/lib.php b/plugins/serendipity_plugin_breakfast/lib.php index bca5978..98caaee 100644 --- a/plugins/serendipity_plugin_breakfast/lib.php +++ b/plugins/serendipity_plugin_breakfast/lib.php @@ -4,13 +4,17 @@ if (IN_serendipity !== true) { } -function breaKfast_cafe_dropdown() { +function breaKfast_cafe_dropdown($selected=0) { $output = ' <select name="cafe"> <option value="0">-- Cafe --</option>'; $results = serendipity_db_query('SELECT * FROM mbg_cafe'); foreach ($results as $r) { - $output .='<option value="'.$r['id'].'">'.$r['name'].'</option>'; + $s = ''; + if ($r['id'] == $selected) { + $s = 'selected="selected"'; + } + $output .='<option value="'.$r['id'].'" '.$s.'>'.$r['name'].'</option>'; } $output .= '</select>'; return $output; @@ -29,16 +33,54 @@ function breakfast_person_dropdown($count) { $output .= '</select>'; return $output; } + +function breakfast_people_dropdown($selected=0) { + static $people; + if (empty($people)) { + $people = serendipity_db_query('SELECT * FROM mbg_person'); + } + $output = ' + <select name="person"> + <option value="0">-- Person --</option>'; + foreach ($people as $person) { + $s = ''; + if ($person['id'] == $selected) { + $s = 'selected="selected"'; + } + $output .= '<option value="'.$person['id'].'" '.$s.'>'.((!empty($person['alias'])) ? $person['alias'] : $person['name']).'</option>'; + } + $output .= '</select>'; + return $output; +} + function breakfast_menu_dropdown($count) { static $menu; if (empty($menu)) { - $menu = serendipity_db_query('SELECT m.id,m.name,c.name as cafe FROM mbg_meal m LEFT JOIN mbg_cafe c ON m.cafe = c.id'); + $menu = serendipity_db_query('SELECT m.id,m.name FROM mbg_meal m'); } $output = ' <select name="meal'.$count.'"> <option value="0">-- Meal --</option>'; foreach ($menu as $item) { - $output .= '<option value="'.$item['id'].'">'.((!empty($item['cafe'])) ? '('.$item['cafe'].')' : '').$item['name'].'</option>'; + $output .= '<option value="'.$item['id'].'">'.$item['name'].'</option>'; + } + $output .= '</select>'; + return $output; +} +function breakfast_meal_dropdown($selected=0) { + static $menu; + if (empty($menu)) { + $menu = serendipity_db_query('SELECT m.id,m.name FROM mbg_meal m'); + } + $output = ' + <select name="meal'.$count.'"> + <option value="0">-- Meal --</option>'; + foreach ($menu as $item) { + $s = ''; + if ($item['id'] == $selected) { + $s = 'selected="selected"'; + } + $output .= '<option value="'.$item['id'].'" '.$s.'>'.$item['name'].'</option>'; } $output .= '</select>'; return $output; @@ -56,51 +98,126 @@ function breakfast_scoring_dropdowns($count) { } } return $output; - +} +function breakfast_date_dropdown($selected=0) { + $dates = serendipity_db_query('SELECT e.date,c.name from mbg_event e JOIN mbg_cafe c ON e.cafe = c.id ORDER BY e.date DESC'); + $output = ' + <select name="date"> + <option value="0">-- Date --</option>'; + foreach ($dates as $date) { + $s = ''; + if ($date['date'] == $selected) { + $s = 'selected="selected"'; + } + $output .= '<option value="'.$date['date'].'">'.date('j F Y',$date['date']).' ('.$date['name'].')</option>'; + } + $output .= '</select>'; + return $output; } -function breakfast_get_latest() { - $sql = 'SELECT c.name, e.date, e.id as event, count(a.id) as num FROM mbg_cafe c - JOIN mbg_event e ON e.cafe = c.id - JOIN mbg_attendee a ON a.event = e.id GROUP BY a.event'; - if (!$latest = serendipity_db_query($sql,true)) { +function breakfast_get_complete($latest=true,$date=0,$cafe=0,$person=0,$meal=0) { + $sql = breakfast_generate_sql($latest,$date,$cafe,$person,$meal); + if (!$latest = serendipity_db_query($sql)) { return false; } - $sql = 'SELECT p.name,p.alias,m.name as meal, a.id FROM mbg_attendee a JOIN mbg_person p ON a.person = p.id JOIN mbg_meal m ON a.ate = m.id - WHERE a.event = '.$latest['event'].' ORDER BY rand() LIMIT 1'; - $latest['random'] = serendipity_db_query($sql,true); - $sql = 'SELECT s.score,c.weight,c.category FROM mbg_score s JOIN mbg_category c ON s.category = c.id WHERE s.attendee = '.$latest['random']['id']; - $latest['random']['scores'] = serendipity_db_query($sql); - $sql = 'SELECT sum(s.score) as score, sum(c.weight) as weight FROM mbg_score s - JOIN mbg_category c ON s.category = c.id - JOIN mbg_attendee a ON s.attendee = a.id WHERE a.event = '.$latest['event'].' GROUP BY s.attendee'; - $totals = serendipity_db_query($sql); - $num = 0; - $grandtotal = 0; - $min = 100; - $max = 0; - $thistotal = 0; - foreach ($totals as $total) { - if ($total['weight'] != 100) { - $thistotal = (($total['score']/$total['weight']) * 100); - $grandtotal += $thistotal; + + // get the categories, we need them + $categories = serendipity_db_query('SELECT * FROM mbg_category'); + $cattemplate = array(); + foreach ($categories as $cat) { + $cattemplate[$cat['category']] = array(); + } + // what has to be distinct is the event, we have to attach all other stuff to that... + $events = array(); + $lastperson = null; + foreach ($latest as $event) { + if (!array_key_exists($event['date'],$events)) { + $events[$event['date']] = array(); + $events[$event['date']]['attendees'] = array(); + $events[$event['date']]['cafe'] = $event['cafe']; + $events[$event['date']]['overallcomment'] = $event['overallcomment']; + $events[$event['date']]['nicedate'] = date('j F Y',$event['date']); + $events[$event['date']]['totals'] = array(); + $events[$event['date']]['totals']['scores'] = 0; + $events[$event['date']]['totals']['min'] = 100; + $events[$event['date']]['totals']['max'] = 0; + $events[$event['date']]['totals']['num'] = 0; + } + if (!array_key_exists($event['person'],$events[$event['date']]['attendees'])) { + $events[$event['date']]['attendees'][$event['person']] = array(); + $events[$event['date']]['attendees'][$event['person']]['name'] = $event['person']; + $events[$event['date']]['attendees'][$event['person']]['alias'] = $event['alias']; + $events[$event['date']]['attendees'][$event['person']]['meal'] = $event['meal']; + $events[$event['date']]['attendees'][$event['person']]['scores'] = $cattemplate; + $events[$event['date']]['attendees'][$event['person']]['totals'] = array(); + $events[$event['date']]['attendees'][$event['person']]['totals']['scores'] = 0; + $events[$event['date']]['attendees'][$event['person']]['totals']['weights'] = 0; + $events[$event['date']]['attendees'][$event['person']]['ate'] = $event['meal']; + $events[$event['date']]['attendees'][$event['person']]['comment'] = $event['comment']; + } + $events[$event['date']]['attendees'][$event['person']]['scores'][$event['category']] = array(); + $events[$event['date']]['attendees'][$event['person']]['scores'][$event['category']]['weight'] = $event['weight']; + $events[$event['date']]['attendees'][$event['person']]['scores'][$event['category']]['score'] = $event['score']; + $events[$event['date']]['attendees'][$event['person']]['totals']['scores'] += $event['score']; + $events[$event['date']]['attendees'][$event['person']]['totals']['weights'] += $event['weight']; + + } + + // now just make up the totals and we're done! + foreach ($events as $date => $event) { + $events[$date]['num'] = count($events[$date]['attendees']); + foreach ($event['attendees'] as $person => $attendee) { + if ($attendee['totals']['weights'] != 100) { + $events[$date]['attendees'][$person]['totals']['unweighted'] = $attendee['totals']['scores']; + $events[$date]['attendees'][$person]['totals']['scores'] = ceil(($attendee['totals']['scores']/$attendee['totals']['weights'])*100); + } + $events[$date]['totals']['scores'] += $events[$date]['attendees'][$person]['totals']['scores']; + $events[$date]['totals']['num']++; + if ($events[$date]['attendees'][$person]['totals']['scores'] < $events[$date]['totals']['min']) { + $events[$date]['totals']['min'] = $events[$date]['attendees'][$person]['totals']['scores']; + } + if ($events[$date]['attendees'][$person]['totals']['scores'] > $events[$date]['totals']['max']) { + $events[$date]['totals']['max'] = $events[$date]['attendees'][$person]['totals']['scores']; + } + } + } + return $events; +} + +function breakfast_generate_sql($latest=true,$date=0,$cafe=0,$person=0,$meal=0) { + $sql = 'SELECT c.name as cafe, e.date as date, e.comment as overallcomment, + e.id as event,p.name as person, p.alias as alias, a.comment as comment, + m.name as meal,s.score as score,cat.category as category, cat.weight as weight + FROM mbg_cafe c + JOIN mbg_event e ON e.cafe = c.id + JOIN mbg_attendee a ON a.event = e.id + JOIN mbg_person p ON a.person = p.id + JOIN mbg_score s ON s.attendee = a.id + JOIN mbg_category cat ON s.category = cat.id + JOIN mbg_meal m ON a.ate = m.id + '; + if (!empty($latest)) { + $sql .= ' WHERE e.date = (SELECT max(date) FROM mbg_event)'; + } else { + $w = false; + if (!empty($meal)) { + $sql .= ((empty($w)) ? ' WHERE ' : ' AND '). 'a.ate = '.$meal; + $w = true; } - else { - $grandtotal += $total['score']; - $thistotal = $total['score']; + if (!empty($person)) { + $sql .= ((empty($w)) ? ' WHERE ' : ' AND '). 'a.person = '.$person; + $w = true; } - $num++; - if ($thistotal < $min) { - $min = $thistotal; + if (!empty($date)) { + $sql .= ((empty($w)) ? ' WHERE ' : ' AND '). 'e.date = '.$date; + $w = true; } - if ($thistotal > $max) { - $max = $thistotal; + if (!empty($cafe)) { + $sql .= ((empty($w)) ? ' WHERE ' : ' AND ').' c.id = '.$cafe; + $w = true; } } - $latest['total'] = $grandtotal/$num; - $latest['min'] = $min; - $latest['max'] = $max; - return $latest; + return $sql .' ORDER BY e.date DESC'; } ?> \ No newline at end of file diff --git a/plugins/serendipity_plugin_breakfast/serendipity_plugin_breakfast.php b/plugins/serendipity_plugin_breakfast/serendipity_plugin_breakfast.php index ea93883..c9f7b64 100644 --- a/plugins/serendipity_plugin_breakfast/serendipity_plugin_breakfast.php +++ b/plugins/serendipity_plugin_breakfast/serendipity_plugin_breakfast.php @@ -31,9 +31,12 @@ class serendipity_plugin_breakfast extends serendipity_plugin } function generate_content(&$title) { - if (!$latest = breakfast_get_latest()) { + if (!$latest = breakfast_get_complete()) { return false; } + $dates = array_keys($latest); + $latest = $latest[$dates[0]]; + $attendee = $latest['attendees'][array_rand($latest['attendees'])]; $title = $this->title; echo ' <table> @@ -41,38 +44,31 @@ class serendipity_plugin_breakfast extends serendipity_plugin <td colspan="2" nowrap="nowrap"><b>Most recent breakfast:</b></td> </tr> <tr> - <td colspan="2">'.$latest['name'].' on '.date('j F Y',$latest['date']).' with '.$latest['num'].' people</td> + <td colspan="2">'.$latest['cafe'].' on '.$latest['nicedate'].' with '.$latest['num'].' people</td> </tr> <tr> - <td colspan="2"><b>'.((!empty($latest['random']['alias'])) ? $latest['random']['alias'] : $latest['random']['name']) - .' had \''.$latest['random']['meal'].'\':</b></td> + <td colspan="2"><b>'.((!empty($attendee['alias'])) ? $attendee['alias'] : $attendee['name']) + .' had \''.$attendee['meal'].'\':</b></td> </tr>'; - $total = 0; - $totalweight = 0; - foreach ($latest['random']['scores'] as $score) { + foreach ($attendee['scores'] as $category => $score) { echo ' <tr> - <td>'.$score['category'].':</td><td>'.$score['score'].'/'.$score['weight'].'</td> + <td>'.$category.':</td><td>'.$score['score'].'/'.$score['weight'].'</td> </tr>'; - $total += $score['score']; - $totalweight += $score['weight']; - } - if ($totalweight != 100) { - $total = ($total/$totalweight) * 100; } echo ' <tr> - <td>Total</td><td>'.$total.'%</td> + <td>Total</td><td>'.$attendee['totals']['scores'].'%</td> </tr> <tr> <td colspan="2"><b>The group gave:</td> </tr> <tr> - <td>Min:</td><td>'.$latest['min'].'%</td> + <td>Min:</td><td>'.$latest['totals']['min'].'%</td> </tr> <tr> - <td>Max:</td><td>'.$latest['max'].'%</td> + <td>Max:</td><td>'.$latest['totals']['max'].'%</td> </tr> <tr> - <td>Avergage:</td><td>'.$latest['total'].'%</td> + <td>Avergage:</td><td>'.ceil($latest['totals']['scores']/$latest['totals']['num']).'%</td> </tr> <tr> <td nowrap="nowrap" colspan="2"><a href="/breakfast/">What the hell is this?</a></td> @@ -124,7 +120,6 @@ class serendipity_plugin_breakfast extends serendipity_plugin );', 'CREATE TABLE mbg_meal ( id int(10) not null auto_increment, - cafe int(10), name varchar(50), PRIMARY KEY (id) );', diff --git a/templates/sgn/style.css b/templates/sgn/style.css index 794f6de..f5a4c6d 100644 --- a/templates/sgn/style.css +++ b/templates/sgn/style.css @@ -472,4 +472,9 @@ div.serendipity_freetag_taglist { color:#999999; } - +.data td { + background-color:white; +} +.data th { + background-color:white; +} -- 2.39.5