PluginProbe
FeedWordPress / trunk
FeedWordPress vtrunk
trunk 0.8 0.9 0.91 0.95 0.96 0.97 0.98 0.981 0.99 0.991 0.992 0.993 2008.1030 2008.1101 2008.1105 2008.1214 2009.0612 2009.0613 2009.0618 2009.0707 2009.1111 2009.1112 2010.0127 2010.0528 All 65 releases
feedwordpress / posts-page.php

posts-page.php in FeedWordPress trunk, at posts-page.php

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