PluginProbe
FeedWordPress / 2020.0818
FeedWordPress v2020.0818
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 2020.0818, at posts-page.php

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