hubblesite-daily-image-word.../classes/DailyImageWidget.php

265 lines
8.1 KiB
PHP
Raw Normal View History

2009-06-02 20:12:47 +00:00
<?php
class DailyImageWidget {
2009-06-10 19:41:27 +00:00
function DailyImageWidget($skip_load_data = false) {
2009-06-04 21:36:51 +00:00
$this->default_display_options = array(
'title',
'image',
'styles'
2009-06-09 19:55:50 +00:00
);
2009-06-09 21:45:59 +00:00
$this->_cache_time = 86400;
2009-06-09 19:55:50 +00:00
$this->data_source = "http://hubblesite.org/gallery/album/daily_image.php";
$this->has_simplexml = class_exists('SimpleXMLElement');
$this->_valid_column_names = array('title', 'caption', 'date', 'image_url', 'gallery_url', 'credits');
2009-06-09 21:45:59 +00:00
$this->_valid_options = array(
2009-06-10 19:41:27 +00:00
"image" => __("Daily Image", "hubblesite-daily-image-widget"),
"title" => __("Image Title", "hubblesite-daily-image-widget"),
"caption" => __("Image Caption", "hubblesite-daily-image-widget"),
"credits" => __("Credits", "hubblesite-daily-image-widget"),
"styles" => __("HubbleSite Styles", "hubblesite-daily-image-widget"),
2009-06-09 21:45:59 +00:00
);
2009-06-10 19:41:27 +00:00
add_action('init', array($this, "_init"));
if (!$skip_load_data) {
if (!$this->_load_data()) {
add_action("admin_notices", array($this, "_connection_warning"));
}
} else {
$this->data = false;
}
2009-06-04 21:36:51 +00:00
}
2009-06-10 19:41:27 +00:00
function _init() {
register_sidebar_widget(__("HubbleSite Daily Image", "hubblesite-daily-image-widget"), array($this, "render"));
register_widget_control(__("HubbleSite Daily Image", "hubblesite-daily-image-widget"), array($this, "render_ui"));
2009-06-10 20:44:19 +00:00
$this->handle_post();
$this->get_display_options();
2009-06-10 19:41:27 +00:00
}
function _connection_warning() {
echo "<div class=\"updated fade\">";
_e("<strong>HubbleSite Daily Image Widget</strong> was unable to retrieve new data from HubbleSite.", "hubblesite-daily-image-widget");
_e("The widget will appear as empty in your site until data can be downloaded again.", "hubblesite-daily-image-widget");
echo "</div>";
}
function _get_from_data_source() {
2009-07-15 12:06:33 +00:00
if (extension_loaded('curl')) {
$ch = curl_init($this->data_source);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result = curl_exec($ch);
curl_close($ch);
return $result;
} else {
return @file_get_contents($this->data_source);
}
2009-06-10 19:41:27 +00:00
}
function _load_data() {
if (($result = $this->_get_cached_data()) === false) {
if (($xml_text = $this->_get_from_data_source()) !== false) {
if (($result = $this->parse_xml($xml_text)) !== false) {
update_option('hubblesite-daily-image-cache', array(time(), $result));
return true;
}
}
return false;
} else {
return true;
}
}
2009-06-10 20:44:19 +00:00
function handle_post() {
if (isset($_POST['hubblesite']['_wpnonce'])) {
if (wp_verify_nonce($_POST['hubblesite']['_wpnonce'], 'hubble')) {
$options = array();
foreach ($this->_valid_options as $option => $label) {
if (isset($_POST['hubblesite'][$option])) {
$options[] = $option;
}
}
$this->display_options = $options;
update_option('hubblesite-daily-image-options', implode(",", $this->display_options));
}
}
}
2009-06-09 19:55:50 +00:00
/**
* Get the list of display options from the WordPress options database.
*/
2009-06-04 21:36:51 +00:00
function get_display_options() {
$display_options = get_option('hubblesite-daily-image-options');
$this->display_options = array();
if (!empty($display_options)) {
2009-06-09 21:45:59 +00:00
$this->display_options = array_intersect(explode(",", $display_options), array_keys($this->_valid_options));
2009-06-04 21:36:51 +00:00
}
if (empty($this->display_options)) {
$this->display_options = $this->default_display_options;
}
2009-06-10 19:41:27 +00:00
update_option('hubblesite-daily-image-options', implode(",", $this->display_options));
2009-06-04 21:36:51 +00:00
return $this->display_options;
}
2009-06-09 19:55:50 +00:00
/**
* Render the widget.
*/
2009-06-03 21:29:23 +00:00
function render() {
2009-06-04 21:36:51 +00:00
if (!empty($this->data) && is_array($this->data)) {
$options = $this->get_display_options();
echo '<div id="hubblesite-daily-image">';
2009-06-10 20:53:33 +00:00
echo '<p id="hubblesite-daily-image-header">HubbleSite Daily Image</p>';
2009-06-04 21:36:51 +00:00
if (in_array("image", $options)) {
echo '<a href="' . $this->data['gallery_url'] . '" title="' . $this->data['title'] . '">';
echo '<img src="' . $this->data['image_url'] . '" alt="' . $this->data['title'] . '" />';
echo '</a>';
}
if (in_array("title", $options)) {
echo '<a id="hubblesite-daily-image-title" href="' . $this->data['gallery_url'] . '">';
echo $this->data['title'];
echo '</a>';
}
if (in_array("caption", $options)) {
echo '<div id="hubblesite-daily-image-caption">';
echo $this->data['caption'];
echo '</div>';
}
if (in_array("credits", $options)) {
echo '<div id="hubblesite-daily-image-credits">';
echo $this->data['credits'];
echo '</div>';
}
echo '</div>';
if (in_array("styles", $options)) {
2009-06-10 20:53:33 +00:00
echo "<style type=\"text/css\">";
include(dirname(__FILE__) . '/../hubblesite-styles.css');
echo "</style>";
2009-06-04 21:36:51 +00:00
}
2009-06-03 21:29:23 +00:00
}
}
2009-06-09 19:55:50 +00:00
2009-06-09 21:45:59 +00:00
function render_ui() {
2009-06-10 20:44:19 +00:00
echo "<input type=\"hidden\" name=\"hubblesite[_wpnonce]\" value=\"" . wp_create_nonce('hubble') . "\" />";
2009-06-10 19:41:27 +00:00
echo "<p>";
2009-06-10 20:44:19 +00:00
_e("Show on Widget <em>(must select at least one)</em>:", "hubblesite-daily-image-widget");
2009-06-10 19:41:27 +00:00
echo "</p>";
2009-06-09 21:45:59 +00:00
foreach ($this->_valid_options as $option => $label) {
echo "<label>";
2009-06-10 20:44:19 +00:00
echo "<input type=\"checkbox\" name=\"hubblesite[${option}]\" " . (in_array($option, $this->display_options) ? "checked=\"checked\"" : "") . "/> ";
2009-06-09 21:45:59 +00:00
echo $label;
echo "</label>";
2009-06-10 19:41:27 +00:00
echo "<br />";
2009-06-09 21:45:59 +00:00
}
}
2009-06-09 19:55:50 +00:00
/**
* Parse a string of XML from the HubbleSite Daily Gallery Image feed.
*/
function parse_xml($xml_text) {
if ($this->has_simplexml) {
try {
$xml = new SimpleXMLElement($xml_text);
if ($xml !== false) {
$data = array();
$is_valid = true;
foreach ($this->_valid_column_names as $node) {
if ($xml->{$node}) {
$data[$node] = (string)$xml->{$node};
} else {
$is_valid = false; break;
}
}
if ($is_valid) {
$this->data = $data;
} else {
$this->data = false;
}
}
} catch (Exception $e) {
$this->data = false;
}
} else {
$parser = xml_parser_create();
$this->_character_data = "";
$this->_xml_data = array();
xml_set_element_handler(
$parser,
array($this, "_start_element_handler"),
array($this, "_end_element_handler")
);
xml_set_character_data_handler($parser, array($this, "_character_data_handler"));
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
$this->data = false;
if (xml_parse($parser, $xml_text)) {
if (count($this->_xml_data) == count($this->_valid_column_names)) {
$this->data = $this->_xml_data;
}
}
}
return $this->data;
}
function _start_element_handler($parser, $name, $attributes) {
$this->_character_data = "";
}
function _end_element_handler($parser, $name) {
$name = strtolower($name);
if (in_array($name, $this->_valid_column_names)) {
$this->_xml_data[$name] = $this->_character_data;
}
$this->_character_data = "";
}
function _character_data_handler($parser, $data) {
$this->_character_data .= $data;
}
2009-06-09 21:45:59 +00:00
function _get_cached_data() {
$result = get_option('hubblesite-daily-image-cache');
if (is_string($result)) {
if (($data = @unserialize($result)) !== false) {
list($timestamp, $cached_data) = $data;
if (($timestamp + $this->_cache_time) > time()) {
2009-06-10 17:32:06 +00:00
$is_valid = true;
foreach ($this->_valid_column_names as $field) {
if (!isset($cached_data[$field])) { $is_valid = false; break; }
}
2009-06-09 21:45:59 +00:00
2009-06-10 19:41:27 +00:00
if ($is_valid) {
$this->data = $cached_data;
return $cached_data;
}
2009-06-09 21:45:59 +00:00
}
}
}
return false;
}
2009-06-02 20:12:47 +00:00
}
2009-06-10 21:08:26 +00:00
function the_hubblesite_daily_image_widget() {
$diw = new DailyImageWidget();
$diw->render();
}
2009-06-02 20:12:47 +00:00
?>