Example 5-3: Meerkat discussion application

<?php
// $Id: ch05,v 1.19 2001/06/11 16:28:51 aschirmer Exp aschirmer $
// A program that browses Meerkat's story store and allows
// users to append spontaneous discussions to the story
// in question.

include("xmlrpc.inc");

$mydir="/demo";

// bomb(  ) just finishes off the page before quitting
function bomb() { print "</body></html>"; exit(  ); }

// dispatch(  ) ensures error handling for XML-RPC calls
function dispatch($client, $method, $args) {
    $msg=new xmlrpcmsg($method, $args);
    $resp=$client->send($msg);
    if (!$resp) { print "<p>IO error: ".$client->errstr ."</p>"; bomb(  ); }
    if ($resp->faultCode(  )) {
        print "<p>There was an error: " . $resp->faultCode(  ) . " " .
            $resp->faultString(  ) . "</p>";
        bomb(  );
    } 
    return xmlrpc_decode($resp->value(  ));    
}

// create client for discussion server
$dclient=new xmlrpc_client("${mydir}/discuss.php",
                     "xmlrpc.usefulinc.com", 80);

// check if we're posting a comment, and send it if so
$storyid=$HTTP_POST_VARS["storyid"];
if ($storyid) {
    // send the comment to the comment server
    $res=dispatch($dclient, "discuss.addComment", 
            array(new xmlrpcval($storyid),
                new xmlrpcval(stripslashes
                    ($HTTP_POST_VARS["name"])),
                new xmlrpcval(stripslashes
                    ($HTTP_POST_VARS["commenttext"]))));

    // send the browser back to the originating page
    Header("Location: ${mydir}/comment.php?catid=" .
                 $HTTP_POST_VARS["catid"] . "&chanid=" .
                 $HTTP_POST_VARS["chanid"] . "&oc=" .
                 $HTTP_POST_VARS["catid"]);
    exit(0);
}

?><html><head><title>meerkat browser</title></head>
<body bgcolor="#ffffff">
<h2>Meerkat integration</h2>
<?php
// handle incoming parameters
$catid=$HTTP_GET_VARS["catid"];
if ($HTTP_GET_VARS["oc"]==$catid)
    $chanid=$HTTP_GET_VARS["chanid"];
else 
    $chanid=0;

// create the Meerkat client
$client=new xmlrpc_client("/meerkat/xml-rpc/server.php",
                          "www.oreillynet.com", 80);

if ($HTTP_GET_VARS["comment"]) {
    // we're making a comment on a story,
    // so display a comment form.
    // TODO: retrieve the story headline & abstract
?>
<h3>Make a comment on the story</h3>
<form method="post">
<p>Your name:<br /><input type="text" size="30" name="name" /></p>
<p>Your comment:<br /><textarea rows="5" cols="60"
   name="commenttext"></textarea></p>
<input type="submit" value="Send comment" />
<input type="hidden" name="storyid" 
   value="<?php echo $HTTP_GET_VARS["comment"];?>" />
<input type="hidden" name="chanid" 
   value="<?php echo $chanid; ?>" />
<input type="hidden" name="catid" 
   value="<?php echo $catid; ?>" />

</form>
<?php
} else {
    // we're exploring the story store
    // first, get the list of top-level categories
    $categories=dispatch($client, "meerkat.getCategories", array(  ));

    // if we've chosen a category, get list of
    // web sites in that category
    if ($catid)
        $sources = dispatch($client, "meerkat.getChannelsByCategory", 

     array(new xmlrpcval($catid, "int")));

    // if we've chosen a web site, get list of
    // most recent 5 stories from that web site
    if ($chanid) {
        $stories = dispatch($client, "meerkat.getItems",
            array(new xmlrpcval(
                array(
                    "channel" => new xmlrpcval($chanid, "int"),
                    "ids" => new xmlrpcval(1, "int"),
                    "descriptions" => new xmlrpcval(200, "int"),
                    "num_items" => new xmlrpcval(5, "int"),
                    "dates" => new xmlrpcval(0, "int")
                    ), "struct")));
    }
    // data is fetched, now render the page
?>
<form>
<p>Subject area:<br />
<select name="catid">
<?php
     // category chooser
      if (!$catid)
            print "<option value=\"0\">Choose a category</option>\n";
      while(list($k,$v) = each($categories)) {
            print "<option value=\"" . $v['id'] ."\"";
            if ($v['id']==$catid) print " selected=\"selected\"";
            print ">". $v['title'] . "</option>\n"; 
        }
?>
</select></p>
<?php 
    if ($catid) { 
?>
<p>News source:<br />
<select name="chanid">
<?php
     // web site chooser
     if (!$chanid)
           print "<option value=\"0\">Choose a source</option>\n";
     while(list($k,$v) = each($sources)) {
            print "<option value=\"" . $v['id'] ."\"";
            if ($v['id']==$chanid) print "\" selected=\"selected\"";
            print ">". $v['title'] . "</option>\n"; 
        }
?>
</select>
</p>

<?php 
    } // end if ($catid)
?>

<p><input type="submit" value="Update" /></p>
<input type="hidden" name="oc" value="<?php echo $catid; ?>" />
</form>

<?php 
     if ($chanid) { 
?>

<h2>Stories available</h2>
<table>
<?php
     // story chooser
     while(list($k,$v) = each($stories)) {
         print "<tr>";
         print "<td><b>" . $v['title'] . "</b><br />";
         print $v['description'] . "<br />";
         print "<em><a target=\"_blank\" href=\"" . 
             $v['link'] . "\">Read full story</a> ";
         print "<a href=\"comment.php?catid=${catid}&chanid=${chanid}&" .
             "oc=${oc}&comment=" . $v['id'] . "\">Comment on this story</a>";
         print "</em>";
         print "</td>";
         print "</tr>\n";
         
         // now look for existing comments that the
         // comment server knows about.
         $res=dispatch($dclient, "discuss.getComments", 
                array(new xmlrpcval($v['id'])));

         if (sizeof($res)>0) {
             // $res is an array of associative arrays
             // -- the result of an xmlrpc_decode(  ) call

             print "<tr><td bgcolor=\"#dddddd\"><p><b><i>" .
                 "Comments on this story:</i></b></p>";
             for($i=0; $i<sizeof($res); $i++) {
                 $s=$res[$i];
                 print "<p><b>From:</b> " . 
                        htmlentities($s['name']) . "<br />";
                 print "<b>Comment:</b> " . 
                        htmlentities($s['comment']) . "</p>";
             }
             print "</td></tr>\n";
         }
         print "<tr><td><hr /></td></tr>\n";
     }
?>
</table>

<?php 
        } // end if ($chanid) 
} // end if ($HTTP_GET_VARS["comment"])
?>

<!-- page footer -->
<hr />
e>
<a href="http://meerkat.oreillynet.com"><img align="right" 
    src="http://meerkat.oreillynet.com/icons/meerkat-powered.jpg"
    height="31" width="88" alt="Meerkat powered, yeah!"
    border="0" hspace="8" /></a>
<em>$Id: ch05,v 1.19 2001/06/11 16:28:51 aschirmer Exp aschirmer $</em></p>
</body>
</html>