PluginProbe
FeedWordPress / 2010.0905
FeedWordPress v2010.0905
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 2010.0905, at admin-ui.php

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