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 +566 -289 2009.11112022.0203 View file →
@@ -1,9 +1,11 @@
1 1 <?php
2 2 require_once(dirname(__FILE__) . '/admin-ui.php');
3 +require_once(dirname(__FILE__) . '/updatedpostscontrol.class.php');
3 4
4 5 class FeedWordPressPostsPage extends FeedWordPressAdminPage {
5 6 var $link = NULL;
7 + var $updatedPosts = NULL;
6 8
7 9 /**
8 10 * Construct the posts page object.
9 11 *
@@ -8,16 +10,153 @@
8 10 * Construct the posts page object.
9 11 *
10 12 * @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings
11 13 */
12 - function FeedWordPressPostsPage ($link = NULL) {
13 - FeedWordPressAdminPage::FeedWordPressAdminPage('feedwordpresspostspage', $link);
14 - $this->dispatch = 'feedwordpress_posts_settings';
14 + public function __construct( $link = -1 ) {
15 + if (is_numeric($link) and -1 == $link) :
16 + $link = $this->submitted_link();
17 + endif;
18 +
19 + parent::__construct('feedwordpresspostspage', $link);
20 + $this->dispatch = 'feedwordpress_admin_page_posts';
15 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 + );
16 29 } /* FeedWordPressPostsPage constructor */
17 30
31 + function save_settings ($post) {
32 + // custom post settings
33 + $custom_settings = $this->custom_post_settings();
34 +
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']);
45 +
46 + if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
47 + $custom_settings[$mn['key1']] = $mn['value']; // in with the new
48 + endif;
49 + endif;
50 + endforeach;
51 +
52 + $this->updatedPosts->accept_POST($post);
53 + if ($this->for_feed_settings()) :
54 + $alter = array ();
55 +
56 + $this->link->settings['postmeta'] = serialize($custom_settings);
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 +
68 + // Post status, comment status, ping status
69 + foreach (array('post', 'comment', 'ping') as $what) :
70 + $sfield = "feed_{$what}_status";
71 + if (isset($post[$sfield])) :
72 + if ($post[$sfield]=='site-default') :
73 + unset($this->link->settings["{$what} status"]);
74 + else :
75 + $this->link->settings["{$what} status"] = $post[$sfield];
76 + endif;
77 + endif;
78 + endforeach;
79 +
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;
87 +
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;
93 +
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);
105 +
106 + if (isset($post['resolve_relative'])) :
107 + update_option('feedwordpress_resolve_relative', $post['resolve_relative']);
108 + endif;
109 + if (isset($post['munge_comments_feed_links'])) :
110 + update_option('feedwordpress_munge_comments_feed_links', $post['munge_comments_feed_links']);
111 + endif;
112 +
113 + if ( $sFeedCommentStatus == 'open' ) :
114 + update_option('feedwordpress_syndicated_comment_status', 'open');
115 + else :
116 + update_option('feedwordpress_syndicated_comment_status', 'closed');
117 + endif;
118 +
119 + if ( $sFeedPingStatus == 'open' ) :
120 + update_option('feedwordpress_syndicated_ping_status', 'open');
121 + else :
122 + update_option('feedwordpress_syndicated_ping_status', 'closed');
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 +
18 157 /**
19 - * Outputs "Publication" settings box.
158 + * publication_box: Outputs "Publication" settings box.
20 159 *
21 160 * @since 2009.0713
22 161 * @param object $page of class FeedWordPressPostsPage tells us whether this is
23 162 * a page for one feed's settings or for global defaults
@@ -25,71 +164,43 @@
25 164 *
26 165 * @uses FeedWordPressPostsPage::these_posts_phrase()
27 166 * @uses FeedWordPress::syndicated_status()
28 167 * @uses SyndicatedLink::syndicated_status()
29 - * @uses SyndicatedPost::use_api()
30 - * @uses fwp_option_box_opener()
31 - * @uses fwp_option_box_closer()
32 168 */
33 169 /*static*/ function publication_box ($page, $box = NULL) {
34 - global $fwp_path;
35 -
36 - $post_status_global = FeedWordPress::syndicated_status('post', /*default=*/ 'publish');
37 170 $thesePosts = $page->these_posts_phrase();
38 -
39 - // Set up array for selector
40 - $setting = array(
41 - 'publish' => array ('label' => "Publish %s immediately", 'checked' => ''),
42 - 'draft' => array('label' => "Save %s as drafts", 'checked' => ''),
43 - 'private' => array('label' => "Save %s as private posts", 'checked' => ''),
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",
44 176 );
45 - if (SyndicatedPost::use_api('post_status_pending')) :
46 - $setting['pending'] = array('label' => "Hold %s for review; mark as Pending", 'checked' => '');
47 - endif;
48 - if ($page->for_feed_settings()) :
49 - $href = $fwp_path.'/'.basename(__FILE__);
50 - $currently = str_replace('%s', '', strtolower(strtok($setting[$post_status_global]['label'], ';')));
51 - $setting['site-default'] = array('label' => "Use <a href=\"admin.php?page=${href}\">site-wide setting</a>", 'checked' => '');
52 - $setting['site-default']['label'] .= " (currently: <strong>${currently}</strong>)";
53 -
54 - $checked = $page->link->syndicated_status('post', 'site-default', /*fallback=*/ false);
55 - else :
56 - $checked = $post_status_global;
57 - endif;
58 -
59 - // Re-order appropriately
60 - $selector = array();
61 - $order = array(
62 - 'site-default',
63 - 'publish',
64 - 'pending',
65 - 'draft',
66 - 'private',
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,
67 188 );
68 - foreach ($order as $line) :
69 - if (isset($setting[$line])) :
70 - $selector[$line] = $setting[$line];
71 - endif;
72 - endforeach;
73 - $selector[$checked]['checked'] = ' checked="checked"';
74 -
189 +
75 190 // Hey ho, let's go...
76 191 ?>
77 - <style type="text/css">
78 - #syndicated-publication-form th { width: 27%; vertical-align: top; }
79 - #syndicated-publication-form td { width: 73%; vertical-align: top; }
80 - </style>
81 -
82 - <table id="syndicated-publication-form" class="form-table" cellspacing="2" cellpadding="5">
83 - <tr><th scope="row">Status for new posts:</th>
84 - <td><ul class="options">
85 - <?php foreach ($selector as $code => $li) : ?>
86 - <li><label><input type="radio" name="feed_post_status"
87 - value="<?php print $code; ?>"<?php print $li['checked']; ?> />
88 - <?php print str_replace('%s', $thesePosts, $li['label']); ?></label></li>
89 - <?php endforeach; ?>
90 - </ul></td>
91 - </tr>
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(); ?>
92 203 </table>
93 204
94 205 <?php
95 206 } /* FeedWordPressPostsPage::publication_box () */
@@ -101,25 +212,63 @@
101 212 * @param object $page of class FeedWordPressPostsPage tells us whether this is
102 213 * a page for one feed's settings or for global defaults
103 214 * @param array $box
104 215 *
105 - * @uses fwp_option_box_opener()
106 - * @uses fwp_option_box_closer()
107 216 */
108 217 function formatting_box ($page, $box = NULL) {
109 - $formatting_filters = get_option('feedwordpress_formatting_filters');
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';
226 + endif;
110 227 ?>
111 - <table class="form-table" cellspacing="2" cellpadding="5">
112 - <tr><th scope="row">Formatting filters:</th>
113 - <td><select name="formatting_filters" size="1">
114 - <option value="no"<?php echo ($formatting_filters!='yes')?' selected="selected"':''; ?>>Protect syndicated posts from formatting filters</option>
115 - <option value="yes"<?php echo ($formatting_filters=='yes')?' selected="selected"':''; ?>>Expose syndicated posts to formatting filters</option>
116 - </select>
117 - <p class="setting-description">If you have trouble getting plugins to work that are supposed to insert
118 - elements after posts (like relevant links or a social networking
119 - <q>Share This</q> button), try changing this option to see if it fixes your
120 - problem.</p>
228 + <table class="edit-form narrow">
229 + <?php if (!is_null($formatting_filters)) : ?>
230 +
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>
241 +
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 + ?>
121 269 </td></tr>
270 +
122 271 </table>
123 272 <?php
124 273 } /* FeedWordPressPostsPage::formatting_box() */
125 274
@@ -130,23 +279,39 @@
130 279 * @param object $page of class FeedWordPressPostsPage tells us whether this is
131 280 * a page for one feed's settings or for global defaults
132 281 * @param array $box
133 282 *
134 - * @uses fwp_option_box_opener()
135 - * @uses fwp_option_box_closer()
136 283 */
137 284 /*static*/ function links_box ($page, $box = NULL) {
138 - $munge_permalink = get_option('feedwordpress_munge_permalink');
139 - $use_aggregator_source_data = get_option('feedwordpress_use_aggregator_source_data');
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 + );
291 +
292 + if (!$page->for_feed_settings()) :
293 + $use_aggregator_source_data = get_option('feedwordpress_use_aggregator_source_data');
294 + endif;
140 295 ?>
141 - <table class="form-table" cellspacing="2" cellpadding="5">
142 - <tr><th scope="row">Permalinks:</th>
143 - <td><select name="munge_permalink" size="1">
144 - <option value="yes"<?php echo ($munge_permalink=='yes')?' selected="selected"':''; ?>>point to the copy on the original website</option>
145 - <option value="no"<?php echo ($munge_permalink=='no')?' selected="selected"':''; ?>>point to the local copy on this website</option>
146 - </select></td>
147 - </tr>
296 + <table class="edit-form narrow">
297 + <tr><th scope="row">Permalinks point to:</th>
298 + <td><?php
148 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 + ?>
310 +
311 + </td></tr>
312 +
313 + <?php if (!$page->for_feed_settings()) : ?>
149 314 <tr><th scope="row">Posts from aggregator feeds:</th>
150 315 <td><ul class="options">
151 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>
152 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>
@@ -154,8 +319,9 @@
154 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.
155 320 This setting controls what FeedWordPress will give as the source of posts from
156 321 such an aggregator feed.</p>
157 322 </td></tr>
323 + <?php endif; ?>
158 324 </table>
159 325
160 326 <?php
161 327 } /* FeedWordPressPostsPage::links_box() */
@@ -167,73 +333,102 @@
167 333 * @param object $page of class FeedWordPressPostsPage tells us whether this is
168 334 * a page for one feed's settings or for global defaults
169 335 * @param array $box
170 336 *
171 - * @uses fwp_option_box_opener()
172 - * @uses fwp_option_box_closer()
173 337 */
174 338 /*static*/ function comments_and_pings_box ($page, $box = NULL) {
175 - $setting = array();
176 - $selector = array();
177 -
178 339 $whatsits = array(
179 340 'comment' => array('label' => __('Comments'), 'accept' => 'Allow comments'),
180 341 'ping' => array('label' => __('Pings'), 'accept' => 'Accept pings'),
181 342 );
182 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 + );
183 358
359 + $settings = array(); $params = array();
184 360 foreach ($whatsits as $what => $how) :
185 361 $whatsits[$what]['default'] = FeedWordPress::syndicated_status($what, /*default=*/ 'closed');
186 362
187 363 // Set up array for selector
188 - $setting = array(
189 - 'open' => array ('label' => "{$how['accept']} %s", 'checked' => ''),
190 - 'closed' => array('label' => "Don't ".strtolower($how['accept'])." %s", 'checked' => ''),
364 + $settings[$what] = array(
365 + 'open' => sprintf(__("{$how['accept']} %s"), __($onThesePosts)),
366 + 'closed' => sprintf(__("Don't ".strtolower($how['accept'])." %s"), __($onThesePosts)),
191 367 );
192 - if ($page->for_feed_settings()) :
193 - $href = $fwp_path.'/'.basename(__FILE__);
194 - $currently = trim(str_replace('%s', '', strtolower(strtok($setting[$whatsits[$what]['default']]['label'], ';'))));
195 - $setting['site-default'] = array('label' => "Use <a href=\"admin.php?page=${href}\">site-wide setting</a>", 'checked' => '');
196 - $setting['site-default']['label'] .= " (currently: <strong>${currently}</strong>)";
197 -
198 - $checked = $page->link->syndicated_status($what, 'site-default', /*fallback=*/ false);
199 - else :
200 - $checked = $whatsits[$what]['default'];
201 - endif;
202 -
203 - // Re-order appropriately
204 - $selector[$what] = array();
205 - $order = array(
206 - 'site-default',
207 - 'open',
208 - 'closed',
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 + ),
209 376 );
210 - foreach ($order as $line) :
211 - if (isset($setting[$line])) :
212 - $selector[$what][$line] = $setting[$line];
213 - endif;
214 - endforeach;
215 - $selector[$what][$checked]['checked'] = ' checked="checked"';
216 377 endforeach;
217 378
218 379 // Hey ho, let's go...
219 380 ?>
220 - <table class="form-table" cellspacing="2" cellpadding="5">
381 + <table class="edit-form narrow">
221 382 <?php foreach ($whatsits as $what => $how) : ?>
222 - <tr><th scope="row"><?php print $how['label']; ?>:</th>
223 - <td><ul class="options">
224 - <?php foreach ($selector[$what] as $code => $li) : ?>
225 - <li><label><input type="radio" name="feed_<?php print $what; ?>_status"
226 - value="<?php print $code; ?>"<?php print $li['checked']; ?> />
227 - <?php print trim(str_replace('%s', $onThesePosts, $li['label'])); ?></label></li>
228 - <?php endforeach; ?>
229 - </ul></td></tr>
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 +
230 392 <?php endforeach; ?>
393 +
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>
231 404 </table>
232 405
233 406 <?php
234 407 } /* FeedWordPressPostsPage::comments_and_pings_box() */
235 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)) :
421 + $custom_settings = unserialize($custom_settings);
422 + endif;
423 +
424 + if (!is_array($custom_settings)) :
425 + $custom_settings = array();
426 + endif;
427 +
428 + return $custom_settings;
429 + } /* FeedWordPressPostsPage::custom_post_settings() */
430 +
236 431 /**
237 432 * Output "Custom Post Settings" settings box
238 433 *
239 434 * @since 2009.0713
@@ -239,35 +434,14 @@
239 434 * @since 2009.0713
240 435 * @param object $page of class FeedWordPressPostsPage tells us whether this is
241 436 * a page for one feed's settings or for global defaults
242 437 * @param array $box
243 - *
244 - * @uses fwp_option_box_opener()
245 - * @uses fwp_option_box_closer()
246 438 */
247 439 /*static*/ function custom_post_settings_box ($page, $box = NULL) {
248 - if ($page->for_feed_settings()) :
249 - $custom_settings = $page->link->settings["postmeta"];
250 - if ($custom_settings and !is_array($custom_settings)) :
251 - $custom_settings = unserialize($custom_settings);
252 - endif;
253 -
254 - if (!is_array($custom_settings)) :
255 - $custom_settings = array();
256 - endif;
257 - else :
258 - $custom_settings = get_option('feedwordpress_custom_settings');
259 - if ($custom_settings and !is_array($custom_settings)) :
260 - $custom_settings = unserialize($custom_settings);
261 - endif;
262 -
263 - if (!is_array($custom_settings)) :
264 - $custom_settings = array();
265 - endif;
266 - endif;
267 -
440 + $custom_settings = FeedWordPressPostsPage::custom_post_settings($page);
268 441 ?>
269 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>
270 444 <table id="meta-list" cellpadding="3">
271 445 <tr>
272 446 <th>Key</th>
273 447 <th>Value</th>
@@ -275,15 +449,19 @@
275 449 </tr>
276 450
277 451 <?php
278 452 $i = 0;
279 - foreach ($custom_settings as $key => $value) :
453 + $testerButton = '<br/><button id="xpath-test-%d"'
454 + .'class="xpath-test"'
455 + .'>test expression</button>';
456 + foreach ($custom_settings as $key => $value) :
280 457 ?>
281 458 <tr style="vertical-align:top">
282 - <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo wp_specialchars($key, 'both'); ?>" />
283 - <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo wp_specialchars($key, 'both'); ?>" /></th>
284 - <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>
285 - <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
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]">
286 464 <option value="update">save changes</option>
287 465 <option value="delete">delete this setting</option>
288 466 </select></td>
289 467 </tr>
@@ -292,172 +470,271 @@
292 470 $i++;
293 471 endforeach;
294 472 ?>
295 473
296 - <tr>
297 - <th scope="row"><input type="text" size="10" name="notes[<?php echo $i; ?>][key1]" value="" /></th>
298 - <td><textarea name="notes[<?php echo $i; ?>][value]" rows="2" cols="40"></textarea></td>
299 - <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo $i; ?>][action]" value="update" /></td>
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>
300 484 </tr>
301 485 </table>
302 486 </div> <!-- id="postcustomstuff" -->
303 487
304 488 <?php
305 - } /* FeedWordPressPostsPage::custom_post_settings_box() */
306 -}
489 + } /* FeedWordPressPostsPage::custom_post_settings_box() */
307 490
308 -function fwp_posts_page () {
309 - global $wpdb, $wp_db_version;
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() */
310 532
311 - if (FeedWordPress::needs_upgrade()) :
312 - fwp_upgrade_page();
313 - return;
314 - endif;
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';
542 + endif;
543 + $hookOrder = intval($page->setting('boilerplate hook order', FEEDWORDPRESS_BOILERPLATE_DEFAULT_HOOK_ORDER));
544 +?>
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 + }
315 567
316 - FeedWordPressCompatibility::validate_http_request(/*action=*/ 'feedwordpress_posts_settings', /*capability=*/ 'manage_links');
568 + .boilerplate-li {
569 + padding-bottom: 5px;
570 + margin-bottom: 5px;
571 + border-bottom: 1px dotted black;
572 + }
573 +
574 + </style>
317 575
318 - $link = FeedWordPressAdminPage::submitted_link();
319 - $link_id = $link->id;
320 - $postsPage = new FeedWordPressPostsPage($link);
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>
321 578
322 - $mesg = null;
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>
323 583
324 - ////////////////////////////////////////////////
325 - // Process POST request, if any /////////////////
326 - ////////////////////////////////////////////////
327 - if (isset($GLOBALS['fwp_post']['save']) or isset($GLOBALS['fwp_post']['submit'])) :
328 - // custom post settings
329 - foreach ($GLOBALS['fwp_post']['notes'] as $mn) :
330 - $mn['key0'] = trim($mn['key0']);
331 - $mn['key1'] = trim($mn['key1']);
584 + <dt><code>[source-name]</code></dt>
585 + <dd>Name of the source you syndicated the post from</dd>
332 586
333 - if (strlen($mn['key0']) > 0) :
334 - unset($custom_settings[$mn['key0']]); // out with the old
587 + <dt><code>[source-url]</code></dt>
588 + <dd>URL of the source you syndicated the post from</dd>
589 +
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>
596 +
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>
599 +
600 + <dt><code>[author-name]</code></dt>
601 + <dd>Name of the author who wrote the post</dd>
602 +
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>
607 +
608 +<?php
609 + print "<ul>\n";
610 + if (!is_array($attrib)) : $attrib = array(); endif;
611 +
612 + print '<input type="hidden" id="next-boilerplate-rule-index" name="next_boilerplate_rule_index" value="'.count($attrib).'" />';
613 +
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 + );
622 +
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"' : '');
630 +
631 + if (!isset($line['class'])) : $line['class'] = array(); endif;
632 + $line['class'][] = 'boilerplate-li';
633 +?>
634 +
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>
644 +<?php
335 645 endif;
336 -
337 - if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
338 - $custom_settings[$mn['key1']] = $mn['value']; // in with the new
339 - endif;
340 646 endforeach;
647 +?>
648 + </ul>
649 + <br style="clear: both" />
341 650
342 - if (is_object($link) and $link->found()) :
343 - $alter = array ();
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 + } );
344 659
345 - $link->settings['postmeta'] = serialize($custom_settings);
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);
346 663
347 - // Post status, comment status, ping status
348 - foreach (array('post', 'comment', 'ping') as $what) :
349 - $sfield = "feed_{$what}_status";
350 - if (isset($GLOBALS['fwp_post'][$sfield])) :
351 - if ($GLOBALS['fwp_post'][$sfield]=='site-default') :
352 - unset($link->settings["{$what} status"]);
353 - else :
354 - $link->settings["{$what} status"] = $GLOBALS['fwp_post'][$sfield];
355 - endif;
356 - endif;
357 - endforeach;
358 -
359 - $alter[] = "link_notes = '".$wpdb->escape($link->settings_to_notes())."'";
664 + $('#add-new-boilerplate-rule').click( function() {
665 + // Get index counter
666 + var nextIndex = parseInt($('#next-boilerplate-rule-index').val());
360 667
361 - $alter_set = implode(", ", $alter);
668 + var newIdPrefix = 'boilerplate-'+nextIndex;
669 + var newNamePrefix = 'boilerplate['+nextIndex+']';
362 670
363 - // issue update query
364 - $result = $wpdb->query("
365 - UPDATE $wpdb->links
366 - SET $alter_set
367 - WHERE link_id='$link_id'
368 - ");
369 - $updated_link = true;
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') };
370 676
371 - // reload link information from DB
372 - if (function_exists('clean_bookmark_cache')) :
373 - clean_bookmark_cache($link_id);
374 - endif;
375 - $link =& new SyndicatedLink($link_id);
376 - else :
377 - // update_option ...
378 - if (isset($GLOBALS['fwp_post']['feed_post_status'])) :
379 - update_option('feedwordpress_syndicated_post_status', $GLOBALS['fwp_post']['feed_post_status']);
380 - endif;
381 -
382 - update_option('feedwordpress_custom_settings', serialize($custom_settings));
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');
383 691
384 - update_option('feedwordpress_munge_permalink', $_REQUEST['munge_permalink']);
385 - update_option('feedwordpress_use_aggregator_source_data', $_REQUEST['use_aggregator_source_data']);
386 - update_option('feedwordpress_formatting_filters', $_REQUEST['formatting_filters']);
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 + }
387 697
388 - if (isset($_REQUEST['feed_comment_status']) and ($_REQUEST['feed_comment_status'] == 'open')) :
389 - update_option('feedwordpress_syndicated_comment_status', 'open');
390 - else :
391 - update_option('feedwordpress_syndicated_comment_status', 'closed');
392 - endif;
393 -
394 - if (isset($_REQUEST['feed_ping_status']) and ($_REQUEST['feed_ping_status'] == 'open')) :
395 - update_option('feedwordpress_syndicated_ping_status', 'open');
396 - else :
397 - update_option('feedwordpress_syndicated_ping_status', 'closed');
398 - endif;
399 -
400 - $updated_link = true;
401 - endif;
402 -
403 - do_action('feedwordpress_admin_page_posts_save', $GLOBALS['fwp_post'], $postsPage);
404 - else :
405 - $updated_link = false;
406 - endif;
407 -
408 - $postsPage->ajax_interface_js();
698 + $('#boilerplate-new-li').before(newLi);
699 + newLi.show('normal');
409 700
410 - if ($updated_link) : ?>
411 -<div class="updated"><p>Syndicated posts settings updated.</p></div>
412 -<?php elseif (!is_null($mesg)) : ?>
413 -<div class="updated"><p><?php print wp_specialchars($mesg, 1); ?></p></div>
414 -<?php endif; ?>
701 + $('#next-boilerplate-rule-index').val(nextIndex+1);
415 702
703 + return false;
704 + } )
705 + } );
706 + </script>
416 707 <?php
417 - $links = FeedWordPress::syndicated_links();
418 - $postsPage->open_sheet('Syndicated Posts & Links');
708 + if ($page->for_default_settings()) :
419 709 ?>
420 -<style type="text/css">
421 - table.edit-form th, table.form-table th { width: 27%; vertical-align: top; }
422 - table.edit-form td, table.form-table td { width: 73%; vertical-align: top; }
423 - ul.options { margin: 0; padding: 0; list-style: none; }
424 -</style>
425 -<div id="post-body">
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>
426 717 <?php
427 -$boxes_by_methods = array(
428 - 'publication_box' => __('Publication'),
429 - 'formatting_box' => __('Formatting'),
430 - 'links_box' => __('Links'),
431 - 'comments_and_pings_box' => __('Comments & Pings'),
432 - 'custom_post_settings_box' => __('Custom Post Settings (to apply to each syndicated post)'),
433 -);
718 + endif;
719 + } /* FeedWordPressPostsPage::boilerplate_box() */
434 720
435 -// Feed-level settings don't exist for these.
436 -if ($postsPage->for_feed_settings()) :
437 - unset($boxes_by_methods['formatting_box']);
438 - unset($boxes_by_methods['links_box']);
439 -endif;
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 () */
440 734
441 - foreach ($boxes_by_methods as $method => $title) :
442 - fwp_add_meta_box(
443 - /*id=*/ 'feedwordpress_'.$method,
444 - /*title=*/ $title,
445 - /*callback=*/ array('FeedWordPressPostsPage', $method),
446 - /*page=*/ $postsPage->meta_box_context(),
447 - /*context=*/ $postsPage->meta_box_context()
448 - );
449 - endforeach;
450 - do_action('feedwordpress_admin_page_posts_meta_boxes', $postsPage);
451 -?>
452 - <div class="metabox-holder">
453 -<?php
454 - fwp_do_meta_boxes($postsPage->meta_box_context(), $postsPage->meta_box_context(), $postsPage);
455 -?>
456 - </div> <!-- class="metabox-holder" -->
457 -</div> <!-- id="post-body" -->
458 -<?php
459 - $postsPage->close_sheet();
460 -} /* function fwp_posts_page () */
461 735
462 - fwp_posts_page();
736 +}
737 +
738 + $postsPage = new FeedWordPressPostsPage;
739 + $postsPage->display();
463 740