plugin=&$GLOBALS['plugin_commentcenter']; $smarty=&$this->smarty; # The default TPL $smarty->assign('admin_resource', 'plugin:commentcenter/policies'); $smarty->assign('plugin_url', plugin_geturl('commentcenter')); $smarty->register_modifier('idToSubject', array(&$this, '_idToTitle')); add_filter('wp_title', array(&$this, '_title'), 15, 2); add_action('wp_head', array(&$this, '_head'), 10); } /** * This function is the callback for the hook system. * It sets the title. * * @param string $val: The current title * @param string $sep: The separator * @return string: The title */ function _title($val, $sep) { return "{$val} {$sep} Comment Center"; } /** * This function is the callback for the hook system. * It adds the javascript of the plugin. */ function _head() { if(!function_exists('plugin_jquery_head')) { return; } $src1=plugin_geturl('commentcenter').'res/ajax.js'; $src2=BLOG_BASEURL.'admin.php?jslang=commentcenter'; echo '\n"; echo '\n"; } /** * This function return the entry title from the id. * It's made to be called from Smarty. * * @param string $id: The entry id * @return string: The output */ function _idToTitle($id) { $o=new FPDB_Query(array('start'=>0, 'count'=>1, 'fullparse'=>false, 'id'=>$id), null); if(!$o->hasMore()) { return false; } $arr=$o->getEntry(); return wp_specialchars($arr[1]['subject']); } /** * This function is an advanced redirect option. * * @param string $cmd: The command * @param mixed $cmdval: The value for the command * @param boolean $nosuccess: Don't save the success? */ function _redirect($cmd, $cmdval=1, $nosuccess=false) { global $panel; $smarty=&$this->smarty; sess_add("success_{$panel}", $smarty->get_template_vars('success')); $action_url=$smarty->get_template_vars('action_url'); $url=admin_filter_command($action_url, $cmd, $cmdval); $url=html_entity_decode($url); $url=substr($url, strlen(BLOG_BASEURL)); utils_redirect($url); die; } /** * This is the main function of the panel. */ function main() { $smarty=&$this->smarty; $plugin=&$this->plugin; $plugin->loadPolicies(); $smarty->assign('policies', $plugin->policies); } /** * This is the callback for the configure command. */ function doconfigure() { global $lang; $plugin=&$this->plugin; $conf=$plugin->getConf(); $smarty=&$this->smarty; $smarty->assign('admin_resource', 'plugin:commentcenter/configure'); $smarty->assign('pl_conf', $conf); $conf=$plugin->getConf(); if(isset($conf) && array_key_exists('akismet_check', $conf) && $conf['akismet_check']) { $akismet=$plugin->akismetLoad(); if(is_numeric($akismet)) { $error=$lang['admin']['entry']['commentcenter']['akismet_errors'][$akismet]; $smarty->assign('warnings', $error); } } } /** * This callback is used when the configuration is saved. */ function onconfigure() { if(!empty($_POST['akismet_url'])) { $pos=strpos($_POST['akismet_url'], '//'); if($pos===FALSE || $pos>8) { $_POST['akismet_url']='http://'.$_POST['akismet_url']; } } $save=array('log_all'=>isset($_POST['log_all']), 'email_alert'=>isset($_POST['email_alert']), 'akismet_check'=>isset($_POST['akismet_check']), 'akismet_key'=>$_POST['akismet_key'], 'akismet_url'=>$_POST['akismet_url']); // It doesn't make very sense: I could just use array_merge but... foreach($save as $key=>$value) { plugin_addoption('commentcenter', $key, $value); } $success=plugin_saveoptions() ? 1 : -1; $this->smarty->assign('success', $success); $this->_redirect('configure'); } /** * The edit policy/new policy action callback. * * @param integer $id: The policy id. -1 means a new one * @return integer: The redirect option */ function dopoledit($id) { global $lang; $plugin=&$this->plugin; $smarty=&$this->smarty; $plang=&$lang['admin']['entry']['commentcenter']; $plugin->loadPolicies(); $smarty->assign('policy', array()); $smarty->assign('admin_resource', 'plugin:commentcenter/editpol'); $smarty->assign('pol_id', $id); if($id!=-1 && isset($plugin->policies[$id])) { $smarty->assign('policy', $plugin->policies[$id]); } elseif($id!=-1) { # Inexistent policy $smarty->assign('errors', $plang['errors']['pol_nonex']); } else { $smarty->assign('polnew', true); } return 0; } /** * The edit policy/new policy save callback. * * @return integer: The redirect option */ function onedit_policy() { $plugin=&$this->plugin; $success=2; $policy=array(); @$id=$_POST['policy_id']; $plugin->loadPolicies(); if($id!=-1 && !isset($plugin->policies[$id])) { $success=-2; } while(true && $success==2) { if(empty($_POST['apply_to'])) { $success=-2; break; } if(!isset($_POST['behavoir'])) { $success=-2; break; } $behavoir=$_POST['behavoir']; if($behavoir!=1 && $behavoir!=0 && $behavoir!=-1) { $success=-2; break; } $policy['do']=$behavoir; switch($_POST['apply_to']) { case 'all_entries': $policy['is_all']=true; break 2; case 'some_entries': if(empty($_POST['entries'])) { $success=-2; } else { $entries=array(); foreach($_POST['entries'] as $entry) { if(entry_exists($entry)) { $entries[]=$entry; } } if(count($entries)==0) { $success=-2; } else { $entries=array_unique($entries); $policy['entry']=$entries; } } break 2; case 'properties': $policy['is_all']=true; if(isset($_POST['cats'])) { $policy['categories']=array_keys($_POST['cats']); $policy['is_all']=false; } if(is_numeric($_POST['older'])) { # Save in seconds $policy['older']=$_POST['older']*86400; $policy['is_all']=false; } if(isset($policy['is_all']) && @!$policy['is_all']) { unset($policy['is_all']); } break 2; default: $success=-2; break 2; } break; } if($success==2) { if($id==-1) { $plugin->policies[]=$policy; } else { $plugin->policies[$id]=$policy; } $success=$plugin->savePolicies() ? 2 : -2; } $this->smarty->assign('success', $success); return 2; } /** * This function is the callback for the poldelete action. * * @param integer $id: The id of policy you wish to delete * @return integer: Redirect option */ function dopoldelete($id) { $plugin=&$this->plugin; $smarty=&$this->smarty; $smarty->assign('admin_resource', 'plugin:commentcenter/deletepol'); $plugin->loadPolicies(); if(isset($plugin->policies[$id])) { $smarty->assign('policies', array($id=>$plugin->policies[$id])); } $smarty->assign('single', true); return 0; } /** * This function is like dopoldelete but it's for multiple policies. * * @return integer: Redirect option */ function onmultidel() { $plugin=&$this->plugin; $smarty=&$this->smarty; if(@!count($_POST['select'])) { $smarty->assign('success', -4); return 2; } $smarty->assign('admin_resource', 'plugin:commentcenter/deletepol'); $plugin->loadPolicies(); $policies=array(); foreach($_POST['select'] as $polid=>$checkvalue) { if(isset($plugin->policies[$polid])) { $policies[$polid]=$plugin->policies[$polid]; } } if(count($policies)>0) { $smarty->assign('policies', $policies); } else { $smarty->assign('success', -4); return 2; } if(count($policies)==1) { $smarty->assign('single', true); } return 0; } /** * This is the delete ok command. * * @return integer: The redirect option */ function ondelok() { if(empty($_POST['del_policy'])) { $s=-4; } else { $plugin=$this->plugin; $plugin->loadPolicies(); foreach($_POST['del_policy'] as $polid) { if(isset($plugin->policies[$polid])) { unset($plugin->policies[$polid]); } } $s=$plugin->savePolicies() ? 4 : -4; } $this->smarty->assign('success', $s); return 2; } /** * This is the cancel callback. It just makes the redirect. * * @return integer: The redirect option */ function oncancel() { return 2; } /** * This function is the callback for the polup action. * * @param integer $id: The id of policy you wish to delete * @return integer: Redirect option */ function dopolup($id) { $s=-3; if($id>0) { $plugin=&$this->plugin; $plugin->loadPolicies(); $plugin->policyMove($id, $id-1); $s=$plugin->savePolicies() ? 3 : -3; } $this->smarty->assign('success', $s); return 2; } /** * This function is the callback for the poldown action. * * @param integer $id: The id of policy you wish to delete * @return integer: Redirect option */ function dopoldown($id) { $s=-3; $plugin=&$this->plugin; $plugin->loadPolicies(); if($idpolicies)-1) { $plugin->policyMove($id, $id+1); $s=$plugin->savePolicies() ? 3 : -3; } $this->smarty->assign('success', $s); return 2; } /** * This function is the callback for the approve_list command * * @return integer: The redirect option */ function doapprove_list() { $plugin=&$this->plugin; $smarty=&$this->smarty; $conf=$plugin->getConf(); $smarty->assign('use_akismet', @$conf['akismet_check']); $smarty->assign('other', @$conf['log_all']); $smarty->assign('admin_resource', 'plugin:commentcenter/approvelist'); $lister=new commentcenter_list($plugin->pl_dir); $smarty->assign('entries', $lister->toDetails()); return 0; } /** * This function is the callback for the publishcomm command * * @param string $id: The comment id * @param boolean $noredirect: If true, don't redirect * @param boolean $noham: If it was blocked from Akismet, don't submit as ham * @return integer: The redirect option */ function dopublishcomm($id, $noredirect=false, $noham=false) { $plugin=&$this->plugin; $smarty=&$this->smarty; $f=$plugin->pl_dir.$id.'.txt'; if(!file_exists($f)) { $smarty->assign('success', -5); $succ=-5; } else { include $f; $entry=substr($id, 1, 18); $ham=false; if(isset($comment['log_reason'])) { $ham=$comment['log_reason']=='akismet' && !$noham; unset($comment['log_reason']); } if(isset($comment['id'])) { unset($comment['id']); } if($ham) { $clean=$plugin->akismetClean($comment, $entry); $akismet=&$plugin->akismetLoad(); if(is_object($akismet)) { $akismet->setComment($clean); $akismet->submitHam(); } } $id=comment_save($entry, $comment); do_action('comment_post', $entry, array($id, $comment)); $succ=$id ? 5 : -5; $smarty->assign('success', $succ); if($succ==5) { @unlink($f); } } if($noredirect) { return $succ==5; } $this->_redirect('approve_list'); return 0; } /** * This is the callback for the action pubnoham. * * @param string $id: The comment id * @return integer: The redirect option. */ function dopubnoham($id) { return $this->dopublishcomm($id, false, true); } /** * This is the callback to publish multiple comments. * * @return integer: The redirect option */ function onmpubcomm() { if(!isset($_POST['select'])) { $this->dopublishcomm('fake'); } $target=count($_POST['select']); $noham=!isset($_POST['submitham']); $i=0; foreach((array)$_POST['select'] as $comm=>$check) { $i++; $this->dopublishcomm($comm, $i!=$target, $noham); } // If it's correct, we should exited the script before $this->smarty->assign('success', -5); $this->_redirect('approve_list'); return 0; } /** * This function is the callback for the deletecomm action. * * @param integer $id: The id of the comment you wish to delete * @return integer: Redirect option */ function dodeletecomm($id) { $plugin=&$this->plugin; $smarty=&$this->smarty; $smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm'); $entry=substr($id, 1, 18); $commid=substr($id, 21, 20); $f=$plugin->pl_dir.$id.'.txt'; if(file_exists($f)) { include $f; $delete[$entry]['del'][$commid]=$comment; $smarty->assign('entries', $delete); } else { $smarty->assign('success', -6); $this->_redirect('approve_list'); } $smarty->assign('single', true); return 0; } /** * This function is like dopoldelete but it's for multiple policies. * * @return integer: Redirect option */ function onmdelcomm() { $plugin=&$this->plugin; $smarty=&$this->smarty; if(@!count($_POST['select'])) { $smarty->assign('success', -6); $this->_redirect('approve_list'); return 0; } $smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm'); $remove=array(); foreach($_POST['select'] as $commbig=>$check) { $entry=substr($commbig, 1, 18); $commid=substr($commbig, 21, 20); $f=$plugin->pl_dir.$commbig.'.txt'; if(file_exists($f)) { include $f; $remove[$entry]['del'][$commid]=$comment; } } if(count($remove)>0) { $smarty->assign('entries', $remove); } else { $smarty->assign('success', -6); $this->_redirect('approve_list'); return 0; } if(count($remove)==1) { $smarty->assign('single', true); } return 0; } /** * This is the delete ok command. * * @return integer: The redirect option */ function oncommdelok() { if(empty($_POST['select'])) { $s=-6; } else { foreach($_POST['select'] as $commid=>$check) { $f=$this->plugin->pl_dir.$commid.'.txt'; @unlink($f); } $s=6; } $this->smarty->assign('success', $s); $this->_redirect('approve_list'); return 2; } /** * This is the cancel callback. It just makes the redirect. * * @return integer: The redirect option */ function onccancel() { $this->_redirect('approve_list'); return 2; } /** * This function is the callback for the action "manage". * * @param string $entry: The entry id * @return integer: The redirect option */ function domanage($entry) { global $lang, $fpdb; $smarty=&$this->smarty; $smarty->assign('admin_resource', 'plugin:commentcenter/manage'); $smarty->assign('is_managing', true); $conf=$this->plugin->getConf(); if(@$conf['akismet_check']) { $smarty->assign('use_akismet', true); } if($entry!='search' && !entry_exists($entry)) { $smarty->assign('error', $lang['admin']['entry']['commentcenter']['errors']['entry_nf']); } elseif($entry!='search') { $smarty->assign('entry_id', $entry); $smarty->assign('fetch', 'list'); $fpdb->query("id:{$entry},fullparse:true,comments:true"); $q=&$fpdb->getQuery(); $q->getEntry(); $list=array(); while($q->comments->hasMore()) { list($id, $comment)=$q->comments->getComment(); $list[$entry]['list'][$id]=$comment; } $smarty->assign('entries', $list); } return 0; } /** * Since it's impossible to use a GET form in Flatpress, to search entries * we have to use a POST form, and here's its callback. * * @return integer: The redirect option */ function onentry_search() { if(!isset($_POST['entry'])) { $_POST['entry']=''; } // In the function we call 'search' isn't an error, but here yes, so delete it if($_POST['entry']=='search') { $_POST['entry']=''; } return @$this->domanage($_POST['entry']); } /** * This function is the callback for the deletecomm2 action. * * @param integer $id: The id of the comment you wish to delete * @return integer: Redirect option */ function dodeletecomm2($id) { $smarty=&$this->smarty; $smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm'); $smarty->assign('is_managing', true); $entry=substr($id, 1, 18); $commid=substr($id, 21, 20); $smarty->assign('entry', $entry); if(comment_exists($entry, $commid)) { $delete[$entry]['del'][$commid]=comment_parse($entry, $commid); $smarty->assign('entries', $delete); } else { $smarty->assign('success', -6); $this->_redirect('manage', $entry); } $smarty->assign('single', true); return 0; } /** * This function is like dopoldelete but it's for multiple policies. * * @return integer: Redirect option */ function onmdelcomm_2() { $smarty=&$this->smarty; if(@!count($_POST['select'])) { $smarty->assign('success', -6); $this->_redirect('manage', @$_POST['entry_hid']); return 0; } $smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm'); $smarty->assign('is_managing', true); $smarty->assign('entry', @$_POST['entry_hid']); $remove=array(); foreach($_POST['select'] as $commbig=>$check) { $entry=substr($commbig, 1, 18); $commid=substr($commbig, 21, 20); $comment=comment_parse($entry, $commid); if($comment!==false) { $remove[$entry]['del'][$commid]=$comment; } } if(count($remove)>0) { $smarty->assign('entries', $remove); } else { $smarty->assign('success', -6); $this->_redirect('manage', @$_POST['entry_hid']); return 0; } if(count($remove)==1) { $smarty->assign('single', true); } return 0; } /** * This is the delete ok command. * * @return integer: The redirect option */ function oncommdelok_2() { if(empty($_POST['select'])) { $s=-6; } else { $i=0; foreach($_POST['select'] as $commid=>$check) { $entry=substr($commid, 1, 18); $commid=substr($commid, 21, 20); $i+=comment_delete($entry, $commid) ? 1 : 0; } $s=$i>0 ? 6 : -6; } $this->smarty->assign('success', $s); $this->_redirect('manage', @$_POST['entry']); return 2; } /** * This is the cancel callback. It just makes the redirect. * * @return integer: The redirect option */ function onccancel_2() { $this->_redirect('manage', @$_POST['entry']); return 2; } /** * This function is the callback for the action commspam. * * @param string $id: The comment id * @return integer: The redirect option */ function docommspam($id) { $smarty=&$this->smarty; $plugin=&$this->plugin; $entry=substr($id, 1, 18); $commid=substr($id, 21, 20); if(!comment_exists($entry, $commid)) { $smarty->assign('success', -7); } else { $comment=comment_parse($entry, $commid); $clean=$plugin->akismetClean($comment, $entry); $akismet=&$plugin->akismetLoad(); if(is_object($akismet)) { $akismet->setComment($clean); $akismet->submitSpam(); $smarty->assign('success', $akismet->errorsExist() ? -7 : 7); } else { $smarty->assign('success', -7); } } $this->_redirect('manage', $entry); return 0; } } admin_addpanelaction('entry', 'commentcenter', true);