PluginProbe
FeedWordPress / 2010.0127
FeedWordPress v2010.0127
trunk 0.8 0.9 0.91 0.95 0.96 0.97 0.98 0.981 0.99 0.991 0.992 0.993 2008.1030 2008.1101 2008.1105 2008.1214 2009.0612 2009.0613 2009.0618 2009.0707 2009.1111 2009.1112 2010.0127 2010.0528 All 65 releases
← All changes | posts-page.php +465 -380 2009.06132010.0127 View file →
@@ -1,443 +1,528 @@
1 1 <?php
2 2 require_once(dirname(__FILE__) . '/admin-ui.php');
3 +require_once(dirname(__FILE__) . '/updatedpostscontrol.class.php');
3 4
4 -function fwp_posts_page () {
5 - global $wpdb, $wp_db_version;
5 +class FeedWordPressPostsPage extends FeedWordPressAdminPage {
6 + var $link = NULL;
7 + var $updatedPosts = NULL;
6 8
7 - FeedWordPressCompatibility::validate_http_request(/*action=*/ 'feedwordpress_posts_settings', /*capability=*/ 'manage_links');
9 + /**
10 + * Construct the posts page object.
11 + *
12 + * @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings
13 + */
14 + function FeedWordPressPostsPage ($link = NULL) {
15 + FeedWordPressAdminPage::FeedWordPressAdminPage('feedwordpresspostspage', $link);
16 + $this->dispatch = 'feedwordpress_posts_settings';
17 + $this->filename = __FILE__;
18 + $this->updatedPosts = new UpdatedPostsControl($this);
19 + } /* FeedWordPressPostsPage constructor */
8 20
9 - if (isset($GLOBALS['fwp_post']['save']) or isset($GLOBALS['fwp_post']['fix_mismatch'])) :
10 - $link_id = $_REQUEST['save_link_id'];
11 - elseif (isset($_REQUEST['link_id'])) :
12 - $link_id = $_REQUEST['link_id'];
13 - else :
14 - $link_id = NULL;
15 - endif;
21 + function accept_POST ($post) {
22 + global $wpdb;
23 +
24 + $link_id = $this->link->id;
16 25
17 - if (is_numeric($link_id) and $link_id) :
18 - $link =& new SyndicatedLink($link_id);
19 - else :
20 - $link = NULL;
21 - endif;
26 + // User mashed a Save Changes button
27 + if (isset($post['save']) or isset($post['submit'])) :
28 + // custom post settings
29 + foreach ($post['notes'] as $mn) :
30 + $mn['key0'] = trim($mn['key0']);
31 + $mn['key1'] = trim($mn['key1']);
32 +
33 + if (strlen($mn['key0']) > 0) :
34 + unset($custom_settings[$mn['key0']]); // out with the old
35 + endif;
36 +
37 + if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
38 + $custom_settings[$mn['key1']] = $mn['value']; // in with the new
39 + endif;
40 + endforeach;
41 +
42 + $this->updatedPosts->accept_POST($post);
43 + if ($this->for_feed_settings()) :
44 + $alter = array ();
45 +
46 + $this->link->settings['postmeta'] = serialize($custom_settings);
47 +
48 + if (isset($post['resolve_relative'])) :
49 + $this->link->settings['resolve relative'] = $post['resolve_relative'];
50 + endif;
51 +
52 + // Post status, comment status, ping status
53 + foreach (array('post', 'comment', 'ping') as $what) :
54 + $sfield = "feed_{$what}_status";
55 + if (isset($post[$sfield])) :
56 + if ($post[$sfield]=='site-default') :
57 + unset($this->link->settings["{$what} status"]);
58 + else :
59 + $this->link->settings["{$what} status"] = $post[$sfield];
60 + endif;
61 + endif;
62 + endforeach;
22 63
23 - $mesg = null;
24 -
25 - ////////////////////////////////////////////////
26 - // Process POST request, if any /////////////////
27 - ////////////////////////////////////////////////
28 - if (isset($GLOBALS['fwp_post']['save'])) :
29 - // custom post settings
30 - foreach ($GLOBALS['fwp_post']['notes'] as $mn) :
31 - $mn['key0'] = trim($mn['key0']);
32 - $mn['key1'] = trim($mn['key1']);
33 -
34 - if (strlen($mn['key0']) > 0) :
35 - unset($custom_settings[$mn['key0']]); // out with the old
36 - endif;
64 + $alter[] = "link_notes = '".$wpdb->escape($this->link->settings_to_notes())."'";
65 + $alter_set = implode(", ", $alter);
66 +
67 + // issue update query
68 + $result = $wpdb->query("
69 + UPDATE $wpdb->links
70 + SET $alter_set
71 + WHERE link_id='$link_id'
72 + ");
73 + $this->updated = true;
37 74
38 - if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
39 - $custom_settings[$mn['key1']] = $mn['value']; // in with the new
40 - endif;
41 - endforeach;
75 + // reload link information from DB
76 + if (function_exists('clean_bookmark_cache')) :
77 + clean_bookmark_cache($link_id);
78 + endif;
79 + $link =& new SyndicatedLink($link_id);
80 + else :
81 + // update_option ...
82 + if (isset($post['feed_post_status'])) :
83 + update_option('feedwordpress_syndicated_post_status', $post['feed_post_status']);
84 + endif;
42 85
43 - if (is_object($link) and $link->found()) :
44 - $alter = array ();
86 + update_option('feedwordpress_custom_settings', serialize($custom_settings));
87 +
88 + update_option('feedwordpress_munge_permalink', $_REQUEST['munge_permalink']);
89 + update_option('feedwordpress_use_aggregator_source_data', $_REQUEST['use_aggregator_source_data']);
90 + update_option('feedwordpress_formatting_filters', $_REQUEST['formatting_filters']);
91 +
92 + if (isset($post['resolve_relative'])) :
93 + update_option('feedwordpress_resolve_relative', $post['resolve_relative']);
94 + endif;
95 + if (isset($_REQUEST['feed_comment_status']) and ($_REQUEST['feed_comment_status'] == 'open')) :
96 + update_option('feedwordpress_syndicated_comment_status', 'open');
97 + else :
98 + update_option('feedwordpress_syndicated_comment_status', 'closed');
99 + endif;
45 100
46 - $link->settings['postmeta'] = serialize($custom_settings);
47 -
48 - // Post status, comment status, ping status
49 - foreach (array('post', 'comment', 'ping') as $what) :
50 - $sfield = "feed_{$what}_status";
51 - if (isset($GLOBALS['fwp_post'][$sfield])) :
52 - if ($GLOBALS['fwp_post'][$sfield]=='site-default') :
53 - unset($link->settings["{$what} status"]);
54 - else :
55 - $link->settings["{$what} status"] = $GLOBALS['fwp_post'][$sfield];
56 - endif;
101 + if (isset($_REQUEST['feed_ping_status']) and ($_REQUEST['feed_ping_status'] == 'open')) :
102 + update_option('feedwordpress_syndicated_ping_status', 'open');
103 + else :
104 + update_option('feedwordpress_syndicated_ping_status', 'closed');
57 105 endif;
58 - endforeach;
59 -
60 - $alter[] = "link_notes = '".$wpdb->escape($link->settings_to_notes())."'";
106 +
107 + $this->updated = true;
108 + endif;
61 109
62 - $alter_set = implode(", ", $alter);
63 -
64 - // issue update query
65 - $result = $wpdb->query("
66 - UPDATE $wpdb->links
67 - SET $alter_set
68 - WHERE link_id='$link_id'
69 - ");
70 - $updated_link = true;
71 -
72 - // reload link information from DB
73 - if (function_exists('clean_bookmark_cache')) :
74 - clean_bookmark_cache($link_id);
75 - endif;
76 - $link =& new SyndicatedLink($link_id);
110 + // Probably a "Go" button for the drop-down
77 111 else :
78 - // update_option ...
79 - if (isset($GLOBALS['fwp_post']['feed_post_status'])) :
80 - update_option('feedwordpress_syndicated_post_status', $GLOBALS['fwp_post']['feed_post_status']);
81 - endif;
82 -
83 - update_option('feedwordpress_custom_settings', serialize($custom_settings));
112 + $this->updated = false;
113 + endif;
114 + }
84 115
85 - update_option('feedwordpress_munge_permalink', $_REQUEST['munge_permalink']);
86 - update_option('feedwordpress_use_aggregator_source_data', $_REQUEST['use_aggregator_source_data']);
87 - update_option('feedwordpress_formatting_filters', $_REQUEST['formatting_filters']);
88 -
89 - if (isset($_REQUEST['feed_comment_status']) and ($_REQUEST['feed_comment_status'] == 'open')) :
90 - update_option('feedwordpress_syndicated_comment_status', 'open');
91 - else :
92 - update_option('feedwordpress_syndicated_comment_status', 'closed');
93 - endif;
116 + /**
117 + * Outputs "Publication" settings box.
118 + *
119 + * @since 2009.0713
120 + * @param object $page of class FeedWordPressPostsPage tells us whether this is
121 + * a page for one feed's settings or for global defaults
122 + * @param array $box
123 + *
124 + * @uses FeedWordPressPostsPage::these_posts_phrase()
125 + * @uses FeedWordPress::syndicated_status()
126 + * @uses SyndicatedLink::syndicated_status()
127 + * @uses SyndicatedPost::use_api()
128 + * @uses fwp_option_box_opener()
129 + * @uses fwp_option_box_closer()
130 + */
131 + /*static*/ function publication_box ($page, $box = NULL) {
132 + global $fwp_path;
94 133
95 - if (isset($_REQUEST['feed_ping_status']) and ($_REQUEST['feed_ping_status'] == 'open')) :
96 - update_option('feedwordpress_syndicated_ping_status', 'open');
97 - else :
98 - update_option('feedwordpress_syndicated_ping_status', 'closed');
99 - endif;
134 + $post_status_global = FeedWordPress::syndicated_status('post', /*default=*/ 'publish');
135 + $thesePosts = $page->these_posts_phrase();
100 136
101 - $updated_link = true;
137 + // Set up array for selector
138 + $setting = array(
139 + 'publish' => array ('label' => "Publish %s immediately", 'checked' => ''),
140 + 'draft' => array('label' => "Save %s as drafts", 'checked' => ''),
141 + 'private' => array('label' => "Save %s as private posts", 'checked' => ''),
142 + );
143 + if (SyndicatedPost::use_api('post_status_pending')) :
144 + $setting['pending'] = array('label' => "Hold %s for review; mark as Pending", 'checked' => '');
102 145 endif;
103 - else :
104 - $updated_link = false;
105 - endif;
106 146
107 - ////////////////////////////////////////////////
108 - // Get defaults from database //////////////////
109 - ////////////////////////////////////////////////
110 147
111 - $post_status_global = get_option('feedwordpress_syndicated_post_status');
112 - if (!$post_status_global) : $post_status_global = 'publish'; endif;
148 + if ($page->for_feed_settings()) :
149 + $href = $fwp_path.'/'.basename(__FILE__);
150 + $currently = str_replace('%s', '', strtolower(strtok($setting[$post_status_global]['label'], ';')));
151 + $setting['site-default'] = array('label' => "Use <a href=\"admin.php?page=${href}\">site-wide setting</a>", 'checked' => '');
152 + $setting['site-default']['label'] .= " (currently: <strong>${currently}</strong>)";
113 153
114 - $comment_status_global = get_option('feedwordpress_syndicated_comment_status');
115 - if (!$comment_status_global) : $comment_status_global = 'closed'; endif;
154 + $checked = $page->link->syndicated_status('post', 'site-default', /*fallback=*/ false);
155 + else :
156 + $checked = $post_status_global;
157 + endif;
158 +
159 + // Re-order appropriately
160 + $selector = array();
161 + $order = array(
162 + 'site-default',
163 + 'publish',
164 + 'pending',
165 + 'draft',
166 + 'private',
167 + );
168 + foreach ($order as $line) :
169 + if (isset($setting[$line])) :
170 + $selector[$line] = $setting[$line];
171 + endif;
172 + endforeach;
173 + $selector[$checked]['checked'] = ' checked="checked"';
174 +
175 + // Hey ho, let's go...
176 + ?>
177 + <style type="text/css">
178 + #syndicated-publication-form th { width: 27%; vertical-align: top; }
179 + #syndicated-publication-form td { width: 73%; vertical-align: top; }
180 + </style>
181 +
182 + <table id="syndicated-publication-form" class="form-table" cellspacing="2" cellpadding="5">
183 + <tr><th scope="row"><?php _e('New posts:'); ?></th>
184 + <td><ul class="options">
185 + <?php foreach ($selector as $code => $li) : ?>
186 + <li><label><input type="radio" name="feed_post_status"
187 + value="<?php print $code; ?>"<?php print $li['checked']; ?> />
188 + <?php print str_replace('%s', $thesePosts, $li['label']); ?></label></li>
189 + <?php endforeach; ?>
190 + </ul></td>
191 + </tr>
116 192
117 - $ping_status_global = get_option('feedwordpress_syndicated_ping_status');
118 - if (!$ping_status_global) : $ping_status_global = 'closed'; endif;
193 + <?php $page->updatedPosts->display(); ?>
194 + </table>
195 +
196 + <?php
197 + } /* FeedWordPressPostsPage::publication_box () */
198 +
199 + /**
200 + * Outputs "Formatting" settings box
201 + *
202 + * @since 2009.0713
203 + * @param object $page of class FeedWordPressPostsPage tells us whether this is
204 + * a page for one feed's settings or for global defaults
205 + * @param array $box
206 + *
207 + * @uses fwp_option_box_opener()
208 + * @uses fwp_option_box_closer()
209 + */
210 + function formatting_box ($page, $box = NULL) {
211 + global $fwp_path;
212 + $thesePosts = $page->these_posts_phrase();
213 + $global_resolve_relative = get_option('feedwordpress_resolve_relative', 'yes');
214 + if ($page->for_feed_settings()) :
215 + $formatting_filters = null;
216 + $resolve_relative = $page->link->setting('resolve relative', NULL, 'default');
217 + $url = preg_replace('|/+$|', '', $page->link->homepage());
218 + $setting = array(
219 + 'yes' => __('resolve relative URIs'),
220 + 'no' => __('leave relative URIs unresolved'),
221 + );
222 + $href = $fwp_path.'/'.basename(__FILE__);
223 + else :
224 + $formatting_filters = get_option('feedwordpress_formatting_filters', 'no');
225 + $resolve_relative = $global_resolve_relative;
226 + $url = 'http://example.com';
227 + endif;
228 + ?>
229 + <table class="form-table" cellspacing="2" cellpadding="5">
230 + <?php if (!is_null($formatting_filters)) : ?>
119 231
120 - $status['post'] = array('publish' => '', 'private' => '', 'draft' => '');
121 - if (SyndicatedPost::use_api('post_status_pending')) :
122 - $status['post']['pending'] = '';
123 - endif;
232 + <tr><th scope="row">Formatting filters:</th>
233 + <td><select name="formatting_filters" size="1">
234 + <option value="no"<?php echo ($formatting_filters!='yes')?' selected="selected"':''; ?>>Protect syndicated posts from formatting filters</option>
235 + <option value="yes"<?php echo ($formatting_filters=='yes')?' selected="selected"':''; ?>>Expose syndicated posts to formatting filters</option>
236 + </select>
237 + <p class="setting-description">If you have trouble getting plugins to work that are supposed to insert
238 + elements after posts (like relevant links or a social networking
239 + <q>Share This</q> button), try changing this option to see if it fixes your
240 + problem.</p>
241 + </td></tr>
124 242
125 - $status['comment'] = array('open' => '', 'closed' => '');
126 - $status['ping'] = array('open' => '', 'closed' => '');
127 -
128 - if (is_object($link) and $link->found()) :
129 - $thePostsPhrase = __('posts from this feed');
130 -
131 - foreach (array('post', 'comment', 'ping') as $what) :
132 - $status[$what]['site-default'] = '';
133 - if (isset($link->settings["{$what} status"])) :
134 - $status[$what][$link->settings["{$what} status"]] = ' checked="checked"';
135 - else :
136 - $status[$what]['site-default'] = ' checked="checked"';
137 - endif;
138 - endforeach;
243 + <?php endif; ?>
139 244
140 - $custom_settings = $link->settings["postmeta"];
141 - if ($custom_settings) :
142 - $custom_settings = unserialize($custom_settings);
143 - endif;
144 -
145 - if (!is_array($custom_settings)) :
146 - $custom_settings = array();
147 - endif;
148 - else :
149 - $thePostsPhrase = __('syndicated posts');
245 + <tr><th scope="row">Relative URIs:</th>
246 + <td>If link or image in a syndicated post from <code><?php print $url; ?></code>
247 + refers to a partial URI like <code>/about</code>, where should
248 + the syndicated copy point to?</p>
150 249
151 - $status['post'][$post_status_global] = ' checked="checked"';
152 - $status['comment'][$comment_status_global] = ' checked="checked"';
153 - $status['ping'][$ping_status_global] = ' checked="checked"';
250 + <ul>
251 + <?php if ($page->for_feed_settings()) : ?>
252 + <li><p><label><input type="radio" name="resolve_relative" value='default' <?php echo ($resolve_relative=='default')?' checked="checked"':''; ?>/> Use <a href="admin.php?page=<?php print $href; ?>">site-wide setting</a><br/>
253 + <small style="margin-left: 2.0em;">Currently: <strong><?php print $setting[$global_resolve_relative]; ?></strong></small></label></p></li>
254 + <?php endif; ?>
255 + <li><p><label><input type="radio" name="resolve_relative" value="yes"<?php echo ($resolve_relative!='no' and $resolve_relative!='default')?' checked="checked"':''; ?>/> Resolve the URI so it points to <code><?php print $url; ?></code><br/>
256 + <small style="margin-left: 2.0em;"><code>/contact</code> is rewritten as <code><?php print $url; ?>/contact</code></label></small></p></li>
257 + <li><p><label><input type="radio" name="resolve_relative" value="no"<?php echo ($resolve_relative=='no')?' checked="checked"':''; ?>/> Leave relative URIs unchanged, so they point to this site<br/>
258 + <small style="margin-left: 2.0em;"><code>/contact</code> is left as <code>/contact</code></small></label></li>
259 + </ul>
260 + </td></tr>
154 261
262 + </table>
263 + <?php
264 + } /* FeedWordPressPostsPage::formatting_box() */
265 +
266 + /**
267 + * Output "Links" settings box
268 + *
269 + * @since 2009.0713
270 + * @param object $page of class FeedWordPressPostsPage tells us whether this is
271 + * a page for one feed's settings or for global defaults
272 + * @param array $box
273 + *
274 + * @uses fwp_option_box_opener()
275 + * @uses fwp_option_box_closer()
276 + */
277 + /*static*/ function links_box ($page, $box = NULL) {
155 278 $munge_permalink = get_option('feedwordpress_munge_permalink');
156 - $formatting_filters = get_option('feedwordpress_formatting_filters');
157 279 $use_aggregator_source_data = get_option('feedwordpress_use_aggregator_source_data');
280 + ?>
281 + <table class="form-table" cellspacing="2" cellpadding="5">
282 + <tr><th scope="row">Permalinks:</th>
283 + <td><select name="munge_permalink" size="1">
284 + <option value="yes"<?php echo ($munge_permalink=='yes')?' selected="selected"':''; ?>>point to the copy on the original website</option>
285 + <option value="no"<?php echo ($munge_permalink=='no')?' selected="selected"':''; ?>>point to the local copy on this website</option>
286 + </select></td>
287 + </tr>
288 +
289 + <tr><th scope="row">Posts from aggregator feeds:</th>
290 + <td><ul class="options">
291 + <li><label><input type="radio" name="use_aggregator_source_data" value="no"<?php echo ($use_aggregator_source_data!="yes")?' checked="checked"':''; ?>> Give the aggregator itself as the source of posts from an aggregator feed.</label></li>
292 + <li><label><input type="radio" name="use_aggregator_source_data" value="yes"<?php echo ($use_aggregator_source_data=="yes")?' checked="checked"':''; ?>> Give the original source of the post as the source, not the aggregator.</label></li>
293 + </ul>
294 + <p class="setting-description">Some feeds (for example, those produced by FeedWordPress) aggregate content from several different sources, and include information about the original source of the post.
295 + This setting controls what FeedWordPress will give as the source of posts from
296 + such an aggregator feed.</p>
297 + </td></tr>
298 + </table>
158 299
159 - $custom_settings = get_option('feedwordpress_custom_settings');
160 - if ($custom_settings) :
161 - $custom_settings = unserialize($custom_settings);
162 - endif;
300 + <?php
301 + } /* FeedWordPressPostsPage::links_box() */
163 302
164 - if (!is_array($custom_settings)) :
165 - $custom_settings = array();
166 - endif;
167 - endif;
168 -?>
169 -<script type="text/javascript">
170 - function contextual_appearance (item, appear, disappear, value, visibleStyle, checkbox) {
171 - if (typeof(visibleStyle)=='undefined') visibleStyle = 'block';
303 + /**
304 + * Output "Comments & Pings" settings box
305 + *
306 + * @since 2009.0713
307 + * @param object $page of class FeedWordPressPostsPage tells us whether this is
308 + * a page for one feed's settings or for global defaults
309 + * @param array $box
310 + *
311 + * @uses fwp_option_box_opener()
312 + * @uses fwp_option_box_closer()
313 + */
314 + /*static*/ function comments_and_pings_box ($page, $box = NULL) {
315 + $setting = array();
316 + $selector = array();
172 317
173 - var rollup=document.getElementById(item);
174 - var newuser=document.getElementById(appear);
175 - var sitewide=document.getElementById(disappear);
176 - if (rollup) {
177 - if ((checkbox && rollup.checked) || (!checkbox && value==rollup.value)) {
178 - if (newuser) newuser.style.display=visibleStyle;
179 - if (sitewide) sitewide.style.display='none';
180 - } else {
181 - if (newuser) newuser.style.display='none';
182 - if (sitewide) sitewide.style.display=visibleStyle;
183 - }
184 - }
185 - }
186 -</script>
318 + $whatsits = array(
319 + 'comment' => array('label' => __('Comments'), 'accept' => 'Allow comments'),
320 + 'ping' => array('label' => __('Pings'), 'accept' => 'Accept pings'),
321 + );
322 + $onThesePosts = 'on '.$page->these_posts_phrase();
187 323
188 -<?php if ($updated_link) : ?>
189 -<div class="updated"><p>Syndicated posts settings updated.</p></div>
190 -<?php elseif (!is_null($mesg)) : ?>
191 -<div class="updated"><p><?php print wp_specialchars($mesg, 1); ?></p></div>
192 -<?php endif; ?>
324 + foreach ($whatsits as $what => $how) :
325 + $whatsits[$what]['default'] = FeedWordPress::syndicated_status($what, /*default=*/ 'closed');
193 326
194 -<div class="wrap">
195 -<form style="position: relative" action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
196 -<div><?php
197 - FeedWordPressCompatibility::stamp_nonce('feedwordpress_posts_settings');
327 + // Set up array for selector
328 + $setting = array(
329 + 'open' => array ('label' => "{$how['accept']} %s", 'checked' => ''),
330 + 'closed' => array('label' => "Don't ".strtolower($how['accept'])." %s", 'checked' => ''),
331 + );
332 + if ($page->for_feed_settings()) :
333 + $href = $fwp_path.'/'.basename(__FILE__);
334 + $currently = trim(str_replace('%s', '', strtolower(strtok($setting[$whatsits[$what]['default']]['label'], ';'))));
335 + $setting['site-default'] = array('label' => "Use <a href=\"admin.php?page=${href}\">site-wide setting</a>", 'checked' => '');
336 + $setting['site-default']['label'] .= " (currently: <strong>${currently}</strong>)";
337 +
338 + $checked = $page->link->syndicated_status($what, 'site-default', /*fallback=*/ false);
339 + else :
340 + $checked = $whatsits[$what]['default'];
341 + endif;
198 342
199 - if (is_numeric($link_id) and $link_id) :
200 -?>
201 -<input type="hidden" name="save_link_id" value="<?php echo $link_id; ?>" />
202 -<?php
203 - else :
204 -?>
205 -<input type="hidden" name="save_link_id" value="*" />
206 -<?php
207 - endif;
208 -?>
209 -</div>
343 + // Re-order appropriately
344 + $selector[$what] = array();
345 + $order = array(
346 + 'site-default',
347 + 'open',
348 + 'closed',
349 + );
350 + foreach ($order as $line) :
351 + if (isset($setting[$line])) :
352 + $selector[$what][$line] = $setting[$line];
353 + endif;
354 + endforeach;
355 + $selector[$what][$checked]['checked'] = ' checked="checked"';
356 + endforeach;
210 357
211 -<?php $links = FeedWordPress::syndicated_links(); ?>
212 -<?php if (fwp_test_wp_version(FWP_SCHEMA_27)) : ?>
213 - <div class="icon32"><img src="<?php print htmlspecialchars(WP_PLUGIN_URL.'/'.$GLOBALS['fwp_path'].'/feedwordpress.png'); ?>" alt="" /></div>
214 -<?php endif; ?>
358 + // Hey ho, let's go...
359 + ?>
360 + <table class="form-table" cellspacing="2" cellpadding="5">
361 + <?php foreach ($whatsits as $what => $how) : ?>
362 + <tr><th scope="row"><?php print $how['label']; ?>:</th>
363 + <td><ul class="options">
364 + <?php foreach ($selector[$what] as $code => $li) : ?>
365 + <li><label><input type="radio" name="feed_<?php print $what; ?>_status"
366 + value="<?php print $code; ?>"<?php print $li['checked']; ?> />
367 + <?php print trim(str_replace('%s', $onThesePosts, $li['label'])); ?></label></li>
368 + <?php endforeach; ?>
369 + </ul></td></tr>
370 + <?php endforeach; ?>
371 + </table>
215 372
216 -<h2>Syndicated Post Settings<?php if (!is_null($link) and $link->found()) : ?>: <?php echo wp_specialchars($link->link->link_name, 1); ?><?php endif; ?></h2>
217 -
218 -<style type="text/css">
219 - table.edit-form th { width: 27%; vertical-align: top; }
220 - table.edit-form td { width: 73%; vertical-align: top; }
221 - table.edit-form td ul.options { margin: 0; padding: 0; list-style: none; }
222 -</style>
223 -
224 -<?php if (fwp_test_wp_version(FWP_SCHEMA_27)) : ?>
225 - <style type="text/css">
226 - #post-search {
227 - float: right;
228 - margin:11px 12px 0;
229 - min-width: 130px;
230 - position:relative;
231 - }
232 - .fwpfs {
233 - color: #dddddd;
234 - background:#797979 url(<?php bloginfo('home') ?>/wp-admin/images/fav.png) repeat-x scroll left center;
235 - border-color:#777777 #777777 #666666 !important; -moz-border-radius-bottomleft:12px;
236 - -moz-border-radius-bottomright:12px;
237 - -moz-border-radius-topleft:12px;
238 - -moz-border-radius-topright:12px;
239 - border-style:solid;
240 - border-width:1px;
241 - line-height:15px;
242 - padding:3px 30px 4px 12px;
243 - }
244 - .fwpfs.slide-down {
245 - border-bottom-color: #626262;
246 - -moz-border-radius-bottomleft:0;
247 - -moz-border-radius-bottomright:0;
248 - -moz-border-radius-topleft:12px;
249 - -moz-border-radius-topright:12px;
250 - background-image:url(<?php bloginfo('home') ?>/wp-admin/images/fav-top.png);
251 - background-position:0 top;
252 - background-repeat:repeat-x;
253 - border-bottom-style:solid;
254 - border-bottom-width:1px;
255 - }
256 - </style>
373 + <?php
374 + } /* FeedWordPressPostsPage::comments_and_pings_box() */
257 375
258 - <script type="text/javascript">
259 - jQuery(document).ready(function($){
260 - $('.fwpfs').toggle(
261 - function(){$('.fwpfs').removeClass('slideUp').addClass('slideDown'); setTimeout(function(){if ( $('.fwpfs').hasClass('slideDown') ) { $('.fwpfs').addClass('slide-down'); }}, 10) },
262 - function(){$('.fwpfs').removeClass('slideDown').addClass('slideUp'); setTimeout(function(){if ( $('.fwpfs').hasClass('slideUp') ) { $('.fwpfs').removeClass('slide-down'); }}, 10) }
263 - );
264 - $('.fwpfs').bind(
265 - 'change',
266 - function () { this.form.submit(); }
267 - );
268 - $('#post-search .button').css( 'display', 'none' );
269 - });
270 - </script>
271 -<?php endif; /* else : */?>
272 -<p id="post-search">
273 -<select name="link_id" class="fwpfs" style="max-width: 20.0em;">
274 - <option value="*"<?php if (is_null($link) or !$link->found()) : ?> selected="selected"<?php endif; ?>>- defaults for all feeds -</option>
275 -<?php if ($links) : foreach ($links as $ddlink) : ?>
276 - <option value="<?php print (int) $ddlink->link_id; ?>"<?php if (!is_null($link) and ($link->link->link_id==$ddlink->link_id)) : ?> selected="selected"<?php endif; ?>><?php print wp_specialchars($ddlink->link_name, 1); ?></option>
277 -<?php endforeach; endif; ?>
278 -</select>
279 -<input class="button" type="submit" name="go" value="<?php _e('Go') ?> &raquo;" />
280 -</p>
281 -<?php /* endif; */ ?>
376 + /**
377 + * Output "Custom Post Settings" settings box
378 + *
379 + * @since 2009.0713
380 + * @param object $page of class FeedWordPressPostsPage tells us whether this is
381 + * a page for one feed's settings or for global defaults
382 + * @param array $box
383 + *
384 + * @uses fwp_option_box_opener()
385 + * @uses fwp_option_box_closer()
386 + */
387 + /*static*/ function custom_post_settings_box ($page, $box = NULL) {
388 + if ($page->for_feed_settings()) :
389 + $custom_settings = $page->link->settings["postmeta"];
390 + if ($custom_settings and !is_array($custom_settings)) :
391 + $custom_settings = unserialize($custom_settings);
392 + endif;
393 +
394 + if (!is_array($custom_settings)) :
395 + $custom_settings = array();
396 + endif;
397 + else :
398 + $custom_settings = get_option('feedwordpress_custom_settings');
399 + if ($custom_settings and !is_array($custom_settings)) :
400 + $custom_settings = unserialize($custom_settings);
401 + endif;
402 +
403 + if (!is_array($custom_settings)) :
404 + $custom_settings = array();
405 + endif;
406 + endif;
282 407
283 -<?php if (!is_null($link) and $link->found()) : ?>
284 - <p>These settings only affect posts syndicated from
285 - <strong><?php echo wp_specialchars($link->link->link_name, 1); ?></strong>.</p>
286 -<?php else : ?>
287 - <p>These settings affect posts syndicated from any feed unless they are overridden
288 - by settings for that specific feed.</p>
289 -<?php endif; ?>
408 + ?>
409 + <div id="postcustomstuff">
410 + <table id="meta-list" cellpadding="3">
411 + <tr>
412 + <th>Key</th>
413 + <th>Value</th>
414 + <th>Action</th>
415 + </tr>
290 416
291 -<div id="poststuff">
292 -<div id="post-body">
293 -<?php fwp_option_box_opener('Publication', 'publicationdiv', 'postbox'); ?>
294 -<table class="form-table" cellspacing="2" cellpadding="5">
295 -<tr><th width="27%" scope="row" style="vertical-align:top">Status for new posts:</th>
296 -<td width="73%" style="vertical-align:top"><ul style="margin:0; list-style:none">
417 + <?php
418 + $i = 0;
419 + foreach ($custom_settings as $key => $value) :
420 + ?>
421 + <tr style="vertical-align:top">
422 + <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo wp_specialchars($key, 'both'); ?>" />
423 + <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo wp_specialchars($key, 'both'); ?>" /></th>
424 + <td width="60%"><textarea rows="2" cols="40" id="notes-<?php echo $i; ?>-value" name="notes[<?php echo $i; ?>][value]"><?php echo wp_specialchars($value, 'both'); ?></textarea></td>
425 + <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
426 + <option value="update">save changes</option>
427 + <option value="delete">delete this setting</option>
428 + </select></td>
429 + </tr>
297 430
298 -<?php if (is_object($link) and $link->found()) : ?>
299 -<li><label><input type="radio" name="feed_post_status" value="site-default"
300 -<?php echo $status['post']['site-default']; ?> /> Use <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php print basename(__FILE__); ?>">site-wide setting</a>
301 -(currently: <strong><?php echo ($post_status_global ? $post_status_global : 'publish'); ?></strong>)</label></li>
302 -<?php endif; ?>
431 + <?php
432 + $i++;
433 + endforeach;
434 + ?>
303 435
304 -<li><label><input type="radio" name="feed_post_status" value="publish"
305 -<?php echo $status['post']['publish']; ?> /> Publish <?php print $thePostsPhrase; ?> immediately</label></li>
436 + <tr>
437 + <th scope="row"><input type="text" size="10" name="notes[<?php echo $i; ?>][key1]" value="" /></th>
438 + <td><textarea name="notes[<?php echo $i; ?>][value]" rows="2" cols="40"></textarea></td>
439 + <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo $i; ?>][action]" value="update" /></td>
440 + </tr>
441 + </table>
442 + </div> <!-- id="postcustomstuff" -->
306 443
307 -<?php if (SyndicatedPost::use_api('post_status_pending')) : ?>
308 -<li><label><input type="radio" name="feed_post_status" value="pending"
309 -<?php echo $status['post']['pending']; ?>/> Hold <?php print $thePostsPhrase; ?> for review; mark as Pending</label></li>
310 -<?php endif; ?>
444 + <?php
445 + } /* FeedWordPressPostsPage::custom_post_settings_box() */
446 +}
311 447
312 -<li><label><input type="radio" name="feed_post_status" value="draft"
313 -<?php echo $status['post']['draft']; ?> /> Save <?php print $thePostsPhrase; ?> as drafts</label></li>
314 -<li><label><input type="radio" name="feed_post_status" value="private"
315 -<?php echo $status['post']['private']; ?> /> Save <?php print $thePostsPhrase; ?> as private posts</label></li>
316 -</ul></td>
317 -</tr>
318 -</table>
319 -<?php
320 - fwp_option_box_closer();
321 -?>
448 +function fwp_posts_page () {
449 + global $wpdb, $wp_db_version;
450 + global $fwp_post;
322 451
323 -<?php if (!(is_object($link) and $link->found())) : ?>
324 -<?php fwp_option_box_opener('Formatting', 'formattingdiv', 'postbox'); ?>
325 -<table class="form-table" cellspacing="2" cellpadding="5">
326 -<tr><th scope="row">Formatting filters:</th>
327 -<td><select name="formatting_filters" size="1">
328 -<option value="no"<?php echo ($formatting_filters!='yes')?' selected="selected"':''; ?>>Protect syndicated posts from formatting filters</option>
329 -<option value="yes"<?php echo ($formatting_filters=='yes')?' selected="selected"':''; ?>>Expose syndicated posts to formatting filters</option>
330 -</select>
331 -<p class="setting-description">If you have trouble getting plugins to work that are supposed to insert
332 -elements after posts (like relevant links or a social networking
333 -<q>Share This</q> button), try changing this option to see if it fixes your
334 -problem.</p>
335 -</td></tr>
336 -</table>
337 -<?php fwp_option_box_closer(); ?>
452 + if (FeedWordPress::needs_upgrade()) :
453 + fwp_upgrade_page();
454 + return;
455 + endif;
338 456
339 -<?php
340 - fwp_option_box_opener('Links', 'linksdiv', 'postbox');
341 -?>
342 -<table class="form-table" cellspacing="2" cellpadding="5">
343 -<tr><th scope="row">Permalinks:</th>
344 -<td><select name="munge_permalink" size="1">
345 -<option value="yes"<?php echo ($munge_permalink=='yes')?' selected="selected"':''; ?>>point to the copy on the original website</option>
346 -<option value="no"<?php echo ($munge_permalink=='no')?' selected="selected"':''; ?>>point to the local copy on this website</option>
347 -</select></td>
348 -</tr>
457 + // If this is a POST, validate source and user credentials
458 + FeedWordPressCompatibility::validate_http_request(/*action=*/ 'feedwordpress_posts_settings', /*capability=*/ 'manage_links');
349 459
350 -<tr><th scope="row">Posts from aggregator feeds:</th>
351 -<td><ul class="options">
352 -<li><label><input type="radio" name="use_aggregator_source_data" value="no"<?php echo ($use_aggregator_source_data!="yes")?' checked="checked"':''; ?>> Give the aggregator itself as the source of posts from an aggregator feed.</label></li>
353 -<li><label><input type="radio" name="use_aggregator_source_data" value="yes"<?php echo ($use_aggregator_source_data=="yes")?' checked="checked"':''; ?>> Give the original source of the post as the source, not the aggregator.</label></li>
354 -</ul>
355 -<p class="setting-description">Some feeds (for example, those produced by FeedWordPress) aggregate content from several different sources, and include information about the original source of the post.
356 -This setting controls what FeedWordPress will give as the source of posts from
357 -such an aggregator feed.</p>
358 -</td></tr>
359 -</table>
360 -<?php
361 - fwp_option_box_closer();
362 - fwp_linkedit_periodic_submit();
363 -endif;
460 + $link = FeedWordPressAdminPage::submitted_link();
461 + $link_id = $link->id;
462 + $postsPage = new FeedWordPressPostsPage($link);
364 463
365 - fwp_option_box_opener(__('Comments & Pings'), 'commentstatus', 'postbox');
366 -?>
367 -<table class="form-table" cellspacing="2" cellpadding="5">
368 -<tr><th scope="row"><?php print __('Comments') ?>:</th>
369 -<td><ul class="options">
370 -<?php if (is_object($link) and $link->found()) : ?>
371 -<li><label><input type="radio" name="feed_comment_status" value="site-default"
372 -<?php echo $status['comment']['site-default']; ?> /> Use <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php print basename(__FILE__); ?>">site-wide setting</a>
373 -(currently: <strong><?php echo $comment_status_global; ?></strong>)</label></li>
374 -<?php endif; ?>
464 + $mesg = null;
375 465
376 -<li><label><input type="radio" name="feed_comment_status" value="open"<?php echo $status['comment']['open'] ?> /> Allow comments on syndicated posts</label></li>
377 -<li><label><input type="radio" name="feed_comment_status" value="closed"<?php echo $status['comment']['closed']; ?> /> Don't allow comments on syndicated posts</label></li>
378 -</ul></td></tr>
466 + ////////////////////////////////////////////////
467 + // Process POST request, if any ////////////////
468 + ////////////////////////////////////////////////
469 + if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
470 + $postsPage->accept_POST($fwp_post);
471 + do_action('feedwordpress_admin_page_posts_save', $fwp_post, $postsPage);
472 + endif;
473 +
474 + $postsPage->ajax_interface_js();
379 475
380 -<tr><th scope="row"><?php print __('Pings') ?>:</th>
381 -<td><ul class="options">
382 -<?php if (is_object($link) and $link->found()) : ?>
383 -<li><label><input type="radio" name="feed_ping_status" value="site-default"
384 -<?php echo $status['ping']['site-default']; ?> /> Use <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php print basename(__FILE__); ?>">site-wide setting</a>
385 -(currently: <strong><?php echo $ping_status_global; ?></strong>)</label></li>
476 + if ($postsPage->updated) : ?>
477 +<div class="updated"><p>Syndicated posts settings updated.</p></div>
478 +<?php elseif (!is_null($mesg)) : ?>
479 +<div class="updated"><p><?php print wp_specialchars($mesg, 1); ?></p></div>
386 480 <?php endif; ?>
387 481
388 -<li><label><input type="radio" name="feed_ping_status" value="open"<?php echo $status['ping']['open']; ?> /> Accept pings on syndicated posts</label></li>
389 -<li><label><input type="radio" name="feed_ping_status" value="closed"<?php echo $status['ping']['closed']; ?> /> Don't accept pings on syndicated posts</label></li>
390 -</ul></td></tr>
391 -</table>
392 482 <?php
393 - fwp_option_box_closer();
394 - fwp_linkedit_periodic_submit();
483 + $links = FeedWordPress::syndicated_links();
484 + $postsPage->open_sheet('Syndicated Posts & Links');
395 485 ?>
486 +<style type="text/css">
487 + table.edit-form th, table.form-table th { width: 27%; vertical-align: top; }
488 + table.edit-form td, table.form-table td { width: 73%; vertical-align: top; }
489 + ul.options { margin: 0; padding: 0; list-style: none; }
490 +</style>
491 +<div id="post-body">
492 +<?php
493 +$boxes_by_methods = array(
494 + 'publication_box' => __('Syndicated Posts'),
495 + 'links_box' => __('Links'),
496 + 'formatting_box' => __('Formatting'),
497 + 'comments_and_pings_box' => __('Comments & Pings'),
498 + 'custom_post_settings_box' => __('Custom Post Settings (to apply to each syndicated post)'),
499 +);
396 500
397 -<?php fwp_option_box_opener('Custom Post Settings (to apply to each syndicated post)', 'postcustom', 'postbox'); ?>
398 -<div id="postcustomstuff">
399 -<table id="meta-list" cellpadding="3">
400 - <tr>
401 - <th>Key</th>
402 - <th>Value</th>
403 - <th>Action</th>
404 - </tr>
501 +// Feed-level settings don't exist for these.
502 +if ($postsPage->for_feed_settings()) :
503 + unset($boxes_by_methods['links_box']);
504 +endif;
405 505
406 -<?php
407 - $i = 0;
408 - foreach ($custom_settings as $key => $value) :
506 + foreach ($boxes_by_methods as $method => $title) :
507 + fwp_add_meta_box(
508 + /*id=*/ 'feedwordpress_'.$method,
509 + /*title=*/ $title,
510 + /*callback=*/ array('FeedWordPressPostsPage', $method),
511 + /*page=*/ $postsPage->meta_box_context(),
512 + /*context=*/ $postsPage->meta_box_context()
513 + );
514 + endforeach;
515 + do_action('feedwordpress_admin_page_posts_meta_boxes', $postsPage);
409 516 ?>
410 - <tr style="vertical-align:top">
411 - <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo wp_specialchars($key, 'both'); ?>" />
412 - <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo wp_specialchars($key, 'both'); ?>" /></th>
413 - <td width="60%"><textarea rows="2" cols="40" id="notes-<?php echo $i; ?>-value" name="notes[<?php echo $i; ?>][value]"><?php echo wp_specialchars($value, 'both'); ?></textarea></td>
414 - <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
415 - <option value="update">save changes</option>
416 - <option value="delete">delete this setting</option>
417 - </select></td>
418 - </tr>
517 + <div class="metabox-holder">
419 518 <?php
420 - $i++;
421 - endforeach;
519 + fwp_do_meta_boxes($postsPage->meta_box_context(), $postsPage->meta_box_context(), $postsPage);
422 520 ?>
423 - <tr>
424 - <th scope="row"><input type="text" size="10" name="notes[<?php echo $i; ?>][key1]" value="" /></th>
425 - <td><textarea name="notes[<?php echo $i; ?>][value]" rows="2" cols="40"></textarea></td>
426 - <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo $i; ?>][action]" value="update" /></td>
427 - </tr>
428 -</table>
429 -<?php fwp_option_box_closer(); ?>
430 -
431 -</div>
432 -</div>
433 -
434 -<p class="submit">
435 -<input class="button-primary" type="submit" name="save" value="Save Changes" />
436 -</p>
437 -</form>
438 -</div> <!-- class="wrap" -->
521 + </div> <!-- class="metabox-holder" -->
522 +</div> <!-- id="post-body" -->
439 523 <?php
524 + $postsPage->close_sheet();
440 525 } /* function fwp_posts_page () */
441 526
442 527 fwp_posts_page();
443 528