diff --git a/classes/PluginWonderful.php b/classes/PluginWonderful.php new file mode 100644 index 0000000..82953e0 --- /dev/null +++ b/classes/PluginWonderful.php @@ -0,0 +1,310 @@ +messages = array(); + $this->adboxes_client = new PWAdboxesClient(); + $this->publisher_info = false; + + if ($member_id = get_option('plugin-wonderful-memberid')) { + $this->publisher_info = $this->adboxes_client->get_ads($member_id); + + if ((get_option('plugin-wonderful-last-update') + PLUGIN_WONDERFUL_UPDATE_TIME) < time()) { + if (($result = file_get_contents(sprintf(PLUGIN_WONDERFUL_XML_URL, (int)get_option('plugin-wonderful-memberid')))) !== false) { + $this->publisher_info = new PublisherInfo(); + if ($this->publisher_info->parse($result)) { + $this->adboxes_client->post_ads($this->publisher_info); + update_option('plugin-wonderful-last-update', time()); + } + } + } + } + + $result = get_option('plugin-wonderful-database-version'); + if (empty($result) || ($result < PLUGIN_WONDERFUL_DATABASE_VERSION)) { + if ($this->adboxes_client->initialize(true)) { + update_option('plugin-wonderful-database-version', PLUGIN_WONDERFUL_DATABASE_VERSION); + } else { + $this->messages[] = "Unable to update database schema!"; + } + } + + $this->set_up_widgets(); + + if (!empty($_POST)) { $this->handle_action(); } + } + + function insert_rss_feed_ads($content) { + if (is_feed()) { + if ($this->publisher_info !== false) { + foreach ($this->publisher_info->adboxes as $adbox) { + if ($adbox->in_rss_feed == 1) { + if (preg_match("##mis", $adbox->advancedcode, $matches) > 0) { + echo $matches[1]; + } + } + } + } + } + return $content; + } + + function insert_activation_ad() { + $result = get_option('plugin-wonderful-activate-ad-code'); + if (!empty($result)) { echo $result; } + } + + function render_widget($options, $adboxid) { + if ($this->publisher_info !== false) { + foreach ($this->publisher_info->adboxes as $adbox) { + if (($adbox->adboxid == $adboxid) || ($adbox->template_tag_id == $adboxid)) { + if (get_option("plugin-wonderful-use-standardcode") == 1) { + $output = $adbox->standardcode; + } else { + $output = $adbox->advancedcode; + } + if ($adbox->center_widget == 1) { + $output = "
{$output}
"; + } + echo $output; + break; + } + } + } + } + + function inject_ads_into_body_copy($body) { + if ($this->publisher_info !== false) { + if (get_option("plugin-wonderful-enable-body-copy-embedding") == 1) { + return $this->publisher_info->inject_ads_into_body_copy($body, (get_option("plugin-wonderful-use-standardcode") == 1)); + } + } + return $body; + } + + function set_up_menu() { + add_options_page('Plugin Wonderful', __("Plugin Wonderful", 'plugin-wonderful'), 5, __FILE__, array($this, "plugin_wonderful_main")); + } + + function set_up_widgets() { + if ($this->publisher_info !== false) { + if (($widgets = $this->publisher_info->get_sidebar_widget_info()) !== false) { + foreach ($widgets as $widget_info) { + extract($widget_info); + wp_register_sidebar_widget($id, $name, array($this, 'render_widget'), "", $options['adboxid']); + register_widget_control($id, array($this, 'render_widget_control'), null, null, $options['adboxid']); + } + } + } + } + + function render_widget_control($adboxid) { + foreach ($this->publisher_info->adboxes as $box) { + if ($box->adboxid == $adboxid) { + echo ''; + echo ''; + break; + } + } + } + + function handle_activation() { + $this->adboxes_client->initialize(); + } + + function plugin_wonderful_main() { + $this->get_view(__FUNCTION__); + } + + function show_messages() { + if (count($this->messages) > 0) { + echo '
'; + foreach ($this->messages as $message) { echo '

' . $message . '

'; } + echo '
'; + } + } + + function _create_target($name, $source) { + return dirname(__FILE__) . "/../{$source}/{$name}.php"; + } + + function get_view($function_name) { + $target = $this->_create_target(str_replace('plugin_wonderful_', '', $function_name), "views"); + if (file_exists($target)) { + $info = get_plugin_data(realpath(__FILE__)); + + echo '
'; + echo '

'; + echo '

' . __("Plugin Wonderful", 'plugin-wonderful') . '

'; + + $this->show_messages(); + + include($target); + + echo '
'; + echo '
'; + echo sprintf(__('%1$s Version %2$s by %3$s', 'plugin-wonderful'), $info['Title'], $info['Version'], $info['Author']) . ' | '; + echo __('Manage your Project Wonderful publisher account', 'plugin-wonderful'); + echo '
'; + echo '
'; + echo '
'; + } else { + die(__("View not found: ", 'plugin-wonderful') . str_replace('plugin-wonderful_', '', $function_name)); + } + } + + function handle_action() { + $action = "handle_action_" . str_replace("-", "_", preg_replace('#[^a-z\-]#', '', strtolower($_POST['action']))); + if (method_exists($this, $action)) { call_user_func(array($this, $action)); } + + // handle widget updates + if (isset($_POST['pw']['_nonce'])) { + if (wp_verify_nonce($_POST['pw']['_nonce'], "plugin-wonderful")) { $this->handle_action_save_widgets(); } + } + } + + function handle_action_save_widgets() { + $new_boxes = array(); + foreach ($this->publisher_info->adboxes as $box) { + if (isset($_POST['pw']['center'][$box->adboxid])) { + $this->adboxes_client->set_widget_centering($box->adboxid, true); + $box->center_widget = "1"; + } else { + $this->adboxes_client->set_widget_centering($box->adboxid, false); + $box->center_widget = "0"; + } + $new_boxes[] = $box; + } + $this->publisher_info->adboxes = $new_boxes; + } + + function handle_action_change_adbox_settings() { + if ($member_id = get_option('plugin-wonderful-memberid')) { + if (isset($_POST['template_tag_id']) && is_array($_POST['template_tag_id'])) { + if (is_array($this->publisher_info->adboxes)) { + $new_boxes = array(); + foreach ($this->publisher_info->adboxes as $box) { + if (isset($_POST['template_tag_id'][$box->adboxid])) { + $tag = $_POST['template_tag_id'][$box->adboxid]; + $prior_value = $box->template_tag_id; + + $tag = $this->adboxes_client->trim_field('template_tag_id', $tag); + + $this->adboxes_client->set_template_tag($box->adboxid, $tag); + $box->template_tag_id = $tag; + + if (!empty($tag) && ($prior_value != $tag)) { + $this->messages[] = sprintf(__('Template tag identifier for ad %1$s set to %2$s.', 'plugin-wonderful'), $box->adboxid, $tag); + } else { + if (!empty($prior_value) && empty($tag)) { + $this->messages[] = sprintf(__('Template tag identifier for ad %s removed.', 'plugin-wonderful'), $box->adboxid); + } + } + } + $new_boxes[] = $box; + } + $this->publisher_info->adboxes = $new_boxes; + } + } + + if (is_array($this->publisher_info->adboxes)) { + $new_boxes = array(); + foreach ($this->publisher_info->adboxes as $box) { + if (isset($_POST['in_rss_feed'][$box->adboxid])) { + $this->adboxes_client->set_rss_feed_usage($box->adboxid, true); + if ($box->in_rss_feed == 0) { + $this->messages[] = sprintf(__('RSS feed usage for ad %1$s enabled.', 'plugin-wonderful'), $box->adboxid); + } + $box->in_rss_feed = "1"; + } else { + $this->adboxes_client->set_rss_feed_usage($box->adboxid, false); + if ($box->in_rss_feed == 1) { + $this->messages[] = sprintf(__('RSS feed usage for ad %1$s disabled.', 'plugin-wonderful'), $box->adboxid); + } + $box->in_rss_feed = "0"; + } + $new_boxes[] = $box; + } + $this->publisher_info->adboxes = $new_boxes; + } + } + + if (count($this->messages) == 0) { + $this->messages[] = __("No changes to adboxes were made.", 'plugin-wonderful'); + } + } + + function handle_action_rebuild_database() { + $this->adboxes_client->destroy(); + $this->adboxes_client->initialize(); + + $this->messages[] = __("Adbox database destroyed and rebuilt.", 'plugin-wonderful'); + + if (get_option('plugin-wonderful-memberid') != "") { + if (($result = file_get_contents(sprintf(PLUGIN_WONDERFUL_XML_URL, (int)get_option('plugin-wonderful-memberid')))) !== false) { + $this->publisher_info = new PublisherInfo(); + if ($this->publisher_info->parse($result)) { + $this->adboxes_client->post_ads($this->publisher_info); + $this->messages[] = sprintf(__('Adbox information redownloaded.', 'plugin-wonderful'), (int)$_POST['memberid']); + } else { + $this->messages[] = __("Unable to parse publisher data from Project Wonderful.", 'plugin-wonderful'); + $this->publisher_info = false; + } + } else { + $this->messages[] = __("Unable to read publisher data from Project Wonderful.", 'plugin-wonderful'); + $this->publisher_info = false; + } + } + } + + function handle_action_change_memberid() { + if (trim($_POST['memberid'])) { + if (trim($_POST['memberid']) === (string)(int)$_POST['memberid']) { + if (($result = file_get_contents(sprintf(PLUGIN_WONDERFUL_XML_URL, (int)$_POST['memberid']))) !== false) { + $this->publisher_info = new PublisherInfo(); + if ($this->publisher_info->parse($result)) { + update_option('plugin-wonderful-memberid', (int)$_POST['memberid']); + $this->adboxes_client->post_ads($this->publisher_info); + $this->messages[] = sprintf(__('Member number changed to %s and adbox information redownloaded.', 'plugin-wonderful'), (int)$_POST['memberid']); + } else { + $this->messages[] = __("Unable to parse publisher data from Project Wonderful.", 'plugin-wonderful'); + update_option('plugin-wonderful-memberid', ""); + $this->publisher_info = false; + } + } else { + $this->messages[] = __("Unable to read publisher data from Project Wonderful.", 'plugin-wonderful'); + update_option('plugin-wonderful-memberid', ""); + $this->publisher_info = false; + } + } else { + $this->messages[] = __("Member numbers need to be numeric.", 'plugin-wonderful'); + update_option('plugin-wonderful-memberid', ""); + $this->publisher_info = false; + } + } else { + $this->messages[] = __("Existing adbox information removed.", 'plugin-wonderful'); + update_option('plugin-wonderful-memberid', ""); + + $this->publisher_info = false; + } + + foreach (array('use-standardcode', 'enable-body-copy-embedding') as $field) { + update_option("plugin-wonderful-${field}", isset($_POST[$field]) ? "1" : "0"); + } + } +} + +function the_project_wonderful_ad($adboxid) { + global $plugin_wonderful; + + $plugin_wonderful->render_widget(array(), $adboxid); +} + +?> \ No newline at end of file diff --git a/plugin-wonderful.php b/plugin-wonderful.php index 43d5204..bf3687f 100644 --- a/plugin-wonderful.php +++ b/plugin-wonderful.php @@ -25,320 +25,19 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -require_once('classes/PWAdboxesClient.php'); +foreach (glob(dirname(__FILE__) . '/classes/*.php') as $file) { require_once($file); } // require_once('FirePHPCore/fb.php'); define('PLUGIN_WONDERFUL_XML_URL', 'http://www.projectwonderful.com/xmlpublisherdata.php?publisher=%d'); define('PLUGIN_WONDERFUL_UPDATE_TIME', 60 * 60 * 12); // every 12 hours -class PluginWonderful { - var $messages, $adboxes_client, $publisher_info, $member_id; - - function PluginWonderful() { - $this->messages = array(); - $this->adboxes_client = new PWAdboxesClient(); - $this->publisher_info = false; - - if ($member_id = get_option('plugin-wonderful-memberid')) { - $this->publisher_info = $this->adboxes_client->get_ads($member_id); - - if ((get_option('plugin-wonderful-last-update') + PLUGIN_WONDERFUL_UPDATE_TIME) < time()) { - if (($result = file_get_contents(sprintf(PLUGIN_WONDERFUL_XML_URL, (int)get_option('plugin-wonderful-memberid')))) !== false) { - $this->publisher_info = new PublisherInfo(); - if ($this->publisher_info->parse($result)) { - $this->adboxes_client->post_ads($this->publisher_info); - update_option('plugin-wonderful-last-update', time()); - } - } - } - } - - $result = get_option('plugin-wonderful-database-version'); - if (empty($result) || ($result < PLUGIN_WONDERFUL_DATABASE_VERSION)) { - if ($this->adboxes_client->initialize(true)) { - update_option('plugin-wonderful-database-version', PLUGIN_WONDERFUL_DATABASE_VERSION); - } else { - $this->messages[] = "Unable to update database schema!"; - } - } - - if (!empty($_POST)) { $this->handle_action(); } - } - - function insert_rss_feed_ads($content) { - if (is_feed()) { - if ($this->publisher_info !== false) { - foreach ($this->publisher_info->adboxes as $adbox) { - if ($adbox->in_rss_feed == 1) { - if (preg_match("##mis", $adbox->advancedcode, $matches) > 0) { - echo $matches[1]; - } - } - } - } - } - return $content; - } - - function insert_activation_ad() { - $result = get_option('plugin-wonderful-activate-ad-code'); - if (!empty($result)) { echo $result; } - } - - function render_widget($options, $adboxid) { - if ($this->publisher_info !== false) { - foreach ($this->publisher_info->adboxes as $adbox) { - if (($adbox->adboxid == $adboxid) || ($adbox->template_tag_id == $adboxid)) { - if (get_option("plugin-wonderful-use-standardcode") == 1) { - $output = $adbox->standardcode; - } else { - $output = $adbox->advancedcode; - } - if ($adbox->center_widget == 1) { - $output = "
{$output}
"; - } - echo $output; - break; - } - } - } - } - - function inject_ads_into_body_copy($body) { - if ($this->publisher_info !== false) { - if (get_option("plugin-wonderful-enable-body-copy-embedding") == 1) { - return $this->publisher_info->inject_ads_into_body_copy($body, (get_option("plugin-wonderful-use-standardcode") == 1)); - } - } - return $body; - } - - function set_up_menu() { - add_options_page('Plugin Wonderful', __("Plugin Wonderful", 'plugin-wonderful'), 5, __FILE__, array($this, "plugin_wonderful_main")); - } - - function set_up_widgets() { - if ($this->publisher_info !== false) { - if (($widgets = $this->publisher_info->get_sidebar_widget_info()) !== false) { - foreach ($widgets as $widget_info) { - extract($widget_info); - wp_register_sidebar_widget($id, $name, array($this, 'render_widget'), "", $options['adboxid']); - register_widget_control($id, array($this, 'render_widget_control'), null, null, $options['adboxid']); - } - } - } - } - - function render_widget_control($adboxid) { - foreach ($this->publisher_info->adboxes as $box) { - if ($box->adboxid == $adboxid) { - echo ''; - break; - } - } - } - - function handle_activation() { - $this->adboxes_client->initialize(); - } - - function plugin_wonderful_main() { - $this->get_view(__FUNCTION__); - } - - function show_messages() { - if (count($this->messages) > 0) { - echo '
'; - foreach ($this->messages as $message) { echo '

' . $message . '

'; } - echo '
'; - } - } - - function _create_target($name, $source) { - return ABSPATH . PLUGINDIR . '/' . dirname(plugin_basename(__FILE__)) . "/{$source}/{$name}.php"; - } - - function get_view($function_name) { - $target = $this->_create_target(str_replace('plugin_wonderful_', '', $function_name), "views"); - if (file_exists($target)) { - - $info = get_plugin_data(realpath(__FILE__)); - - echo '
'; - echo '

'; - echo '

' . __("Plugin Wonderful", 'plugin-wonderful') . '

'; - - $this->show_messages(); - - include($target); - - echo '
'; - echo '
'; - echo sprintf(__('%1$s Version %2$s by %3$s', 'plugin-wonderful'), $info['Title'], $info['Version'], $info['Author']) . ' | '; - echo __('Manage your Project Wonderful publisher account', 'plugin-wonderful'); - echo '
'; - echo '
'; - echo '
'; - } else { - die(__("View not found: ", 'plugin-wonderful') . str_replace('plugin-wonderful_', '', $function_name)); - } - } - - function handle_action() { - $action = "handle_action_" . str_replace("-", "_", preg_replace('#[^a-z\-]#', '', strtolower($_POST['action']))); - if (method_exists($this, $action)) { call_user_func(array($this, $action)); } - - // handle widget updates - if (isset($_POST['save-widgets'])) { $this->handle_action_save_widgets(); } - } - - function handle_action_save_widgets() { - $new_boxes = array(); - foreach ($this->publisher_info->adboxes as $box) { - if (isset($_POST['pw']['center'][$box->adboxid])) { - $this->adboxes_client->set_widget_centering($box->adboxid, true); - $box->center_widget = "1"; - } else { - $this->adboxes_client->set_widget_centering($box->adboxid, false); - $box->center_widget = "0"; - } - $new_boxes[] = $box; - } - $this->publisher_info->adboxes = $new_boxes; - } - - function handle_action_change_adbox_settings() { - if ($member_id = get_option('plugin-wonderful-memberid')) { - if (isset($_POST['template_tag_id']) && is_array($_POST['template_tag_id'])) { - if (is_array($this->publisher_info->adboxes)) { - $new_boxes = array(); - foreach ($this->publisher_info->adboxes as $box) { - if (isset($_POST['template_tag_id'][$box->adboxid])) { - $tag = $_POST['template_tag_id'][$box->adboxid]; - $prior_value = $box->template_tag_id; - - $tag = $this->adboxes_client->trim_field('template_tag_id', $tag); - - $this->adboxes_client->set_template_tag($box->adboxid, $tag); - $box->template_tag_id = $tag; - - if (!empty($tag) && ($prior_value != $tag)) { - $this->messages[] = sprintf(__('Template tag identifier for ad %1$s set to %2$s.', 'plugin-wonderful'), $box->adboxid, $tag); - } else { - if (!empty($prior_value) && empty($tag)) { - $this->messages[] = sprintf(__('Template tag identifier for ad %s removed.', 'plugin-wonderful'), $box->adboxid); - } - } - } - $new_boxes[] = $box; - } - $this->publisher_info->adboxes = $new_boxes; - } - } - - if (is_array($this->publisher_info->adboxes)) { - $new_boxes = array(); - foreach ($this->publisher_info->adboxes as $box) { - if (isset($_POST['in_rss_feed'][$box->adboxid])) { - $this->adboxes_client->set_rss_feed_usage($box->adboxid, true); - if ($box->in_rss_feed == 0) { - $this->messages[] = sprintf(__('RSS feed usage for ad %1$s enabled.', 'plugin-wonderful'), $box->adboxid); - } - $box->in_rss_feed = "1"; - } else { - $this->adboxes_client->set_rss_feed_usage($box->adboxid, false); - if ($box->in_rss_feed == 1) { - $this->messages[] = sprintf(__('RSS feed usage for ad %1$s disabled.', 'plugin-wonderful'), $box->adboxid); - } - $box->in_rss_feed = "0"; - } - $new_boxes[] = $box; - } - $this->publisher_info->adboxes = $new_boxes; - } - } - - if (count($this->messages) == 0) { - $this->messages[] = __("No changes to adboxes were made.", 'plugin-wonderful'); - } - } - - function handle_action_rebuild_database() { - $this->adboxes_client->destroy(); - $this->adboxes_client->initialize(); - - $this->messages[] = __("Adbox database destroyed and rebuilt.", 'plugin-wonderful'); - - if (get_option('plugin-wonderful-memberid') != "") { - if (($result = file_get_contents(sprintf(PLUGIN_WONDERFUL_XML_URL, (int)get_option('plugin-wonderful-memberid')))) !== false) { - $this->publisher_info = new PublisherInfo(); - if ($this->publisher_info->parse($result)) { - $this->adboxes_client->post_ads($this->publisher_info); - $this->messages[] = sprintf(__('Adbox information redownloaded.', 'plugin-wonderful'), (int)$_POST['memberid']); - } else { - $this->messages[] = __("Unable to parse publisher data from Project Wonderful.", 'plugin-wonderful'); - $this->publisher_info = false; - } - } else { - $this->messages[] = __("Unable to read publisher data from Project Wonderful.", 'plugin-wonderful'); - $this->publisher_info = false; - } - } - } - - function handle_action_change_memberid() { - if (trim($_POST['memberid'])) { - if (trim($_POST['memberid']) === (string)(int)$_POST['memberid']) { - if (($result = file_get_contents(sprintf(PLUGIN_WONDERFUL_XML_URL, (int)$_POST['memberid']))) !== false) { - $this->publisher_info = new PublisherInfo(); - if ($this->publisher_info->parse($result)) { - update_option('plugin-wonderful-memberid', (int)$_POST['memberid']); - $this->adboxes_client->post_ads($this->publisher_info); - $this->messages[] = sprintf(__('Member number changed to %s and adbox information redownloaded.', 'plugin-wonderful'), (int)$_POST['memberid']); - } else { - $this->messages[] = __("Unable to parse publisher data from Project Wonderful.", 'plugin-wonderful'); - update_option('plugin-wonderful-memberid', ""); - $this->publisher_info = false; - } - } else { - $this->messages[] = __("Unable to read publisher data from Project Wonderful.", 'plugin-wonderful'); - update_option('plugin-wonderful-memberid', ""); - $this->publisher_info = false; - } - } else { - $this->messages[] = __("Member numbers need to be numeric.", 'plugin-wonderful'); - update_option('plugin-wonderful-memberid', ""); - $this->publisher_info = false; - } - } else { - $this->messages[] = __("Existing adbox information removed.", 'plugin-wonderful'); - update_option('plugin-wonderful-memberid', ""); - - $this->publisher_info = false; - } - - foreach (array('use-standardcode', 'enable-body-copy-embedding') as $field) { - update_option("plugin-wonderful-${field}", isset($_POST[$field]) ? "1" : "0"); - } - } -} - $plugin_wonderful = new PluginWonderful(); add_action('admin_menu', array($plugin_wonderful, 'set_up_menu')); -add_action('init', array($plugin_wonderful, 'set_up_widgets')); +add_action('init', array($plugin_wonderful, 'init')); add_filter('the_excerpt_rss', array($plugin_wonderful, 'insert_rss_feed_ads')); add_filter('the_content', array($plugin_wonderful, 'inject_ads_into_body_copy')); register_activation_hook(__FILE__, array($plugin_wonderful, 'handle_activation')); -function the_project_wonderful_ad($adboxid) { - global $plugin_wonderful; - - $plugin_wonderful->render_widget(array(), $adboxid); -} - -?> +?> \ No newline at end of file diff --git a/test/PluginWonderfulTest.php b/test/PluginWonderfulTest.php new file mode 100644 index 0000000..f1c984e --- /dev/null +++ b/test/PluginWonderfulTest.php @@ -0,0 +1,44 @@ +pw = new PluginWonderful(); + $_POST = array(); + } + + function testSaveWidgetsIsCalled() { + _set_valid_nonce("plugin-wonderful", "12345"); + $_POST['pw']['_nonce'] = "12345"; + + $pw = $this->getMock('PluginWonderful', array('handle_action_save_widgets')); + $pw->expects($this->once())->method("handle_action_save_widgets"); + $pw->handle_action(); + } + + function testRenderWidgetControl() { + _set_valid_nonce("plugin-wonderful", "12345"); + + $this->pw->publisher_info->adboxes = array( + (object)array('adboxid' => '123', + 'center_widget' => 0) + ); + + ob_start(); + $this->pw->render_widget_control('123'); + $source = ob_get_clean(); + + $this->assertTrue(($xml = _to_xml($source)) !== false); + + foreach (array( + '//input[@name="pw[_nonce]" and @value="12345"]' => true + ) as $xpath => $value) { + $this->assertTrue(_xpath_test($xml, $xpath, $value), $xpath); + } + } +} + +?> \ No newline at end of file