PluginProbe
FeedWordPress / 2011.0211.2
FeedWordPress v2011.0211.2
trunk 0.8 0.9 0.91 0.95 0.96 0.97 0.98 0.981 0.99 0.991 0.992 0.993 2008.1030 2008.1101 2008.1105 2008.1214 2009.0612 2009.0613 2009.0618 2009.0707 2009.1111 2009.1112 2010.0127 2010.0528 All 65 releases
← All changes | admin-ui.php +849 -432 2009.11122011.0211.2 View file →
@@ -1,11 +1,14 @@
1 1 <?php
2 2 class FeedWordPressAdminPage {
3 3 var $context;
4 4 var $updated = false;
5 + var $mesg = NULL;
6 +
5 7 var $link = NULL;
6 8 var $dispatch = NULL;
7 9 var $filename = NULL;
10 + var $pagenames = array();
8 11
9 12 /**
10 13 * Construct the admin page object.
11 14 *
@@ -20,11 +23,133 @@
20 23 $this->context .= 'forfeed';
21 24 endif;
22 25 } /* FeedWordPressAdminPage constructor */
23 26
27 + function pageslug () {
28 + $slug = preg_replace('/FeedWordPress(.*)Page/', '$1', get_class($this));
29 + return strtolower($slug);
30 + }
31 +
32 + function pagename ($context = NULL) {
33 + if (is_null($context)) :
34 + $context = 'default';
35 + endif;
36 +
37 + if (isset($this->pagenames[$context])) :
38 + $name = $this->pagenames[$context];
39 + elseif (isset($tis->pagenames['default'])) :
40 + $name = $this->pagenames['default'];
41 + else :
42 + $name = $this->pageslug();
43 + endif;
44 + return __($name);
45 + } /* FeedWordPressAdminPage::pagename () */
46 +
47 + function accept_POST ($post) {
48 + if ($this->for_feed_settings() and $this->update_requested_in($post)) :
49 + $this->update_feed();
50 + elseif ($this->save_requested_in($post)) : // User mashed Save Changes
51 + $this->save_settings($post);
52 + endif;
53 + do_action($this->dispatch.'_post', &$post, &$this);
54 + }
55 +
56 + function update_feed () {
57 + global $feedwordpress;
58 +
59 + add_action('feedwordpress_check_feed', 'update_feeds_mention');
60 + add_action('feedwordpress_check_feed_complete', 'update_feeds_finish', 10, 3);
61 +
62 + print '<div class="updated">';
63 + print "<ul>";
64 + $uri = $this->link->uri();
65 + $delta = $feedwordpress->update($uri);
66 + print "</ul>";
67 +
68 + if (!is_null($delta)) :
69 + $mesg = array();
70 + if (isset($delta['new'])) : $mesg[] = ' '.$delta['new'].' new posts were syndicated'; endif;
71 + if (isset($delta['updated'])) : $mesg[] = ' '.$delta['updated'].' existing posts were updated'; endif;
72 + echo "<p><strong>Update complete.</strong>".implode(' and', $mesg)."</p>";
73 + echo "\n"; flush();
74 + else :
75 + $uri = esc_html($uri);
76 + echo "<p><strong>Error:</strong> There was a problem updating <a href=\"$uri\">$uri</a></p>\n";
77 + endif;
78 + print "</div>\n";
79 + remove_action('feedwordpress_check_feed', 'update_feeds_mention');
80 + remove_action('feedwordpress_check_feed_complete', 'update_feeds_finish', 10, 3);
81 + }
82 +
83 + function save_settings ($post) {
84 + do_action($this->dispatch.'_save', &$post, &$this);
85 +
86 + if ($this->for_feed_settings()) :
87 + // Save settings
88 + $this->link->save_settings(/*reload=*/ true);
89 + $this->updated = true;
90 +
91 + // Reset, reload
92 + $link_id = $this->link->id;
93 + unset($this->link);
94 + $this->link = new SyndicatedLink($link_id);
95 + else :
96 + $this->updated = true;
97 + endif;
98 + } /* FeedWordPressAdminPage::save_settings () */
99 +
24 100 function for_feed_settings () { return (is_object($this->link) and method_exists($this->link, 'found') and $this->link->found()); }
25 101 function for_default_settings () { return !$this->for_feed_settings(); }
26 102
103 + function setting ($names, $fallback_value = NULL, $params = array()) {
104 + if (!is_array($params)) :
105 + $params = array('default' => $params);
106 + endif;
107 + $params = shortcode_atts(array(
108 + 'default' => 'default',
109 + 'fallback' => true,
110 + ), $params);
111 +
112 + if (is_string($names)) :
113 + $feed_name = $names;
114 + $global_name = 'feedwordpress_'.preg_replace('![\s/]+!', '_', $names);
115 + else :
116 + $feed_name = $names['feed'];
117 + $global_name = 'feedwordpress_'.$names['global'];
118 + endif;
119 +
120 + if ($this->for_feed_settings()) : // Check feed-specific setting first; fall back to global
121 + if (!$params['fallback']) : $global_name = NULL; endif;
122 + $ret = $this->link->setting($feed_name, $global_name, $fallback_value, $params['default']);
123 + else : // Check global setting
124 + $ret = get_option($global_name, $fallback_value);
125 + endif;
126 + return $ret;
127 + }
128 +
129 + function update_setting ($names, $value, $default = 'default') {
130 + if (is_string($names)) :
131 + $feed_name = $names;
132 + $global_name = 'feedwordpress_'.preg_replace('![\s/]+!', '_', $names);
133 + else :
134 + $feed_name = $names['feed'];
135 + $global_name = 'feedwordpress_'.$names['global'];
136 + endif;
137 +
138 + if ($this->for_feed_settings()) : // Update feed-specific setting
139 + $this->link->update_setting($feed_name, $value, $default);
140 + else : // Update global setting
141 + update_option($global_name, $value);
142 + endif;
143 + } /* FeedWordPressAdminPage::update_setting () */
144 +
145 + function save_requested_in ($post) {
146 + return (isset($post['save']) or isset($post['submit']));
147 + }
148 + function update_requested_in ($post) {
149 + return (isset($post['update']) and (strlen($post['update']) > 0));
150 + }
151 +
27 152 /*static*/ function submitted_link_id () {
28 153 global $fwp_post;
29 154
30 155 // Presume global unless we get a specific link ID
@@ -51,9 +176,9 @@
51 176
52 177 /*static*/ function submitted_link () {
53 178 $link_id = FeedWordPressAdminPage::submitted_link_id();
54 179 if (is_numeric($link_id) and $link_id) :
55 - $link =& new SyndicatedLink($link_id);
180 + $link = new SyndicatedLink($link_id);
56 181 else :
57 182 $link = NULL;
58 183 endif;
59 184 return $link;
@@ -61,9 +186,9 @@
61 186
62 187 function stamp_link_id ($field = null) {
63 188 if (is_null($field)) : $field = 'save_link_id'; endif;
64 189 ?>
65 - <input type="hidden" name="<?php print wp_specialchars($field, 'both'); ?>" value="<?php print ($this->for_feed_settings() ? $this->link->id : '*'); ?>" />
190 + <input type="hidden" name="<?php print esc_html($field); ?>" value="<?php print ($this->for_feed_settings() ? $this->link->id : '*'); ?>" />
66 191 <?php
67 192 } /* FeedWordPressAdminPage::stamp_link_id () */
68 193
69 194 function these_posts_phrase () {
@@ -98,121 +223,152 @@
98 223 } /* FeedWordPressAdminPage::fix_toggles() */
99 224
100 225 function ajax_interface_js () {
101 226 ?>
102 -<script type="text/javascript">
103 227 function contextual_appearance (item, appear, disappear, value, visibleStyle, checkbox) {
104 228 if (typeof(visibleStyle)=='undefined') visibleStyle = 'block';
105 229
106 230 var rollup=document.getElementById(item);
107 - var newuser=document.getElementById(appear);
108 - var sitewide=document.getElementById(disappear);
109 231 if (rollup) {
110 232 if ((checkbox && rollup.checked) || (!checkbox && value==rollup.value)) {
111 - if (newuser) newuser.style.display=visibleStyle;
112 - if (sitewide) sitewide.style.display='none';
233 + jQuery('#'+disappear).hide();
234 + jQuery('#'+appear).show(600);
113 235 } else {
114 - if (newuser) newuser.style.display='none';
115 - if (sitewide) sitewide.style.display=visibleStyle;
236 + jQuery('#'+appear).hide();
237 + jQuery('#'+disappear).show(600);
116 238 }
117 239 }
118 240 }
119 -</script>
120 -
121 241 <?php
122 242 } /* FeedWordPressAdminPage::ajax_interface_js () */
123 243
244 + function display_feed_settings_page_links ($params = array()) {
245 + global $fwp_path;
246 +
247 + $params = wp_parse_args($params, array(
248 + 'before' => '',
249 + 'between' => ' | ',
250 + 'after' => '',
251 + 'long' => false,
252 + 'subscription' => $this->link,
253 + ));
254 + $sub = $params['subscription'];
255 +
256 + $links = array(
257 + "Feed" => array('page' => 'feeds-page.php', 'long' => 'Feeds & Updates'),
258 + "Posts" => array('page' => 'posts-page.php', 'long' => 'Posts & Links'),
259 + "Authors" => array('page' => 'authors-page.php', 'long' => 'Authors'),
260 + 'Categories' => array('page' => 'categories-page.php', 'long' => 'Categories'.FEEDWORDPRESS_AND_TAGS),
261 + );
262 +
263 + $hrefPrefix = 'admin.php?';
264 +
265 + $link_id = NULL;
266 + if (is_object($sub)) :
267 + if (method_exists($sub, 'found')) :
268 + if ($sub->found()) :
269 + $link_id = $sub->link->link_id;
270 + endif;
271 + else :
272 + $link_id = $sub->link_id;
273 + endif;
274 + endif;
275 +
276 + if (!is_null($link_id)) :
277 + $urlParam = "link_id={$link_id}";
278 + $hrefPrefix .= $urlParam."&";
279 + $urlSuffix = "&".$urlParam;
280 + else :
281 + $urlParam = '';
282 + endif;
283 + $hrefPrefix .= "page=${fwp_path}/";
284 +
285 + print $params['before']; $first = true;
286 + foreach ($links as $label => $link) :
287 + if (!$first) : print $params['between']; endif;
288 +
289 + if (isset($link['url'])) : $url = $link['url'].$urlSuffix;
290 + else : $url = $hrefPrefix.$link['page'];
291 + endif;
292 + $url = esc_html($url);
293 +
294 + if ($link['page']==basename($this->filename)) :
295 + print "<strong>";
296 + else :
297 + print "<a href=\"${url}\">";
298 + endif;
299 +
300 + if ($params['long']) : print esc_html(__($link['long']));
301 + else : print esc_html(__($label));
302 + endif;
303 +
304 + if ($link['page']==basename($this->filename)) :
305 + print "</strong>";
306 + else :
307 + print "</a>";
308 + endif;
309 +
310 + $first = false;
311 + endforeach;
312 + print $params['after'];
313 + } /* FeedWordPressAdminPage::display_feed_settings_page_links */
314 +
124 315 function display_feed_select_dropdown() {
125 316 $links = FeedWordPress::syndicated_links();
126 - if (fwp_test_wp_version(FWP_SCHEMA_27)) :
127 - ?>
128 - <style type="text/css">
129 - #post-search {
130 - float: right;
131 - margin:11px 12px 0;
132 - min-width: 130px;
133 - position:relative;
134 - }
135 - .fwpfs {
136 - color: #dddddd;
137 - background:#797979 url(<?php bloginfo('home') ?>/wp-admin/images/fav.png) repeat-x scroll left center;
138 - border-color:#777777 #777777 #666666 !important; -moz-border-radius-bottomleft:12px;
139 - -moz-border-radius-bottomright:12px;
140 - -moz-border-radius-topleft:12px;
141 - -moz-border-radius-topright:12px;
142 - border-style:solid;
143 - border-width:1px;
144 - line-height:15px;
145 - padding:3px 30px 4px 12px;
146 - }
147 - .fwpfs.slide-down {
148 - border-bottom-color: #626262;
149 - -moz-border-radius-bottomleft:0;
150 - -moz-border-radius-bottomright:0;
151 - -moz-border-radius-topleft:12px;
152 - -moz-border-radius-topright:12px;
153 - background-image:url(<?php bloginfo('home') ?>/wp-admin/images/fav-top.png);
154 - background-position:0 top;
155 - background-repeat:repeat-x;
156 - border-bottom-style:solid;
157 - border-bottom-width:1px;
158 - }
159 - </style>
160 -
161 - <script type="text/javascript">
162 - jQuery(document).ready(function($){
163 - $('.fwpfs').toggle(
164 - function(){$('.fwpfs').removeClass('slideUp').addClass('slideDown'); setTimeout(function(){if ( $('.fwpfs').hasClass('slideDown') ) { $('.fwpfs').addClass('slide-down'); }}, 10) },
165 - function(){$('.fwpfs').removeClass('slideDown').addClass('slideUp'); setTimeout(function(){if ( $('.fwpfs').hasClass('slideUp') ) { $('.fwpfs').removeClass('slide-down'); }}, 10) }
166 - );
167 - $('.fwpfs').bind(
168 - 'change',
169 - function () { this.form.submit(); }
170 - );
171 - $('#post-search .button').css( 'display', 'none' );
172 - });
173 - </script>
174 - <?php
175 - endif;
176 317
177 318 ?>
178 - <p id="post-search">
179 - <select name="link_id" class="fwpfs" style="max-width: 20.0em;">
319 + <div id="fwpfs-container"><ul class="subsubsub">
320 + <li><select name="link_id" class="fwpfs" style="max-width: 20.0em;">
180 321 <option value="*"<?php if ($this->for_default_settings()) : ?> selected="selected"<?php endif; ?>>- defaults for all feeds -</option>
181 322 <?php if ($links) : foreach ($links as $ddlink) : ?>
182 - <option value="<?php print (int) $ddlink->link_id; ?>"<?php if (!is_null($this->link) and ($this->link->id==$ddlink->link_id)) : ?> selected="selected"<?php endif; ?>><?php print wp_specialchars($ddlink->link_name, 1); ?></option>
323 + <option value="<?php print (int) $ddlink->link_id; ?>"<?php if (!is_null($this->link) and ($this->link->id==$ddlink->link_id)) : ?> selected="selected"<?php endif; ?>><?php print esc_html($ddlink->link_name); ?></option>
183 324 <?php endforeach; endif; ?>
184 325 </select>
185 - <input class="button" type="submit" name="go" value="<?php _e('Go') ?> &raquo;" />
186 - </p>
326 + <input id="fwpfs-button" class="button" type="submit" name="go" value="<?php _e('Go') ?> &raquo;" /></li>
327 +
187 328 <?php
329 + $this->display_feed_settings_page_links(array(
330 + 'before' => '<li>',
331 + 'between' => "</li>\n<li>",
332 + 'after' => '</li>',
333 + 'subscription' => $this->link,
334 + ));
335 +
336 + if ($this->for_feed_settings()) :
337 + ?>
338 + <li><input class="button" type="submit" name="update" value="Update Now" /></li>
339 + <?php
340 + endif;
341 + ?>
342 + </ul>
343 + </div>
344 + <?php
188 345 } /* FeedWordPressAdminPage::display_feed_select_dropdown() */
189 346
190 347 function display_sheet_header ($pagename = 'Syndication', $all = false) {
191 - if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_27)) :
192 - ?>
193 - <div class="icon32"><img src="<?php print wp_specialchars(WP_PLUGIN_URL.'/'.$GLOBALS['fwp_path'].'/feedwordpress.png', 1); ?>" alt="" /></div>
194 - <?php
195 - endif;
196 348 ?>
197 -
198 - <h2><?php print wp_specialchars(__($pagename.($all ? '' : ' Settings')), 1); ?><?php if ($this->for_feed_settings()) : ?>: <?php echo wp_specialchars($this->link->link->link_name, 1); ?><?php endif; ?></h2>
349 + <div class="icon32"><img src="<?php print esc_html(WP_PLUGIN_URL.'/'.$GLOBALS['fwp_path'].'/feedwordpress.png'); ?>" alt="" /></div>
350 + <h2><?php print esc_html(__($pagename.($all ? '' : ' Settings'))); ?><?php if ($this->for_feed_settings()) : ?>: <?php echo esc_html($this->link->name(/*from feed=*/ false)); ?><?php endif; ?></h2>
199 351 <?php
200 352 }
201 353
202 354 function display_update_notice_if_updated ($pagename = 'Syndication', $mesg = NULL) {
355 + if (!is_null($mesg)) :
356 + $this->mesg = $mesg;
357 + endif;
358 +
203 359 if ($this->updated) :
204 360 if ($this->updated === true) :
205 - $mesg = $pagename . ' settings updated.';
361 + $this->mesg = $pagename . ' settings updated.';
206 362 else :
207 - $mesg = $this->updated;
363 + $this->mesg = $this->updated;
208 364 endif;
209 365 endif;
210 366
211 - if (!is_null($mesg)) :
367 + if (!is_null($this->mesg)) :
212 368 ?>
213 369 <div class="updated">
214 - <p><?php print wp_specialchars($mesg, 1); ?></p>
370 + <p><?php print esc_html($this->mesg); ?></p>
215 371 </div>
216 372 <?php
217 373 endif;
218 374 } /* FeedWordPressAdminPage::display_update_notice_if_updated() */
@@ -220,9 +376,9 @@
220 376 function display_settings_scope_message () {
221 377 if ($this->for_feed_settings()) :
222 378 ?>
223 379 <p>These settings only affect posts syndicated from
224 - <strong><?php echo wp_specialchars($this->link->link->link_name, 1); ?></strong>.</p>
380 + <strong><?php echo esc_html($this->link->link->link_name); ?></strong>.</p>
225 381 <?php
226 382 else :
227 383 ?>
228 384 <p>These settings affect posts syndicated from any feed unless they are overridden
@@ -232,22 +388,99 @@
232 388 } /* FeedWordPressAdminPage::display_settings_scope_message () */
233 389
234 390 /*static*/ function has_link () { return true; }
235 391
392 + function form_action ($filename = NULL) {
393 + global $fwp_path;
394 +
395 + if (is_null($filename)) :
396 + $filename = basename($this->filename);
397 + endif;
398 + return "admin.php?page=${fwp_path}/".$filename;
399 + } /* FeedWordPressAdminPage::form_action () */
400 +
401 + function update_message () {
402 + return $this->mesg;
403 + }
404 +
405 + function display () {
406 + if (FeedWordPress::needs_upgrade()) :
407 + fwp_upgrade_page();
408 + return;
409 + endif;
410 +
411 + FeedWordPressCompatibility::validate_http_request(/*action=*/ $this->dispatch, /*capability=*/ 'manage_links');
412 +
413 + ////////////////////////////////////////////////
414 + // Process POST request, if any ////////////////
415 + ////////////////////////////////////////////////
416 + if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
417 + $this->accept_POST($GLOBALS['fwp_post']);
418 + else :
419 + $this->updated = false;
420 + endif;
421 +
422 + ////////////////////////////////////////////////
423 + // Prepare settings page ///////////////////////
424 + ////////////////////////////////////////////////
425 +
426 + $this->display_update_notice_if_updated(
427 + $this->pagename('settings-update'),
428 + $this->update_message()
429 + );
430 +
431 + $this->open_sheet($this->pagename('open-sheet'));
432 + ?>
433 + <div id="post-body">
434 + <?php
435 + foreach ($this->boxes_by_methods as $method => $row) :
436 + if (is_array($row)) :
437 + $id = $row['id'];
438 + $title = $row['title'];
439 + else :
440 + $id = 'feedwordpress_'.$method;
441 + $title = $row;
442 + endif;
443 +
444 + add_meta_box(
445 + /*id=*/ $id,
446 + /*title=*/ $title,
447 + /*callback=*/ array(&$this, $method),
448 + /*page=*/ $this->meta_box_context(),
449 + /*context=*/ $this->meta_box_context()
450 + );
451 + endforeach;
452 + do_action($this->dispatch.'_meta_boxes', $this);
453 + ?>
454 + <div class="metabox-holder">
455 + <?php
456 + fwp_do_meta_boxes($this->meta_box_context(), $this->meta_box_context(), $this);
457 + ?>
458 + </div> <!-- class="metabox-holder" -->
459 + </div> <!-- id="post-body" -->
460 + <?php $this->close_sheet(); ?>
461 + <?php
462 + }
463 +
236 464 function open_sheet ($header) {
237 465 // Set up prepatory AJAX stuff
466 + ?>
467 + <script type="text/javascript">
468 + <?php
238 469 $this->ajax_interface_js();
239 - if (function_exists('add_meta_box')) :
240 - add_action(
241 - FeedWordPressCompatibility::bottom_script_hook($this->filename),
242 - /*callback=*/ array($this, 'fix_toggles'),
243 - /*priority=*/ 10000
244 - );
245 - FeedWordPressSettingsUI::ajax_nonce_fields();
246 - endif;
470 + ?>
471 + </script>
472 +
473 + <?php
474 + add_action(
475 + FeedWordPressCompatibility::bottom_script_hook($this->filename),
476 + /*callback=*/ array($this, 'fix_toggles'),
477 + /*priority=*/ 10000
478 + );
479 + FeedWordPressSettingsUI::ajax_nonce_fields();
247 480
248 481 ?>
249 - <div class="wrap" style="position:relative">
482 + <div class="wrap feedwordpress-admin" id="feedwordpress-admin-<?php print $this->pageslug(); ?>">
250 483 <?php
251 484 if (!is_null($header)) :
252 485 $this->display_sheet_header($header);
253 486 endif;
@@ -253,9 +486,9 @@
253 486 endif;
254 487
255 488 if (!is_null($this->dispatch)) :
256 489 ?>
257 - <form action="admin.php?page=<?php print $GLOBALS['fwp_path']; ?>/<?php echo basename($this->filename); ?>" method="post">
490 + <form action="<?php print $this->form_action(); ?>" method="post">
258 491 <div><?php
259 492 FeedWordPressCompatibility::stamp_nonce($this->dispatch);
260 493 $this->stamp_link_id();
261 494 ?></div>
@@ -262,84 +495,221 @@
262 495 <?php
263 496 endif;
264 497
265 498 if ($this->has_link()) :
266 - $this->display_feed_select_dropdown();
267 499 $this->display_settings_scope_message();
268 500 endif;
269 501
270 - if (function_exists('do_meta_boxes')) :
271 - ?>
272 - <div id="poststuff">
273 - <?php
274 - else :
275 - ?>
276 - </div> <!-- class="wrap" -->
277 - <?php
502 + ?><div class="tablenav"><?php
503 + if (!is_null($this->dispatch)) :
504 + ?><div class="alignright"><?php
505 + $this->save_button();
506 + ?></div><?php
278 507 endif;
279 508
280 - if (!is_null($this->dispatch)) :
281 - fwp_settings_form_single_submit();
509 + if ($this->has_link()) :
510 + $this->display_feed_select_dropdown();
282 511 endif;
512 + ?>
513 + </div>
514 +
515 + <div id="poststuff">
516 + <?php
283 517 } /* FeedWordPressAdminPage::open_sheet () */
284 518
285 519 function close_sheet () {
286 - // WordPress 2.5+
287 - if (function_exists('do_meta_boxes')) :
288 - ?>
289 - </div> <!-- id="poststuff" -->
290 - <?php if (!is_null($this->dispatch)) : ?>
291 - <?php fwp_settings_form_single_submit_closer(); ?>
292 - </form>
293 - <?php endif; ?>
294 - </div> <!-- class="wrap" -->
295 - <?php
520 + ?>
521 +
522 + </div> <!-- id="poststuff" -->
523 + <?php
524 + if (!is_null($this->dispatch)) :
525 + $this->save_button();
526 + print "</form>\n";
296 527 endif;
297 - }
298 -} /* class FeedWordPressAdminPage */
528 + ?>
529 + </div> <!-- class="wrap" -->
530 +
531 + <?php
532 + } /* FeedWordPressAdminPage::close_sheet () */
533 +
534 + function setting_radio_control ($localName, $globalName, $options, $params = array()) {
535 + global $fwp_path;
536 +
537 + if (isset($params['filename'])) : $filename = $params['filename'];
538 + else : $filename = basename($this->filename);
539 + endif;
540 +
541 + if (isset($params['site-wide-url'])) : $href = $params['site-wide-url'];
542 + else : $href = "admin.php?page=${fwp_path}/${filename}";
543 + endif;
544 +
545 + if (isset($params['setting-default'])) : $settingDefault = $params['setting-default'];
546 + else : $settingDefault = NULL;
547 + endif;
548 +
549 + if (isset($params['global-setting-default'])) : $globalSettingDefault = $params['global-setting-default'];
550 + else : $globalSettingDefault = $settingDefault;
551 + endif;
299 552
300 -function fwp_settings_form_single_submit ($caption = NULL) {
301 - if (fwp_test_wp_version(FWP_SCHEMA_25, FWP_SCHEMA_27)) :
302 - if (is_null($caption)) : $caption = __('Save'); endif;
303 -?>
304 -<div class="submitbox" id="submitlink">
305 -<div id="previewview"></div>
306 -<div class="inside"></div>
553 + $globalSetting = get_option('feedwordpress_'.$globalName, $globalSettingDefault);
554 + if ($this->for_feed_settings()) :
555 + $setting = $this->link->setting($localName, NULL, $settingDefault);
556 + else :
557 + $setting = $globalSetting;
558 + endif;
559 +
560 + if (isset($params['offer-site-wide'])) : $offerSiteWide = $params['offer-site-wide'];
561 + else : $offerSiteWide = $this->for_feed_settings();
562 + endif;
563 +
564 + // This allows us to provide an alternative set of human-readable
565 + // labels for each potential value. For use in Currently: line.
566 + if (isset($params['labels'])) : $labels = $params['labels'];
567 + elseif (is_callable($options)) : $labels = NULL;
568 + else : $labels = $options;
569 + endif;
570 +
571 + if (isset($params['input-name'])) : $inputName = $params['input-name'];
572 + else : $inputName = $globalName;
573 + endif;
574 +
575 + if (isset($params['default-input-id'])) : $defaultInputId = $params['default-input-id'];
576 + else : $defaultInputId = NULL;
577 + endif;
307 578
308 -<p class="submit">
309 -<input type="submit" name="save" value="<?php print $caption; ?>" />
310 -</p>
311 -</div>
312 -<?php
313 - endif;
314 -}
579 + if (isset($params['default-input-id-no'])) : $defaultInputIdNo = $params['default-input-id-no'];
580 + elseif (!is_null($defaultInputId)) : $defaultInputIdNo = $defaultInputId.'-no';
581 + else : $defaultInputIdNo = NULL;
582 + endif;
583 +
584 + // This allows us to either include the site-default setting as
585 + // one of the options within the radio box, or else as a simple
586 + // yes/no toggle that controls whether or not to check another
587 + // set of inputs.
588 + if (isset($params['default-input-name'])) : $defaultInputName = $params['default-input-name'];
589 + else : $defaultInputName = $inputName;
590 + endif;
315 591
316 -function fwp_settings_form_periodic_submit ($caption = NULL) {
317 - if (!fwp_test_wp_version(FWP_SCHEMA_25)) :
318 - if (is_null($caption)) : $caption = __('Save Changes &raquo;'); endif;
319 -?>
320 -<p class="submit">
321 -<input type="submit" name="save" value="<?php print $caption; ?>" />
322 -</p>
323 -<?php
324 - endif;
325 -}
592 + if ($defaultInputName != $inputName) :
593 + $defaultInputValue = 'yes';
594 + else :
595 + $defaultInputValue = (
596 + isset($params['default-input-value'])
597 + ? $params['default-input-value']
598 + : 'site-default'
599 + );
600 + endif;
601 +
602 + $settingDefaulted = (is_null($setting) or ($settingDefault === $setting));
326 603
327 -function fwp_settings_form_single_submit_closer ($caption = NULL) {
328 - if (fwp_test_wp_version(FWP_SCHEMA_27)) :
604 + if (!is_callable($options)) :
605 + $checked = array();
606 + if ($settingDefaulted) :
607 + $checked[$defaultInputValue] = ' checked="checked"';
608 + endif;
609 +
610 + foreach ($options as $value => $label) :
611 + if ($setting == $value) :
612 + $checked[$value] = ' checked="checked"';
613 + else :
614 + $checked[$value] = '';
615 + endif;
616 + endforeach;
617 + endif;
618 +
619 + $defaulted = array();
620 + if ($defaultInputName != $inputName) :
621 + $defaulted['yes'] = ($settingDefaulted ? ' checked="checked"' : '');
622 + $defaulted['no'] = ($settingDefaulted ? '' : ' checked="checked"');
623 + else :
624 + $defaulted['yes'] = (isset($checked[$defaultInputValue]) ? $checked[$defaultInputValue] : '');
625 + endif;
626 +
627 + if (isset($params['defaulted'])) :
628 + $defaulted['yes'] = ($params['defaulted'] ? ' checked="checked"' : '');
629 + $defaulted['no'] = ($params['defaulted'] ? '' : ' checked="checked"');
630 + endif;
631 +
632 + if ($offerSiteWide) :
633 + ?>
634 + <table class="twofer">
635 + <tbody>
636 + <tr><td class="equals first inactive">
637 + <ul class="options">
638 + <li><label><input type="radio"
639 + name="<?php print $defaultInputName; ?>"
640 + value="<?php print $defaultInputValue; ?>"
641 + <?php if (!is_null($defaultInputId)) : ?>id="<?php print $defaultInputId; ?>" <?php endif; ?>
642 + <?php print $defaulted['yes']; ?> />
643 + Use the site-wide setting</label>
644 + <span class="current-setting">Currently:
645 + <strong><?php if (is_callable($labels)) :
646 + print call_user_func($labels, $globalSetting, $defaulted, $params);
647 + elseif (is_null($labels)) :
648 + print $globalSetting;
649 + else :
650 + print $labels[$globalSetting];
651 + endif; ?></strong> (<a href="<?php print $href; ?>">change</a>)</span></li>
652 + </ul></td>
653 +
654 + <td class="equals second inactive">
655 + <?php if ($defaultInputName != $inputName) : ?>
656 + <ul class="options">
657 + <li><label><input type="radio"
658 + name="<?php print $defaultInputName; ?>"
659 + value="no"
660 + <?php if (!is_null($defaultInputIdNo)) : ?>id="<?php print $defaultInputIdNo; ?>" <?php endif; ?>
661 + <?php print $defaulted['no']; ?> />
662 + <?php _e('Do something different with this feed.'); ?></label>
663 + <?php endif;
664 + endif;
665 +
666 + // Let's spit out the controls here.
667 + if (is_callable($options)) :
668 + // Method call to print out options list
669 + call_user_func($options, $setting, $defaulted, $params);
670 + else :
671 + ?>
672 + <ul class="options">
673 + <?php foreach ($options as $value => $label) : ?>
674 + <li><label><input type="radio" name="<?php print $inputName; ?>"
675 + value="<?php print $value; ?>"
676 + <?php print $checked[$value]; ?> />
677 + <?php print $label; ?></label></li>
678 + <?php endforeach; ?>
679 + </ul> <!-- class="options" -->
680 + <?php
681 + endif;
682 +
683 + if ($offerSiteWide) :
684 + if ($defaultInputName != $inputName) :
685 + // Close the <li> and <ul class="options"> we opened above
686 + ?>
687 + </li>
688 + </ul> <!-- class="options" -->
689 + <?php
690 + endif;
691 +
692 + // Close off the twofer table that we opened up above.
693 + ?>
694 + </td></tr>
695 + </tbody>
696 + </table>
697 + <?php
698 + endif;
699 + } /* FeedWordPressAdminPage::setting_radio_control () */
700 +
701 + function save_button ($caption = NULL) {
329 702 if (is_null($caption)) : $caption = __('Save Changes'); endif;
330 -?>
703 + ?>
331 704 <p class="submit">
332 705 <input class="button-primary" type="submit" name="save" value="<?php print $caption; ?>" />
333 706 </p>
334 -<?php
335 - endif;
336 -}
707 + <?php
708 + }
709 +} /* class FeedWordPressAdminPage */
337 710
338 711 function fwp_authors_single_submit ($link = NULL) {
339 - global $wp_db_version;
340 -
341 - if (fwp_test_wp_version(FWP_SCHEMA_25)) :
342 712 ?>
343 713 <div class="submitbox" id="submitlink">
344 714 <div id="previewview">
345 715 </div>
@@ -350,25 +720,16 @@
350 720 <input type="submit" name="save" value="<?php _e('Save') ?>" />
351 721 </p>
352 722 </div>
353 723 <?php
354 - endif;
355 724 }
356 725
357 726 function fwp_option_box_opener ($legend, $id, $class = "stuffbox") {
358 - // WordPress 2.5+
359 - if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_25)) :
360 727 ?>
361 728 <div id="<?php print $id; ?>" class="<?php print $class; ?>">
362 729 <h3><?php print htmlspecialchars($legend); ?></h3>
363 730 <div class="inside">
364 731 <?php
365 - else :
366 -?>
367 - <div class="wrap">
368 - <h2><?php print htmlspecialchars($legend); ?></h2>
369 -<?php
370 - endif;
371 732 }
372 733
373 734 function fwp_option_box_closer () {
374 735 global $wp_db_version;
@@ -383,101 +744,123 @@
383 744 <?php
384 745 endif;
385 746 }
386 747
387 -function fwp_tags_box ($tags, $object) {
748 +function fwp_tags_box ($tags, $object, $params = array()) {
388 749 if (!is_array($tags)) : $tags = array(); endif;
389 -
750 + $tax_name = (isset($params['taxonomy']) ? $params['taxonomy'] : 'post_tag');
390 751 $desc = "<p style=\"font-size:smaller;font-style:bold;margin:0\">Tag $object as...</p>";
391 752
392 - if (fwp_test_wp_version(FWP_SCHEMA_28)) : // WordPress 2.8+
393 -?>
394 - <?php print $desc; ?>
395 - <div class="tagsdiv" id="post_tag">
396 - <div class="jaxtag">
397 - <div class="nojs-tags hide-if-js">
398 - <p><?php _e('Add or remove tags'); ?></p>
399 - <textarea name="tax_input[post_tag]" class="the-tags" id="tax-input[post_tag]"><?php echo implode(",", $tags); ?></textarea>
400 - </div>
401 -
402 - <span class="ajaxtag hide-if-no-js">
403 - <label class="screen-reader-text" for="new-tag-post_tag"><?php _e('Tags'); ?></label>
404 - <input type="text" id="new-tag-post_tag" name="newtag[post_tag]" class="newtag form-input-tip" size="16" autocomplete="off" value="<?php esc_attr_e('Add new tag'); ?>" />
405 - <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" />
406 - </span>
407 - </div>
408 - <p class="howto"><?php echo __('Separate tags with commas.'); ?></p>
409 - <div class="tagchecklist"></div>
410 - </div>
411 - <p class="tagcloud-link hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-post_tag"><?php printf( __('Choose from the most used tags in %s'), 'Post Tags'); ?></a></p>
412 - </div>
413 - </div>
414 -<?php
753 + if (isset($params['textarea_name'])) :
754 + $textAreaName = $params['textarea_name'];
415 755 else :
416 -?>
417 - <?php print $desc; ?>
418 - <p id="jaxtag"><input type="text" name="tags_input" class="tags-input" id="tags-input" size="40" tabindex="3" value="<?php echo implode(",", $tags); ?>" /></p>
419 - <div id="tagchecklist"></div>
420 - </div>
421 - </div>
422 -<?php
756 + $textAreaName = "tax_input[$tax_name]";
423 757 endif;
758 + print $desc;
759 + $helps = __('Separate tags with commas.');
760 + $box['title'] = __('Tags');
761 + ?>
762 + <div class="tagsdiv" id="<?php echo $tax_name; ?>">
763 + <div class="jaxtag">
764 + <div class="nojs-tags hide-if-js">
765 + <p><?php _e('Add or remove tags'); ?></p>
766 + <textarea name="<?php echo esc_html($textAreaName); ?>" class="the-tags" id="tax-input[<?php echo $tax_name; ?>]"><?php echo esc_attr(implode(",", $tags)); ?></textarea></div>
767 +
768 + <div class="ajaxtag hide-if-no-js">
769 + <label class="screen-reader-text" for="new-tag-<?php echo $tax_name; ?>"><?php echo $box['title']; ?></label>
770 + <div class="taghint"><?php _e('Add new tag'); ?></div>
771 + <p>
772 + <input type="text" id="new-tag-<?php echo $tax_name; ?>" name="newtag[<?php echo $tax_name; ?>]" class="newtag form-input-tip" size="16" autocomplete="off" value="" />
773 + <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" tabindex="3" />
774 + </p>
775 + </div></div>
776 + <p class="howto"><?php echo $helps; ?></p>
777 + <div class="tagchecklist"></div>
778 + </div>
779 + <p class="hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-<?php echo $tax_name; ?>"><?php printf( __('Choose from the most used tags in %s'), $box['title'] ); ?></a></p>
780 + <?php
424 781 }
425 782
426 -function fwp_category_box ($checked, $object, $tags = array()) {
783 +function fwp_category_box ($checked, $object, $tags = array(), $params = array()) {
427 784 global $wp_db_version;
428 785
429 - if (fwp_test_wp_version(FWP_SCHEMA_25)) : // WordPress 2.5.x
786 + if (is_string($params)) :
787 + $prefix = $params;
788 + $taxonomy = 'category';
789 + elseif (is_array($params)) :
790 + $prefix = (isset($params['prefix']) ? $params['prefix'] : '');
791 + $taxonomy = (isset($params['taxonomy']) ? $params['taxonomy'] : 'category');
792 + endif;
793 + $tax = get_taxonomy($taxonomy);
794 +
795 + if (strlen($prefix) > 0) :
796 + $idPrefix = $prefix.'-';
797 + $idSuffix = "-".$prefix;
798 + $namePrefix = $prefix . '_';
799 + else :
800 + $idPrefix = 'feedwordpress-';
801 + $idSuffix = "-feedwordpress";
802 + $namePrefix = 'feedwordpress_';
803 + endif;
804 +
430 805 ?>
431 -<div id="category-adder" class="wp-hidden-children">
432 - <h4><a id="category-add-toggle" href="#category-add" class="hide-if-no-js" tabindex="3"><?php _e( '+ Add New Category' ); ?></a></h4>
433 - <p id="category-add" class="wp-hidden-child">
434 - <input type="text" name="newcat" id="newcat" class="form-required form-input-tip" value="<?php _e( 'New category name' ); ?>" tabindex="3" />
435 - <?php wp_dropdown_categories( array( 'hide_empty' => 0, 'name' => 'newcat_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => __('Parent category'), 'tab_index' => 3 ) ); ?>
436 - <input type="button" id="category-add-sumbit" class="add:categorychecklist:category-add button" value="<?php _e( 'Add' ); ?>" tabindex="3" />
437 - <?php wp_nonce_field( 'add-category', '_ajax_nonce', false ); ?>
438 - <span id="category-ajax-response"></span>
806 +<div id="<?php print $idPrefix; ?>taxonomy-<?php print $taxonomy; ?>" class="feedwordpress-category-div">
807 + <ul id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-tabs" class="category-tabs">
808 + <li class="ui-tabs-selected tabs"><a href="#<?php print $idPrefix; ?><?php print $taxonomy; ?>-all" tabindex="3"><?php _e( 'All posts' ); ?></a>
809 + <p style="font-size:smaller;font-style:bold;margin:0">Give <?php print $object; ?> these <?php print $tax->labels->name; ?></p>
810 + </li>
811 + </ul>
812 +
813 +<div id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-all" class="tabs-panel">
814 + <input type="hidden" value="0" name="tax_input[<?php print $taxonomy; ?>][]" />
815 + <ul id="<?php print $idPrefix; ?><?php print $taxonomy; ?>checklist" class="list:<?php print $taxonomy; ?> categorychecklist form-no-clear">
816 + <?php fwp_category_checklist(NULL, false, $checked, $params) ?>
817 + </ul>
818 +</div>
819 +
820 +<div id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-adder" class="<?php print $taxonomy; ?>-adder wp-hidden-children">
821 + <h4><a id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add-toggle" class="category-add-toggle" href="#<?php print $idPrefix; ?><?php print $taxonomy; ?>-add" class="hide-if-no-js" tabindex="3"><?php _e( '+ Add New Category' ); ?></a></h4>
822 + <p id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add" class="category-add wp-hidden-child">
823 + <?php
824 + $newcat = 'new'.$taxonomy;
825 +
826 + // Well, thank God they added "egory" before WP 3.0 came out.
827 + if ('newcategory'==$newcat
828 + and !FeedWordPressCompatibility::test_version(FWP_SCHEMA_30)) :
829 + $newcat = 'newcat';
830 + endif;
831 + ?>
832 + <label class="screen-reader-text" for="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>"><?php _e('Add New Category'); ?></label>
833 + <input
834 + id="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>"
835 + class="new<?php print $taxonomy; ?> form-required form-input-tip"
836 + aria-required="true"
837 + tabindex="3"
838 + type="text" name="<?php print $newcat; ?>"
839 + value="<?php _e( 'New category name' ); ?>"
840 + />
841 + <label class="screen-reader-text" for="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>-parent"><?php _e('Parent Category:'); ?></label>
842 + <?php wp_dropdown_categories( array(
843 + 'taxonomy' => $taxonomy,
844 + 'hide_empty' => 0,
845 + 'id' => $idPrefix.'new'.$taxonomy.'-parent',
846 + 'class' => 'new'.$taxonomy.'-parent',
847 + 'name' => $newcat.'_parent',
848 + 'orderby' => 'name',
849 + 'hierarchical' => 1,
850 + 'show_option_none' => __('Parent category'),
851 + 'tab_index' => 3,
852 + ) ); ?>
853 + <input type="button" id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add-sumbit" class="add:<?php print $idPrefix; ?><?php print $taxonomy; ?>checklist:<?php print $taxonomy; ?>-add add-categorychecklist-category-add button category-add-submit" value="<?php _e( 'Add' ); ?>" tabindex="3" />
854 + <?php /* wp_nonce_field currently doesn't let us set an id different from name, but we need a non-unique name and a unique id */ ?>
855 + <input type="hidden" id="_ajax_nonce<?php print esc_html($idSuffix); ?>" name="_ajax_nonce" value="<?php print wp_create_nonce('add-'.$taxonomy); ?>" />
856 + <input type="hidden" id="_ajax_nonce-add-<?php print $taxonomy; ?><?php print esc_html($idSuffix); ?>" name="_ajax_nonce-add-<?php print $taxonomy; ?>" value="<?php print wp_create_nonce('add-'.$taxonomy); ?>" />
857 + <span id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-ajax-response" class="<?php print $taxonomy; ?>-ajax-response"></span>
439 858 </p>
440 859 </div>
441 860
442 -<ul id="category-tabs">
443 - <?php /* ui-tabs-selected in WP 2.7 CSS = tabs in WP 2.8 CSS. Thank you, o brilliant wordsmiths of the WordPress 2.8 stylesheet... */ ?>
444 - <li class="ui-tabs-selected tabs"><a href="#categories-all" tabindex="3"><?php _e( 'All posts' ); ?></a>
445 - <p style="font-size:smaller;font-style:bold;margin:0">Give <?php print $object; ?> these categories</p>
446 -</li>
447 -</ul>
448 -
449 -<?php /* ui-tabs-panel in WP 2.7 CSS = tabs-panel in WP 2.8 CSS. Thank you, o brilliant wordsmiths of the WordPress 2.8 stylesheet... */ ?>
450 -<div id="categories-all" class="ui-tabs-panel tabs-panel">
451 - <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
452 - <?php fwp_category_checklist(NULL, false, $checked) ?>
453 - </ul>
454 861 </div>
455 862 <?php
456 - elseif (fwp_test_wp_version(FWP_SCHEMA_20)) : // WordPress 2.x
457 -?>
458 - <div id="moremeta" style="position: relative; right: auto">
459 - <div id="grabit" class="dbx-group">
460 - <fieldset id="categorydiv" class="dbx-box">
461 - <h3 class="dbx-handle"><?php _e('Categories') ?></h3>
462 - <div class="dbx-content">
463 - <p style="font-size:smaller;font-style:bold;margin:0">Place <?php print $object; ?> under...</p>
464 - <p id="jaxcat"></p>
465 - <div id="categorychecklist"><?php fwp_category_checklist(NULL, false, $checked); ?></div>
466 - </div>
467 - </fieldset>
468 - </div>
469 - </div>
470 -<?php
471 - else : // WordPress 1.5
472 -?>
473 - <fieldset style="width: 60%;">
474 - <legend><?php _e('Categories') ?></legend>
475 - <p style="font-size:smaller;font-style:bold;margin:0">Place <?php print $object; ?> under...</p>
476 - <div style="height: 10em; overflow: scroll;"><?php fwp_category_checklist(NULL, false, $checked); ?></div>
477 - </fieldset>
478 -<?php
479 - endif;
480 863 }
481 864
482 865 function update_feeds_mention ($feed) {
483 866 echo "<li>Updating <cite>".$feed['link/name']."</cite> from &lt;<a href=\""
@@ -484,9 +867,18 @@
484 867 .$feed['link/uri']."\">".$feed['link/uri']."</a>&gt; ...";
485 868 flush();
486 869 }
487 870 function update_feeds_finish ($feed, $added, $dt) {
488 - echo " completed in $dt second".(($dt==1)?'':'s')."</li>\n";
871 + if (is_wp_error($added)) :
872 + $mesgs = $added->get_error_messages();
873 + foreach ($mesgs as $mesg) :
874 + echo "<br/><strong>Feed error:</strong> <code>$mesg</code>";
875 + endforeach;
876 + echo "</li>\n";
877 + else :
878 + echo " completed in $dt second".(($dt==1)?'':'s')."</li>\n";
879 + endif;
880 + flush();
489 881 }
490 882
491 883 function fwp_author_list () {
492 884 global $wpdb;
@@ -491,20 +883,13 @@
491 883 function fwp_author_list () {
492 884 global $wpdb;
493 885 $ret = array();
494 886
495 - // display_name introduced in WP 2.0
496 - if (fwp_test_wp_version(FWP_SCHEMA_20)) :
497 - $name_column = 'display_name';
498 - else :
499 - $name_column = 'user_nickname';
500 - endif;
501 -
502 - $users = $wpdb->get_results("SELECT * FROM $wpdb->users ORDER BY {$name_column}");
887 + $users = get_users_of_blog();
503 888 if (is_array($users)) :
504 889 foreach ($users as $user) :
505 890 $id = (int) $user->ID;
506 - $ret[$id] = $user->{$name_column};
891 + $ret[$id] = $user->display_name;
507 892 if (strlen(trim($ret[$id])) == 0) :
508 893 $ret[$id] = $user->user_login;
509 894 endif;
510 895 endforeach;
@@ -512,63 +897,60 @@
512 897 return $ret;
513 898 }
514 899
515 900 class FeedWordPressSettingsUI {
516 - function instead_of_posts_box ($link_id = null) {
517 - if (!is_null($link_id)) :
518 - $from_this_feed = 'from this feed';
519 - $by_default = '';
520 - $id_param = "&amp;link_id=".$link_id;
521 - else :
522 - $from_this_feed = 'from syndicated feeds';
523 - $by_default = " by default";
524 - $id_param = "";
901 + function is_admin () {
902 + global $fwp_path;
903 +
904 + $admin_page = false; // Innocent until proven guilty
905 + if (isset($_REQUEST['page'])) :
906 + $admin_page = (
907 + is_admin()
908 + and preg_match("|^{$fwp_path}/|", $_REQUEST['page'])
909 + );
525 910 endif;
526 -?>
527 -<p>Use the <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/posts-page.php<?php print $id_param; ?>"><?php _e('Posts & Links'); ?></a>
528 -settings page to set up how new posts <?php print $from_this_feed; ?> will be published<?php $by_default; ?>, whether they will accept
529 -comments and pings, any custom fields that should be set on each post, etc.</p>
530 -<?php
531 - } /* FeedWordPressSettingsUI::instead_of_posts_box () */
911 + return $admin_page;
912 + }
532 913
533 - function instead_of_authors_box ($link_id = null) {
534 - if (!is_null($link_id)) :
535 - $from_this_feed = 'from this feed';
536 - $by_default = '';
537 - $id_param = "&amp;link_id=".$link_id;
538 - else :
539 - $from_this_feed = 'from syndicated feeds';
540 - $by_default = " by default";
541 - $id_param = "";
914 + function admin_scripts () {
915 + global $fwp_path;
916 +
917 + wp_enqueue_script('post'); // for magic tag and category boxes
918 + if (!FeedWordPressCompatibility::test_version(FWP_SCHEMA_29)) : // < 2.9
919 + wp_enqueue_script('thickbox'); // for fold-up boxes
542 920 endif;
921 + wp_enqueue_script('admin-forms'); // for checkbox selection
922 +
923 + wp_register_script('feedwordpress-elements', WP_PLUGIN_URL.'/'.$fwp_path.'/feedwordpress-elements.js');
924 + wp_enqueue_script('feedwordpress-elements');
925 + }
543 926
544 -?>
545 -<p>Use the <a
546 -href="admin.php?page=<?php print $GLOBALS['fwp_path']
547 -?>/authors-page.php<?php print $id_param; ?>"><?php _e('Authors');
548 -?></a> settings page to set up how new posts
549 -<?php print $from_this_feed; ?> will be assigned to
550 -authors.</p>
551 -<?php
552 - } /* FeedWordPressSettingsUI::instead_of_authors_box () */
927 + function admin_styles () {
928 + ?>
929 + <style type="text/css">
930 + #feedwordpress-admin-feeds .link-rss-params-remove .x, .feedwordpress-admin .remove-it .x {
931 + background: url(<?php print admin_url('images/xit.gif') ?>) no-repeat scroll 0 0 transparent;
932 + }
933 +
934 + #feedwordpress-admin-feeds .link-rss-params-remove:hover .x, .feedwordpress-admin .remove-it:hover .x {
935 + background: url(<?php print admin_url('images/xit.gif') ?>) no-repeat scroll -10px 0 transparent;
936 + }
937 +
938 + .fwpfs {
939 + background-image: url(<?php print admin_url('images/fav.png'); ?>);
940 + background-repeat: repeat-x;
941 + background-position: left center;
942 + background-attachment: scroll;
943 + }
944 + .fwpfs.slide-down {
945 + background-image:url(<?php print admin_url('images/fav-top.png'); ?>);
946 + background-position:0 top;
947 + background-repeat:repeat-x;
948 + }
949 + </style>
950 + <?php
951 + } /* FeedWordPressSettingsUI::admin_styles () */
553 952
554 - function instead_of_categories_box ($link_id = null) {
555 - if (!is_null($link_id)) :
556 - $from_this_feed = 'from this feed';
557 - $by_default = '';
558 - $id_param = "&amp;link_id=".$link_id;
559 - else :
560 - $from_this_feed = 'from syndicated feeds';
561 - $by_default = " by default";
562 - $id_param = "";
563 - endif;
564 -
565 -?>
566 -<p>Use the <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/categories-page.php<?php print $id_param; ?>"><?php _e('Categories'.FEEDWORDPRESS_AND_TAGS); ?></a>
567 -settings page to set up how new posts <?php print $from_this_feed; ?> are assigned categories <?php if (FeedWordPressCompatibility::post_tags()) : ?>or tags<?php endif; ?><?php print $by_default; ?>.</p>
568 -<?php
569 - } /* FeedWordPressSettingsUI::instead_of_categories_box () */
570 -
571 953 /*static*/ function ajax_nonce_fields () {
572 954 if (function_exists('wp_nonce_field')) :
573 955 echo "<form style='display: none' method='get' action=''>\n<p>\n";
574 956 wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
@@ -579,24 +961,17 @@
579 961
580 962 /*static*/ function fix_toggles_js ($context) {
581 963 ?>
582 964 <script type="text/javascript">
583 - jQuery(document).ready( function($) {
584 - <?php if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_25, FWP_SCHEMA_27)) : ?>
585 - // In case someone got here first...
586 - jQuery('.postbox h3').unbind('click');
587 -
588 - add_postbox_toggles('<?php print $context; ?>');
589 - <?php elseif (FeedWordPressCompatibility::test_version(FWP_SCHEMA_27)) : ?>
590 - // In case someone got here first...
591 - $('.postbox h3, .postbox .handlediv').unbind('click');
592 - $('.postbox h3 a').unbind('click');
593 - $('.hide-postbox-tog').unbind('click');
594 - $('.columns-prefs input[type="radio"]').unbind('click');
595 - $('.meta-box-sortables').sortable('destroy');
965 + jQuery(document).ready( function($) {
966 + // In case someone got here first...
967 + $('.postbox h3, .postbox .handlediv').unbind('click');
968 + $('.postbox h3 a').unbind('click');
969 + $('.hide-postbox-tog').unbind('click');
970 + $('.columns-prefs input[type="radio"]').unbind('click');
971 + $('.meta-box-sortables').sortable('destroy');
596 972
597 - postboxes.add_postbox_toggles('<?php print $context; ?>');
598 - <?php endif; ?>
973 + postboxes.add_postbox_toggles('<?php print $context; ?>');
599 974 } );
600 975 </script>
601 976 <?php
602 977 } /* FeedWordPressSettingsUI::fix_toggles_js () */
@@ -601,13 +976,15 @@
601 976 <?php
602 977 } /* FeedWordPressSettingsUI::fix_toggles_js () */
603 978
604 979 function magic_input_tip_js ($id) {
605 - if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_25)) :
980 + if (!preg_match('/^[.#]/', $id)) :
981 + $id = '#'.$id;
982 + endif;
606 983 ?>
607 984 <script type="text/javascript">
608 985 jQuery(document).ready( function () {
609 - var inputBox = jQuery("#<?php print $id; ?>");
986 + var inputBox = jQuery("<?php print $id; ?>");
610 987 var boxEl = inputBox.get(0);
611 988 if (boxEl.value==boxEl.defaultValue) { inputBox.addClass('form-input-tip'); }
612 989 inputBox.focus(function() {
613 990 if ( this.value == this.defaultValue )
@@ -619,9 +996,8 @@
619 996 });
620 997 } );
621 998 </script>
622 999 <?php
623 - endif;
624 1000 } /* FeedWordPressSettingsUI::magic_input_tip_js () */
625 1001 } /* class FeedWordPressSettingsUI */
626 1002
627 1003 function fwp_insert_new_user ($newuser_name) {
@@ -630,23 +1006,18 @@
630 1006 $ret = null;
631 1007 if (strlen($newuser_name) > 0) :
632 1008 $userdata = array();
633 1009 $userdata['ID'] = NULL;
1010 + $userdata['user_login'] = apply_filters('pre_user_login', sanitize_user($newuser_name));
1011 + $userdata['user_nicename'] = apply_filters('pre_user_nicename', sanitize_title($newuser_name));
1012 + $userdata['display_name'] = $newuser_name;
1013 + $userdata['user_pass'] = substr(md5(uniqid(microtime())), 0, 6); // just something random to lock it up
634 1014
635 - $userdata['user_login'] = sanitize_user($newuser_name);
636 - $userdata['user_login'] = apply_filters('pre_user_login', $userdata['user_login']);
1015 + $blahUrl = get_bloginfo('url'); $url = parse_url($blahUrl);
1016 + $userdata['user_email'] = substr(md5(uniqid(microtime())), 0, 6).'@'.$url['host'];
637 1017
638 - $userdata['user_nicename'] = sanitize_title($newuser_name);
639 - $userdata['user_nicename'] = apply_filters('pre_user_nicename', $userdata['user_nicename']);
640 -
641 - $userdata['display_name'] = $wpdb->escape($newuser_name);
642 -
643 1018 $newuser_id = wp_insert_user($userdata);
644 - if (is_numeric($newuser_id)) :
645 - $ret = $newuser_id;
646 - else :
647 - // TODO: Add some error detection and reporting
648 - endif;
1019 + $ret = $newuser_id; // Either a numeric ID or a WP_Error object
649 1020 else :
650 1021 // TODO: Add some error reporting
651 1022 endif;
652 1023 return $ret;
@@ -651,132 +1022,178 @@
651 1022 endif;
652 1023 return $ret;
653 1024 } /* fwp_insert_new_user () */
654 1025
1026 +/**
1027 + * fwp_add_meta_box
1028 + *
1029 + * This function is no longer necessary, since no versions of WordPress that FWP
1030 + * still supports lack add_meta_box(). But I've left it in place for the time
1031 + * being for add-on modules that may have used it in setting up their UI.
1032 + */
655 1033 function fwp_add_meta_box ($id, $title, $callback, $page, $context = 'advanced', $priority = 'default', $callback_args = null) {
656 - if (function_exists('add_meta_box')) :
657 - return add_meta_box($id, $title, $callback, $page, $context, $priority, $callback_args);
658 - else :
659 - /* Re-used as per terms of the GPL from add_meta_box() in WordPress 2.8.1 wp-admin/includes/template.php. */
660 - global $wp_meta_boxes;
661 -
662 - if ( !isset($wp_meta_boxes) )
663 - $wp_meta_boxes = array();
664 - if ( !isset($wp_meta_boxes[$page]) )
665 - $wp_meta_boxes[$page] = array();
666 - if ( !isset($wp_meta_boxes[$page][$context]) )
667 - $wp_meta_boxes[$page][$context] = array();
668 -
669 - foreach ( array_keys($wp_meta_boxes[$page]) as $a_context ) {
670 - foreach ( array('high', 'core', 'default', 'low') as $a_priority ) {
671 - if ( !isset($wp_meta_boxes[$page][$a_context][$a_priority][$id]) )
672 - continue;
673 -
674 - // If a core box was previously added or removed by a plugin, don't add.
675 - if ( 'core' == $priority ) {
676 - // If core box previously deleted, don't add
677 - if ( false === $wp_meta_boxes[$page][$a_context][$a_priority][$id] )
678 - return;
679 - // If box was added with default priority, give it core priority to maintain sort order
680 - if ( 'default' == $a_priority ) {
681 - $wp_meta_boxes[$page][$a_context]['core'][$id] = $wp_meta_boxes[$page][$a_context]['default'][$id];
682 - unset($wp_meta_boxes[$page][$a_context]['default'][$id]);
683 - }
684 - return;
685 - }
686 - // If no priority given and id already present, use existing priority
687 - if ( empty($priority) ) {
688 - $priority = $a_priority;
689 - // else if we're adding to the sorted priortiy, we don't know the title or callback. Glab them from the previously added context/priority.
690 - } elseif ( 'sorted' == $priority ) {
691 - $title = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['title'];
692 - $callback = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['callback'];
693 - $callback_args = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['args'];
694 - }
695 - // An id can be in only one priority and one context
696 - if ( $priority != $a_priority || $context != $a_context )
697 - unset($wp_meta_boxes[$page][$a_context][$a_priority][$id]);
698 - }
699 - }
700 -
701 - if ( empty($priority) )
702 - $priority = 'low';
703 -
704 - if ( !isset($wp_meta_boxes[$page][$context][$priority]) )
705 - $wp_meta_boxes[$page][$context][$priority] = array();
706 -
707 - $wp_meta_boxes[$page][$context][$priority][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $callback_args);
708 - endif;
1034 + return add_meta_box($id, $title, $callback, $page, $context, $priority, $callback_args);
709 1035 } /* function fwp_add_meta_box () */
710 1036
711 1037 function fwp_do_meta_boxes($page, $context, $object) {
712 - if (function_exists('do_meta_boxes')) :
713 - $ret = do_meta_boxes($page, $context, $object);
1038 + $ret = do_meta_boxes($page, $context, $object);
714 1039
715 - // Avoid JavaScript error from WordPress 2.5 bug
1040 + // Avoid JavaScript error from WordPress 2.5 bug
716 1041 ?>
717 1042 <div style="display: none">
718 1043 <div id="tags-input"></div> <!-- avoid JS error from WP 2.5 bug -->
719 1044 </div>
720 1045 <?php
721 - return $ret;
722 - else :
723 - /* Derived as per terms of the GPL from do_meta_boxes() in WordPress 2.8.1 wp-admin/includes/template.php. */
724 - global $wp_meta_boxes;
725 - static $already_sorted = false;
726 -
727 - //do_action('do_meta_boxes', $page, $context, $object);
728 -
729 - echo "<div id='$context-sortables' class='meta-box-sortables'>\n";
730 -
731 - $i = 0;
732 - do {
733 - if ( !isset($wp_meta_boxes) || !isset($wp_meta_boxes[$page]) || !isset($wp_meta_boxes[$page][$context]) )
734 - break;
735 -
736 - foreach ( array('high', 'sorted', 'core', 'default', 'low') as $priority ) {
737 - if ( isset($wp_meta_boxes[$page][$context][$priority]) ) {
738 - foreach ( (array) $wp_meta_boxes[$page][$context][$priority] as $box ) {
739 - if ( false == $box || ! $box['title'] )
740 - continue;
741 - $i++;
742 - fwp_option_box_opener($box['title'], $box['id'], 'postbox' /*. postbox_classes($box['id'], $page)*/);
743 - call_user_func($box['callback'], $object, $box);
744 - fwp_option_box_closer();
745 -
746 - if (is_object($object) and method_exists($object, 'interstitial')) :
747 - $object->interstitial();
748 - else :
749 - // Submit button for WP 1.5, early 2.x style
750 - fwp_settings_form_periodic_submit();
751 - endif;
752 - }
753 - }
754 - }
755 - } while(0);
756 -
757 - echo "</div>";
758 -
759 - return $i;
760 - endif;
1046 + return $ret;
761 1047 } /* function fwp_do_meta_boxes() */
762 1048
763 1049 function fwp_remove_meta_box($id, $page, $context) {
764 - if (function_exists('remove_meta_box')) :
765 - return remove_meta_box($id, $page, $context);
766 - else :
767 - /* Re-used as per terms of the GPL from remove_meta_box() in WordPress 2.8.1 wp-admin/includes/template.php */
768 - global $wp_meta_boxes;
1050 + return remove_meta_box($id, $page, $context);
1051 +} /* function fwp_remove_meta_box() */
1052 +
1053 +function fwp_syndication_manage_page_links_table_rows ($links, $page, $visible = 'Y') {
1054 + global $fwp_path;
769 1055
770 - if ( !isset($wp_meta_boxes) )
771 - $wp_meta_boxes = array();
772 - if ( !isset($wp_meta_boxes[$page]) )
773 - $wp_meta_boxes[$page] = array();
774 - if ( !isset($wp_meta_boxes[$page][$context]) )
775 - $wp_meta_boxes[$page][$context] = array();
776 -
777 - foreach ( array('high', 'core', 'default', 'low') as $priority )
778 - $wp_meta_boxes[$page][$context][$priority][$id] = false;
1056 + $subscribed = ('Y' == strtoupper($visible));
1057 + if ($subscribed or (count($links) > 0)) :
1058 + ?>
1059 + <table class="widefat<?php if (!$subscribed) : ?> unsubscribed<?php endif; ?>">
1060 + <thead>
1061 + <tr>
1062 + <th class="check-column" scope="col"><input type="checkbox" /></th>
1063 + <th scope="col"><?php _e('Name'); ?></th>
1064 + <th scope="col"><?php _e('Feed'); ?></th>
1065 + <th scope="col"><?php _e('Updated'); ?></th>
1066 + </tr>
1067 + </thead>
1068 +
1069 + <tbody>
1070 +<?php
1071 + $alt_row = true;
1072 + if (count($links) > 0):
1073 + foreach ($links as $link):
1074 + $trClass = array();
1075 +
1076 + // Prep: Get last updated timestamp
1077 + $sLink = new SyndicatedLink($link->link_id);
1078 + if (!is_null($sLink->setting('update/last'))) :
1079 + $lastUpdated = fwp_time_elapsed($sLink->setting('update/last'));
1080 + else :
1081 + $lastUpdated = __('None yet');
1082 + endif;
1083 +
1084 + // Prep: get last error timestamp, if any
1085 + if (is_null($sLink->setting('update/error'))) :
1086 + $errorsSince = '';
1087 + else :
1088 + $trClass[] = 'feed-error';
1089 +
1090 + $theError = unserialize($sLink->setting('update/error'));
1091 +
1092 + $errorsSince = "<div class=\"returning-errors\">"
1093 + ."<p><strong>Returning errors</strong> since "
1094 + .fwp_time_elapsed($theError['since'])
1095 + ."</p>"
1096 + ."<p>Most recent ("
1097 + .fwp_time_elapsed($theError['ts'])
1098 + ."):<br/><code>"
1099 + .implode("</code><br/><code>", $theError['object']->get_error_messages())
1100 + ."</code></p>"
1101 + ."</div>\n";
1102 + endif;
1103 +
1104 + $nextUpdate = "<div style='font-style:italic;size:0.9em'>Ready for next update ";
1105 + if (isset($sLink->settings['update/ttl']) and is_numeric($sLink->settings['update/ttl'])) :
1106 + if (isset($sLink->settings['update/timed']) and $sLink->settings['update/timed']=='automatically') :
1107 + $next = $sLink->settings['update/last'] + ((int) $sLink->settings['update/ttl'] * 60);
1108 + $nextUpdate .= fwp_time_elapsed($next);
1109 + if (FEEDWORDPRESS_DEBUG) : $nextUpdate .= " [".(($next-time())/60)." minutes]"; endif;
1110 + else :
1111 + $nextUpdate .= "every ".$sLink->settings['update/ttl']." minute".(($sLink->settings['update/ttl']!=1)?"s":"");
1112 + endif;
1113 + else:
1114 + $nextUpdate .= "as soon as possible";
1115 + endif;
1116 + $nextUpdate .= "</div>";
1117 +
1118 + unset($sLink);
1119 +
1120 + $alt_row = !$alt_row;
1121 +
1122 + if ($alt_row) :
1123 + $trClass[] = 'alternate';
1124 + endif;
1125 + ?>
1126 + <tr<?php echo ((count($trClass) > 0) ? ' class="'.implode(" ", $trClass).'"':''); ?>>
1127 + <th class="check-column" scope="row"><input type="checkbox" name="link_ids[]" value="<?php echo $link->link_id; ?>" /></th>
1128 + <?php
1129 + $hrefPrefix = "admin.php?link_id={$link->link_id}&amp;page=${fwp_path}/";
1130 + $caption = (
1131 + (strlen($link->link_rss) > 0)
1132 + ? __('Switch Feed')
1133 + : $caption=__('Find Feed')
1134 + );
1135 + ?>
1136 + <td>
1137 + <strong><a href="<?php print $hrefPrefix; ?>feeds-page.php"><?php print esc_html($link->link_name); ?></a></strong>
1138 + <div class="row-actions"><?php if ($subscribed) :
1139 + $page->display_feed_settings_page_links(array(
1140 + 'before' => '<div><strong>Settings &gt;</strong> ',
1141 + 'after' => '</div>',
1142 + 'subscription' => $link,
1143 + ));
1144 + endif; ?>
1145 +
1146 + <div><strong>Actions &gt;</strong>
1147 + <?php if ($subscribed) : ?>
1148 + <a href="<?php print $hrefPrefix; ?>syndication.php&amp;action=feedfinder"><?php echo $caption; ?></a>
1149 + <?php else : ?>
1150 + <a href="<?php print $hrefPrefix; ?>syndication.php&amp;action=<?php print FWP_RESUB_CHECKED; ?>"><?php _e('Re-subscribe'); ?></a>
1151 + <?php endif; ?>
1152 + | <a href="<?php print $hrefPrefix; ?>syndication.php&amp;action=Unsubscribe"><?php _e(($subscribed ? 'Unsubscribe' : 'Delete permanently')); ?></a>
1153 + | <a href="<?php print esc_html($link->link_url); ?>"><?php _e('View')?></a></div>
1154 + </div>
1155 + </td>
1156 + <?php if (strlen($link->link_rss) > 0): ?>
1157 + <td><a href="<?php echo esc_html($link->link_rss); ?>"><?php echo esc_html(feedwordpress_display_url($link->link_rss, 32)); ?></a></td>
1158 + <?php else: ?>
1159 + <td class="feed-missing"><p><strong>no feed assigned</strong></p></td>
1160 + <?php endif; ?>
1161 +
1162 + <td><div style="float: right; padding-left: 10px">
1163 + <input type="submit" class="button" name="update_uri[<?php print esc_html($link->link_rss); ?>]" value="<?php _e('Update Now'); ?>" />
1164 + </div>
1165 + <?php print $lastUpdated; ?>
1166 + <?php print $errorsSince; ?>
1167 + <?php print $nextUpdate; ?>
1168 + </td>
1169 + </tr>
1170 + <?php
1171 + endforeach;
1172 + else :
1173 +?>
1174 +<tr><td colspan="4"><p>There are no websites currently listed for syndication.</p></td></tr>
1175 +<?php
1176 + endif;
1177 +?>
1178 +</tbody>
1179 +</table>
1180 + <?php
779 1181 endif;
780 -} /* function fwp_remove_meta_box() */
1182 +} /* function fwp_syndication_manage_page_links_table_rows () */
781 1183
1184 +function fwp_syndication_manage_page_links_subsubsub ($sources, $showInactive) {
1185 + global $fwp_path;
1186 + $hrefPrefix = "admin.php?page=${fwp_path}/syndication.php";
1187 + ?>
1188 + <ul class="subsubsub">
1189 + <li><a <?php if (!$showInactive) : ?>class="current" <?php endif; ?>href="<?php print $hrefPrefix; ?>&amp;visibility=Y">Subscribed
1190 + <span class="count">(<?php print count($sources['Y']); ?>)</span></a></li>
1191 + <?php if ($showInactive or (count($sources['N']) > 0)) : ?>
1192 + <li><a <?php if ($showInactive) : ?>class="current" <?php endif; ?>href="<?php print $hrefPrefix; ?>&amp;visibility=N">Inactive</a>
1193 + <span class="count">(<?php print count($sources['N']); ?>)</span></a></li>
1194 + <?php endif; ?>
1195 +
1196 + </ul> <!-- class="subsubsub" -->
1197 + <?php
1198 +}
782 1199