PluginProbe
FeedWordPress / 2013.0504
FeedWordPress v2013.0504
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
feedwordpress / admin-ui.php

admin-ui.php in FeedWordPress 2013.0504, at admin-ui.php

1,264 lines 40.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 class FeedWordPressAdminPage {
3 var $context;
4 var $updated = false;
5 var $mesg = NULL;
6
7 var $link = NULL;
8 var $dispatch = NULL;
9 var $filename = NULL;
10 var $pagenames = array();
11
12 /**
13 * Construct the admin page object.
14 *
15 * @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings
16 */
17 function FeedWordPressAdminPage ($page = 'feedwordpressadmin', $link = NULL) {
18 $this->link = $link;
19
20 // Set meta-box context name
21 $this->context = $page;
22 if ($this->for_feed_settings()) :
23 $this->context .= 'forfeed';
24 endif;
25 } /* FeedWordPressAdminPage constructor */
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
100 function for_feed_settings () { return (is_object($this->link) and method_exists($this->link, 'found') and $this->link->found()); }
101 function for_default_settings () { return !$this->for_feed_settings(); }
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
152 /*static*/ function submitted_link_id () {
153 global $fwp_post;
154
155 // Presume global unless we get a specific link ID
156 $link_id = NULL;
157
158 $submit_buttons = array(
159 'save',
160 'submit',
161 'fix_mismatch',
162 'feedfinder',
163 );
164 foreach ($submit_buttons as $field) :
165 if (isset($fwp_post[$field])) :
166 $link_id = MyPHP::request('save_link_id');
167 endif;
168 endforeach;
169
170 if (is_null($link_id) and isset($_REQUEST['link_id'])) :
171 $link_id = MyPHP::request('link_id');
172 endif;
173
174 return $link_id;
175 } /* FeedWordPressAdminPage::submitted_link_id() */
176
177 /*static*/ function submitted_link () {
178 $link_id = FeedWordPressAdminPage::submitted_link_id();
179 if (is_numeric($link_id) and $link_id) :
180 $link = new SyndicatedLink($link_id);
181 else :
182 $link = NULL;
183 endif;
184 return $link;
185 } /* FeedWordPressAdminPage::submitted_link () */
186
187 function stamp_link_id ($field = null) {
188 if (is_null($field)) : $field = 'save_link_id'; endif;
189 ?>
190 <input type="hidden" name="<?php print esc_attr($field); ?>" value="<?php print ($this->for_feed_settings() ? $this->link->id : '*'); ?>" />
191 <?php
192 } /* FeedWordPressAdminPage::stamp_link_id () */
193
194 function these_posts_phrase () {
195 if ($this->for_feed_settings()) :
196 $phrase = __('posts from this feed');
197 else :
198 $phrase = __('syndicated posts');
199 endif;
200 return $phrase;
201 } /* FeedWordPressAdminPage::these_posts_phrase() */
202
203 /**
204 * Provides a uniquely identifying name for the interface context for
205 * use with add_meta_box() and do_meta_boxes(),
206 *
207 * @return string the context name
208 *
209 * @see add_meta_box()
210 * @see do_meta_boxes()
211 */
212 function meta_box_context () {
213 return $this->context;
214 } /* FeedWordPressAdminPage::meta_box_context () */
215
216 /**
217 * Outputs JavaScript to fix AJAX toggles settings.
218 *
219 * @uses FeedWordPressAdminPage::meta_box_context()
220 */
221 function fix_toggles () {
222 FeedWordPressSettingsUI::fix_toggles_js($this->meta_box_context());
223 } /* FeedWordPressAdminPage::fix_toggles() */
224
225 function ajax_interface_js () {
226 ?>
227 function contextual_appearance (item, appear, disappear, value, visibleStyle, checkbox) {
228 if (typeof(visibleStyle)=='undefined') visibleStyle = 'block';
229
230 var rollup=document.getElementById(item);
231 if (rollup) {
232 if ((checkbox && rollup.checked) || (!checkbox && value==rollup.value)) {
233 jQuery('#'+disappear).hide();
234 jQuery('#'+appear).show(600);
235 } else {
236 jQuery('#'+appear).hide();
237 jQuery('#'+disappear).show(600);
238 }
239 }
240 }
241 <?php
242 } /* FeedWordPressAdminPage::ajax_interface_js () */
243
244 function admin_page_href ($page, $params = array(), $link = NULL) {
245 global $fwp_path;
246
247 // Merge in the page's filename
248 $params = array_merge($params, array('page' => $fwp_path.'/'.$page));
249
250 // If there is a link ID provided, then merge that in too.
251 if (!is_null($link)) :
252 $link_id = NULL;
253 if (is_object($link)) :
254 if (method_exists($link, 'found')) :
255 // Is this a SyndicatedLink object?
256 if ($link->found()) :
257 $link_id = $link->link->link_id;
258 endif;
259 else :
260 // Is this a wp_links table record?
261 $link_id = $link->link_id;
262 endif;
263 else :
264 // Is this just a numeric ID?
265 $link_id = $link;
266 endif;
267
268 if (!is_null($link_id)) :
269 $params = array_merge($params, array('link_id' => $link_id));
270 endif;
271 endif;
272
273 return MyPHP::url(admin_url('admin.php'), $params);
274 } /* FeedWordPressAdminPage::admin_page_href () */
275
276 function display_feed_settings_page_links ($params = array()) {
277 global $fwp_path;
278
279 $params = wp_parse_args($params, array(
280 'before' => '',
281 'between' => ' | ',
282 'after' => '',
283 'long' => false,
284 'subscription' => $this->link,
285 ));
286 $sub = $params['subscription'];
287
288 $links = array(
289 "Feed" => array('page' => 'feeds-page.php', 'long' => 'Feeds & Updates'),
290 "Posts" => array('page' => 'posts-page.php', 'long' => 'Posts & Links'),
291 "Authors" => array('page' => 'authors-page.php', 'long' => 'Authors'),
292 'Categories' => array('page' => 'categories-page.php', 'long' => 'Categories & Tags'),
293 );
294
295 $link_id = NULL;
296 if (is_object($sub)) :
297 if (method_exists($sub, 'found')) :
298 if ($sub->found()) :
299 $link_id = $sub->link->link_id;
300 endif;
301 else :
302 $link_id = $sub->link_id;
303 endif;
304 endif;
305
306 print $params['before']; $first = true;
307 foreach ($links as $label => $link) :
308 if (!$first) : print $params['between']; endif;
309
310 if (isset($link['url'])) : MyPHP::url($link['url'], array("link_id" => $link_id));
311 else : $url = $this->admin_page_href($link['page'], array(), $sub);
312 endif;
313 $url = esc_html($url);
314
315 if ($link['page']==basename($this->filename)) :
316 print "<strong>";
317 else :
318 print "<a href=\"${url}\">";
319 endif;
320
321 if ($params['long']) : print esc_html(__($link['long']));
322 else : print esc_html(__($label));
323 endif;
324
325 if ($link['page']==basename($this->filename)) :
326 print "</strong>";
327 else :
328 print "</a>";
329 endif;
330
331 $first = false;
332 endforeach;
333 print $params['after'];
334 } /* FeedWordPressAdminPage::display_feed_settings_page_links */
335
336 function display_feed_select_dropdown() {
337 $links = FeedWordPress::syndicated_links();
338
339 ?>
340 <div id="fwpfs-container"><ul class="subsubsub">
341 <li><select name="link_id" class="fwpfs" style="max-width: 20.0em;">
342 <option value="*"<?php if ($this->for_default_settings()) : ?> selected="selected"<?php endif; ?>>- defaults for all feeds -</option>
343 <?php if ($links) : foreach ($links as $ddlink) : ?>
344 <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>
345 <?php endforeach; endif; ?>
346 </select>
347 <input id="fwpfs-button" class="button" type="submit" name="go" value="<?php _e('Go') ?> &raquo;" /></li>
348
349 <?php
350 $this->display_feed_settings_page_links(array(
351 'before' => '<li>',
352 'between' => "</li>\n<li>",
353 'after' => '</li>',
354 'subscription' => $this->link,
355 ));
356
357 if ($this->for_feed_settings()) :
358 ?>
359 <li><input class="button" type="submit" name="update" value="Update Now" /></li>
360 <?php
361 endif;
362 ?>
363 </ul>
364 </div>
365 <?php
366 } /* FeedWordPressAdminPage::display_feed_select_dropdown() */
367
368 function display_sheet_header ($pagename = 'Syndication', $all = false) {
369 global $fwp_path;
370 ?>
371 <div class="icon32"><img src="<?php print esc_html(WP_PLUGIN_URL.'/'.$fwp_path.'/feedwordpress.png'); ?>" alt="" /></div>
372 <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>
373 <?php
374 }
375
376 function display_update_notice_if_updated ($pagename = 'Syndication', $mesg = NULL) {
377 if (!is_null($mesg)) :
378 $this->mesg = $mesg;
379 endif;
380
381 if ($this->updated) :
382 if ($this->updated === true) :
383 $this->mesg = $pagename . ' settings updated.';
384 else :
385 $this->mesg = $this->updated;
386 endif;
387 endif;
388
389 if (!is_null($this->mesg)) :
390 ?>
391 <div class="updated">
392 <p><?php print esc_html($this->mesg); ?></p>
393 </div>
394 <?php
395 endif;
396 } /* FeedWordPressAdminPage::display_update_notice_if_updated() */
397
398 function display_settings_scope_message () {
399 if ($this->for_feed_settings()) :
400 ?>
401 <p>These settings only affect posts syndicated from
402 <strong><?php echo esc_html($this->link->link->link_name); ?></strong>.</p>
403 <?php
404 else :
405 ?>
406 <p>These settings affect posts syndicated from any feed unless they are overridden
407 by settings for that specific feed.</p>
408 <?php
409 endif;
410 } /* FeedWordPressAdminPage::display_settings_scope_message () */
411
412 /*static*/ function has_link () { return true; }
413
414 function form_action ($filename = NULL) {
415 global $fwp_path;
416
417 if (is_null($filename)) :
418 $filename = basename($this->filename);
419 endif;
420 return $this->admin_page_href($filename);
421 } /* FeedWordPressAdminPage::form_action () */
422
423 function update_message () {
424 return $this->mesg;
425 }
426
427 function display () {
428 global $fwp_post;
429
430 if (FeedWordPress::needs_upgrade()) :
431 fwp_upgrade_page();
432 return;
433 endif;
434
435 FeedWordPressCompatibility::validate_http_request(/*action=*/ $this->dispatch, /*capability=*/ 'manage_links');
436
437 ////////////////////////////////////////////////
438 // Process POST request, if any ////////////////
439 ////////////////////////////////////////////////
440 if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
441 $this->accept_POST($fwp_post);
442 else :
443 $this->updated = false;
444 endif;
445
446 ////////////////////////////////////////////////
447 // Prepare settings page ///////////////////////
448 ////////////////////////////////////////////////
449
450 $this->display_update_notice_if_updated(
451 $this->pagename('settings-update'),
452 $this->update_message()
453 );
454
455 $this->open_sheet($this->pagename('open-sheet'));
456 ?>
457 <div id="post-body">
458 <?php
459 foreach ($this->boxes_by_methods as $method => $row) :
460 if (is_array($row)) :
461 $id = $row['id'];
462 $title = $row['title'];
463 else :
464 $id = 'feedwordpress_'.$method;
465 $title = $row;
466 endif;
467
468 add_meta_box(
469 /*id=*/ $id,
470 /*title=*/ $title,
471 /*callback=*/ array($this, $method),
472 /*page=*/ $this->meta_box_context(),
473 /*context=*/ $this->meta_box_context()
474 );
475 endforeach;
476 do_action($this->dispatch.'_meta_boxes', $this);
477 ?>
478 <div class="metabox-holder">
479 <?php
480 fwp_do_meta_boxes($this->meta_box_context(), $this->meta_box_context(), $this);
481 ?>
482 </div> <!-- class="metabox-holder" -->
483 </div> <!-- id="post-body" -->
484 <?php $this->close_sheet(); ?>
485 <?php
486 }
487
488 function open_sheet ($header) {
489 // Set up prepatory AJAX stuff
490 ?>
491 <script type="text/javascript">
492 <?php
493 $this->ajax_interface_js();
494 ?>
495 </script>
496
497 <?php
498 add_action(
499 FeedWordPressCompatibility::bottom_script_hook($this->filename),
500 /*callback=*/ array($this, 'fix_toggles'),
501 /*priority=*/ 10000
502 );
503 FeedWordPressSettingsUI::ajax_nonce_fields();
504
505 ?>
506 <div class="wrap feedwordpress-admin" id="feedwordpress-admin-<?php print $this->pageslug(); ?>">
507 <?php
508 if (!is_null($header)) :
509 $this->display_sheet_header($header);
510 endif;
511
512 if (!is_null($this->dispatch)) :
513 ?>
514 <form action="<?php print $this->form_action(); ?>" method="post">
515 <div><?php
516 FeedWordPressCompatibility::stamp_nonce($this->dispatch);
517 $this->stamp_link_id();
518 ?></div>
519 <?php
520 endif;
521
522 if ($this->has_link()) :
523 $this->display_settings_scope_message();
524 endif;
525
526 ?><div class="tablenav"><?php
527 if (!is_null($this->dispatch)) :
528 ?><div class="alignright"><?php
529 $this->save_button();
530 ?></div><?php
531 endif;
532
533 if ($this->has_link()) :
534 $this->display_feed_select_dropdown();
535 endif;
536 ?>
537 </div>
538
539 <div id="poststuff">
540 <?php
541 } /* FeedWordPressAdminPage::open_sheet () */
542
543 function close_sheet () {
544 ?>
545
546 </div> <!-- id="poststuff" -->
547 <?php
548 if (!is_null($this->dispatch)) :
549 $this->save_button();
550 print "</form>\n";
551 endif;
552 ?>
553 </div> <!-- class="wrap" -->
554
555 <?php
556 } /* FeedWordPressAdminPage::close_sheet () */
557
558 function setting_radio_control ($localName, $globalName, $options, $params = array()) {
559 global $fwp_path;
560
561 if (isset($params['filename'])) : $filename = $params['filename'];
562 else : $filename = basename($this->filename);
563 endif;
564
565 if (isset($params['site-wide-url'])) : $href = $params['site-wide-url'];
566 else : $href = $this->admin_page_href($filename);
567 endif;
568
569 if (isset($params['setting-default'])) : $settingDefault = $params['setting-default'];
570 else : $settingDefault = NULL;
571 endif;
572
573 if (isset($params['global-setting-default'])) : $globalSettingDefault = $params['global-setting-default'];
574 else : $globalSettingDefault = $settingDefault;
575 endif;
576
577 $globalSetting = get_option('feedwordpress_'.$globalName, $globalSettingDefault);
578 if ($this->for_feed_settings()) :
579 $setting = $this->link->setting($localName, NULL, $settingDefault);
580 else :
581 $setting = $globalSetting;
582 endif;
583
584 if (isset($params['offer-site-wide'])) : $offerSiteWide = $params['offer-site-wide'];
585 else : $offerSiteWide = $this->for_feed_settings();
586 endif;
587
588 // This allows us to provide an alternative set of human-readable
589 // labels for each potential value. For use in Currently: line.
590 if (isset($params['labels'])) : $labels = $params['labels'];
591 elseif (is_callable($options)) : $labels = NULL;
592 else : $labels = $options;
593 endif;
594
595 if (isset($params['input-name'])) : $inputName = $params['input-name'];
596 else : $inputName = $globalName;
597 endif;
598
599 if (isset($params['default-input-id'])) : $defaultInputId = $params['default-input-id'];
600 else : $defaultInputId = NULL;
601 endif;
602
603 if (isset($params['default-input-id-no'])) : $defaultInputIdNo = $params['default-input-id-no'];
604 elseif (!is_null($defaultInputId)) : $defaultInputIdNo = $defaultInputId.'-no';
605 else : $defaultInputIdNo = NULL;
606 endif;
607
608 // This allows us to either include the site-default setting as
609 // one of the options within the radio box, or else as a simple
610 // yes/no toggle that controls whether or not to check another
611 // set of inputs.
612 if (isset($params['default-input-name'])) : $defaultInputName = $params['default-input-name'];
613 else : $defaultInputName = $inputName;
614 endif;
615
616 if ($defaultInputName != $inputName) :
617 $defaultInputValue = 'yes';
618 else :
619 $defaultInputValue = (
620 isset($params['default-input-value'])
621 ? $params['default-input-value']
622 : 'site-default'
623 );
624 endif;
625
626 $settingDefaulted = (is_null($setting) or ($settingDefault === $setting));
627
628 if (!is_callable($options)) :
629 $checked = array();
630 if ($settingDefaulted) :
631 $checked[$defaultInputValue] = ' checked="checked"';
632 endif;
633
634 foreach ($options as $value => $label) :
635 if ($setting == $value) :
636 $checked[$value] = ' checked="checked"';
637 else :
638 $checked[$value] = '';
639 endif;
640 endforeach;
641 endif;
642
643 $defaulted = array();
644 if ($defaultInputName != $inputName) :
645 $defaulted['yes'] = ($settingDefaulted ? ' checked="checked"' : '');
646 $defaulted['no'] = ($settingDefaulted ? '' : ' checked="checked"');
647 else :
648 $defaulted['yes'] = (isset($checked[$defaultInputValue]) ? $checked[$defaultInputValue] : '');
649 endif;
650
651 if (isset($params['defaulted'])) :
652 $defaulted['yes'] = ($params['defaulted'] ? ' checked="checked"' : '');
653 $defaulted['no'] = ($params['defaulted'] ? '' : ' checked="checked"');
654 endif;
655
656 if ($offerSiteWide) :
657 ?>
658 <table class="twofer">
659 <tbody>
660 <tr><td class="equals first inactive">
661 <ul class="options">
662 <li><label><input type="radio"
663 name="<?php print $defaultInputName; ?>"
664 value="<?php print $defaultInputValue; ?>"
665 <?php if (!is_null($defaultInputId)) : ?>id="<?php print $defaultInputId; ?>" <?php endif; ?>
666 <?php print $defaulted['yes']; ?> />
667 Use the site-wide setting</label>
668 <span class="current-setting">Currently:
669 <strong><?php if (is_callable($labels)) :
670 print call_user_func($labels, $globalSetting, $defaulted, $params);
671 elseif (is_null($labels)) :
672 print $globalSetting;
673 else :
674 print $labels[$globalSetting];
675 endif; ?></strong> (<a href="<?php print $href; ?>">change</a>)</span></li>
676 </ul></td>
677
678 <td class="equals second inactive">
679 <?php if ($defaultInputName != $inputName) : ?>
680 <ul class="options">
681 <li><label><input type="radio"
682 name="<?php print $defaultInputName; ?>"
683 value="no"
684 <?php if (!is_null($defaultInputIdNo)) : ?>id="<?php print $defaultInputIdNo; ?>" <?php endif; ?>
685 <?php print $defaulted['no']; ?> />
686 <?php _e('Do something different with this feed.'); ?></label>
687 <?php endif;
688 endif;
689
690 // Let's spit out the controls here.
691 if (is_callable($options)) :
692 // Method call to print out options list
693 call_user_func($options, $setting, $defaulted, $params);
694 else :
695 ?>
696 <ul class="options">
697 <?php foreach ($options as $value => $label) : ?>
698 <li><label><input type="radio" name="<?php print $inputName; ?>"
699 value="<?php print $value; ?>"
700 <?php print $checked[$value]; ?> />
701 <?php print $label; ?></label></li>
702 <?php endforeach; ?>
703 </ul> <!-- class="options" -->
704 <?php
705 endif;
706
707 if ($offerSiteWide) :
708 if ($defaultInputName != $inputName) :
709 // Close the <li> and <ul class="options"> we opened above
710 ?>
711 </li>
712 </ul> <!-- class="options" -->
713 <?php
714 endif;
715
716 // Close off the twofer table that we opened up above.
717 ?>
718 </td></tr>
719 </tbody>
720 </table>
721 <?php
722 endif;
723 } /* FeedWordPressAdminPage::setting_radio_control () */
724
725 function save_button ($caption = NULL) {
726 if (is_null($caption)) : $caption = __('Save Changes'); endif;
727 ?>
728 <p class="submit">
729 <input class="button-primary" type="submit" name="save" value="<?php print $caption; ?>" />
730 </p>
731 <?php
732 }
733 } /* class FeedWordPressAdminPage */
734
735 function fwp_authors_single_submit ($link = NULL) {
736 ?>
737 <div class="submitbox" id="submitlink">
738 <div id="previewview">
739 </div>
740 <div class="inside">
741 </div>
742
743 <p class="submit">
744 <input type="submit" name="save" value="<?php _e('Save') ?>" />
745 </p>
746 </div>
747 <?php
748 }
749
750 function fwp_option_box_opener ($legend, $id, $class = "stuffbox") {
751 ?>
752 <div id="<?php print $id; ?>" class="<?php print $class; ?>">
753 <h3><?php print htmlspecialchars($legend); ?></h3>
754 <div class="inside">
755 <?php
756 }
757
758 function fwp_option_box_closer () {
759 ?>
760 </div> <!-- class="inside" -->
761 </div> <!-- class="stuffbox" -->
762 <?php
763 }
764
765 function fwp_tags_box ($tags, $object, $params = array()) {
766 $params = wp_parse_args($params, array( // Default values
767 'taxonomy' => 'post_tag',
768 'textarea_name' => NULL,
769 'textarea_id' => NULL,
770 'input_id' => NULL,
771 'input_name' => NULL,
772 'id' => NULL,
773 'box_title' => __('Post Tags'),
774 ));
775
776 if (!is_array($tags)) : $tags = array(); endif;
777
778 $tax_name = $params['taxonomy'];
779 $taxonomy = get_taxonomy($params['taxonomy']);
780 $disabled = (!current_user_can($taxonomy->cap->assign_terms) ? 'disabled="disabled"' : '');
781
782 $desc = "<p style=\"font-size:smaller;font-style:bold;margin:0\">Tag $object as...</p>";
783
784 if (is_null($params['textarea_name'])) :
785 $params['textarea_name'] = "tax_input[$tax_name]";
786 endif;
787 if (is_null($params['textarea_id'])) :
788 $params['textarea_id'] = "tax-input-${tax_name}";
789 endif;
790 if (is_null($params['input_id'])) :
791 $params['input_id'] = "new-tag-${tax_name}";
792 endif;
793 if (is_null($params['input_name'])) :
794 $params['input_name'] = "newtag[$tax_name]";
795 endif;
796
797 if (is_null($params['id'])) :
798 $params['id'] = $tax_name;
799 endif;
800
801 print $desc;
802 $helps = __('Separate tags with commas.');
803 $box['title'] = __('Tags');
804 ?>
805 <div class="tagsdiv" id="<?php echo $params['id']; ?>">
806 <div class="jaxtag">
807 <div class="nojs-tags hide-if-js">
808 <p><?php echo $taxonomy->labels->add_or_remove_items; ?></p>
809 <textarea name="<?php echo $params['textarea_name']; ?>" class="the-tags" id="<?php echo $params['textarea_id']; ?>"><?php echo esc_attr(implode(",", $tags)); ?></textarea></div>
810
811 <?php if ( current_user_can($taxonomy->cap->assign_terms) ) :?>
812 <div class="ajaxtag hide-if-no-js">
813 <label class="screen-reader-text" for="<?php echo $params['input_id']; ?>"><?php echo $params['box_title']; ?></label>
814 <div class="taghint"><?php echo $taxonomy->labels->add_new_item; ?></div>
815 <p><input type="text" id="<?php print $params['input_id']; ?>" name="<?php print $params['input_name']; ?>" class="newtag form-input-tip" size="16" autocomplete="off" value="" />
816 <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" tabindex="3" /></p>
817 </div>
818 <p class="howto"><?php echo esc_attr( $taxonomy->labels->separate_items_with_commas ); ?></p>
819 <?php endif; ?>
820 </div>
821
822 <div class="tagchecklist"></div>
823 </div>
824 <?php if ( current_user_can($taxonomy->cap->assign_terms) ) : ?>
825 <p class="hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->choose_from_most_used; ?></a></p>
826 <?php endif;
827
828 }
829
830 function fwp_category_box ($checked, $object, $tags = array(), $params = array()) {
831 global $wp_db_version;
832
833 if (is_string($params)) :
834 $prefix = $params;
835 $taxonomy = 'category';
836 elseif (is_array($params)) :
837 $prefix = (isset($params['prefix']) ? $params['prefix'] : '');
838 $taxonomy = (isset($params['taxonomy']) ? $params['taxonomy'] : 'category');
839 endif;
840 $tax = get_taxonomy($taxonomy);
841
842 if (strlen($prefix) > 0) :
843 $idPrefix = $prefix.'-';
844 $idSuffix = "-".$prefix;
845 $namePrefix = $prefix . '_';
846 else :
847 $idPrefix = 'feedwordpress-';
848 $idSuffix = "-feedwordpress";
849 $namePrefix = 'feedwordpress_';
850 endif;
851
852 ?>
853 <div id="<?php print $idPrefix; ?>taxonomy-<?php print $taxonomy; ?>" class="feedwordpress-category-div">
854 <ul id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-tabs" class="category-tabs">
855 <li class="ui-tabs-selected tabs"><a href="#<?php print $idPrefix; ?><?php print $taxonomy; ?>-all" tabindex="3"><?php _e( 'All posts' ); ?></a>
856 <p style="font-size:smaller;font-style:bold;margin:0">Give <?php print $object; ?> these <?php print $tax->labels->name; ?></p>
857 </li>
858 </ul>
859
860 <div id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-all" class="tabs-panel">
861 <input type="hidden" value="0" name="tax_input[<?php print $taxonomy; ?>][]" />
862 <ul id="<?php print $idPrefix; ?><?php print $taxonomy; ?>checklist" class="list:<?php print $taxonomy; ?> categorychecklist form-no-clear">
863 <?php fwp_category_checklist(NULL, false, $checked, $params) ?>
864 </ul>
865 </div>
866
867 <div id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-adder" class="<?php print $taxonomy; ?>-adder wp-hidden-children">
868 <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>
869 <p id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add" class="category-add wp-hidden-child">
870 <?php
871 $newcat = 'new'.$taxonomy;
872
873 ?>
874 <label class="screen-reader-text" for="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>"><?php _e('Add New Category'); ?></label>
875 <input
876 id="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>"
877 class="new<?php print $taxonomy; ?> form-required form-input-tip"
878 aria-required="true"
879 tabindex="3"
880 type="text" name="<?php print $newcat; ?>"
881 value="<?php _e( 'New category name' ); ?>"
882 />
883 <label class="screen-reader-text" for="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>-parent"><?php _e('Parent Category:'); ?></label>
884 <?php wp_dropdown_categories( array(
885 'taxonomy' => $taxonomy,
886 'hide_empty' => 0,
887 'id' => $idPrefix.'new'.$taxonomy.'-parent',
888 'class' => 'new'.$taxonomy.'-parent',
889 'name' => $newcat.'_parent',
890 'orderby' => 'name',
891 'hierarchical' => 1,
892 'show_option_none' => __('Parent category'),
893 'tab_index' => 3,
894 ) ); ?>
895 <input type="button" id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add-sumbit" class="add:<?php print $idPrefix; ?><?php print $taxonomy; ?>checklist:<?php print $idPrefix.$taxonomy; ?>-add add-categorychecklist-category-add button category-add-submit" value="<?php _e( 'Add' ); ?>" tabindex="3" />
896 <?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 */ ?>
897 <input type="hidden" id="_ajax_nonce<?php print esc_html($idSuffix); ?>" name="_ajax_nonce" value="<?php print wp_create_nonce('add-'.$taxonomy); ?>" />
898 <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); ?>" />
899 <span id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-ajax-response" class="<?php print $taxonomy; ?>-ajax-response"></span>
900 </p>
901 </div>
902
903 </div>
904 <?php
905 }
906
907 function update_feeds_mention ($feed) {
908 echo "<li>Updating <cite>".$feed['link/name']."</cite> from &lt;<a href=\""
909 .$feed['link/uri']."\">".$feed['link/uri']."</a>&gt; ...";
910 flush();
911 }
912 function update_feeds_finish ($feed, $added, $dt) {
913 if (is_wp_error($added)) :
914 $mesgs = $added->get_error_messages();
915 foreach ($mesgs as $mesg) :
916 echo "<br/><strong>Feed error:</strong> <code>$mesg</code>";
917 endforeach;
918 echo "</li>\n";
919 else :
920 echo " completed in $dt second".(($dt==1)?'':'s')."</li>\n";
921 endif;
922 flush();
923 }
924
925 function fwp_author_list () {
926 global $wpdb;
927 $ret = array();
928
929 $users = get_users_of_blog();
930 if (is_array($users)) :
931 foreach ($users as $user) :
932 $id = (int) $user->ID;
933 $ret[$id] = $user->display_name;
934 if (strlen(trim($ret[$id])) == 0) :
935 $ret[$id] = $user->user_login;
936 endif;
937 endforeach;
938 endif;
939 return $ret;
940 }
941
942 class FeedWordPressSettingsUI {
943 function is_admin () {
944 global $fwp_path;
945
946 $admin_page = false; // Innocent until proven guilty
947 if (isset($_REQUEST['page'])) :
948 $admin_page = (
949 is_admin()
950 and preg_match("|^{$fwp_path}/|", $_REQUEST['page'])
951 );
952 endif;
953 return $admin_page;
954 }
955
956 function admin_scripts () {
957 global $fwp_path;
958
959 wp_enqueue_script('post'); // for magic tag and category boxes
960 wp_enqueue_script('admin-forms'); // for checkbox selection
961
962 wp_register_script('feedwordpress-elements', WP_PLUGIN_URL.'/'.$fwp_path.'/feedwordpress-elements.js');
963 wp_enqueue_script('feedwordpress-elements');
964 }
965
966 function admin_styles () {
967 ?>
968 <style type="text/css">
969 #feedwordpress-admin-feeds .link-rss-params-remove .x, .feedwordpress-admin .remove-it .x {
970 background: url(<?php print admin_url('images/xit.gif') ?>) no-repeat scroll 0 0 transparent;
971 }
972
973 #feedwordpress-admin-feeds .link-rss-params-remove:hover .x, .feedwordpress-admin .remove-it:hover .x {
974 background: url(<?php print admin_url('images/xit.gif') ?>) no-repeat scroll -10px 0 transparent;
975 }
976
977 .fwpfs {
978 background-image: url(<?php print admin_url('images/fav.png'); ?>);
979 background-repeat: repeat-x;
980 background-position: left center;
981 background-attachment: scroll;
982 }
983 .fwpfs.slide-down {
984 background-image:url(<?php print admin_url('images/fav-top.png'); ?>);
985 background-position:0 top;
986 background-repeat:repeat-x;
987 }
988
989 .update-results {
990 max-width: 100%;
991 overflow: auto;
992 }
993
994 </style>
995 <?php
996 } /* FeedWordPressSettingsUI::admin_styles () */
997
998 /*static*/ function ajax_nonce_fields () {
999 if (function_exists('wp_nonce_field')) :
1000 echo "<form style='display: none' method='get' action=''>\n<p>\n";
1001 wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
1002 wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
1003 echo "</p>\n</form>\n";
1004 endif;
1005 } /* FeedWordPressSettingsUI::ajax_nonce_fields () */
1006
1007 /*static*/ function fix_toggles_js ($context) {
1008 ?>
1009 <script type="text/javascript">
1010 jQuery(document).ready( function($) {
1011 // In case someone got here first...
1012 $('.postbox h3, .postbox .handlediv').unbind('click');
1013 $('.postbox h3 a').unbind('click');
1014 $('.hide-postbox-tog').unbind('click');
1015 $('.columns-prefs input[type="radio"]').unbind('click');
1016 $('.meta-box-sortables').sortable('destroy');
1017
1018 postboxes.add_postbox_toggles('<?php print $context; ?>');
1019 } );
1020 </script>
1021 <?php
1022 } /* FeedWordPressSettingsUI::fix_toggles_js () */
1023
1024 function magic_input_tip_js ($id) {
1025 if (!preg_match('/^[.#]/', $id)) :
1026 $id = '#'.$id;
1027 endif;
1028 ?>
1029 <script type="text/javascript">
1030 jQuery(document).ready( function () {
1031 var inputBox = jQuery("<?php print $id; ?>");
1032 var boxEl = inputBox.get(0);
1033 if (boxEl.value==boxEl.defaultValue) { inputBox.addClass('form-input-tip'); }
1034 inputBox.focus(function() {
1035 if ( this.value == this.defaultValue )
1036 jQuery(this).val( '' ).removeClass( 'form-input-tip' );
1037 });
1038 inputBox.blur(function() {
1039 if ( this.value == '' )
1040 jQuery(this).val( this.defaultValue ).addClass( 'form-input-tip' );
1041 });
1042 } );
1043 </script>
1044 <?php
1045 } /* FeedWordPressSettingsUI::magic_input_tip_js () */
1046 } /* class FeedWordPressSettingsUI */
1047
1048 function fwp_insert_new_user ($newuser_name) {
1049 global $wpdb;
1050
1051 $ret = null;
1052 if (strlen($newuser_name) > 0) :
1053 $userdata = array();
1054 $userdata['ID'] = NULL;
1055 $userdata['user_login'] = apply_filters('pre_user_login', sanitize_user($newuser_name));
1056 $userdata['user_nicename'] = apply_filters('pre_user_nicename', sanitize_title($newuser_name));
1057 $userdata['display_name'] = $newuser_name;
1058 $userdata['user_pass'] = substr(md5(uniqid(microtime())), 0, 6); // just something random to lock it up
1059
1060 $blahUrl = get_bloginfo('url'); $url = parse_url($blahUrl);
1061 $userdata['user_email'] = substr(md5(uniqid(microtime())), 0, 6).'@'.$url['host'];
1062
1063 $newuser_id = wp_insert_user($userdata);
1064 $ret = $newuser_id; // Either a numeric ID or a WP_Error object
1065 else :
1066 // TODO: Add some error reporting
1067 endif;
1068 return $ret;
1069 } /* fwp_insert_new_user () */
1070
1071 /**
1072 * fwp_add_meta_box
1073 *
1074 * This function is no longer necessary, since no versions of WordPress that FWP
1075 * still supports lack add_meta_box(). But I've left it in place for the time
1076 * being for add-on modules that may have used it in setting up their UI.
1077 */
1078 function fwp_add_meta_box ($id, $title, $callback, $page, $context = 'advanced', $priority = 'default', $callback_args = null) {
1079 return add_meta_box($id, $title, $callback, $page, $context, $priority, $callback_args);
1080 } /* function fwp_add_meta_box () */
1081
1082 function fwp_do_meta_boxes($page, $context, $object) {
1083 $ret = do_meta_boxes($page, $context, $object);
1084
1085 // Avoid JavaScript error from WordPress 2.5 bug
1086 ?>
1087 <div style="display: none">
1088 <div id="tags-input"></div> <!-- avoid JS error from WP 2.5 bug -->
1089 </div>
1090 <?php
1091 return $ret;
1092 } /* function fwp_do_meta_boxes() */
1093
1094 function fwp_remove_meta_box($id, $page, $context) {
1095 return remove_meta_box($id, $page, $context);
1096 } /* function fwp_remove_meta_box() */
1097
1098 function fwp_syndication_manage_page_links_table_rows ($links, $page, $visible = 'Y') {
1099
1100 $subscribed = ('Y' == strtoupper($visible));
1101 if ($subscribed or (count($links) > 0)) :
1102 ?>
1103 <table class="widefat<?php if (!$subscribed) : ?> unsubscribed<?php endif; ?>">
1104 <thead>
1105 <tr>
1106 <th class="check-column" scope="col"><input type="checkbox" /></th>
1107 <th scope="col"><?php _e('Name'); ?></th>
1108 <th scope="col"><?php _e('Feed'); ?></th>
1109 <th scope="col"><?php _e('Updated'); ?></th>
1110 </tr>
1111 </thead>
1112
1113 <tbody>
1114 <?php
1115 $alt_row = true;
1116 if (count($links) > 0):
1117 foreach ($links as $link):
1118 $trClass = array();
1119
1120 // Prep: Get last updated timestamp
1121 $sLink = new SyndicatedLink($link->link_id);
1122 if (!is_null($sLink->setting('update/last'))) :
1123 $lastUpdated = 'Last checked '. fwp_time_elapsed($sLink->setting('update/last'));
1124 else :
1125 $lastUpdated = __('None yet');
1126 endif;
1127
1128 // Prep: get last error timestamp, if any
1129 $fileSizeLines = array();
1130 if (is_null($sLink->setting('update/error'))) :
1131 $errorsSince = '';
1132 if (!is_null($sLink->setting('link/item count'))) :
1133 $N = $sLink->setting('link/item count');
1134 $fileSizeLines[] = sprintf((($N==1) ? __('%d item') : __('%d items')), $N);
1135 endif;
1136
1137 if (!is_null($sLink->setting('link/filesize'))) :
1138 $fileSizeLines[] = size_format($sLink->setting('link/filesize')). ' total';
1139 endif;
1140 else :
1141 $trClass[] = 'feed-error';
1142
1143 $theError = unserialize($sLink->setting('update/error'));
1144
1145 $errorsSince = "<div class=\"returning-errors\">"
1146 ."<p><strong>Returning errors</strong> since "
1147 .fwp_time_elapsed($theError['since'])
1148 ."</p>"
1149 ."<p>Most recent ("
1150 .fwp_time_elapsed($theError['ts'])
1151 ."):<br/><code>"
1152 .implode("</code><br/><code>", $theError['object']->get_error_messages())
1153 ."</code></p>"
1154 ."</div>\n";
1155 endif;
1156
1157 $nextUpdate = "<div style='max-width: 30.0em; font-size: 0.9em;'><div style='font-style:italic;'>";
1158
1159 $ttl = $sLink->setting('update/ttl');
1160 if (is_numeric($ttl)) :
1161 $next = $sLink->setting('update/last') + $sLink->setting('update/fudge') + ((int) $ttl * 60);
1162 if ('automatically'==$sLink->setting('update/timed')) :
1163 if ($next < time()) :
1164 $nextUpdate .= 'Ready and waiting to be updated since ';
1165 else :
1166 $nextUpdate .= 'Scheduled for next update ';
1167 endif;
1168 $nextUpdate .= fwp_time_elapsed($next);
1169 if (FEEDWORDPRESS_DEBUG) : $nextUpdate .= " [".(($next-time())/60)." minutes]"; endif;
1170 else :
1171 $lastUpdated .= " &middot; Next ";
1172 if ($next < time()) :
1173 $lastUpdated .= 'ASAP';
1174 elseif ($next - time() < 60) :
1175 $lastUpdated .= fwp_time_elapsed($next);
1176 elseif ($next - time() < 60*60*24) :
1177 $lastUpdated .= gmdate('g:ia', $next + (get_option('gmt_offset') * 3600));
1178 else :
1179 $lastUpdated .= gmdate('F j', $next + (get_option('gmt_offset') * 3600));
1180 endif;
1181
1182 $nextUpdate .= "Scheduled to be checked for updates every ".$ttl." minute".(($ttl!=1)?"s":"")."</div><div style='size:0.9em; margin-top: 0.5em'> This update schedule was requested by the feed provider";
1183 if ($sLink->setting('update/xml')) :
1184 $nextUpdate .= " using a standard <code style=\"font-size: inherit; padding: 0; background: transparent\">&lt;".$sLink->setting('update/xml')."&gt;</code> element";
1185 endif;
1186 $nextUpdate .= ".";
1187 endif;
1188 else:
1189 $nextUpdate .= "Scheduled for update as soon as possible";
1190 endif;
1191 $nextUpdate .= "</div></div>";
1192
1193 $fileSize = '';
1194 if (count($fileSizeLines) > 0) :
1195 $fileSize = '<div>'.implode(" / ", $fileSizeLines)."</div>";
1196 endif;
1197
1198 unset($sLink);
1199
1200 $alt_row = !$alt_row;
1201
1202 if ($alt_row) :
1203 $trClass[] = 'alternate';
1204 endif;
1205 ?>
1206 <tr<?php echo ((count($trClass) > 0) ? ' class="'.implode(" ", $trClass).'"':''); ?>>
1207 <th class="check-column" scope="row"><input type="checkbox" name="link_ids[]" value="<?php echo $link->link_id; ?>" /></th>
1208 <?php
1209 $caption = (
1210 (strlen($link->link_rss) > 0)
1211 ? __('Switch Feed')
1212 : $caption=__('Find Feed')
1213 );
1214 ?>
1215 <td>
1216 <strong><a href="<?php print $page->admin_page_href('feeds-page.php', array(), $link); ?>"><?php print esc_html($link->link_name); ?></a></strong>
1217 <div class="row-actions"><?php if ($subscribed) :
1218 $page->display_feed_settings_page_links(array(
1219 'before' => '<div><strong>Settings &gt;</strong> ',
1220 'after' => '</div>',
1221 'subscription' => $link,
1222 ));
1223 endif; ?>
1224
1225 <div><strong>Actions &gt;</strong>
1226 <?php if ($subscribed) : ?>
1227 <a href="<?php print $page->admin_page_href('syndication.php', array('action' => 'feedfinder'), $link); ?>"><?php echo $caption; ?></a>
1228 <?php else : ?>
1229 <a href="<?php print $page->admin_page_href('syndication.php', array('action' => FWP_RESUB_CHECKED), $link); ?>"><?php _e('Re-subscribe'); ?></a>
1230 <?php endif; ?>
1231 | <a href="<?php print $page->admin_page_href('syndication.php', array('action' => 'Unsubscribe'), $link); ?>"><?php _e(($subscribed ? 'Unsubscribe' : 'Delete permanently')); ?></a>
1232 | <a href="<?php print esc_html($link->link_url); ?>"><?php _e('View')?></a></div>
1233 </div>
1234 </td>
1235 <?php if (strlen($link->link_rss) > 0): ?>
1236 <td><a href="<?php echo esc_html($link->link_rss); ?>"><?php echo esc_html(feedwordpress_display_url($link->link_rss, 32)); ?></a></td>
1237 <?php else: ?>
1238 <td class="feed-missing"><p><strong>no feed assigned</strong></p></td>
1239 <?php endif; ?>
1240
1241 <td><div style="float: right; padding-left: 10px">
1242 <input type="submit" class="button" name="update_uri[<?php print esc_html($link->link_rss); ?>]" value="<?php _e('Update Now'); ?>" />
1243 </div>
1244 <?php print $lastUpdated; ?>
1245 <?php print $fileSize; ?>
1246 <?php print $errorsSince; ?>
1247 <?php print $nextUpdate; ?>
1248 </td>
1249 </tr>
1250 <?php
1251 endforeach;
1252 else :
1253 ?>
1254 <tr><td colspan="4"><p>There are no websites currently listed for syndication.</p></td></tr>
1255 <?php
1256 endif;
1257 ?>
1258 </tbody>
1259 </table>
1260 <?php
1261 endif;
1262 } /* function fwp_syndication_manage_page_links_table_rows () */
1263
1264