# PLUGIN PREVIEW BY TEXTPATTERN.INFO
/*
adi_article_tab - Enhanced article tab
Written by Adi Gilbert
Released under the GNU General Public License
Version history:
0.3 - refixes for TXP 4.6
0.2 - fixes for TXP 4.6
0.1 - initial release
*/
if (@txpinterface == 'admin') {
global $prefs,$adi_article_tab_debug;
$adi_article_tab_debug = 0;
if (!version_compare(txp_version,'4.5.0','>=')) return;
adi_article_tab_init();
}
function adi_article_tab_init() {
// initial set up
global $prefs,$event,$step,$textarray,$adi_article_tab_tab_list,$adi_article_tab_prefs,$adi_article_tab_outlaws,$adi_article_tab_debug,$adi_article_tab_plugin_status,$adi_article_tab_url,$adi_article_tab_txp460;
$adi_article_tab_txp460 = (version_compare(txp_version,'4.6-dev','>='));
// default preferences
$adi_article_tab_prefs = array(
'adi_article_tab_privs' => array('value' => '1,2,3,4,5,6', 'blank' => 1, 'private' => 0, 'input' => 'custom', 'label' => 'adi_plugin_privs', 'tab' => 'options'), // allowed to use plugin
);
// plugin privs to be excluded
$adi_article_tab_outlaws = array(0);
# --- BEGIN PLUGIN TEXTPACK ---
$adi_article_tab_gtxt = array(
'adi_admin_privs' => 'Admin privileges',
'adi_install_fail' => 'Unable to install',
'adi_installed' => 'Installed',
'adi_not_installed' => 'Not installed',
'adi_plugin_privs' => 'Plugin privileges',
'adi_textpack_fail' => 'Textpack installation failed',
'adi_textpack_feedback' => 'Textpack feedback',
'adi_textpack_online' => 'Textpack also available online',
'adi_uninstall' => 'Uninstall',
'adi_uninstall_fail' => 'Unable to uninstall',
'adi_uninstalled' => 'Uninstalled',
'adi_update_prefs' => 'Update preferences',
'adi_upgrade_fail' => 'Unable to upgrade',
'adi_upgrade_required' => 'Upgrade required',
'adi_upgraded' => 'Upgraded',
);
# --- END PLUGIN TEXTPACK ---
// update $textarray
$textarray += $adi_article_tab_gtxt;
// Textpack
$adi_article_tab_url = array(
'textpack' => 'http://www.greatoceanmedia.com.au/files/adi_textpack.txt',
'textpack_download' => 'http://www.greatoceanmedia.com.au/textpack/download',
'textpack_feedback' => 'http://www.greatoceanmedia.com.au/textpack/?plugin=adi_article_tab',
);
if (strpos($prefs['plugin_cache_dir'],'adi') !== FALSE) // use Adi's local version
$adi_article_tab_url['textpack'] = $prefs['plugin_cache_dir'].'/adi_textpack.txt';
$view = gps('view'); // values: blank or "text" (normal edit view), "html", "preview"
if (($view == 'text') || ($view == '')) { // don't want anything in HTML or Preview views
// adi_article_tab privs & callbacks
add_privs('adi_article_tab',adi_article_tab_pref('adi_article_tab_privs'));
if (has_privs('adi_article_tab')) {
if ($event == 'article')
register_callback('adi_article_tab_delete_button','admin_side','body_end'); // load at bottom of page (to get new article ID) & shift into position using jQuery (USE MAIN_CONTENT_END IN 4.6?)
register_callback('adi_article_tab_display_id','article_ui','author');
}
// script
if ($event == 'article')
register_callback('adi_article_tab_script','admin_side','head_end');
}
// plugin options
$adi_article_tab_plugin_status = fetch('status','txp_plugin','name','adi_article_tab');
if ($adi_article_tab_plugin_status) { // proper install - options under Plugins tab
add_privs('plugin_prefs.adi_article_tab'); // defaults to priv '1' only
register_callback('adi_article_tab_options','plugin_prefs.adi_article_tab');
}
else { // txpdev - options under Extensions tab
add_privs('adi_article_tab_options'); // defaults to priv '1' only
register_tab('extensions','adi_article_tab_options','adi_article_tab options');
register_callback('adi_article_tab_options','adi_article_tab_options');
}
}
function adi_article_tab_script() {
// scriptism
global $adi_article_tab_txp460;
echo <<<END_SCRIPT
<script type="text/javascript">
$(function() {
// adi_article_tab
var txp460 = "$adi_article_tab_txp460";
// shift article delete button into place
if (txp460 == "1") {
$("#adi_article_tab_delete_link").appendTo("p.txp-save + p.txp-actions");
}
else {
$("p.adi_article_tab_delete_button").insertBefore("fieldset#write-status");
}
// link click -> form submit
$('#adi_article_tab_delete_link').click(function() {
$('form#adi_article_tab_delete_form').submit();
});
});
</script>
END_SCRIPT;
}
function adi_article_tab_pref($name,$value=NULL,$private=FALSE) {
// read or set pref
global $prefs,$adi_article_tab_prefs;
if ($value === NULL)
return get_pref($name,$adi_article_tab_prefs[$name]['value']);
else {
if (array_key_exists($name,$adi_article_tab_prefs))
$html = $adi_article_tab_prefs[$name]['input'];
else
$html = 'text_input';
$res = set_pref($name,$value,'adi_article_tab_admin',2,$html,0,$private);
$prefs[$name] = get_pref($name,$adi_article_tab_prefs[$name]['value'],TRUE);
return $res;
}
}
function adi_article_tab_delete_button($e,$s) {
// delete button
// generate a hidden form to sit in footer (can't have it inside article tab's <form>)
// generate a link "button" that'll get shifted into place by jQuery
global $event,$step,$txp_user,$txp_permissions,$adi_article_tab_debug,$adi_article_tab_txp460;
$debug = '[NO BUTTON]';
if ($step == 'edit') { // article edit only
if (isset($GLOBALS['ID'])) { // new article create
$id = $GLOBALS['ID'];
$debug = "id=n/a,globals_id=$id";
}
else { // existing article
$id = gps('ID');
$debug = "id=$id,globals_id=n/a";
}
$id = assert_int($id);
$author = safe_field('AuthorID','textpattern',"ID=$id");
if ($adi_article_tab_debug) {
$user_priv = safe_field("privs","txp_users","name='".doSlash($txp_user)."'");
$debug =
"event=$event,step=$step,".$debug
.br."txp_user=$txp_user,author=$author,user_priv=$user_priv"
.br."article.delete=".$txp_permissions['article.delete'].";article.delete.own=".$txp_permissions['article.delete.own'];
}
else
$debug = '';
if (has_privs('article.delete') || (($txp_user == $author) && has_privs('article.delete.own'))) {
// echo (to avoid fiddling with $default) a hidden form that'll get actioned by jQuery when user clicks link button
// have to use form coz list tab expects instructions to be POSTed
echo
form(
eInput('list')
.sInput('list_multi_edit')
.hInput('edit_method','delete')
.hInput('selected[0]',$id)
,'display:none'
,"confirm('".gTxt('confirm_delete_popup')."');"
,'post'
,''
,''
,'adi_article_tab_delete_form' // HTML ID
);
if ($adi_article_tab_txp460)
$delete_link = '<a href="#" id="adi_article_tab_delete_link" title="'.gTxt('delete').'" class="txp-destroy"><span class="ui-icon ui-icon-trash"></span> '.gTxt('delete').'</a>';
else
$delete_link = '<p class="action-create adi_article_tab_delete_button"><a href="#" id="adi_article_tab_delete_link" title="'.gTxt('delete').'" class="txp-destroy txp-button">'.gTxt('delete').'</a></p>';
// echo (to avoid fiddling with $default) a "delete article" link (shifted into place using jQuery)
echo $debug.$delete_link;
return;
}
else
$debug .= br.'[INSUFFICIENT PRIVS]';
}
if ($adi_article_tab_debug) echo graf($debug,' class="adi_article_tab_delete_button"');
}
function adi_article_tab_display_id($e,$s,$default) {
// insert article id before "Posted by" bit
if (isset($GLOBALS['ID'])) // new article create
$id = $GLOBALS['ID'];
else // existing article
$id = gps('ID');
return str_replace('<small>','<small>#'.$id.' · ',$default);
}
function adi_article_tab_pref_inputs($event,$tab=NULL) {
// output preference input fields according to options/admin setting
global $txp_groups,$adi_article_tab_prefs,$adi_article_tab_outlaws,$adi_article_tab_admin_outlaws;
if ($tab === NULL) return;
$out = '';
foreach ($adi_article_tab_prefs as $pref_name => $pref_info) {
if ($pref_info['tab'] == $tab) {
switch ($pref_info['input']) {
case 'yesnoradio':
$out .=
graf(
tag(gTxt($pref_info['label']),'label')
.sp.sp
.tag(radio($pref_name,'0',(adi_article_tab_pref($pref_name) == '0')).sp.gTxt('no'),'label')
.sp.sp
.tag(radio($pref_name,'1',(adi_article_tab_pref($pref_name) == '1')).sp.gTxt('yes'),'label')
,' class="'.$pref_name.'"'
);
break;
case 'custom':
// admin privs
if ($pref_name == 'adi_article_tab_admin_privs') {
$priv_out = gTxt($pref_info['label']);
$admin_privs = do_list(adi_article_tab_pref('adi_article_tab_admin_privs'));
foreach ($txp_groups as $index => $group)
if (array_search($index,$adi_article_tab_admin_outlaws) === FALSE) // ignore the outlaws
$priv_out .= tag(sp.sp.checkbox2("adi_article_tab_admin_privs[$index]",(array_search($index,$admin_privs) !== FALSE),'','adi_article_tab_admin_privs').sp.gTxt($group),'label');
$out .= graf($priv_out,' class="'.$pref_name.'"');
}
// plugin privs
if ($pref_name == 'adi_article_tab_privs') {
$priv_out = gTxt($pref_info['label']);
$plugin_privs = do_list(adi_article_tab_pref('adi_article_tab_privs'));
foreach ($txp_groups as $index => $group)
if (array_search($index,$adi_article_tab_outlaws) === FALSE) // ignore the outlaws
$priv_out .= tag(sp.sp.checkbox2("adi_article_tab_privs[$index]",(array_search($index,$plugin_privs) !== FALSE),'','adi_article_tab_privs').sp.gTxt($group),'label');
$out .= graf($priv_out,' class="'.$pref_name.'"');
}
break;
default: // text_input
$size = (isset($pref_info['size']) ? $pref_info['size'] : '');
$out .=
graf(
tag(gTxt($pref_info['label']),'label')
.sp.sp
.finput('text',$pref_name,stripslashes(adi_article_tab_pref($pref_name)),$pref_name,'','',$size)
,' class="'.$pref_name.'"'
);
break;
}
}
}
if ($out)
return
form(
tag(
tag(gTxt('edit_preferences'),'h2')
.$out
.fInput('submit','do_something',gTxt('adi_update_prefs'),'smallerbox')
.eInput($event)
.sInput('update_prefs')
,'div'
,' style="text-align:center" class="adi_article_tab_prefs"'
)
);
}
function adi_article_tab_update_prefs($tab=NULL) {
// update prefs
global $txp_user,$adi_article_tab_prefs;
if ($tab === NULL)
return FALSE;
else {
$result = TRUE;
foreach ($adi_article_tab_prefs as $pref_name => $pref_info) {
if ($pref_info['tab'] == $tab) { // tab match?
if (array_key_exists($pref_name,$_POST))
$value = $_POST[$pref_name];
else if ($pref_info['input'] == 'yesnoradio')
$value = '0';
else
$value = $pref_info['value'];
if (is_array($value)) { // string-ify arrays
$values = array_keys($value); // need index values not 1s
if ($pref_name == 'adi_article_tab_admin_privs') {
$user_priv = safe_field('privs','txp_users',"name='".doSlash($txp_user)."'");
$values = array_unique(array_merge($values,array(1,$user_priv))); // can't kill off Publisher or self
}
$value = implode(',',$values);
}
// some values not allowed to be blank, reset to default
if ((!$pref_info['blank']) && (trim($value) == ''))
$value = $adi_article_tab_prefs[$pref_name]['value'];
// update pref
$private = ($pref_info['tab'] == 'options' ? FALSE : $pref_info['private']); // "options" prefs can't be private
$result &= adi_article_tab_pref($pref_name,$value,$private);
}
}
return $result;
}
}
function adi_article_tab_options($event,$step) {
// adi_article_tab options page
global $txp_user,$txp_groups,$adi_article_tab_debug,$adi_article_tab_url,$adi_article_tab_plugin_status,$adi_article_tab_prefs,$adi_article_tab_outlaws;
$message = '';
// dance steps
if ($step == 'textpack') {
$adi_textpack = file_get_contents($adi_article_tab_url['textpack']);
if ($adi_textpack) {
$result = install_textpack($adi_textpack);
$message = gTxt('textpack_strings_installed', array('{count}' => $result));
$textarray = load_lang(LANG); // load in new strings
}
else
$message = array(gTxt('adi_textpack_fail'),E_ERROR);
}
else if ($step == 'update_prefs') {
$result = adi_article_tab_update_prefs('options');
$result ? $message = gTxt('preferences_saved') : $message = array(gTxt('adi_pref_update_fail'),E_ERROR);
}
// generate page
pagetop('adi_article_tab - '.gTxt('plugin_prefs'),$message);
// plugin priv checkboxes
$plugin_privs = do_list(adi_article_tab_pref('adi_article_tab_privs'));
$priv_checkboxes = '';
foreach ($txp_groups as $index => $group)
if (array_search($index,$adi_article_tab_outlaws) === FALSE) // ignore the outlaws
$priv_checkboxes .= tag(gTxt($group).checkbox2("adi_article_tab_privs[$index]",(array_search($index,$plugin_privs) !== FALSE),'','adi_article_tab_privs').sp.sp,'label');
// options
echo tag(
tag('adi_article_tab '.gTxt('plugin_prefs'),'h2')
// prefs
.adi_article_tab_pref_inputs($event,'options')
// textpack links
.graf(href(gTxt('install_textpack'),'?event='.$event.a.'step=textpack'),' style="margin-top:3em"')
.graf(href(gTxt('adi_textpack_online'),$adi_article_tab_url['textpack_download']))
.graf(href(gTxt('adi_textpack_feedback'),$adi_article_tab_url['textpack_feedback']))
,'div'
,' style="text-align:center"'
);
}