From 8ad3163afcec68920b07563e7fe605ffe7b9be4c Mon Sep 17 00:00:00 2001 From: John Bintz <john@coswellproductions.com> Date: Tue, 30 Jun 2009 22:50:55 -0400 Subject: [PATCH] pre 2.8 widget work --- classes/PluginWonderful.php | 101 ++++++++++++-- classes/PluginWonderfulWidget.php | 33 +---- plugin-wonderful.php | 6 +- test/PluginWonderfulTest.php | 131 ++++++++++++++++-- test/PluginWonderfulWidgetTest.php | 24 +--- .../adbox-information.inc | 2 +- .../memberid-settings.inc | 2 +- 7 files changed, 218 insertions(+), 81 deletions(-) diff --git a/classes/PluginWonderful.php b/classes/PluginWonderful.php index cb62ced..47f506c 100644 --- a/classes/PluginWonderful.php +++ b/classes/PluginWonderful.php @@ -25,13 +25,20 @@ class PluginWonderful { * Initialize the object if it isn't already. */ function init() { + global $wp_version; + if (empty($this->adboxes_client)) { $this->messages = array(); $this->adboxes_client = new PWAdboxesClient(); $this->_get_publisher_info(); $this->_update_database_version(); - + + if ($wp_version < 2.8) { + register_sidebar_widget(__('Plugin Wonderful', 'plugin-wonderful'), array($this, 'render_pre28_widget')); + register_widget_control(__('Plugin Wonderful', 'plugin-wonderful'), array($this, 'render_pre28_widget_control')); + } + if (!empty($_POST)) { $this->handle_action(); } } } @@ -120,7 +127,7 @@ class PluginWonderful { } function plugin_wonderful_main() { - $this->get_view(__FUNCTION__); + $this->show_view(new PluginWonderfulViewMain()); } function show_messages() { @@ -131,16 +138,8 @@ class PluginWonderful { } } - function _create_target($name, $source) { - return dirname(__FILE__) . "/../{$source}/{$name}.php"; - } - - function _include($target) { include($target); } - function _file_exists($target) { return @file_exists($target); } - - function get_view($function_name) { - $target = $this->_create_target(str_replace('plugin_wonderful_', '', $function_name), "views"); - if ($this->_file_exists($target)) { + function show_view($view) { + if (is_object($view) && method_exists($view, 'render')) { $info = get_plugin_data(realpath(__FILE__)); echo '<div class="wrap">'; @@ -149,7 +148,7 @@ class PluginWonderful { $this->show_messages(); - $this->_include($target); + $view->render(); echo '<div style="margin-top: 20px; border-top: solid #E3E3E3 1px; overflow: hidden">'; echo '<form style="float: right; display: inline" action="https://www.paypal.com/cgi-bin/webscr" method="post"><input type="hidden" name="cmd" value="_s-xclick"><input type="hidden" name="hosted_button_id" value="3215507"><input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif" border="0" name="submit" alt=""><img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1"></form>'; @@ -159,14 +158,14 @@ class PluginWonderful { echo '</div>'; echo '</div>'; } else { - echo __("View not found: ", 'plugin-wonderful') . str_replace('plugin_wonderful_', '', $function_name); + var_dump($view); } } function handle_action() { if (!empty($_POST['_pw_nonce'])) { if (wp_verify_nonce($_POST['_pw_nonce'], 'plugin-wonderful')) { - $action = "handle_action_" . str_replace("-", "_", preg_replace('#[^a-z\-]#', '', strtolower($_POST['action']))); + $action = "handle_action_" . str_replace("-", "_", preg_replace('#[^a-z\-]#', '', strtolower($_POST['_pw_action']))); if (method_exists($this, $action)) { call_user_func(array($this, $action)); } } } @@ -329,6 +328,78 @@ class PluginWonderful { } } } + + function _render_adbox_admin($instance, $field_names) { + if ($this->publisher_info !== false) { + echo '<p>'; + echo 'Select an adbox:<br />'; + foreach ($this->publisher_info->adboxes as $box) { + echo '<label>'; + echo '<input type="radio" name="' + . $field_names['adboxid'] + . '" value="' + . $box->adboxid + . '" ' + . (($instance['adboxid'] == $box->adboxid) ? 'checked="checked"' : "") + . ' />'; + echo $box->adtype . " " . $box->dimensions . " (" . $box->adboxid . ")"; + echo "</label>"; + echo "<br />"; + } + echo '</p>'; + + echo '<p>'; + echo '<label>'; + echo '<input type="checkbox" value="1" name="' . $field_names['center'] . '" ' . (($instance['center'] == 1) ? 'checked="checked"' : "") . ' /> '; + echo 'Wrap ad in <center> tags'; + echo '</label>'; + echo '</p>'; + } + } + + function render_pre28_widget() { + $data = get_option('plugin-wonderful-pre28-widget-info'); + if (is_array($data)) { + if (count(array_intersect(array_keys($data), array("adboxid", "center"))) == 2) { + if ($this->publisher_info !== false) { + foreach ($this->publisher_info->adboxes as $adbox) { + if ($adbox->adboxid == $data['adboxid']) { + $this->_render_adbox($data['adboxid'], !empty($data['center'])); + } + } + } + } + } + } + + function _normalize_pre28_option() { + $instance = array( + 'adboxid' => false, + 'center' => 0 + ); + + $data = get_option('plugin-wonderful-pre28-widget-info'); + if (is_array($data)) { + foreach ($data as $field => $value) { + if (isset($instance[$field])) { + if (is_numeric($value)) { + $instance[$field] = $value; + } + } + } + } + + update_option('plugin-wonderful-pre28-widget-info', $instance); + return $instance; + } + + function render_pre28_widget_control() { + $instance = $this->_normalize_pre28_option(); + + echo '<input type="hidden" name="_pw_nonce" value="' . wp_create_nonce('plugin-wonderful') . '" />'; + echo '<input type="hidden" name="_pw_action" value="update-pre28-widget" />'; + $this->_render_adbox_admin($instance, array('adboxid' => 'pw[adboxid]', 'center' => 'pw[center]')); + } } function the_project_wonderful_ad($adboxid) { diff --git a/classes/PluginWonderfulWidget.php b/classes/PluginWonderfulWidget.php index 60bb1d7..e9ceded 100644 --- a/classes/PluginWonderfulWidget.php +++ b/classes/PluginWonderfulWidget.php @@ -22,32 +22,13 @@ if (class_exists('WP_Widget')) { function form($instance) { global $plugin_wonderful; - - if ($plugin_wonderful->publisher_info !== false) { - echo '<p>'; - echo 'Select an adbox:<br />'; - foreach ($plugin_wonderful->publisher_info->adboxes as $box) { - echo '<label>'; - echo '<input type="radio" name="' - . $this->get_field_name('adboxid') - . '" value="' - . $box->adboxid - . '" ' - . (($instance['adboxid'] == $box->adboxid) ? 'checked="checked"' : "") - . ' />'; - echo $box->adtype . " " . $box->dimensions . " (" . $box->adboxid . ")"; - echo "</label>"; - echo "<br />"; - } - echo '</p>'; - - echo '<p>'; - echo '<label>'; - echo '<input type="checkbox" value="1" name="' . $this->get_field_name('center') . '" ' . (($instance['center'] == 1) ? 'checked="checked"' : "") . ' /> '; - echo 'Wrap ad in <center> tags'; - echo '</label>'; - echo '</p>'; - } + $plugin_wonderful->_render_adbox_admin( + $instance, + array( + 'adboxid' => $this->get_field_name('adboxid'), + 'center' => $this->get_field_name('center') + ) + ); } function update($new_instance, $old_instance) { diff --git a/plugin-wonderful.php b/plugin-wonderful.php index 8fdd19f..e02b7a2 100644 --- a/plugin-wonderful.php +++ b/plugin-wonderful.php @@ -26,7 +26,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ foreach (glob(dirname(__FILE__) . '/classes/*.php') as $file) { require_once($file); } -// require_once('FirePHPCore/fb.php'); +foreach (glob(dirname(__FILE__) . '/views/*.php') as $file) { require_once($file); } define('PLUGIN_WONDERFUL_XML_URL', 'http://www.projectwonderful.com/xmlpublisherdata.php?publisher=%d'); define('PLUGIN_WONDERFUL_UPDATE_TIME', 60 * 60 * 12); // every 12 hours @@ -43,7 +43,9 @@ add_action('admin_menu', array($plugin_wonderful, 'set_up_menu')); 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')); -add_action('widgets_init', '__plugin_wonderful_load_widgets'); +if ($wp_version >= 2.8) { + add_action('widgets_init', '__plugin_wonderful_load_widgets'); +} register_activation_hook(__FILE__, array($plugin_wonderful, 'handle_activation')); diff --git a/test/PluginWonderfulTest.php b/test/PluginWonderfulTest.php index 6dd5226..0474ea4 100644 --- a/test/PluginWonderfulTest.php +++ b/test/PluginWonderfulTest.php @@ -182,17 +182,18 @@ class PluginWonderfulTest extends PHPUnit_Framework_TestCase { $this->assertEquals($expected_body, $this->pw->inject_ads_into_body_copy("body")); } - function providerTestGetView() { + function providerTestShowView() { return array( - array("**bad**", false), - array("**good**", true), + array(null, false), + array((object)array(), false), + array($this->getMock('Test', array('render')), true) ); } /** - * @dataProvider providerTestGetView + * @dataProvider providerTestShowView */ - function testGetView($function_extension, $file_exists) { + function testShowView($class, $is_success) { global $wp_test_expectations; $wp_test_expectations['plugin_data'][realpath(dirname(__FILE__) . '/../classes/PluginWonderful.php')] = array( 'Title' => '**title**', @@ -200,17 +201,11 @@ class PluginWonderfulTest extends PHPUnit_Framework_TestCase { 'Author' => '**author**' ); - $pw = $this->getMock('PluginWonderful', array('_create_target', '_include', '_file_exists')); - - $pw->expects($this->once())->method("_file_exists")->will($this->returnValue($file_exists)); - ob_start(); - $pw->get_view("plugin_wonderful_" . $function_extension); + $this->pw->show_view($class); $source = ob_get_clean(); - - $this->assertEquals($file_exists, strpos($source, $function_extension) === false); - - if ($file_exists) { + + if ($is_success) { foreach (array("title", "version", "author") as $name) { $this->assertTrue(strpos($source, "**${name}**") !== false); } @@ -233,7 +228,7 @@ class PluginWonderfulTest extends PHPUnit_Framework_TestCase { _set_valid_nonce('plugin-wonderful', $has_verify_nonce ? '12345' : '54321'); $pw = $this->getMock('PluginWonderful', $method_exists ? array('handle_action_test') : array('handle_action_invalid')); - $_POST['action'] = 'test'; + $_POST['_pw_action'] = 'test'; if ($method_exists) { $pw->expects($this->once())->method('handle_action_test'); @@ -459,6 +454,112 @@ class PluginWonderfulTest extends PHPUnit_Framework_TestCase { $this->pw->_render_adbox($requested_adboxid, $center_widget); $this->assertEquals($expected_result, ob_get_clean()); } + + function testRenderAdboxAdmin() { + $this->pw->publisher_info->adboxes = array( + (object)array('adboxid' => '123'), + (object)array('adboxid' => '234'), + (object)array('adboxid' => '345'), + ); + + ob_start(); + $this->pw->_render_adbox_admin(array('adboxid' => '123', 'center' => 1), array('adboxid' => 'adname', 'center' => 'centername')); + $source = ob_get_clean(); + + $this->assertTrue(($xml = _to_xml($source)) !== false); + + foreach (array( + '//input[@type="radio" and @name="adname" and @value="123" and @checked="checked"]' => true, + '//input[@type="radio" and @name="adname" and @value="234" and not(@checked="checked")]' => true, + '//input[@type="radio" and @name="adname" and @value="345" and not(@checked="checked")]' => true, + '//input[@type="checkbox" and @name="centername" and @value="1" and @checked="checked"]' => true + ) as $xpath => $value) { + $this->assertTrue(_xpath_test($xml, $xpath, $value), $xpath); + } + } + + function providerTestRenderPre28Widget() { + return array( + array(false, false), + array(array('blah' => 'yadda'), false), + array(array('adboxid' => '1', 'center' => 1), false), + array(array('adboxid' => '123', 'center' => 1), true) + ); + } + + /** + * @dataProvider providerTestRenderPre28Widget + */ + function testRenderPre28Widget($option_value, $success) { + update_option('plugin-wonderful-pre28-widget-info', $option_value); + + $this->pw->publisher_info->adboxes = array( + (object)array('adboxid' => '123'), + ); + + ob_start(); + $this->pw->render_pre28_widget(); + $source = ob_get_clean(); + + $this->assertEquals($success, !empty($source)); + } + + function testRenderPre28WidgetControl() { + update_option('plugin-wonderful-pre28-widget-info', array('adboxid' => 123, 'center' => 1)); + + $this->pw->publisher_info->adboxes = array( + (object)array('adboxid' => '123'), + ); + + ob_start(); + $this->pw->render_pre28_widget_control(); + $source = ob_get_clean(); + + $this->assertTrue(($xml = _to_xml($source)) !== false); + + foreach (array( + '//input[@name="_pw_nonce"]' => true, + '//input[@name="pw[adboxid]"]' => true, + '//input[@name="pw[center]"]' => true, + ) as $xpath => $value) { + $this->assertTrue(_xpath_test($xml, $xpath, $value), $xpath); + } + } + + function providerTestNormalizePre28Option() { + return array( + array( + false, + array('adboxid' => false, 'center' => 0) + ), + array( + array(), + array('adboxid' => false, 'center' => 0) + ), + array( + array('adboxid' => 'meow'), + array('adboxid' => false, 'center' => 0) + ), + array( + array('adboxid' => '123'), + array('adboxid' => '123', 'center' => 0) + ), + ); + } + + /** + * @dataProvider providerTestNormalizePre28Option + */ + function testNormalizePre28Option($option_value, $expected_result) { + update_option('plugin-wonderful-pre28-widget-info', $option_value); + + $this->assertEquals($expected_result, $this->pw->_normalize_pre28_option()); + $this->assertEquals($expected_result, get_option('plugin-wonderful-pre28-widget-info')); + } + + function testHandlePre28WidgetUpdate() { + $this->markTestIncomplete(); + } } ?> diff --git a/test/PluginWonderfulWidgetTest.php b/test/PluginWonderfulWidgetTest.php index d3e3896..a26a0ab 100644 --- a/test/PluginWonderfulWidgetTest.php +++ b/test/PluginWonderfulWidgetTest.php @@ -27,28 +27,10 @@ class PluginWonderfulWidgetTest extends PHPUnit_Framework_TestCase { function testRenderWidgetControl() { global $plugin_wonderful; - $plugin_wonderful = $this->getMock('PluginWonderful'); + $plugin_wonderful = $this->getMock('PluginWonderful', array('_render_adbox_admin')); + $plugin_wonderful->expects($this->once())->method('_render_adbox_admin'); - $plugin_wonderful->publisher_info->adboxes = array( - (object)array('adboxid' => '123'), - (object)array('adboxid' => '234'), - (object)array('adboxid' => '345'), - ); - - ob_start(); - $this->w->form(array('adboxid' => '123', 'center' => 1)); - $source = ob_get_clean(); - - $this->assertTrue(($xml = _to_xml($source)) !== false); - - foreach (array( - '//input[@type="radio" and @name="' . $this->w->get_field_name('adboxid') . '" and @value="123" and @checked="checked"]' => true, - '//input[@type="radio" and @name="' . $this->w->get_field_name('adboxid') . '" and @value="234" and not(@checked="checked")]' => true, - '//input[@type="radio" and @name="' . $this->w->get_field_name('adboxid') . '" and @value="345" and not(@checked="checked")]' => true, - '//input[@type="checkbox" and @name="' . $this->w->get_field_name('center') . '" and @value="1" and @checked="checked"]' => true - ) as $xpath => $value) { - $this->assertTrue(_xpath_test($xml, $xpath, $value), $xpath); - } + $this->w->form(array()); } function testUpdateWidget() { diff --git a/views/PluginWonderfulViewMain/adbox-information.inc b/views/PluginWonderfulViewMain/adbox-information.inc index 72393c8..8573d6a 100644 --- a/views/PluginWonderfulViewMain/adbox-information.inc +++ b/views/PluginWonderfulViewMain/adbox-information.inc @@ -3,7 +3,7 @@ <h3><?php _e('Adbox Information', 'plugin-wonderful') ?></h3> <form action="" method="post"> <input type="hidden" name="_pw_nonce" value="<?php echo $this->_pw_nonce ?>" /> - <input type="hidden" name="action" value="change-adbox-settings" /> + <input type="hidden" name="_pw_action" value="change-adbox-settings" /> <table class="widefat post fixed"> <tr> <th width="12%" class="manage-column"><?php _e('Site Name', 'plugin-wonderful') ?></th> diff --git a/views/PluginWonderfulViewMain/memberid-settings.inc b/views/PluginWonderfulViewMain/memberid-settings.inc index 02f09f0..e2c2f15 100644 --- a/views/PluginWonderfulViewMain/memberid-settings.inc +++ b/views/PluginWonderfulViewMain/memberid-settings.inc @@ -1,7 +1,7 @@ <?php if (is_admin()) { ?> <form id="pw-handler" action="" method="post"> <input type="hidden" name="_pw_nonce" value="<?php echo $this->_pw_nonce ?>" /> - <input type="hidden" name="action" value="change-memberid" /> + <input type="hidden" name="_pw_action" value="change-memberid" /> <table class="form-table"> <tr> <th scope="row"><?php _e('Your member number', 'plugin-wonderful') ?></th>