| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- <?php
- /**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category Zend
- * @package Zend_Gdata
- * @subpackage Demos
- * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
- * @license http://framework.zend.com/license/new-bsd New BSD License
- */
- //////////////////////////////////////////////////////////////////////////////
- // Configuration: You must change these settings before running this sample //
- //////////////////////////////////////////////////////////////////////////////
- // Change this to point to the location of your private signing key. See:
- // http://code.google.com/apis/health/getting_started.html#DomainRegistration
- define('HEALTH_PRIVATE_KEY', '/path/to/your/rsa_private_key.pem');
- //////////////////////////////////////////////////////////////////////////////
- // End Configuration //
- //////////////////////////////////////////////////////////////////////////////
- // Load the Zend Gdata classes.
- require_once 'Zend/Loader.php';
- Zend_Loader::loadClass('Zend_Gdata_AuthSub');
- Zend_Loader::loadClass('Zend_Gdata_Health');
- Zend_Loader::loadClass('Zend_Gdata_Health_Query');
- session_start();
- // Google H9 Sandbox AuthSub/OAuth scope
- define('SCOPE', 'https://www.google.com/h9/feeds/');
- try {
- // Setup the HTTP client and fetch an AuthSub token for H9
- $client = authenticate(@$_GET['token']);
- $useH9 = true;
- $healthService = new Zend_Gdata_Health($client, 'google-HealthPHPSample-v1.0', $useH9);
- } catch(Zend_Gdata_App_Exception $e) {
- echo 'Error: ' . $e->getMessage();
- }
- ?>
- <html>
- <head>
- <style>
- body { margin:0; }
- div { width:75%;margin-left:10px;padding:5px;font-family: "Courier New"; }
- div#tokenstats { border-bottom:5px solid;background-color:#99ccff;margin:0 0 10px 0;padding:5px;width:100%; }
- .code { margin:5px 0 5px 10px;background-color:#eee; }
- div.data{ height:600px;border:1px solid;overflow:auto; }
- </style>
- </head>
- <body>
- <div id="tokenstats">
- <b>Token info</b>: <?php echo getTokenInfo($client); ?><br>
- <b>Session Token</b>: <?php echo $client->getAuthSubToken(); ?><br>
- </div>
- <?php
- // =============================================================================
- // Return the user's entire profile in a single atom <entry>
- // =============================================================================
- try {
- $snippet = '
- // =========================================================================
- // Return the user\'s entire profile in a single atom <entry>
- // =========================================================================
- $query = new Zend_Gdata_Health_Query();
- $query->setDigest("true");
- $profileFeed = $healthService->getHealthProfileFeed($query);';
- $snippet2 = '
- $entries = $profileFeed->getEntries();
- $ccr = $entries[0]->getCcr();
- $xmlStr = $ccr->saveXML($ccr);
- echo "<p>" . xmlpp($xmlStr) . "</p>";';
- echo '<div class="code"><pre>' . htmlentities($snippet . $snippet2) . '</pre></div>';
- eval($snippet);
- } catch(Zend_Gdata_App_Exception $e) {
- echo 'Error: ' . $e->getMessage();
- }
- echo '<div class="data"><pre>';
- echo 'num entries: ' . count($profileFeed->getEntries());
- eval($snippet2);
- echo '</pre></div>';
- // =============================================================================
- // Return a user's medication from the entire CCR
- // =============================================================================
- try {
- $snippet = '
- // =========================================================================
- // Return a user\'s medication for the entire CCR
- // =========================================================================
- $profileFeed = $healthService->getHealthProfileFeed();';
- $snippet2 = '
- foreach ($profileFeed->entry as $entry) {
- $medications = $entry->getCcr()->getMedications();
- foreach ($medications as $med) {
- $xmlStr = $med->ownerDocument->saveXML($med);
- echo "<p>" . xmlpp($xmlStr) . "</p>";
- }
- }';
- } catch(Zend_Gdata_App_Exception $e) {
- echo 'Error: ' . $e->getMessage();
- }
- echo '<div class="code"><pre>' . htmlentities($snippet . $snippet2) . '</pre></div>';
- eval($snippet);
- echo '<div class="data"><pre>';
- eval($snippet2);
- echo '</pre></div>';
- // =============================================================================
- // Category query: return a user's medication
- // =============================================================================
- try {
- $snippet = '
- // =========================================================================
- // Category query: return a user\'s medication
- // =========================================================================
- $query = new Zend_Gdata_Health_Query(SCOPE . "profile/default");
- $query->setCategory("medication");
- $profileFeed = $healthService->getHealthProfileFeed($query);';
- $snippet2 = '
- foreach ($profileFeed->entry as $entry) {
- $medications = $entry->getCcr()->getMedications();
- foreach ($medications as $med) {
- $xmlStr = $med->ownerDocument->saveXML($med);
- echo "<p>" . xmlpp($xmlStr) . "</p>";
- }
- }';
- } catch(Zend_Gdata_App_Exception $e) {
- echo 'Error: ' . $e->getMessage();
- }
- echo '<div class="code"><pre>' . htmlentities($snippet . $snippet2) . '</pre></div>';
- eval($snippet);
- echo '<div class="data"><pre>';
- echo 'query: ' . $query->getQueryUrl() . '<br>';
- echo 'num entries: ' . count($profileFeed->getEntries());
- eval($snippet2);
- echo '</pre></div>';
- // =============================================================================
- // Query for a specific item within a category: allgergy A-Fil
- // =============================================================================
- try {
- $snippet = '
- // =========================================================================
- // Query for a specific item within a category: allgergy A-Fil
- // =========================================================================
- $query = new Zend_Gdata_Health_Query(SCOPE . "profile/default");
- $query->setCategory("allergy", "A-Fil");
- $query->setGrouped("true");
- $profileFeed = $healthService->getHealthProfileFeed($query);';
- $snippet2 = '
- foreach ($profileFeed->getEntries() as $entry) {
- $allergies = $entry->getCcr()->getAllergies();
- foreach ($allergies as $allergy) {
- $xmlStr = $allergy->ownerDocument->saveXML($allergy);
- echo "<p>" . xmlpp($xmlStr) . "</p>";
- }
- }';
- } catch(Zend_Gdata_App_Exception $e) {
- echo 'Error: ' . $e->getMessage();
- }
- echo '<div class="code"><pre>' . htmlentities($snippet . $snippet2) . '</pre></div>';
- eval($snippet);
- echo '<div class="data"><pre>';
- echo 'query: ' . $query->getQueryUrl() . '<br>';
- echo 'num entries: ' . count($profileFeed->getEntries());
- eval($snippet2);
- echo '</pre></div>';
- // =============================================================================
- // Query (and return) the user\'s medications OR conditions
- // =============================================================================
- try {
- $snippet = '
- // =========================================================================
- // Query (and return) the user\'s medications OR conditions
- // =========================================================================
- $queryStr = SCOPE . "profile/default/-/medication%7Ccondition?digest=false";
- $profileFeed = $healthService->getHealthProfileFeed($queryStr);';
- $snippet2 = '
- $entries = $profileFeed->getEntries();
- foreach ($entries as $entry) {
- $ccr = $entry->getCcr();
- $xmlStr = $ccr->saveXML($ccr);
- echo "<p>" . xmlpp($xmlStr) . "</p>";
- }';
- echo '<div class="code"><pre>' . htmlentities($snippet . $snippet2) . '</pre></div>';
- eval($snippet);
- } catch(Zend_Gdata_App_Exception $e) {
- echo 'Error: ' . $e->getMessage();
- }
- echo '<div class="data"><pre>';
- echo 'num entries: ' . count($profileFeed->getEntries());
- eval($snippet2);
- echo '</pre></div>';
- // =============================================================================
- // Send a notice to the user's profile that includes a CCR payload
- // =============================================================================
- try {
- $snippet = '
- // =========================================================================
- // Send a notice to the user\'s profile that includes a CCR payload
- // =========================================================================
- $subject = "Title of your notice goes here";
- $body = "Notice body can contain <b>html</b> entities";
- $ccr = \'<ContinuityOfCareRecord xmlns="urn:astm-org:CCR">
- <Body>
- <Problems>
- <Problem>
- <DateTime>
- <Type><Text>Start date</Text></Type>
- <ExactDateTime>2007-04-04T07:00:00Z</ExactDateTime>
- </DateTime>
- <Description>
- <Text>Aortic valve disorders</Text>
- <Code>
- <Value>410.10</Value>
- <CodingSystem>ICD9</CodingSystem>
- <Version>2004</Version>
- </Code>
- </Description>
- <Status><Text>Active</Text></Status>
- </Problem>
- </Problems>
- </Body>
- </ContinuityOfCareRecord>\';
- $responseEntry = $healthService->sendHealthNotice($subject, $body, "html", $ccr);';
- } catch(Zend_Gdata_App_Exception $e) {
- echo 'Error: ' . $e->getMessage();
- }
- echo '<div class="code"><pre>' . htmlentities($snippet) . '</pre></div>';
- eval($snippet);
- echo '<div class="data"><pre>';
- echo xmlpp($responseEntry->getXML());
- echo '</pre></div>';
- // =============================================================================
- // Revoke the AuthSub session token
- // =============================================================================
- //$revoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($client->getAuthSubToken(), $client) ? 'yes' : 'no';
- //echo '<b>Token revoked</b>: ' . @$revoked;
- //unset($_SESSION['sessionToken']);
- ?>
- </body>
- </html>
- <?php
- function getCurrentUrl() {
- $phpRequestUri =
- htmlentities(substr($_SERVER['REQUEST_URI'], 0, strcspn($_SERVER['REQUEST_URI'], "\n\r")), ENT_QUOTES);
- if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') {
- $protocol = 'https://';
- } else {
- $protocol = 'http://';
- }
- $host = $_SERVER['HTTP_HOST'];
- if ($_SERVER['SERVER_PORT'] != '' &&
- (($protocol == 'http://' && $_SERVER['SERVER_PORT'] != '80') ||
- ($protocol == 'https://' && $_SERVER['SERVER_PORT'] != '443'))) {
- $port = ':' . $_SERVER['SERVER_PORT'];
- } else {
- $port = '';
- }
- return $protocol . $host . $port . $phpRequestUri;
- }
- function authenticate($singleUseToken=null) {
- $sessionToken = isset($_SESSION['sessionToken']) ? $_SESSION['sessionToken'] : null;
- // If there is no AuthSub session or one-time token waiting for us,
- // redirect the user to Google Health's AuthSub handler to get one.
- if (!$sessionToken && !$singleUseToken) {
- $next = getCurrentUrl();
- $secure = 1;
- $session = 1;
- $authSubHandler = 'https://www.google.com/h9/authsub';
- $permission = 1; // 1 - allows reading of the profile && posting notices
- $authSubURL =
- Zend_Gdata_AuthSub::getAuthSubTokenUri($next, SCOPE, $secure, $session,
- $authSubHandler);
- $authSubURL .= '&permission=' . $permission;
- echo '<a href="' . $authSubURL . '">Link your Google Health Account</a>';
- exit();
- }
- $client = new Zend_Gdata_HttpClient();
- $client->setAuthSubPrivateKeyFile(HEALTH_PRIVATE_KEY, null, true);
- // Convert an AuthSub one-time token into a session token if needed
- if ($singleUseToken && !$sessionToken) {
- $sessionToken =
- Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken, $client);
- $_SESSION['sessionToken'] = $sessionToken;
- }
- $client->setAuthSubToken($sessionToken);
- return $client;
- }
- function getTokenInfo($client) {
- $sessionToken = $client->getAuthSubToken();
- return Zend_Gdata_AuthSub::getAuthSubTokenInfo($sessionToken, $client);
- }
- function revokeToken($client) {
- $sessionToken = $client->getAuthSubToken();
- return Zend_Gdata_AuthSub::AuthSubRevokeToken($sessionToken, $client);
- }
- /** Prettifies an XML string into a human-readable and indented work of art
- * @param string $xml The XML as a string
- * @param boolean $html_output True if the output should be escaped (for use in HTML)
- */
- function xmlpp($xml, $html_output=true) {
- $xml_obj = new SimpleXMLElement($xml);
- $level = 4;
- $indent = 0; // current indentation level
- $pretty = array();
- // get an array containing each XML element
- $xml = explode("\n", preg_replace('/>\s*</', ">\n<", $xml_obj->asXML()));
- // shift off opening XML tag if present
- if (count($xml) && preg_match('/^<\?\s*xml/', $xml[0])) {
- $pretty[] = array_shift($xml);
- }
- foreach ($xml as $el) {
- if (preg_match('/^<([\w])+[^>\/]*>$/U', $el)) {
- // opening tag, increase indent
- $pretty[] = str_repeat(' ', $indent) . $el;
- $indent += $level;
- } else {
- if (preg_match('/^<\/.+>$/', $el)) {
- $indent -= $level; // closing tag, decrease indent
- }
- if ($indent < 0) {
- $indent += $level;
- }
- $pretty[] = str_repeat(' ', $indent) . $el;
- }
- }
- $xml = implode("\n", $pretty);
- return ($html_output) ? htmlentities($xml) : $xml;
- }
- ?>
|