PluginProbe
FeedWordPress / 2022.0203
FeedWordPress v2022.0203
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 +646 -349 2009.06122022.0203 View file →
@@ -1,145 +1,424 @@
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 + public function __construct( $link = -1 ) {
15 + if (is_numeric($link) and -1 == $link) :
16 + $link = $this->submitted_link();
17 + endif;
8 18
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;
19 + parent::__construct('feedwordpresspostspage', $link);
20 + $this->dispatch = 'feedwordpress_admin_page_posts';
21 + $this->filename = __FILE__;
22 + $this->updatedPosts = new UpdatedPostsControl($this);
23 +
24 + $this->pagenames = array(
25 + 'default' => 'Posts',
26 + 'settings-update' => 'Syndicated posts',
27 + 'open-sheet' => 'Syndicated Posts & Links',
28 + );
29 + } /* FeedWordPressPostsPage constructor */
16 30
17 - if (is_numeric($link_id) and $link_id) :
18 - $link =& new SyndicatedLink($link_id);
19 - else :
20 - $link = NULL;
21 - endif;
31 + function save_settings ($post) {
32 + // custom post settings
33 + $custom_settings = $this->custom_post_settings();
22 34
23 - $mesg = null;
35 + foreach ($post['notes'] as $mn) :
36 + if (isset($mn['key0'])) :
37 + $mn['key0'] = trim($mn['key0']);
38 + if (strlen($mn['key0']) > 0) :
39 + unset($custom_settings[$mn['key0']]); // out with the old
40 + endif;
41 + endif;
42 +
43 + if (isset($mn['key1'])) :
44 + $mn['key1'] = trim($mn['key1']);
24 45
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
46 + if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
47 + $custom_settings[$mn['key1']] = $mn['value']; // in with the new
48 + endif;
36 49 endif;
37 -
38 - if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
39 - $custom_settings[$mn['key1']] = $mn['value']; // in with the new
40 - endif;
41 50 endforeach;
42 51
43 - if (is_object($link) and $link->found()) :
52 + $this->updatedPosts->accept_POST($post);
53 + if ($this->for_feed_settings()) :
44 54 $alter = array ();
45 55
46 - $link->settings['postmeta'] = serialize($custom_settings);
56 + $this->link->settings['postmeta'] = serialize($custom_settings);
47 57
58 + if (isset($post['resolve_relative'])) :
59 + $this->link->settings['resolve relative'] = $post['resolve_relative'];
60 + endif;
61 + if (isset($post['munge_permalink'])) :
62 + $this->link->settings['munge permalink'] = $post['munge_permalink'];
63 + endif;
64 + if (isset($post['munge_comments_feed_links'])) :
65 + $this->link->settings['munge comments feed links'] = $post['munge_comments_feed_links'];
66 + endif;
67 +
48 68 // Post status, comment status, ping status
49 69 foreach (array('post', 'comment', 'ping') as $what) :
50 70 $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"]);
71 + if (isset($post[$sfield])) :
72 + if ($post[$sfield]=='site-default') :
73 + unset($this->link->settings["{$what} status"]);
54 74 else :
55 - $link->settings["{$what} status"] = $GLOBALS['fwp_post'][$sfield];
75 + $this->link->settings["{$what} status"] = $post[$sfield];
56 76 endif;
57 77 endif;
58 78 endforeach;
59 79
60 - $alter[] = "link_notes = '".$wpdb->escape($link->settings_to_notes())."'";
80 + if (isset($post['syndicated_post_type'])) :
81 + if ($post['syndicated_post_type']=='default') :
82 + unset($this->link->settings['syndicated post type']);
83 + else :
84 + $this->link->settings['syndicated post type'] = $post['syndicated_post_type'];
85 + endif;
86 + endif;
61 87
62 - $alter_set = implode(", ", $alter);
88 + else :
89 + // update_option ...
90 + if (isset($post['feed_post_status'])) :
91 + update_option('feedwordpress_syndicated_post_status', $post['feed_post_status']);
92 + endif;
63 93
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;
94 + update_option('feedwordpress_custom_settings', serialize($custom_settings));
95 +
96 + $sMungePermalink = sanitize_text_field($_REQUEST['munge_permalink']);
97 + $sUseAggregatorSourceData = sanitize_text_field($_REQUEST['use_aggregator_source_data']);
98 + $sFormattingFilters = sanitize_text_field($_REQUEST['formatting_filters']);
99 + $sFeedCommentStatus = (isset($_REQUEST['feed_comment_status']) ? sanitize_text_field($_REQUEST['feed_comment_status']) : '');
100 + $sFeedPingStatus = (isset($_REQUEST['feed_ping_status']) ? sanitize_text_field($_REQUEST['feed_ping_status']) : '');
101 +
102 + update_option('feedwordpress_munge_permalink', $sMungePermalink);
103 + update_option('feedwordpress_use_aggregator_source_data', $sUseAggregatorSourceData);
104 + update_option('feedwordpress_formatting_filters', $sFormattingFilters);
71 105
72 - // reload link information from DB
73 - if (function_exists('clean_bookmark_cache')) :
74 - clean_bookmark_cache($link_id);
106 + if (isset($post['resolve_relative'])) :
107 + update_option('feedwordpress_resolve_relative', $post['resolve_relative']);
75 108 endif;
76 - $link =& new SyndicatedLink($link_id);
77 - 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']);
109 + if (isset($post['munge_comments_feed_links'])) :
110 + update_option('feedwordpress_munge_comments_feed_links', $post['munge_comments_feed_links']);
81 111 endif;
82 112
83 - update_option('feedwordpress_custom_settings', serialize($custom_settings));
84 -
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')) :
113 + if ( $sFeedCommentStatus == 'open' ) :
90 114 update_option('feedwordpress_syndicated_comment_status', 'open');
91 115 else :
92 116 update_option('feedwordpress_syndicated_comment_status', 'closed');
93 117 endif;
94 -
95 - if (isset($_REQUEST['feed_ping_status']) and ($_REQUEST['feed_ping_status'] == 'open')) :
118 +
119 + if ( $sFeedPingStatus == 'open' ) :
96 120 update_option('feedwordpress_syndicated_ping_status', 'open');
97 121 else :
98 122 update_option('feedwordpress_syndicated_ping_status', 'closed');
99 123 endif;
124 +
125 + if (isset($post['syndicated_post_type'])) :
126 + update_option('feedwordpress_syndicated_post_type', $post['syndicated_post_type']);
127 + endif;
128 + endif;
129 +
130 + if (isset($post['save']) or isset($post['submit'])) :
131 + if (isset($post['boilerplate'])) :
132 + foreach ($post['boilerplate'] as $index => $line) :
133 + if (0 == strlen(trim($line['template']))) :
134 + unset($post['boilerplate'][$index]);
135 + endif;
136 + endforeach;
137 +
138 + // Convert indexes to 0..(N-1) to avoid possible collisions
139 + $post['boilerplate'] = array_values($post['boilerplate']);
140 +
141 + if ($this->for_feed_settings()) :
142 + $this->link->settings['boilerplate rules'] = serialize($post['boilerplate']);
143 + $this->link->save_settings(/*reload=*/ true);
144 + else :
145 + update_option('feedwordpress_boilerplate', $post['boilerplate']);
146 + endif;
147 + endif;
148 +
149 + if (isset($post['boilerplate_hook_order'])) :
150 + $this->update_setting('boilerplate hook order', intval($post['boilerplate_hook_order']));
151 + endif;
152 + endif;
153 +
154 + parent::save_settings($post);
155 + }
156 +
157 + /**
158 + * publication_box: Outputs "Publication" settings box.
159 + *
160 + * @since 2009.0713
161 + * @param object $page of class FeedWordPressPostsPage tells us whether this is
162 + * a page for one feed's settings or for global defaults
163 + * @param array $box
164 + *
165 + * @uses FeedWordPressPostsPage::these_posts_phrase()
166 + * @uses FeedWordPress::syndicated_status()
167 + * @uses SyndicatedLink::syndicated_status()
168 + */
169 + /*static*/ function publication_box ($page, $box = NULL) {
170 + $thesePosts = $page->these_posts_phrase();
171 + $postSelector = array(
172 + 'publish' => "Publish %s immediately",
173 + 'pending' => "Hold %s for review; mark as Pending",
174 + 'draft' => "Save %s as drafts",
175 + 'private' => "Save %s as private posts",
176 + );
177 + $labels = array();
178 + foreach ($postSelector as $index => $value) :
179 + $postSelector[$index] = sprintf(__($value), $thesePosts);
180 + $labels[$index] = __(str_replace(' %s', '', strtolower(strtok($value, ';'))));
181 + endforeach;
182 +
183 + $params = array(
184 + 'input-name' => 'feed_post_status',
185 + 'setting-default' => NULL,
186 + 'global-setting-default' => 'publish',
187 + 'labels' => $labels,
188 + );
189 +
190 + // Hey ho, let's go...
191 + ?>
192 + <table id="syndicated-publication-form" class="edit-form narrow">
193 + <tr><th scope="row"><?php _e('New posts:'); ?></th>
194 + <td><?php
195 + $this->setting_radio_control(
196 + 'post status', 'syndicated_post_status',
197 + $postSelector, $params
198 + );
199 + ?>
200 + </td></tr>
201 +
202 + <?php $page->updatedPosts->display(); ?>
203 + </table>
100 204
101 - $updated_link = true;
205 + <?php
206 + } /* FeedWordPressPostsPage::publication_box () */
207 +
208 + /**
209 + * Outputs "Formatting" settings box
210 + *
211 + * @since 2009.0713
212 + * @param object $page of class FeedWordPressPostsPage tells us whether this is
213 + * a page for one feed's settings or for global defaults
214 + * @param array $box
215 + *
216 + */
217 + function formatting_box ($page, $box = NULL) {
218 + $thesePosts = $page->these_posts_phrase();
219 +
220 + if ($page->for_feed_settings()) :
221 + $formatting_filters = null;
222 + $url = preg_replace('|/+$|', '', $page->link->homepage());
223 + else :
224 + $formatting_filters = get_option('feedwordpress_formatting_filters', 'no');
225 + $url = 'http://example.com';
102 226 endif;
103 - else :
104 - $updated_link = false;
105 - endif;
227 + ?>
228 + <table class="edit-form narrow">
229 + <?php if (!is_null($formatting_filters)) : ?>
106 230
107 - ////////////////////////////////////////////////
108 - // Get defaults from database //////////////////
109 - ////////////////////////////////////////////////
231 + <tr><th scope="row">Formatting filters:</th>
232 + <td><select name="formatting_filters" size="1">
233 + <option value="no"<?php echo ($formatting_filters!='yes')?' selected="selected"':''; ?>>Protect syndicated posts from formatting filters</option>
234 + <option value="yes"<?php echo ($formatting_filters=='yes')?' selected="selected"':''; ?>>Expose syndicated posts to formatting filters</option>
235 + </select>
236 + <p class="setting-description">If you have trouble getting plugins to work that are supposed to insert
237 + elements after posts (like relevant links or a social networking
238 + <q>Share This</q> button), try changing this option to see if it fixes your
239 + problem.</p>
240 + </td></tr>
110 241
111 - $post_status_global = get_option('feedwordpress_syndicated_post_status');
112 - if (!$post_status_global) : $post_status_global = 'publish'; endif;
242 + <?php endif; ?>
243 +
244 + <tr><th scope="row">Relative URIs:</th>
245 + <td><p>If link or image in a syndicated post from <code><?php print esc_html($url); ?></code>
246 + refers to a partial URI like <code>/about</code>, where should
247 + the syndicated copy point to?</p>
248 +
249 + <?php
250 + $options = array(
251 + 'yes' => 'Resolve the URI so it points to <code>'.$url.'</code><br/><small style="margin-left: 2.0em;"><code>/contact</code> is rewritten as <code>'.$url.'/contact</code></small>',
252 + 'no' => 'Leave relative URIs unchanged, so they point to this site<br/><small style="margin-left: 2.0em;"><code>/contact</code> is left as <code>/contact</code></small>',
253 + );
254 + $params = array(
255 + 'setting-default' => 'default',
256 + 'global-setting-default' => 'yes',
257 + 'labels' => array(
258 + 'yes' => __('resolve relative URIs'),
259 + 'no' => __('leave relative URIs unresolved'),
260 + ),
261 + 'default-input-value' => 'default',
262 + );
263 +
264 + $this->setting_radio_control(
265 + 'resolve relative', 'resolve_relative',
266 + $options, $params
267 + );
268 + ?>
269 + </td></tr>
270 +
271 + </table>
272 + <?php
273 + } /* FeedWordPressPostsPage::formatting_box() */
113 274
114 - $comment_status_global = get_option('feedwordpress_syndicated_comment_status');
115 - if (!$comment_status_global) : $comment_status_global = 'closed'; endif;
275 + /**
276 + * Output "Links" settings box
277 + *
278 + * @since 2009.0713
279 + * @param object $page of class FeedWordPressPostsPage tells us whether this is
280 + * a page for one feed's settings or for global defaults
281 + * @param array $box
282 + *
283 + */
284 + /*static*/ function links_box ($page, $box = NULL) {
285 + $setting = array(
286 + 'munge_permalink' => array(
287 + 'yes' => __('The copy on the original website'),
288 + 'no' => __('The local copy on this website'),
289 + ),
290 + );
116 291
117 - $ping_status_global = get_option('feedwordpress_syndicated_ping_status');
118 - if (!$ping_status_global) : $ping_status_global = 'closed'; endif;
292 + if (!$page->for_feed_settings()) :
293 + $use_aggregator_source_data = get_option('feedwordpress_use_aggregator_source_data');
294 + endif;
295 + ?>
296 + <table class="edit-form narrow">
297 + <tr><th scope="row">Permalinks point to:</th>
298 + <td><?php
299 +
300 + $params = array(
301 + 'setting-default' => 'default',
302 + 'global-setting-default' => 'yes',
303 + 'default-input-value' => 'default',
304 + );
305 + $this->setting_radio_control(
306 + 'munge permalink', 'munge_permalink',
307 + $setting['munge_permalink'], $params
308 + );
309 + ?>
119 310
120 - $status['post'] = array('publish' => '', 'private' => '', 'draft' => '');
121 - if (SyndicatedPost::use_api('post_status_pending')) :
122 - $status['post']['pending'] = '';
123 - endif;
311 + </td></tr>
312 +
313 + <?php if (!$page->for_feed_settings()) : ?>
314 + <tr><th scope="row">Posts from aggregator feeds:</th>
315 + <td><ul class="options">
316 + <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>
317 + <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>
318 + </ul>
319 + <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.
320 + This setting controls what FeedWordPress will give as the source of posts from
321 + such an aggregator feed.</p>
322 + </td></tr>
323 + <?php endif; ?>
324 + </table>
124 325
125 - $status['comment'] = array('open' => '', 'closed' => '');
126 - $status['ping'] = array('open' => '', 'closed' => '');
326 + <?php
327 + } /* FeedWordPressPostsPage::links_box() */
127 328
128 - if (is_object($link) and $link->found()) :
129 - $thePostsPhrase = __('posts from this feed');
329 + /**
330 + * Output "Comments & Pings" settings box
331 + *
332 + * @since 2009.0713
333 + * @param object $page of class FeedWordPressPostsPage tells us whether this is
334 + * a page for one feed's settings or for global defaults
335 + * @param array $box
336 + *
337 + */
338 + /*static*/ function comments_and_pings_box ($page, $box = NULL) {
339 + $whatsits = array(
340 + 'comment' => array('label' => __('Comments'), 'accept' => 'Allow comments'),
341 + 'ping' => array('label' => __('Pings'), 'accept' => 'Accept pings'),
342 + );
343 + $onThesePosts = 'on '.$page->these_posts_phrase();
344 +
345 + $mcflSettings = array(
346 + "yes" => __('Point to comment feeds from the original website (when provided by the syndicated feed)'),
347 + "no" => __('Point to local comment feeds on this website'),
348 + );
349 + $mcflParams = array(
350 + 'setting-default' => 'default',
351 + 'global-setting-default' => 'yes',
352 + 'labels' => array(
353 + 'yes' => __('comment feeds from the original website'),
354 + 'no' => __('local comment feeds on this website')
355 + ),
356 + 'default-input-value' => 'default',
357 + );
130 358
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;
359 + $settings = array(); $params = array();
360 + foreach ($whatsits as $what => $how) :
361 + $whatsits[$what]['default'] = FeedWordPress::syndicated_status($what, /*default=*/ 'closed');
362 +
363 + // Set up array for selector
364 + $settings[$what] = array(
365 + 'open' => sprintf(__("{$how['accept']} %s"), __($onThesePosts)),
366 + 'closed' => sprintf(__("Don't ".strtolower($how['accept'])." %s"), __($onThesePosts)),
367 + );
368 + $params[$what] = array(
369 + 'input-name' => "feed_${what}_status",
370 + 'setting-default' => NULL,
371 + 'global-setting-default' => FeedWordPress::syndicated_status($what, /*default=*/ 'closed'),
372 + 'labels' => array(
373 + 'open' => strtolower(__($how['accept'])),
374 + 'closed' => strtolower(__("Don't ".$how['accept'])),
375 + ),
376 + );
138 377 endforeach;
378 +
379 + // Hey ho, let's go...
380 + ?>
381 + <table class="edit-form narrow">
382 + <?php foreach ($whatsits as $what => $how) : ?>
383 +
384 + <tr><th scope="row"><?php print esc_html($how['label']); ?>:</th>
385 + <td><?php
386 + $this->setting_radio_control(
387 + "$what status", "syndicated_${what}_status",
388 + $settings[$what], $params[$what]
389 + );
390 + ?></td></tr>
391 +
392 + <?php endforeach; ?>
139 393
140 - $custom_settings = $link->settings["postmeta"];
141 - if ($custom_settings) :
394 + <tr><th scope="row"><?php _e('Comment feeds'); ?></th>
395 + <td><p>When WordPress feeds and templates link to comments
396 + feeds for <?php print esc_html($page->these_posts_phrase()); ?>, the
397 + URLs for the feeds should...</p>
398 + <?php
399 + $this->setting_radio_control(
400 + "munge comments feed links", "munge_comments_feed_links",
401 + $mcflSettings, $mcflParams
402 + );
403 + ?></td></tr>
404 + </table>
405 +
406 + <?php
407 + } /* FeedWordPressPostsPage::comments_and_pings_box() */
408 +
409 + /*static*/ function custom_post_settings ($page = NULL) {
410 + if (is_null($page)) :
411 + $page = $this;
412 + endif;
413 +
414 + if ($page->for_feed_settings()) :
415 + $custom_settings = $page->link->setting("postmeta", NULL, array());
416 + else :
417 + $custom_settings = get_option('feedwordpress_custom_settings');
418 + endif;
419 +
420 + if ($custom_settings and !is_array($custom_settings)) :
142 421 $custom_settings = unserialize($custom_settings);
143 422 endif;
144 423
145 424 if (!is_array($custom_settings)) :
@@ -144,300 +423,318 @@
144 423
145 424 if (!is_array($custom_settings)) :
146 425 $custom_settings = array();
147 426 endif;
148 - else :
149 - $thePostsPhrase = __('syndicated posts');
150 427
151 - $status['post'][$post_status_global] = ' checked="checked"';
152 - $status['comment'][$comment_status_global] = ' checked="checked"';
153 - $status['ping'][$ping_status_global] = ' checked="checked"';
428 + return $custom_settings;
429 + } /* FeedWordPressPostsPage::custom_post_settings() */
430 +
431 + /**
432 + * Output "Custom Post Settings" settings box
433 + *
434 + * @since 2009.0713
435 + * @param object $page of class FeedWordPressPostsPage tells us whether this is
436 + * a page for one feed's settings or for global defaults
437 + * @param array $box
438 + */
439 + /*static*/ function custom_post_settings_box ($page, $box = NULL) {
440 + $custom_settings = FeedWordPressPostsPage::custom_post_settings($page);
441 + ?>
442 + <div id="postcustomstuff">
443 + <p>Custom fields can be used to add extra metadata to a post that you can <a href="http://codex.wordpress.org/Using_Custom_Fields">use in your theme</a>.</p>
444 + <table id="meta-list" cellpadding="3">
445 + <tr>
446 + <th>Key</th>
447 + <th>Value</th>
448 + <th>Action</th>
449 + </tr>
154 450
155 - $munge_permalink = get_option('feedwordpress_munge_permalink');
156 - $formatting_filters = get_option('feedwordpress_formatting_filters');
157 - $use_aggregator_source_data = get_option('feedwordpress_use_aggregator_source_data');
451 + <?php
452 + $i = 0;
453 + $testerButton = '<br/><button id="xpath-test-%d"'
454 + .'class="xpath-test"'
455 + .'>test expression</button>';
456 + foreach ($custom_settings as $key => $value) :
457 + ?>
458 + <tr style="vertical-align:top">
459 + <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo esc_attr($i); ?>][key0]" value="<?php echo esc_html($key); ?>" />
460 + <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo esc_attr($i); ?>][key1]" value="<?php echo esc_html($key); ?>" /></th>
461 + <td width="60%"><textarea rows="2" cols="40" id="notes-<?php echo esc_attr($i); ?>-value" name="notes[<?php echo esc_attr($i); ?>][value]"><?php echo esc_html($value); ?></textarea>
462 + <?php print sprintf($testerButton, esc_attr($i) ); ?></td>
463 + <td width="10%"><select name="notes[<?php echo esc_attr($i); ?>][action]">
464 + <option value="update">save changes</option>
465 + <option value="delete">delete this setting</option>
466 + </select></td>
467 + </tr>
158 468
159 - $custom_settings = get_option('feedwordpress_custom_settings');
160 - if ($custom_settings) :
161 - $custom_settings = unserialize($custom_settings);
162 - endif;
469 + <?php
470 + $i++;
471 + endforeach;
472 + ?>
163 473
164 - if (!is_array($custom_settings)) :
165 - $custom_settings = array();
474 + <tr style="vertical-align: top">
475 + <th scope="row"><input type="text" size="10" name="notes[<?php echo esc_attr($i); ?>][key1]" value="" /></th>
476 + <td><textarea name="notes[<?php echo esc_attr($i); ?>][value]" rows="2" cols="40"></textarea><?php print sprintf($testerButton, esc_attr($i)); ?>
477 + <p>Enter a text value, or a path to a data element from the syndicated item.<br/>
478 + For data elements, you can use an XPath-like syntax wrapped in <code>$( ... )</code>.<br/>
479 + <code>hello</code> = the text value <code><span style="background-color: #30FFA0;">hello</span></code><br/>
480 + <code>$(author/email)</code> = the contents of <code>&lt;author&gt;&lt;email&gt;<span style="background-color: #30FFA0">...</span>&lt;/email&gt;&lt;/author&gt;</code><br/>
481 + <code>$(media:content/@url)</code> = the contents of <code>&lt;media:content url="<span style="background-color: #30FFA0">...</span>"&gt;...&lt;/media:content&gt;</code></p>
482 + </td>
483 + <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo esc_attr($i); ?>][action]" value="update" /></td>
484 + </tr>
485 + </table>
486 + </div> <!-- id="postcustomstuff" -->
487 +
488 + <?php
489 + } /* FeedWordPressPostsPage::custom_post_settings_box() */
490 +
491 + function custom_post_types_box ($page, $box = NULL) {
492 + global $fwp_path;
493 +
494 + // local: syndicated post type // default NULL
495 + // global: syndicated_post_type // default 'post'
496 + // default-input-value => 'default'
497 +
498 + // Get all custom post types
499 + $post_types = get_post_types(array(
500 + '_builtin' => false,
501 + ), 'objects');
502 +
503 + $ul = array();
504 + $ul['post'] = __('Normal WordPress posts');
505 + foreach ($post_types as $post_type) :
506 + $ul[$post_type->name] = __($post_type->labels->name);
507 + endforeach;
508 +
509 + $params = array(
510 + 'global-setting-default' => 'post',
511 + 'default-input-value' => 'default',
512 + );
513 +
514 + // Hey, ho, let's go...
515 + ?>
516 + <table class="edit-form narrow">
517 + <tbody>
518 + <tr><th><?php _e('Custom Post Types:'); ?></th>
519 + <td><p>Incoming syndicated posts should be stored in the
520 + posts database as...</p>
521 + <?php
522 + $this->setting_radio_control(
523 + 'syndicated post type', 'syndicated_post_type',
524 + $ul, $params
525 + );
526 + ?>
527 + </td></tr>
528 + </tbody>
529 + </table>
530 + <?php
531 + } /* FeedWordPressPostsPage::custom_post_types_box() */
532 +
533 + public function boilerplate_box ($page, $box = NULL) {
534 + if ($page->for_feed_settings()) :
535 + $attrib = isset($page->link->settings['boilerplate rules'])
536 + ? unserialize($page->link->settings['boilerplate rules'])
537 + : [];
538 + $syndicatedPosts = 'this feed\'s posts';
539 + else :
540 + $attrib = get_option('feedwordpress_boilerplate');
541 + $syndicatedPosts = 'syndicated posts';
166 542 endif;
167 - endif;
543 + $hookOrder = intval($page->setting('boilerplate hook order', FEEDWORDPRESS_BOILERPLATE_DEFAULT_HOOK_ORDER));
168 544 ?>
169 -<script type="text/javascript">
170 - function contextual_appearance (item, appear, disappear, value, visibleStyle, checkbox) {
171 - if (typeof(visibleStyle)=='undefined') visibleStyle = 'block';
545 + <style type="text/css">
546 + .boilerplate-help-box {
547 + float: right;
548 + width: 300px;
549 + border: 1px dotted #777;
550 + margin: 3px;
551 + padding: 5px;
552 + background-color: #f7f7f7;
553 + }
554 + .boilerplate-help-box dt {
555 + font-weight: bold;
556 + font-size: 85%;
557 + }
558 + .boilerplate-help-box dd {
559 + font-size: 80%; line-height: 100%; font-style: italic;
560 + padding-left: 1.5em;
561 + }
562 + .boilerplate-help-box code {
563 + font-size: inherit;
564 + font-style: normal;
565 + background-color: inherit;
566 + }
172 567
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 - }
568 + .boilerplate-li {
569 + padding-bottom: 5px;
570 + margin-bottom: 5px;
571 + border-bottom: 1px dotted black;
185 572 }
186 -</script>
573 +
574 + </style>
187 575
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; ?>
576 + <div class="boilerplate-help-box">
577 + <p style="border-bottom: 1px dotted #777;">To remove boilerplate, just blank out the text box and leave it empty.</p>
193 578
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');
579 + <p>Use shortcodes to include information about your source:</p>
580 + <dl>
581 + <dt><code>[source]</code></dt>
582 + <dd>A link to the source you syndicated the post from</dd>
198 583
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>
584 + <dt><code>[source-name]</code></dt>
585 + <dd>Name of the source you syndicated the post from</dd>
210 586
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; ?>
587 + <dt><code>[source-url]</code></dt>
588 + <dd>URL of the source you syndicated the post from</dd>
215 589
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>
590 + <dt><code>[original-link]text[/original-link]</code></dt>
591 + <dd>A link to the <em>original post</em> back on the source website,
592 + using <code>text</code> as the link text.</dd>
593 +
594 + <dt><code>[original-url]</code></dt>
595 + <dd>URL of the <em>original post</em> back on the source website</dd>
217 596
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>
597 + <dt><code>[author]</code></dt>
598 + <dd>A link with the name of the author who wrote the post, linking to other posts by the same author</dd>
223 599
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>
600 + <dt><code>[author-name]</code></dt>
601 + <dd>Name of the author who wrote the post</dd>
257 602
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; */ ?>
603 + <dt><code>[feed-setting key="setting-name"]</code></dt>
604 + <dd>Value of a custom feed setting (named <code>setting-name</code>) for the feed</dd>
605 + </dl>
606 + </div>
282 607
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; ?>
608 +<?php
609 + print "<ul>\n";
610 + if (!is_array($attrib)) : $attrib = array(); endif;
290 611
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">
612 + print '<input type="hidden" id="next-boilerplate-rule-index" name="next_boilerplate_rule_index" value="'.count($attrib).'" />';
297 613
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; ?>
614 + // In AJAX environment, this is a dummy rule that stays hidden. In a
615 + // non-AJAX environment, this provides a blank rule that we can fill in.
616 + $attrib['new'] = array(
617 + 'class' => array('hide-if-js'),
618 + 'placement' => 'before',
619 + 'element' => 'post',
620 + 'template' => '',
621 + );
303 622
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>
623 + foreach ($attrib as $index => $line) :
624 + if (isset($line['template'])) :
625 + $selected['before'] = (($line['placement']=='before') ? ' selected="selected"' : '');
626 + $selected['after'] = (($line['placement']=='after') ? ' selected="selected"' : '');
627 + $selected['title'] = (($line['element']=='title') ? ' selected="selected"' : '');
628 + $selected['post'] = (($line['element']=='post') ? ' selected="selected"' : '');
629 + $selected['excerpt'] = (($line['element']=='excerpt') ? ' selected="selected"' : '');
306 630
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; ?>
631 + if (!isset($line['class'])) : $line['class'] = array(); endif;
632 + $line['class'][] = 'boilerplate-li';
633 +?>
311 634
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>
635 +<li id="boilerplate-<?php print esc_attr($index); ?>-li" class="<?php print esc_attr(implode(' ', $line['class'])); ?>">&raquo; <strong>Add</strong> <select id="boilerplate-<?php print esc_attr($index); ?>-placement" name="boilerplate[<?php print esc_attr($index); ?>][placement]" style="width: 8.0em">
636 +<option value="before"<?php print $selected['before']; ?>>before</option>
637 +<option value="after"<?php print $selected['after']; ?>>after</option>
638 +</select> the <select style="width: 8.0em" id="boilerplate-<?php print esc_attr($index); ?>-element" name="boilerplate[<?php print esc_attr($index); ?>][element]">
639 +<option value="title"<?php print $selected['title']; ?>>title</option>
640 +<option value="post"<?php print $selected['post']; ?>>content</option>
641 +<option value="excerpt"<?php print $selected['excerpt']; ?>>excerpt</option>
642 +</select> of
643 +<?php print esc_html($syndicatedPosts); ?>: <textarea style="vertical-align: top; width: 40%;" rows="2" cols="30" class="boilerplate-template" id="boilerplate-<?php print esc_attr($index); ?>-template" name="boilerplate[<?php print esc_attr($index); ?>][template]"><?php print esc_html($line['template']); ?></textarea></li>
319 644 <?php
320 - fwp_option_box_closer();
645 + endif;
646 + endforeach;
321 647 ?>
648 + </ul>
649 + <br style="clear: both" />
322 650
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(); ?>
651 + <script type="text/javascript">
652 + jQuery(document).ready( function($) {
653 + $('.boilerplate-template').blur( function() {
654 + if (this.value.length == 0) {
655 + var theLi = $('li:has(#'+this.id+")");
656 + theLi.hide('normal')
657 + }
658 + } );
338 659
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>
660 + var addRuleLi = document.createElement('li');
661 + addRuleLi.innerHTML = '<strong style="vertical-align: middle; font-size: 110%">[+]</strong> <a style="font-variant: small-caps" id="add-new-boilerplate-rule" href="#">Add new boilerplate</a> ….';
662 + $('#boilerplate-new-li').after(addRuleLi);
349 663
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;
664 + $('#add-new-boilerplate-rule').click( function() {
665 + // Get index counter
666 + var nextIndex = parseInt($('#next-boilerplate-rule-index').val());
364 667
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; ?>
668 + var newIdPrefix = 'boilerplate-'+nextIndex;
669 + var newNamePrefix = 'boilerplate['+nextIndex+']';
375 670
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>
671 + var dummy = {};
672 + dummy['li'] = {'el': $('#boilerplate-new-li') }
673 + dummy['placement'] = {'el': $('#boilerplate-new-placement') };
674 + dummy['element'] = {'el': $('#boilerplate-new-element') };
675 + dummy['template'] = {'el': $('#boilerplate-new-template') };
379 676
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>
386 -<?php endif; ?>
677 + for (var element in dummy) {
678 + dummy[element]['save'] = {
679 + 'id': dummy[element]['el'].attr('id'),
680 + 'name': dummy[element]['el'].attr('name')
681 + };
682 + dummy[element]['el'].attr('id', newIdPrefix+'-'+element);
683 + dummy[element]['el'].attr('name', newNamePrefix+'['+element+']');
684 + }
685 +
686 + var newLi = $('#'+newIdPrefix+'-li').clone(/*events=*/ true);
687 + //newLi.attr('id', null);
688 + newLi.removeClass('hide-if-js');
689 + newLi.addClass('boilerplate-li');
690 + newLi.css('display', 'none');
387 691
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 -<?php
393 - fwp_option_box_closer();
394 - fwp_linkedit_periodic_submit();
395 -?>
692 + // Switch back
693 + for (var element in dummy) {
694 + dummy[element]['el'].attr('id', dummy[element]['save']['id']);
695 + dummy[element]['el'].attr('name', dummy[element]['save']['name']);
696 + }
396 697
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>
698 + $('#boilerplate-new-li').before(newLi);
699 + newLi.show('normal');
405 700
701 + $('#next-boilerplate-rule-index').val(nextIndex+1);
702 +
703 + return false;
704 + } )
705 + } );
706 + </script>
406 707 <?php
407 - $i = 0;
408 - foreach ($custom_settings as $key => $value) :
708 + if ($page->for_default_settings()) :
409 709 ?>
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>
710 + <h3>Advanced Settings</h3>
711 + <table class="edit-form narrow">
712 + <tbody>
713 + <tr><th scope="row"><?php _e("Hook Order:") ?></th>
714 + <td><input type="number" name="boilerplate_hook_order" value="<?php print esc_attr($hookOrder); ?>" /></td></tr>
715 + </tbody>
716 + </table>
419 717 <?php
420 - $i++;
421 - endforeach;
422 -?>
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(); ?>
718 + endif;
719 + } /* FeedWordPressPostsPage::boilerplate_box() */
430 720
431 -</div>
432 -</div>
721 + function display () {
722 + $this->boxes_by_methods = array(
723 + 'publication_box' => __('Syndicated Posts'),
724 + 'links_box' => __('Links'),
725 + 'formatting_box' => __('Formatting'),
726 + 'boilerplate_box' => ('Boilerplate / Credits'),
727 + 'comments_and_pings_box' => __('Comments & Pings'),
728 + 'custom_post_settings_box' => __('Custom Post Settings (to apply to each syndicated post)'),
729 + 'custom_post_types_box' => ('Custom Post Types (advanced database settings)'),
730 + );
731 +
732 + parent::display();
733 + } /* FeedWordPressPostsPage::display () */
433 734
434 -<p class="submit">
435 -<input class="button-primary" type="submit" name="save" value="Save Changes" />
436 -</p>
437 -</form>
438 -</div> <!-- class="wrap" -->
439 -<?php
440 -} /* function fwp_posts_page () */
441 735
442 - fwp_posts_page();
736 +}
737 +
738 + $postsPage = new FeedWordPressPostsPage;
739 + $postsPage->display();
443 740