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

732 lines 25.0 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 = unserialize($page->link->settings['boilerplate rules']);
529 $syndicatedPosts = 'this feed\'s posts';
530 else :
531 $attrib = get_option('feedwordpress_boilerplate');
532 $syndicatedPosts = 'syndicated posts';
533 endif;
534 $hookOrder = intval($page->setting('boilerplate hook order', FEEDWORDPRESS_BOILERPLATE_DEFAULT_HOOK_ORDER));
535 ?>
536 <style type="text/css">
537 .boilerplate-help-box {
538 float: right;
539 width: 300px;
540 border: 1px dotted #777;
541 margin: 3px;
542 padding: 5px;
543 background-color: #f7f7f7;
544 }
545 .boilerplate-help-box dt {
546 font-weight: bold;
547 font-size: 85%;
548 }
549 .boilerplate-help-box dd {
550 font-size: 80%; line-height: 100%; font-style: italic;
551 padding-left: 1.5em;
552 }
553 .boilerplate-help-box code {
554 font-size: inherit;
555 font-style: normal;
556 background-color: inherit;
557 }
558
559 .boilerplate-li {
560 padding-bottom: 5px;
561 margin-bottom: 5px;
562 border-bottom: 1px dotted black;
563 }
564
565 </style>
566
567 <div class="boilerplate-help-box">
568 <p style="border-bottom: 1px dotted #777;">To remove boilerplate, just blank out the text box and leave it empty.</p>
569
570 <p>Use shortcodes to include information about your source:</p>
571 <dl>
572 <dt><code>[source]</code></dt>
573 <dd>A link to the source you syndicated the post from</dd>
574
575 <dt><code>[source-name]</code></dt>
576 <dd>Name of the source you syndicated the post from</dd>
577
578 <dt><code>[source-url]</code></dt>
579 <dd>URL of the source you syndicated the post from</dd>
580
581 <dt><code>[original-link]text[/original-link]</code></dt>
582 <dd>A link to the <em>original post</em> back on the source website,
583 using <code>text</code> as the link text.</dd>
584
585 <dt><code>[original-url]</code></dt>
586 <dd>URL of the <em>original post</em> back on the source website</dd>
587
588 <dt><code>[author]</code></dt>
589 <dd>A link with the name of the author who wrote the post, linking to other posts by the same author</dd>
590
591 <dt><code>[author-name]</code></dt>
592 <dd>Name of the author who wrote the post</dd>
593
594 <dt><code>[feed-setting key="setting-name"]</code></dt>
595 <dd>Value of a custom feed setting (named <code>setting-name</code>) for the feed</dd>
596 </dl>
597 </div>
598
599 <?php
600 print "<ul>\n";
601 if (!is_array($attrib)) : $attrib = array(); endif;
602
603 print '<input type="hidden" id="next-boilerplate-rule-index" name="next_boilerplate_rule_index" value="'.count($attrib).'" />';
604
605 // In AJAX environment, this is a dummy rule that stays hidden. In a
606 // non-AJAX environment, this provides a blank rule that we can fill in.
607 $attrib['new'] = array(
608 'class' => array('hide-if-js'),
609 'placement' => 'before',
610 'element' => 'post',
611 'template' => '',
612 );
613
614 foreach ($attrib as $index => $line) :
615 if (isset($line['template'])) :
616 $selected['before'] = (($line['placement']=='before') ? ' selected="selected"' : '');
617 $selected['after'] = (($line['placement']=='after') ? ' selected="selected"' : '');
618 $selected['title'] = (($line['element']=='title') ? ' selected="selected"' : '');
619 $selected['post'] = (($line['element']=='post') ? ' selected="selected"' : '');
620 $selected['excerpt'] = (($line['element']=='excerpt') ? ' selected="selected"' : '');
621
622 if (!isset($line['class'])) : $line['class'] = array(); endif;
623 $line['class'][] = 'boilerplate-li';
624 ?>
625
626 <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">
627 <option value="before"<?php print $selected['before']; ?>>before</option>
628 <option value="after"<?php print $selected['after']; ?>>after</option>
629 </select> the <select style="width: 8.0em" id="boilerplate-<?php print $index; ?>-element" name="boilerplate[<?php print $index; ?>][element]">
630 <option value="title"<?php print $selected['title']; ?>>title</option>
631 <option value="post"<?php print $selected['post']; ?>>content</option>
632 <option value="excerpt"<?php print $selected['excerpt']; ?>>excerpt</option>
633 </select> of
634 <?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>
635 <?php
636 endif;
637 endforeach;
638 ?>
639 </ul>
640 <br style="clear: both" />
641
642 <script type="text/javascript">
643 jQuery(document).ready( function($) {
644 $('.boilerplate-template').blur( function() {
645 if (this.value.length == 0) {
646 var theLi = $('li:has(#'+this.id+")");
647 theLi.hide('normal')
648 }
649 } );
650
651 var addRuleLi = document.createElement('li');
652 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> ….';
653 $('#boilerplate-new-li').after(addRuleLi);
654
655 $('#add-new-boilerplate-rule').click( function() {
656 // Get index counter
657 var nextIndex = parseInt($('#next-boilerplate-rule-index').val());
658
659 var newIdPrefix = 'boilerplate-'+nextIndex;
660 var newNamePrefix = 'boilerplate['+nextIndex+']';
661
662 var dummy = {};
663 dummy['li'] = {'el': $('#boilerplate-new-li') }
664 dummy['placement'] = {'el': $('#boilerplate-new-placement') };
665 dummy['element'] = {'el': $('#boilerplate-new-element') };
666 dummy['template'] = {'el': $('#boilerplate-new-template') };
667
668 for (var element in dummy) {
669 dummy[element]['save'] = {
670 'id': dummy[element]['el'].attr('id'),
671 'name': dummy[element]['el'].attr('name')
672 };
673 dummy[element]['el'].attr('id', newIdPrefix+'-'+element);
674 dummy[element]['el'].attr('name', newNamePrefix+'['+element+']');
675 }
676
677 var newLi = $('#'+newIdPrefix+'-li').clone(/*events=*/ true);
678 //newLi.attr('id', null);
679 newLi.removeClass('hide-if-js');
680 newLi.addClass('boilerplate-li');
681 newLi.css('display', 'none');
682
683 // Switch back
684 for (var element in dummy) {
685 dummy[element]['el'].attr('id', dummy[element]['save']['id']);
686 dummy[element]['el'].attr('name', dummy[element]['save']['name']);
687 }
688
689 $('#boilerplate-new-li').before(newLi);
690 newLi.show('normal');
691
692 $('#next-boilerplate-rule-index').val(nextIndex+1);
693
694 return false;
695 } )
696 } );
697 </script>
698 <?php
699 if ($page->for_default_settings()) :
700 ?>
701 <h3>Advanced Settings</h3>
702 <table class="edit-form narrow">
703 <tbody>
704 <tr><th scope="row"><?php _e("Hook Order:") ?></th>
705 <td><input type="number" name="boilerplate_hook_order" value="<?php print esc_attr($hookOrder); ?>" /></td></tr>
706 </tbody>
707 </table>
708 <?php
709 endif;
710 } /* FeedWordPressPostsPage::boilerplate_box() */
711
712 function display () {
713 $this->boxes_by_methods = array(
714 'publication_box' => __('Syndicated Posts'),
715 'links_box' => __('Links'),
716 'formatting_box' => __('Formatting'),
717 'boilerplate_box' => ('Boilerplate / Credits'),
718 'comments_and_pings_box' => __('Comments & Pings'),
719 'custom_post_settings_box' => __('Custom Post Settings (to apply to each syndicated post)'),
720 'custom_post_types_box' => ('Custom Post Types (advanced database settings)'),
721 );
722
723 parent::display();
724 } /* FeedWordPressPostsPage::display () */
725
726
727 }
728
729 $postsPage = new FeedWordPressPostsPage;
730 $postsPage->display();
731
732