PluginProbe
FeedWordPress / 2011.0512
FeedWordPress v2011.0512
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 2011.0512, at admin-ui.php

1,200 lines 38.2 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 = $_REQUEST['save_link_id'];
167 endif;
168 endforeach;
169
170 if (is_null($link_id) and isset($_REQUEST['link_id'])) :
171 $link_id = $_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_html($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 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
315 function display_feed_select_dropdown() {
316 $links = FeedWordPress::syndicated_links();
317
318 ?>
319 <div id="fwpfs-container"><ul class="subsubsub">
320 <li><select name="link_id" class="fwpfs" style="max-width: 20.0em;">
321 <option value="*"<?php if ($this->for_default_settings()) : ?> selected="selected"<?php endif; ?>>- defaults for all feeds -</option>
322 <?php if ($links) : foreach ($links as $ddlink) : ?>
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>
324 <?php endforeach; endif; ?>
325 </select>
326 <input id="fwpfs-button" class="button" type="submit" name="go" value="<?php _e('Go') ?> &raquo;" /></li>
327
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
345 } /* FeedWordPressAdminPage::display_feed_select_dropdown() */
346
347 function display_sheet_header ($pagename = 'Syndication', $all = false) {
348 ?>
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>
351 <?php
352 }
353
354 function display_update_notice_if_updated ($pagename = 'Syndication', $mesg = NULL) {
355 if (!is_null($mesg)) :
356 $this->mesg = $mesg;
357 endif;
358
359 if ($this->updated) :
360 if ($this->updated === true) :
361 $this->mesg = $pagename . ' settings updated.';
362 else :
363 $this->mesg = $this->updated;
364 endif;
365 endif;
366
367 if (!is_null($this->mesg)) :
368 ?>
369 <div class="updated">
370 <p><?php print esc_html($this->mesg); ?></p>
371 </div>
372 <?php
373 endif;
374 } /* FeedWordPressAdminPage::display_update_notice_if_updated() */
375
376 function display_settings_scope_message () {
377 if ($this->for_feed_settings()) :
378 ?>
379 <p>These settings only affect posts syndicated from
380 <strong><?php echo esc_html($this->link->link->link_name); ?></strong>.</p>
381 <?php
382 else :
383 ?>
384 <p>These settings affect posts syndicated from any feed unless they are overridden
385 by settings for that specific feed.</p>
386 <?php
387 endif;
388 } /* FeedWordPressAdminPage::display_settings_scope_message () */
389
390 /*static*/ function has_link () { return true; }
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
464 function open_sheet ($header) {
465 // Set up prepatory AJAX stuff
466 ?>
467 <script type="text/javascript">
468 <?php
469 $this->ajax_interface_js();
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();
480
481 ?>
482 <div class="wrap feedwordpress-admin" id="feedwordpress-admin-<?php print $this->pageslug(); ?>">
483 <?php
484 if (!is_null($header)) :
485 $this->display_sheet_header($header);
486 endif;
487
488 if (!is_null($this->dispatch)) :
489 ?>
490 <form action="<?php print $this->form_action(); ?>" method="post">
491 <div><?php
492 FeedWordPressCompatibility::stamp_nonce($this->dispatch);
493 $this->stamp_link_id();
494 ?></div>
495 <?php
496 endif;
497
498 if ($this->has_link()) :
499 $this->display_settings_scope_message();
500 endif;
501
502 ?><div class="tablenav"><?php
503 if (!is_null($this->dispatch)) :
504 ?><div class="alignright"><?php
505 $this->save_button();
506 ?></div><?php
507 endif;
508
509 if ($this->has_link()) :
510 $this->display_feed_select_dropdown();
511 endif;
512 ?>
513 </div>
514
515 <div id="poststuff">
516 <?php
517 } /* FeedWordPressAdminPage::open_sheet () */
518
519 function close_sheet () {
520 ?>
521
522 </div> <!-- id="poststuff" -->
523 <?php
524 if (!is_null($this->dispatch)) :
525 $this->save_button();
526 print "</form>\n";
527 endif;
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;
552
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;
578
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;
591
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));
603
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) {
702 if (is_null($caption)) : $caption = __('Save Changes'); endif;
703 ?>
704 <p class="submit">
705 <input class="button-primary" type="submit" name="save" value="<?php print $caption; ?>" />
706 </p>
707 <?php
708 }
709 } /* class FeedWordPressAdminPage */
710
711 function fwp_authors_single_submit ($link = NULL) {
712 ?>
713 <div class="submitbox" id="submitlink">
714 <div id="previewview">
715 </div>
716 <div class="inside">
717 </div>
718
719 <p class="submit">
720 <input type="submit" name="save" value="<?php _e('Save') ?>" />
721 </p>
722 </div>
723 <?php
724 }
725
726 function fwp_option_box_opener ($legend, $id, $class = "stuffbox") {
727 ?>
728 <div id="<?php print $id; ?>" class="<?php print $class; ?>">
729 <h3><?php print htmlspecialchars($legend); ?></h3>
730 <div class="inside">
731 <?php
732 }
733
734 function fwp_option_box_closer () {
735 global $wp_db_version;
736 if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
737 ?>
738 </div> <!-- class="inside" -->
739 </div> <!-- class="stuffbox" -->
740 <?php
741 else :
742 ?>
743 </div> <!-- class="wrap" -->
744 <?php
745 endif;
746 }
747
748 function fwp_tags_box ($tags, $object, $params = array()) {
749 if (!is_array($tags)) : $tags = array(); endif;
750 $tax_name = (isset($params['taxonomy']) ? $params['taxonomy'] : 'post_tag');
751 $desc = "<p style=\"font-size:smaller;font-style:bold;margin:0\">Tag $object as...</p>";
752
753 if (isset($params['textarea_name'])) :
754 $textAreaName = $params['textarea_name'];
755 else :
756 $textAreaName = "tax_input[$tax_name]";
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
781 }
782
783 function fwp_category_box ($checked, $object, $tags = array(), $params = array()) {
784 global $wp_db_version;
785
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
805 ?>
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>
858 </p>
859 </div>
860
861 </div>
862 <?php
863 }
864
865 function update_feeds_mention ($feed) {
866 echo "<li>Updating <cite>".$feed['link/name']."</cite> from &lt;<a href=\""
867 .$feed['link/uri']."\">".$feed['link/uri']."</a>&gt; ...";
868 flush();
869 }
870 function update_feeds_finish ($feed, $added, $dt) {
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();
881 }
882
883 function fwp_author_list () {
884 global $wpdb;
885 $ret = array();
886
887 $users = get_users_of_blog();
888 if (is_array($users)) :
889 foreach ($users as $user) :
890 $id = (int) $user->ID;
891 $ret[$id] = $user->display_name;
892 if (strlen(trim($ret[$id])) == 0) :
893 $ret[$id] = $user->user_login;
894 endif;
895 endforeach;
896 endif;
897 return $ret;
898 }
899
900 class FeedWordPressSettingsUI {
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 );
910 endif;
911 return $admin_page;
912 }
913
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
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 }
926
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 () */
952
953 /*static*/ function ajax_nonce_fields () {
954 if (function_exists('wp_nonce_field')) :
955 echo "<form style='display: none' method='get' action=''>\n<p>\n";
956 wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
957 wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
958 echo "</p>\n</form>\n";
959 endif;
960 } /* FeedWordPressSettingsUI::ajax_nonce_fields () */
961
962 /*static*/ function fix_toggles_js ($context) {
963 ?>
964 <script type="text/javascript">
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');
972
973 postboxes.add_postbox_toggles('<?php print $context; ?>');
974 } );
975 </script>
976 <?php
977 } /* FeedWordPressSettingsUI::fix_toggles_js () */
978
979 function magic_input_tip_js ($id) {
980 if (!preg_match('/^[.#]/', $id)) :
981 $id = '#'.$id;
982 endif;
983 ?>
984 <script type="text/javascript">
985 jQuery(document).ready( function () {
986 var inputBox = jQuery("<?php print $id; ?>");
987 var boxEl = inputBox.get(0);
988 if (boxEl.value==boxEl.defaultValue) { inputBox.addClass('form-input-tip'); }
989 inputBox.focus(function() {
990 if ( this.value == this.defaultValue )
991 jQuery(this).val( '' ).removeClass( 'form-input-tip' );
992 });
993 inputBox.blur(function() {
994 if ( this.value == '' )
995 jQuery(this).val( this.defaultValue ).addClass( 'form-input-tip' );
996 });
997 } );
998 </script>
999 <?php
1000 } /* FeedWordPressSettingsUI::magic_input_tip_js () */
1001 } /* class FeedWordPressSettingsUI */
1002
1003 function fwp_insert_new_user ($newuser_name) {
1004 global $wpdb;
1005
1006 $ret = null;
1007 if (strlen($newuser_name) > 0) :
1008 $userdata = array();
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
1014
1015 $blahUrl = get_bloginfo('url'); $url = parse_url($blahUrl);
1016 $userdata['user_email'] = substr(md5(uniqid(microtime())), 0, 6).'@'.$url['host'];
1017
1018 $newuser_id = wp_insert_user($userdata);
1019 $ret = $newuser_id; // Either a numeric ID or a WP_Error object
1020 else :
1021 // TODO: Add some error reporting
1022 endif;
1023 return $ret;
1024 } /* fwp_insert_new_user () */
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 */
1033 function fwp_add_meta_box ($id, $title, $callback, $page, $context = 'advanced', $priority = 'default', $callback_args = null) {
1034 return add_meta_box($id, $title, $callback, $page, $context, $priority, $callback_args);
1035 } /* function fwp_add_meta_box () */
1036
1037 function fwp_do_meta_boxes($page, $context, $object) {
1038 $ret = do_meta_boxes($page, $context, $object);
1039
1040 // Avoid JavaScript error from WordPress 2.5 bug
1041 ?>
1042 <div style="display: none">
1043 <div id="tags-input"></div> <!-- avoid JS error from WP 2.5 bug -->
1044 </div>
1045 <?php
1046 return $ret;
1047 } /* function fwp_do_meta_boxes() */
1048
1049 function fwp_remove_meta_box($id, $page, $context) {
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;
1055
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
1181 endif;
1182 } /* function fwp_syndication_manage_page_links_table_rows () */
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 }
1199
1200