Posts & Links,
* Syndication > Feeds & Updates, etc., whether for setting global defaults, or for
* settings on particular feeds.
*
*/
class FeedWordPressAdminPage {
protected $context;
protected $updated = false;
protected $mesg = NULL;
var $link = NULL;
var $dispatch = NULL;
var $filename = NULL;
var $pagenames = array();
/**
* Construct the admin page object.
*
* @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings
*/
public function __construct( $page = 'feedwordpressadmin', $link = NULL ) {
$this->link = $link;
// Set meta-box context name
$this->context = $page;
if ($this->for_feed_settings()) :
$this->context .= 'forfeed';
endif;
} /* FeedWordPressAdminPage constructor */
public function pageslug () {
$slug = preg_replace('/FeedWordPress(.*)Page/', '$1', get_class($this));
return strtolower($slug);
}
public function pagename ($context = NULL) {
if (is_null($context)) :
$context = 'default';
endif;
if (isset($this->pagenames[$context])) :
$name = $this->pagenames[$context];
elseif (isset($tis->pagenames['default'])) :
$name = $this->pagenames['default'];
else :
$name = $this->pageslug();
endif;
return __($name);
} /* FeedWordPressAdminPage::pagename () */
public function accept_POST ($post) {
if ($this->for_feed_settings() and $this->update_requested_in($post)) :
$this->update_feed();
elseif ($this->save_requested_in($post)) : // User mashed Save Changes
$this->save_settings($post);
endif;
do_action($this->dispatch.'_post', $post, $this);
}
public function update_feed () {
global $feedwordpress;
add_action('feedwordpress_check_feed', 'update_feeds_mention');
add_action('feedwordpress_check_feed_complete', 'update_feeds_finish', 10, 3);
$link = $this->link;
print '
';
print "
";
$uri = $this->link->uri();
$displayUrl = $uri;
// check for effects of an effective-url filter
$effectiveUrl = $link->uri(array('fetch' => true));
if ($uri != $effectiveUrl) : $displayUrl .= ' | ' . $effectiveUrl; endif;
$delta = $feedwordpress->update($uri);
print "
";
if (!is_null($delta)) :
echo "
Update complete.".fwp_update_set_results_message($delta)."
";
echo "\n"; flush();
else :
$effectiveUrl = esc_html($effectiveUrl);
echo "
Error: There was a problem updating $displayUrl
\n";
endif;
print "
\n";
remove_action('feedwordpress_check_feed', 'update_feeds_mention');
remove_action('feedwordpress_check_feed_complete', 'update_feeds_finish', 10, 3);
}
public function save_settings ($post) {
do_action($this->dispatch.'_save', $post, $this);
if ($this->for_feed_settings()) :
// Save settings
$this->link->save_settings(/*reload=*/ true);
$this->updated = true;
// Reset, reload
$link_id = $this->link->id;
unset($this->link);
$this->link = new SyndicatedLink($link_id);
else :
$this->updated = true;
endif;
} /* FeedWordPressAdminPage::save_settings () */
public function for_feed_settings () { return (is_object($this->link) and method_exists($this->link, 'found') and $this->link->found()); }
public function for_default_settings () { return !$this->for_feed_settings(); }
public function setting ($names, $fallback_value = NULL, $params = array()) {
if (!is_array($params)) :
$params = array('default' => $params);
endif;
$params = shortcode_atts(array(
'default' => 'default',
'fallback' => true,
), $params);
if (is_string($names)) :
$feed_name = $names;
$global_name = 'feedwordpress_'.preg_replace('![\s/]+!', '_', $names);
else :
$feed_name = $names['feed'];
$global_name = 'feedwordpress_'.$names['global'];
endif;
if ($this->for_feed_settings()) : // Check feed-specific setting first; fall back to global
if (!$params['fallback']) : $global_name = NULL; endif;
$ret = $this->link->setting($feed_name, $global_name, $fallback_value, $params['default']);
else : // Check global setting
$ret = get_option($global_name, $fallback_value);
endif;
return $ret;
}
public function update_setting ($names, $value, $default = 'default') {
if (is_string($names)) :
$feed_name = $names;
$global_name = 'feedwordpress_'.preg_replace('![\s/]+!', '_', $names);
else :
$feed_name = $names['feed'];
$global_name = 'feedwordpress_'.$names['global'];
endif;
if ($this->for_feed_settings()) : // Update feed-specific setting
$this->link->update_setting($feed_name, $value, $default);
else : // Update global setting
update_option($global_name, $value);
endif;
} /* FeedWordPressAdminPage::update_setting () */
public function save_requested_in ($post) {
return (isset($post['save']) or isset($post['submit']));
}
public function update_requested_in ($post) {
return (isset($post['update']) and (strlen($post['update']) > 0));
}
public function submitted_link_id () {
global $fwp_post;
// Presume global unless we get a specific link ID
$link_id = NULL;
$submit_buttons = array(
'save',
'submit',
'fix_mismatch',
'feedfinder',
);
foreach ($submit_buttons as $field) :
if (isset($fwp_post[$field])) :
$link_id = MyPHP::request('save_link_id');
endif;
endforeach;
if (is_null($link_id) and isset($_REQUEST['link_id'])) :
$link_id = MyPHP::request('link_id');
endif;
return $link_id;
} /* FeedWordPressAdminPage::submitted_link_id() */
public function submitted_link () {
$link_id = $this->submitted_link_id();
if (is_numeric($link_id) and $link_id) :
$link = new SyndicatedLink($link_id);
else :
$link = NULL;
endif;
return $link;
} /* FeedWordPressAdminPage::submitted_link () */
public function stamp_link_id ($field = null) {
if (is_null($field)) : $field = 'save_link_id'; endif;
?>
These settings affect posts syndicated from any feed unless they are overridden
by settings for that specific feed.
filename);
endif;
return $this->admin_page_href($filename);
} /* FeedWordPressAdminPage::form_action () */
public function update_message () {
return $this->mesg;
}
public function display () {
global $fwp_post;
if (FeedWordPress::needs_upgrade()) :
fwp_upgrade_page();
return;
endif;
FeedWordPressCompatibility::validate_http_request(/*action=*/ $this->dispatch, /*capability=*/ 'manage_links');
////////////////////////////////////////////////
// Process POST request, if any ////////////////
////////////////////////////////////////////////
if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
$this->accept_POST($fwp_post);
else :
$this->updated = false;
endif;
////////////////////////////////////////////////
// Prepare settings page ///////////////////////
////////////////////////////////////////////////
$this->display_update_notice_if_updated(
$this->pagename('settings-update'),
$this->update_message()
);
$this->open_sheet($this->pagename('open-sheet'));
?>
boxes_by_methods as $method => $row) :
if (is_array($row)) :
$id = $row['id'];
$title = $row['title'];
else :
$id = 'feedwordpress_'.$method;
$title = $row;
endif;
add_meta_box(
/*id=*/ $id,
/*title=*/ $title,
/*callback=*/ array($this, $method),
/*page=*/ $this->meta_box_context(),
/*context=*/ $this->meta_box_context()
);
endforeach;
do_action($this->dispatch.'_meta_boxes', $this);
?>
meta_box_context(), $this->meta_box_context(), $this);
?>
close_sheet(); ?>
filename),
/*callback=*/ array($this, 'fix_toggles'),
/*priority=*/ 10000
);
FeedWordPressSettingsUI::ajax_nonce_fields();
?>
display_sheet_header($header);
endif;
if (!is_null($this->dispatch)) :
?>
\n";
endif;
?>
filename);
endif;
if (isset($params['site-wide-url'])) : $href = $params['site-wide-url'];
else : $href = $this->admin_page_href($filename);
endif;
if (isset($params['setting-default'])) : $settingDefault = $params['setting-default'];
else : $settingDefault = NULL;
endif;
if (isset($params['global-setting-default'])) : $globalSettingDefault = $params['global-setting-default'];
else : $globalSettingDefault = $settingDefault;
endif;
$globalSetting = get_option('feedwordpress_'.$globalName, $globalSettingDefault);
if ($this->for_feed_settings()) :
$setting = $this->link->setting($localName, NULL, $settingDefault);
else :
$setting = $globalSetting;
endif;
if (isset($params['offer-site-wide'])) : $offerSiteWide = $params['offer-site-wide'];
else : $offerSiteWide = $this->for_feed_settings();
endif;
// This allows us to provide an alternative set of human-readable
// labels for each potential value. For use in Currently: line.
if (isset($params['labels'])) : $labels = $params['labels'];
elseif (is_callable($options)) : $labels = NULL;
else : $labels = $options;
endif;
if (isset($params['input-name'])) : $inputName = $params['input-name'];
else : $inputName = $globalName;
endif;
if (isset($params['default-input-id'])) : $defaultInputId = $params['default-input-id'];
else : $defaultInputId = NULL;
endif;
if (isset($params['default-input-id-no'])) : $defaultInputIdNo = $params['default-input-id-no'];
elseif (!is_null($defaultInputId)) : $defaultInputIdNo = $defaultInputId.'-no';
else : $defaultInputIdNo = NULL;
endif;
// This allows us to either include the site-default setting as
// one of the options within the radio box, or else as a simple
// yes/no toggle that controls whether or not to check another
// set of inputs.
if (isset($params['default-input-name'])) : $defaultInputName = $params['default-input-name'];
else : $defaultInputName = $inputName;
endif;
if ($defaultInputName != $inputName) :
$defaultInputValue = 'yes';
else :
$defaultInputValue = (
isset($params['default-input-value'])
? $params['default-input-value']
: 'site-default'
);
endif;
$settingDefaulted = (is_null($setting) or ($settingDefault === $setting));
if (!is_callable($options)) :
$checked = array();
if ($settingDefaulted) :
$checked[$defaultInputValue] = ' checked="checked"';
endif;
foreach ($options as $value => $label) :
if ($setting == $value) :
$checked[$value] = ' checked="checked"';
else :
$checked[$value] = '';
endif;
endforeach;
endif;
$defaulted = array();
if ($defaultInputName != $inputName) :
$defaulted['yes'] = ($settingDefaulted ? ' checked="checked"' : '');
$defaulted['no'] = ($settingDefaulted ? '' : ' checked="checked"');
else :
$defaulted['yes'] = (isset($checked[$defaultInputValue]) ? $checked[$defaultInputValue] : '');
endif;
if (isset($params['defaulted'])) :
$defaulted['yes'] = ($params['defaulted'] ? ' checked="checked"' : '');
$defaulted['no'] = ($params['defaulted'] ? '' : ' checked="checked"');
endif;
if ($offerSiteWide) :
?>