array(
'controller' => 'forum_ui',
'path' => null,
'ui' => 'forum_form_ui',
'uipath' => null
),
'mods' => array(
'controller' => 'forum_ui',
'path' => null,
'ui' => 'forum_form_ui',
'uipath' => null
),
'report' => array(
'controller' => 'reported_ui',
'path' => null,
'ui' => 'reported_form_ui',
'uipath' => null
),
'post' => array(
'controller' => 'post_ui',
'path' => null,
'ui' => 'post_form_ui',
'uipath' => null
),
);
protected $adminMenu = array(
'main/list' => array('caption' => LAN_MANAGE, 'perm' => 'P'),
'main/create' => array('caption' => LAN_CREATE, 'perm' => 'P'),
'main/opt1' => array('divider' => true),
'main/rules' => array('caption' => WMGLAN_5, 'perm' => 'P'),
'mods/list' => array('caption' => LAN_FORUM_2003, 'perm'=>'P', 'icon'=>'fas-user-tie'),
'main/prefs' => array('caption' => LAN_PREFS, 'perm' => 'P'),
'main/opt2' => array('divider' => true),
'report/list' => array('caption' => FORLAN_116, 'perm'=>'P', 'icon'=>'fas-flag'),
'post/list' => array('caption' => LAN_PLUGIN_FORUM_LATESTPOSTS, 'perm'=>'P'),
'main/prune' => array('caption' => LAN_PRUNE, 'perm' => 'P', 'icon'=>'fas-filter'),
'main/tools' => array('caption' => FORLAN_153, 'perm'=>'p')
);
protected $adminMenuAliases = array(
'main/edit' => 'main/list'
);
protected $menuTitle = LAN_PLUGIN_FORUM_NAME;
function init()
{
if(E107_DEBUG_LEVEL > 0)
{
$this->adminMenu['opt3'] = array('divider'=>true);
$this->adminMenu['main/update'] = array('caption'=>"Redo v1.x Forum Upgrade", 'perm'=>0, 'uri'=>'{e_PLUGIN}forum/forum_update.php');
}
}
}
class forum_ui extends e_admin_ui
{
protected $pluginTitle = LAN_PLUGIN_FORUM_NAME;
protected $pluginName = 'forum';
// protected $eventName = 'forum-forum'; // remove comment to enable event triggers in admin.
protected $table = 'forum';
protected $pid = 'forum_id';
protected $perPage = 30;
protected $batchDelete = true;
protected $batchCopy = true;
protected $sortField = 'forum_order';
protected $sortParent = 'forum_parent';
protected $orderStep = 50;
/*
// protected $tabs = array('Tabl 1','Tab 2'); // Use 'tab'=>0 OR 'tab'=>1 in the $fields below to enable.
// protected $listQry = "SELECT *, xAND forum_order > 45 THEN forum_order ELSE forum_order + forum_parent END AS Sort FROM `#forum` "; // Example Custom Query. LEFT JOINS allowed. Should be without any Order or Limit.
// protected $listQry = "SELECT *, CASE WHEN forum_parent = 0 OR forum_order =0 THEN forum_id + (forum_order/1000) ELSE forum_parent + (forum_order/1000) END AS Sort FROM `#forum` "; // Example Custom Query. LEFT JOINS allowed. Should be without any Order or Limit.
// protected $listOrder = ' COALESCE(NULLIF(forum_parent,0), forum_order), forum_parent > 0, forum_order '; //FIXME works with parent/child but doesn't respect parent order.
// protected $listQry = "SELECT * , forum_parent + forum_order AS Sort FROM `#forum` ";
*/
protected $listQry = "SELECT a. *, CASE WHEN a.forum_parent = 0 THEN a.forum_order ELSE b.forum_order + (( a.forum_order)/1000) END AS Sort FROM `#forum` AS a LEFT JOIN `#forum` AS b ON a.forum_parent = b.forum_id ";
protected $listOrder = 'Sort,forum_order ';
// protected $listOrder = 'forum_order';
// protected $listOrder = ' COALESCE(NULLIF(forum_parent,0), forum_id), forum_parent > 0, forum_order ';
protected $fields = array (
'checkboxes' => array ( 'title' => '', 'type' => null, 'data' => null, 'width' => '5%', 'thclass' => 'center', 'forced' => '1', 'class' => 'center', 'toggle' => 'e-multiselect', ),
'forum_id' => array ( 'title' => LAN_ID, 'data' => 'int', 'width' => '5%', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ),
'forum_name' => array ( 'title' => LAN_TITLE, 'type' => 'method', 'inline'=>true, 'data' => 'str', 'width' => '40%', 'help' => FORLAN_223, 'readParms' => '', 'writeParms' => '', 'validate' => true,'class' => 'left', 'thclass' => 'left', ),
'forum_sef' => array ( 'title' => LAN_SEFURL, 'type' => 'text', 'batch'=>true, 'inline'=>true, 'noedit'=>false, 'data' => 'str', 'width' => 'auto', 'help' => 'Leave blank to auto-generate it from the title above.', 'readParms' => '', 'writeParms' => 'sef=forum_name&size=xxlarge', 'class' => 'left', 'thclass' => 'left', ),
'forum_description' => array ( 'title' => LAN_DESCRIPTION, 'type' => 'textarea', 'data' => 'str', 'width' => '30%', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ),
'forum_image' => array ( 'title' => LAN_IMAGE, 'type' => 'image', 'batch'=>false, 'inline'=>false, 'noedit'=>false, 'data' => 'str', 'width' => 'auto', 'help' => 'Image that will be displayed using {FORUMIMAGE}', 'readParms' => '', 'writeParms' => 'media=forum&max=1', 'class' => 'center', 'thclass' => 'center', ),
'forum_icon' => array ('title' => LAN_ICON, 'type' => 'icon', 'data' => 'str', 'width' => 'auto', 'help' => 'Icon that will be displayed using {FORUMICON}', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'center',),
'forum_parent' => array ( 'title' => FORLAN_75, 'type' => 'dropdown', 'data' => 'int', 'width' => '10%', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ),
'forum_sub' => array ( 'title' => LAN_FORUM_1002, 'type' => 'dropdown', 'data' => 'int', 'width' => 'auto', 'help' => '', 'readParms' => array(), 'writeParms' => array(), 'class' => 'center', 'thclass' => 'center', ),
'forum_moderators' => array ( 'title' => LAN_FORUM_2003, 'type' => 'userclass', 'inline'=>true, 'data' => 'int', 'width' => 'auto', 'help' => '', 'readParms' => 'classlist=admin,main,classes', 'writeParms' => "classlist=admin,main,mods,classes", 'class' => 'left', 'thclass' => 'left', ),
'forum_threads' => array ( 'title' => LAN_FORUM_1003, 'type' => 'number', 'data' => 'int', 'noedit'=>true, 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'center', 'thclass' => 'center', ),
'forum_replies' => array ( 'title' => LAN_FORUM_0003, 'type' => 'number', 'data' => 'int', 'noedit'=>true, 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'center', 'thclass' => 'center', ),
'forum_lastpost_user' => array ( 'title' => LAN_AUTHOR, 'type' => 'hidden', 'noedit'=>true, 'data' => 'int', 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ),
'forum_lastpost_user_anon' => array ( 'title' => FORLAN_204, 'type' => 'hidden','noedit'=>true, 'data' => 'str', 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'center', 'thclass' => 'center', ),
'forum_lastpost_info' => array ( 'title' => LAN_PLUGIN_FORUM_LATESTPOSTS, 'type' => 'hidden', 'noedit'=>true, 'data' => 'str', 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'center', 'thclass' => 'center', ),
'forum_class' => array ( 'title' => LAN_VISIBILITY, 'type' => 'userclass', 'data' => 'int', 'width' => 'auto', 'batch' => true, 'filter' => true, 'inline' => true, 'help' => '', 'readParms' => array('classlist'=>'public,guest,nobody,member,admin,main,new,mods,classes'), 'writeParms' => array('classlist'=>'public,guest,nobody,member,admin,main,new,mods,classes'), 'class' => 'left', 'thclass' => 'left', ),
'forum_order' => array ( 'title' => LAN_ORDER, 'type' => 'text', 'data' => 'int', 'inline'=>true, 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ),
'forum_postclass' => array ( 'title' => FORLAN_205, 'type' => 'userclass', 'inline'=>true,'filter'=>true, 'batch'=>true, 'data' => 'int', 'width' => 'auto', 'help' => '', 'readParms' => array('classlist'=>'public,guest,nobody,member,admin,main,new,mods,classes'), 'writeParms' => array('classlist'=>'public,guest,nobody,member,admin,main,new,mods,classes'), 'class' => 'center', 'thclass' => 'center', ),
'forum_threadclass' => array ( 'title' => FORLAN_206, 'type' => 'userclass', 'inline'=>true, 'filter'=>true, 'batch'=>true, 'data' => 'int', 'width' => 'auto', 'help' => '', 'readParms' => array('classlist'=>'public,guest,nobody,member,admin,main,new,mods,classes'), 'writeParms' => array('classlist'=>'public,guest,nobody,member,admin,main,new,mods,classes'), 'class' => 'center', 'thclass' => 'center', ),
'forum_datestamp' => array ( 'title' => LAN_DATESTAMP, 'type' => 'datestamp', 'data' => 'int', 'noedit'=>true, 'width' => 'auto', 'filter' => true, 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'right', 'thclass' => 'center', ),
// 'Sort' => array ( 'title' => 'Sort', 'type' => 'text', 'data' => 'str', 'noedit'=>true, 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'center', 'thclass' => 'center', ),
'forum_options' => array ( 'title' => LAN_OPTIONS, 'type' => 'hidden', 'data' => 'str', 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'center', 'thclass' => 'center', ),
'options' => array ( 'title' => LAN_OPTIONS, 'type' => null, 'data' => null, 'width' => '10%', 'thclass' => 'center last', 'class' => 'center last', 'forced' => '1', 'sort'=>1 ),
);
protected $fieldpref = array('forum_name', 'forum_parent', 'Sort', 'forum_description', 'forum_class', 'forum_postclass', 'forum_threadclass', 'forum_order');
protected $preftabs = array();
protected $prefs = array(
'enclose' => array('title' => FORLAN_44, 'type'=>'boolean', 'data' => 'int','help'=>FORLAN_45),
'title' => array('title' => FORLAN_65, 'type'=>'text', 'data' => 'str','help'=>''),
'notify' => array('title' => FORLAN_47, 'type'=>'boolean', 'data' => 'int','help'=>FORLAN_48),
'notify_on' => array('title' => FORLAN_177, 'type'=>'boolean', 'data' => 'int','help'=>FORLAN_178),
'poll' => array('title' => FORLAN_49, 'type'=>'userclass', 'data' => 'int','help'=>FORLAN_50),
'attach' => array('title' => FORLAN_70, 'type'=>'boolean', 'data' => 'str','help'=>FORLAN_71),
'maxwidth' => array('title' => FORLAN_134, 'type'=>'number', 'data' => 'str','help'=>FORLAN_135),
'linkimg' => array('title' => FORLAN_136, 'type'=>'boolean', 'data' => 'int','help'=>FORLAN_137),
'track' => array('title' => FORLAN_200, 'type'=>'boolean', 'data' => 'int','help'=>FORLAN_201),
'trackemail' => array('title' => FORLAN_202, 'type'=>'boolean', 'data' => 'int','help'=>FORLAN_203),
'redirect' => array('title' => FORLAN_112, 'type'=>'boolean', 'data' => 'int','help'=>FORLAN_113),
//'reported_post_email' => array('title' => FORLAN_116, 'type'=>'boolean', 'data' => 'int','help'=>FORLAN_122),
'tooltip' => array('title' => FORLAN_126, 'type'=>'boolean', 'data' => 'int','help'=>FORLAN_127),
'ranks' => array('title' => FORLAN_63, 'type'=>'boolean', 'data' => 'int','help'=>''),
'tiplength' => array('title' => FORLAN_128, 'type'=>'number', 'data' => 'int','help'=>FORLAN_129),
'eprefix' => array('title' => FORLAN_53, 'type'=>'text', 'data' => 'string','help'=>FORLAN_54),
'popular' => array('title' => FORLAN_55, 'type'=>'number', 'data' => 'int','help'=>FORLAN_56),
'postspage' => array('title' => FORLAN_57, 'type'=>'number', 'data' => 'int','help'=>FORLAN_58),
'threadspage' => array('title' => FORLAN_186, 'type'=>'number', 'data' => 'int','help'=>FORLAN_187),
'editor' => array('title' => FORLAN_220, 'type' => 'dropdown', 'data' => 'str', 'readParms' => array(), 'writeParms' => array('optArray' => array(), 'defaultValue' => 'default'), 'help' => FORLAN_221),
'quickreply' => array('title' => FORLAN_222, 'type' => 'dropdown', 'data' => 'str', 'readParms' => array(), 'writeParms' => array('optArray' => array(), 'defaultValue' => 'default'), 'help' => '')
);
public $forumParents = array();
public $forumObj = null;
// Correct bad ordering based on parent/child relationship.
private function checkOrder()
{
$sql = e107::getDb();
$sql2 = e107::getDb('sql2');
$count = $sql->select('forum', 'forum_id', 'forum_order = 0');
if($count > 1)
{
$sql->gen("SELECT forum_id,forum_name,forum_parent,forum_order FROM `#forum` ORDER BY COALESCE(NULLIF(forum_parent,0), forum_id), forum_parent > 0, forum_order ");
$c = 0;
while($row = $sql->fetch())
{
//print_a($row);
if($row['forum_parent'] == 0)
{
$c = $c + 100;
}
else
{
$c = $c+1;
}
$sql2->update('forum', 'forum_order = '.$c.' WHERE forum_id = '.$row['forum_id'].' LIMIT 1');
}
}
}
public function init()
{
$this->checkOrder();
$this->prefs['editor']['writeParms']['optArray']['default'] = FORLAN_217;
$this->prefs['editor']['writeParms']['optArray']['bbcode'] = 'BBCode';
$editors = e107::getPlug()->getInstalledWysiwygEditors();
if (!empty($editors))
{
$this->prefs['editor']['writeParms']['optArray'] = array_merge($this->prefs['editor']['writeParms']['optArray'], $editors);
}
$this->prefs['quickreply']['writeParms']['optArray'] = array(
'default' => FORLAN_218,
'wysiwyg' => FORLAN_219
);
if(e107::isInstalled('poll') == false)
{
$this->prefs['poll']['writeParms']['post'] = " ".FORLAN_215."";
}
if($this->getMode() == 'mods')
{
$this->fieldpref = array('forum_name', 'forum_moderators');
$this->fields['forum_moderators']['width'] = '50%';
$this->fields['options']['nolist'] = true;
$this->fields['options']['forced'] = false;
$this->fields['forum_class']['batch'] = false;
$this->fields['forum_postclass']['batch'] = false;
$this->fields['forum_threadclass']['batch'] = false;
$this->fields['forum_moderators']['batch'] = true;
}
require_once(e_PLUGIN.'forum/forum_class.php');
$this->forumObj = new e107forum;
if(E107_DEBUG_LEVEL > 0) // check fpr legacy prefs in debug mode. Should normally be done during upgrade.
{
$this->forumObj->upgradeLegacyPrefs();
}
if (!empty($_POST['do_prune']) && !empty($_POST['prune_days']) && !empty($_POST['pruneForum']))
{
$msg = $this->forumObj->forumPrune($_POST['prune_type'], $_POST['prune_days'], $_POST['pruneForum']);
e107::getMessage()->addSuccess($msg);
}
if(!empty($_POST['frsubmit']))
{
$this->saveRules();
}
if($this->getAction() == 'edit')
{
$this->fields['forum_order']['noedit'] = true;
}
$data = e107::getDb()->retrieve('forum', 'forum_id,forum_name,forum_parent', 'forum_id != 0',true);
$this->forumParents[0] = FORLAN_216;
$forumSubParents = array();
foreach($data as $val)
{
$id = $val['forum_id'];
if($val['forum_parent'] == 0)
{
$this->forumParents[$id] = $val['forum_name'];
}
else
{
$forumSubParents[$id] = $val['forum_name'];
}
}
$this->fields['forum_parent']['writeParms'] = $this->forumParents;
$this->fields['forum_sub']['writeParms']['optArray'] = $forumSubParents;
$this->fields['forum_sub']['writeParms']['default'] = 'blank';
}
// ------- Customize Create --------
public function afterSort($result, $selected)
{
return;
$sql = e107::getDb();
$data2 = $sql->retrieve('forum','forum_id,forum_name,forum_parent,forum_order','forum_parent = 0',true);
foreach($data2 as $val)
{
$id = $val['forum_id'];
$parent[$id] = $val['forum_order'];
}
$previous = 0;
$data = $sql->retrieve('forum','*','forum_parent != 0 ORDER BY forum_order',true);
foreach($data as $row)
{
$p = $row['forum_parent'];
if($p != $previous)
{
$c = $parent[$p];
}
$c++;
$previous = $p;
// echo "
".$row['forum_name']." with parent: ".$p." old: ".$row['forum_order']." new: ".$c;
$sql->update('forum','forum_order = '.$c.' WHERE forum_id = '.intval($row['forum_id']).' LIMIT 1');
}
}
public function beforeCreate($new_data, $old_data)
{
$sql = e107::getDb();
$parentOrder = $sql->retrieve('forum','forum_order','forum_id='.$new_data['forum_parent']." LIMIT 1");
$new_data['forum_order'] = $parentOrder + 50;
if (!empty($new_data['forum_name']))
{
// make sure the forum_name contains only plain text, no bbcode or html
$new_data['forum_name'] = trim(e107::getParser()->toText($new_data['forum_name']));
}
if(empty($new_data['forum_sef']))
{
$new_data['forum_sef'] = eHelper::title2sef($new_data['forum_name']);
}
else
{
// issue #3245 correct any possible errors/misformatting in the forum_sef
$new_data['forum_sef'] = eHelper::title2sef($new_data['forum_sef']);
}
return $new_data;
}
public function afterCreate($new_data, $old_data, $id)
{
// do something
e107::getCache()->clear_sys('forum_perms');
}
public function onCreateError($new_data, $old_data)
{
// do something
}
// ------- Customize Update --------
public function beforeUpdate($new_data, $old_data, $id)
{
if (!empty($new_data['forum_name']))
{
// make sure the forum_name contains only plain text, no bbcode or html
$new_data['forum_name'] = trim(e107::getParser()->toText($new_data['forum_name']));
}
if(isset($new_data['forum_sef']) && empty($new_data['forum_sef']) && !empty($new_data['forum_name']))
{
$new_data['forum_sef'] = eHelper::title2sef($new_data['forum_name']);
}
elseif(!empty($new_data['forum_sef']))
{
// issue #3245 correct any possible errors/misformatting in the forum_sef
$new_data['forum_sef'] = eHelper::title2sef($new_data['forum_sef']);
}
return $new_data;
}
public function afterUpdate($new_data, $old_data, $id)
{
// do something
e107::getCache()->clear_sys('forum_perms',true);
}
public function afterDelete($deleted_data, $id, $deleted_check)
{
e107::getCache()->clear_sys('forum_perms');
}
public function onUpdateError($new_data, $old_data, $id)
{
// do something
}
// optional - a custom page.
public function prunePage()
{
$ns = e107::getRender();
$sql = e107::getDB();
$frm = e107::getForm();
// $sql->select("forum", "forum_id, forum_name", "forum_parent!=0 ORDER BY forum_order ASC");
$qry = "
SELECT f.forum_id, f.forum_name, sp.forum_name AS sub_parent, fp.forum_name AS forum_parent
FROM #forum AS f
LEFT JOIN #forum AS sp ON sp.forum_id = f.forum_sub
LEFT JOIN #forum AS fp ON fp.forum_id = f.forum_parent
WHERE f.forum_parent != 0
ORDER BY f.forum_parent ASC, f.forum_sub, f.forum_order ASC
";
$forums = $sql->retrieve($qry, true);
// $forums = $sql->db_getList();
e107::getMessage()->addWarning(FORLAN_60);
$text = "