directory = FF_Meta_Externaldata::get(FF_META_DEFAULT_DIR); } function get_url_by_city($city) { $val = $this->directory[$city]; if (empty($val)) { return false; } else { return $val; } } } /** * OO interface to handle a single community/city */ class FF_Community { public $name; public $street; public $zip; public $city; public $lon; public $lat; /** * Default constructor from metadata */ function __construct($metadata) { $loc = $metadata['location']; $this->name = (isset($loc['address']) && isset($loc['address']['Name'])) ? $loc['address']['Name'] : ''; $this->street = (isset($loc['address']) && isset($loc['address']['Street'])) ? $loc['address']['Street'] : ''; $this->zip = (isset($loc['address']) && isset($loc['address']['Zipcode'])) ? $loc['address']['Zipcode'] : ''; $this->city = isset($loc['city']) ? $loc['city'] : ''; $this->lon = isset($loc['lon']) ? $loc['lon'] : ''; $this->lat = isset($loc['lat']) ? $loc['lat'] : ''; } /** * Alternative constructor from city name */ static function make_from_city($city) { // TODO: test if (false === ($url = $this->dir->get_url_by_city($city))) { return "\n"; } if (false === ($metadata = FF_Meta_Externaldata::get($url))) { return "\n"; } return new FF_Community($metadata); } function format_address() { if (empty($this->name) || empty($this->street) || empty($this->zip)) { return ''; } // TODO: style address + map as single box // TODO: once it is "ready" package openlayers.js into the plugin (cf. http://docs.openlayers.org/library/deploying.html) // TODO: handle missing values (i.e. only name & city) return '

' . sprintf('%s
%s
%s %s', $this->name, $this->street, $this->zip, $this->city) . '

'; } } /** * main class for whole plugin */ class FF_Meta { private $dir; function __construct() { $this->dir = new FF_Directory(); } function register_stuff() { if ( ! shortcode_exists('ff_state') ) { add_shortcode('ff_state', array($this, 'shortcode_handler')); } if ( ! shortcode_exists('ff_services') ) { add_shortcode('ff_services', array($this, 'shortcode_handler')); } if ( ! shortcode_exists('ff_contact') ) { add_shortcode('ff_contact', array($this, 'shortcode_handler')); } if ( ! shortcode_exists('ff_location') ) { add_shortcode('ff_location', array($this, 'shortcode_handler')); } add_action('admin_menu', array($this, 'admin_menu')); add_action('admin_init', array($this, 'admin_init')); register_uninstall_hook( __FILE__, array('ff_meta', 'uninstall_hook')); } function output_ff_state($citydata) { $state = $citydata['state']; return sprintf('%s', $state['nodes']); } function aux_get_all_locations() { // gather all location data if (false === ( $json_locs = get_transient("FF_metadata_json_locs") )) { $all_locs = array(); $arr_select = array('lat' => 1, 'lon' => 1); foreach ($this->dir as $tmp_city => $url) { try { $tmp_meta = FF_Meta_Externaldata::get($url); if (!empty($tmp_meta['location'])) { $tmp_loc = array_intersect_key($tmp_meta['location'], $arr_select); $all_locs[$tmp_city] = $tmp_loc; } } catch (Exception $e) { // pass } } $json_locs = json_encode($all_locs); $cachetime = get_option('FF_meta_cachetime', FF_META_DEFAULT_CACHETIME) * MINUTE_IN_SECONDS; set_transient("FF_metadata_json_locs", $json_locs, $cachetime); } return $json_locs; } function output_ff_location($citydata) { // normal per-city code $loc = new FF_Community($citydata); $outstr = $loc->format_address(); $json_locs = $this->aux_get_all_locations(); if (!empty($loc_name) && !empty($loc_name)) { $icon_url = plugin_dir_url(__FILE__) . "freifunk_marker.png"; $outstr .= << EOT; } return $outstr; } function output_ff_services($citydata) { $outstr = ''; return $outstr; } function output_ff_contact($citydata) { $outstr = '

'; $contact = $citydata['contact']; // Output -- rather ugly but the data is not uniform, some fields are URIs, some are usernames, ... if (!empty($contact['email'])) { $outstr .= sprintf("E-Mail: %s
\n", $contact['email'], $contact['email']); } if (!empty($contact['ml'])) { $outstr .= sprintf("Mailingliste: %s
\n", $contact['ml'], $contact['ml']); } if (!empty($contact['irc'])) { $outstr .= sprintf("IRC: %s
\n", $contact['irc'], $contact['irc']); } if (!empty($contact['twitter'])) { // catch username instead of URI if ($contact['twitter'][0] === "@") { $twitter_url = 'http://twitter.com/' . ltrim($contact['twitter'], "@"); $twitter_handle = $contact['twitter']; } else { $twitter_url = $contact['twitter']; $twitter_handle = '@' . substr($contact['twitter'], strrpos($contact['twitter'], '/') + 1); } $outstr .= sprintf("Twitter: %s
\n", $twitter_url, $twitter_handle); } if (!empty($contact['facebook'])) { $outstr .= sprintf("Facebook: %s
\n", $contact['facebook'], $contact['facebook']); } if (!empty($contact['googleplus'])) { $outstr .= sprintf("G+: %s
\n", $contact['googleplus'], $contact['googleplus']); } if (!empty($contact['jabber'])) { $outstr .= sprintf("XMPP: %s
\n", $contact['jabber'], $contact['jabber']); } $outstr .= '

'; return $outstr; } function output_ff_list() { return 'here be some ff_list'; } function shortcode_handler($atts, $content, $shortcode) { // $atts[0] holds the city name, if given if (empty($atts[0])) { $city = get_option('FF_meta_city', FF_META_DEFAULT_CITY); } else { $city = $atts[0]; } if (false === ($cityurl = $this->dir->get_url_by_city($city))) { return "\n"; } if (false === ($metadata = FF_Meta_Externaldata::get($cityurl))) { return "\n"; } $outstr = "
"; switch ($shortcode) { case 'ff_state': $outstr .= $this->output_ff_state($metadata); break; case 'ff_location': $outstr .= $this->output_ff_location($metadata); break; case 'ff_services': $outstr .= $this->output_ff_services($metadata); break; case 'ff_contact': $outstr .= $this->output_ff_contact($metadata); break; case 'ff_list': $outstr .= $this->output_ff_list(); break; default: $outstr .= ""; break; } $outstr .= "
"; return $outstr; } function admin_menu() { // Options Page: add_options_page( 'FF Meta Plugin', // page title 'FF Meta', // menu title 'manage_options', // req'd capability 'ff_meta_plugin', // menu slug array ('FF_meta', 'options_page') // callback function ); } function admin_init() { register_setting( 'ff_meta_settings-group', // group name 'ff_meta_cachetime' // option name ); register_setting( 'ff_meta_settings-group', // group name 'ff_meta_city' // option name ); add_settings_section( 'ff_meta_section-one', // ID 'Section One', // Title array ('FF_Meta', 'section_one_callback'), // callback to fill 'ff_meta_plugin' // page to display on ); add_settings_field( 'ff_meta_city', // ID 'Default community', // Title array ('FF_Meta', 'city_callback'), // callback to fill field 'ff_meta_plugin', // menu page=slug to display field on 'ff_meta_section-one', // section to display the field in array('label_for' => 'ff_meta_city_id') // ID of input element ); add_settings_field( 'ff_meta_cachetime', // ID 'Cache time', // Title array ('FF_Meta', 'cachetime_callback'), // callback to fill field 'ff_meta_plugin', // menu page=slug to display field on 'ff_meta_section-one', // section to display the field in array('label_for' => 'ff_meta_cachetime_id') // ID of input element ); } function section_one_callback() { echo 'This Plugin provides shortcodes to display information from the Freifunk meta.json.'; } function cachetime_callback() { $time = get_option( 'ff_meta_cachetime', FF_META_DEFAULT_CACHETIME ); echo " minutes" ."

Data from external URLs is cached for this number of minutes.

"; } function city_callback() { if (false === ($directory = FF_Meta_Externaldata::get ( FF_META_DEFAULT_DIR ))) { // TODO: error handling return; } $default_city = get_option( 'ff_meta_city', FF_META_DEFAULT_CITY ); echo ""; echo "

This is the default city parameter.

"; } function options_page() { ?>

Freifunk Meta Plugin Options

register_stuff();