1
0
mirror of https://github.com/e107inc/e107.git synced 2025-07-31 11:50:30 +02:00

Admin tools - column selector working everywhere again; improved UI - list/editQuery not needed anymore, queries are auto-generated, table JOIN support added (see comment manager), various improvement, still work in progress

This commit is contained in:
secretr
2009-11-05 17:32:19 +00:00
parent 276fa19298
commit 18a4b9bfe9
11 changed files with 455 additions and 260 deletions

View File

@@ -11,9 +11,9 @@
| GNU General Public License (http://gnu.org). | GNU General Public License (http://gnu.org).
| |
| $Source: /cvs_backup/e107_0.8/e107_admin/comment.php,v $ | $Source: /cvs_backup/e107_0.8/e107_admin/comment.php,v $
| $Revision: 1.11 $ | $Revision: 1.12 $
| $Date: 2009-11-05 00:11:56 $ | $Date: 2009-11-05 17:32:18 $
| $Author: e107coders $ | $Author: secretr $
+----------------------------------------------------------------------------+ +----------------------------------------------------------------------------+
*/ */
require_once("../class2.php"); require_once("../class2.php");
@@ -54,8 +54,24 @@ class comments_admin_ui extends e_admin_ui
{ {
protected $pluginTitle = LAN_COMMENTMAN; protected $pluginTitle = LAN_COMMENTMAN;
protected $pluginName = 'comments'; protected $pluginName = 'core';
protected $table = "comments"; protected $table = "comments";
/**
* If present this array will be used to build your list query
* You can link fileds from $field array with 'table' parameter, which should equal to a key (table) from this array
* 'leftField', 'rightField' and 'fields' attributes here are required, the rest is optional
*
* @var array [optional]
*/
protected $tableJoin = array (
'user' => array('leftField' => 'comment_author_id', 'rightField' => 'user_id', 'fields' => '*'/*, 'leftTable' => '', 'joinType' => 'LEFT JOIN', 'whereJoin' => '', 'where' => ''*/)
);
//protected $listQry = "SELECT SQL_CALC_FOUND_ROWS * FROM #comments"; // without any Order or Limit.
protected $editQry = "SELECT * FROM #comments WHERE comment_id = {ID}";
protected $pid = "comment_id"; protected $pid = "comment_id";
protected $perPage = 10; protected $perPage = 10;
protected $batchDelete = true; protected $batchDelete = true;
@@ -65,10 +81,11 @@ class comments_admin_ui extends e_admin_ui
'comment_id' => array('title'=> ID, 'type' => 'int', 'width' =>'5%', 'forced'=> TRUE), 'comment_id' => array('title'=> ID, 'type' => 'int', 'width' =>'5%', 'forced'=> TRUE),
'comment_item_id' => array('title'=> "item id", 'type' => 'text', 'width' => 'auto'), 'comment_item_id' => array('title'=> "item id", 'type' => 'text', 'width' => 'auto'),
'comment_subject' => array('title'=> "subject", 'type' => 'text', 'width' => 'auto', 'thclass' => 'left first'), // Display name 'comment_subject' => array('title'=> "subject", 'type' => 'text', 'width' => 'auto', 'thclass' => 'left first'), // Display name
'comment_comment' => array('title'=> "comment", 'type' => 'textarea', 'width' => '30%', 'readParms' => 'expand=...&truncate=50'), // Display name 'comment_comment' => array('title'=> "comment", 'type' => 'textarea', 'width' => '30%', 'readParms' => 'expand=...&truncate=50&bb=1'), // Display name
'comment_author_id' => array('title'=> "authorID", 'type' => 'text', 'width' => 'auto'), // User name 'comment_author_id' => array('title'=> "authorID", 'type' => 'number', 'width' => 'auto'), // User id
'comment_author_name' => array('title'=> "authorName",'type' => 'text', 'width' => 'auto'), // User name 'comment_author_name' => array('title'=> "authorName",'type' => 'text', 'width' => 'auto'), // User name
'comment_datestamp' => array('title'=> "datestamp", 'type' => 'datestamp', 'width' => 'auto'), // User name 'user_name' => array('title'=> "System user", 'type' => 'text', 'width' => 'auto', 'table' => 'user', 'noedit' => true), // User name
'comment_datestamp' => array('title'=> "datestamp", 'type' => 'datestamp', 'width' => 'auto'), // User date
'comment_blocked' => array('title'=> "blocked", 'type' => 'text', 'width' => 'auto'), // Photo 'comment_blocked' => array('title'=> "blocked", 'type' => 'text', 'width' => 'auto'), // Photo
'comment_ip' => array('title'=> "IP", 'type' => 'text', 'width' => '10%', 'thclass' => 'center' ), // Real name (no real vetting) 'comment_ip' => array('title'=> "IP", 'type' => 'text', 'width' => '10%', 'thclass' => 'center' ), // Real name (no real vetting)
'comment_type' => array('title'=> "Type", 'type' => 'method', 'width' => '10%', 'thclass' => 'center', 'filter'=>TRUE,'batch'=>TRUE ), // No real vetting 'comment_type' => array('title'=> "Type", 'type' => 'method', 'width' => '10%', 'thclass' => 'center', 'filter'=>TRUE,'batch'=>TRUE ), // No real vetting
@@ -86,10 +103,6 @@ class comments_admin_ui extends e_admin_ui
'pref_name' => array('title'=> 'name', 'type' => 'text') 'pref_name' => array('title'=> 'name', 'type' => 'text')
); );
protected $listQry = "SELECT * FROM #comments"; // without any Order or Limit.
protected $editQry = "SELECT * FROM #comments WHERE comment_id = {ID}";
} }
//TODO Block and Unblock buttons, moderated comments? //TODO Block and Unblock buttons, moderated comments?

View File

@@ -9,9 +9,9 @@
* Custom Menus/Pages Administration * Custom Menus/Pages Administration
* *
* $Source: /cvs_backup/e107_0.8/e107_admin/cpage.php,v $ * $Source: /cvs_backup/e107_0.8/e107_admin/cpage.php,v $
* $Revision: 1.24 $ * $Revision: 1.25 $
* $Date: 2009-11-01 23:10:57 $ * $Date: 2009-11-05 17:32:17 $
* $Author: e107coders $ * $Author: secretr $
* *
*/ */
@@ -111,7 +111,7 @@ class page
{ {
global $pref,$user_pref, $admin_log; global $pref,$user_pref, $admin_log;
if(isset($_POST['submit-e-columns'])) if(isset($_POST['etrigger_ecolumns']))
{ {
$user_pref['admin_cpage_columns'] = $_POST['e-columns']; $user_pref['admin_cpage_columns'] = $_POST['e-columns'];
save_prefs('user'); save_prefs('user');

View File

@@ -9,9 +9,9 @@
* Administration Area - Site Links * Administration Area - Site Links
* *
* $Source: /cvs_backup/e107_0.8/e107_admin/links.php,v $ * $Source: /cvs_backup/e107_0.8/e107_admin/links.php,v $
* $Revision: 1.31 $ * $Revision: 1.32 $
* $Date: 2009-10-26 09:51:56 $ * $Date: 2009-11-05 17:32:17 $
* $Author: e107coders $ * $Author: secretr $
* *
*/ */
@@ -208,7 +208,7 @@ class links
$this->mode = $_GET['mode']; $this->mode = $_GET['mode'];
} }
if (varset($_POST['submit-e-columns'])) if (varset($_POST['etrigger_ecolumns']))
{ {
$user_pref['admin_links_columns'] = $_POST['e-columns']; $user_pref['admin_links_columns'] = $_POST['e-columns'];
save_prefs('user'); save_prefs('user');

View File

@@ -9,8 +9,8 @@
* News Administration * News Administration
* *
* $Source: /cvs_backup/e107_0.8/e107_admin/newspost.php,v $ * $Source: /cvs_backup/e107_0.8/e107_admin/newspost.php,v $
* $Revision: 1.62 $ * $Revision: 1.63 $
* $Date: 2009-10-30 17:59:32 $ * $Date: 2009-11-05 17:32:17 $
* $Author: secretr $ * $Author: secretr $
*/ */
require_once("../class2.php"); require_once("../class2.php");
@@ -453,7 +453,7 @@ class admin_newspost
$this->_observe_newsCommentsRecalc(); $this->_observe_newsCommentsRecalc();
} }
if(isset($_POST['submit-e-columns'])) //elseif fails. if(isset($_POST['etrigger_ecolumns'])) //elseif fails.
{ {
$this->_observe_saveColumns(); $this->_observe_saveColumns();
} }
@@ -1143,7 +1143,7 @@ class admin_newspost
} }
// AUTO RENDER // AUTO RENDER
$text .= $frm->trow($this->fields, $this->fieldpref, $row, 'news_id'); $text .= $frm->renderTableRow($this->fields, $this->fieldpref, $row, 'news_id');
} }
$text .= " $text .= "

View File

@@ -11,8 +11,8 @@
| GNU General Public License (http://gnu.org). | GNU General Public License (http://gnu.org).
| |
| $Source: /cvs_backup/e107_0.8/e107_admin/plugin.php,v $ | $Source: /cvs_backup/e107_0.8/e107_admin/plugin.php,v $
| $Revision: 1.53 $ | $Revision: 1.54 $
| $Date: 2009-11-04 21:59:35 $ | $Date: 2009-11-05 17:32:17 $
| $Author: secretr $ | $Author: secretr $
+----------------------------------------------------------------------------+ +----------------------------------------------------------------------------+
*/ */
@@ -127,7 +127,7 @@ class pluginManager{
$this -> pluginProcessUpload(); $this -> pluginProcessUpload();
} }
if(isset($_POST['submit-e-columns'])) if(isset($_POST['etrigger_ecolumns']))
{ {
$user_pref['admin_pluginmanager_columns'] = $_POST['e-columns']; $user_pref['admin_pluginmanager_columns'] = $_POST['e-columns'];
save_prefs('user'); save_prefs('user');

View File

@@ -9,9 +9,9 @@
* Administration Area - User classes * Administration Area - User classes
* *
* $Source: /cvs_backup/e107_0.8/e107_admin/userclass2.php,v $ * $Source: /cvs_backup/e107_0.8/e107_admin/userclass2.php,v $
* $Revision: 1.31 $ * $Revision: 1.32 $
* $Date: 2009-11-05 12:26:43 $ * $Date: 2009-11-05 17:32:18 $
* $Author: e107coders $ * $Author: secretr $
* *
*/ */
@@ -861,7 +861,7 @@ class uclass_manager
function uclass_manager() function uclass_manager()
{ {
global $user_pref; global $user_pref;
if(isset($_POST['submit-e-columns'])) if(isset($_POST['etrigger_ecolumns']))
{ {
$user_pref['admin_userclass_columns'] = $_POST['e-columns']; $user_pref['admin_userclass_columns'] = $_POST['e-columns'];
save_prefs('user'); save_prefs('user');

View File

@@ -10,9 +10,9 @@
* Administration Area - Users * Administration Area - Users
* *
* $Source: /cvs_backup/e107_0.8/e107_admin/users.php,v $ * $Source: /cvs_backup/e107_0.8/e107_admin/users.php,v $
* $Revision: 1.61 $ * $Revision: 1.62 $
* $Date: 2009-10-21 21:36:10 $ * $Date: 2009-11-05 17:32:17 $
* $Author: e107steved $ * $Author: secretr $
* *
*/ */
require_once ('../class2.php'); require_once ('../class2.php');
@@ -762,7 +762,7 @@ class users
function usersSaveColumnPref() function usersSaveColumnPref()
{ {
global $pref,$user_pref,$admin_log; global $pref,$user_pref,$admin_log;
if (isset ($_POST['submit-e-columns'])) if (isset ($_POST['etrigger_ecolumns']))
{ {
$user_pref['admin_users_columns'] = $_POST['e-columns']; $user_pref['admin_users_columns'] = $_POST['e-columns'];
save_prefs('user'); save_prefs('user');

View File

@@ -1894,10 +1894,13 @@ class e_admin_ui extends e_admin_controller_ui
protected $validationRules = array(); protected $validationRules = array();
protected $prefs = array(); protected $prefs = array();
protected $pluginName; protected $pluginName;
protected $listQry; protected $listQry;
protected $tableJoin;
protected $editQry; protected $editQry;
protected $table; protected $table;
protected $pid; protected $pid;
protected $pluginTitle; protected $pluginTitle;
protected $perPage = 20; protected $perPage = 20;
protected $batchDelete = true; protected $batchDelete = true;
@@ -2140,10 +2143,11 @@ class e_admin_ui extends e_admin_controller_ui
{ {
$tp = e107::getParser(); $tp = e107::getParser();
$multi_name = vartrue($this->fields['checkboxes']['toggle'], 'multiselect'); $multi_name = vartrue($this->fields['checkboxes']['toggle'], 'multiselect');
$selected = $tp->toDB(array_values($this->getPosted($multi_name, array()))); $selected = array_values($this->getPosted($multi_name, array()));
if(empty($selected)) return; if(empty($selected)) return;
$selected = array_map('intval', $selected);
$trigger = $tp->toDB(explode('__', $batch_trigger)); $trigger = $tp->toDB(explode('__', $batch_trigger));
$this->triggersEnabled(false); //disable further triggering $this->triggersEnabled(false); //disable further triggering
@@ -2160,26 +2164,38 @@ class e_admin_ui extends e_admin_controller_ui
$this->getTreeModel()->setMessages(); $this->getTreeModel()->setMessages();
break; break;
case 'bool': // FIXME - tree method update case 'bool':
// direct query // direct query
$field = $trigger[1]; $field = $trigger[1];
$value = $trigger[2]; $value = $trigger[2] ? 1 : 0;
if($cnt = e107::getDb()->db_Update($this->getTableName(), "{$field}={$value} WHERE ".$this->getPrimaryName()." IN (".implode(', ', $selected).")")) $cnt = $this->getTreeModel()->update($field, $value, $selected, $value, false);
if($cnt)
{ {
$this->getTreeModel()->addMessageSuccess($cnt.' records successfully updated.', true); $this->getTreeModel()->addMessageSuccess($cnt.' records successfully updated.');
} }
$this->getTreeModel()->setMessages(); $this->getTreeModel()->setMessages();
$this->redirectAction();
break; break;
case 'boolreverse': // FIXME - tree method update case 'boolreverse':
// direct query // direct query
$field = $trigger[1]; //TODO - errors $field = $trigger[1]; //TODO - errors
if($cnt = e107::getDb()->db_Update($this->getTableName(), "{$field}=1-{$field} WHERE ".$this->getPrimaryName()." IN (".implode(', ', $selected).")")) $tree = $this->getTreeModel();
$cnt = $tree->update($field, "1-{$field}", $selected, null, false);
if($cnt)
{ {
e107::getMessage()->add($cnt.' records successfully reversed.', E_MESSAGE_SUCCESS, true); $tree->addMessageSuccess($cnt.' records successfully reversed.');
//sync models
foreach ($selected as $id)
{
if($tree->hasNode($id))
{
$tree->getNode($id)
->set($field, $syncvalue)
->setMessages();
}
}
} }
$this->redirectAction(); $this->getTreeModel()->setMessages();
break; break;
default: default:
@@ -2191,14 +2207,17 @@ class e_admin_ui extends e_admin_controller_ui
} }
else // default handling else // default handling
{ {
// FIXME - tree method update
$field = $trigger[0]; $field = $trigger[0];
$value = $trigger[1]; //TODO - errors $value = $trigger[1]; //TODO - errors
if($cnt = e107::getDb()->db_Update($this->getTableName(), "{$field}='{$value}' WHERE ".$this->getPrimaryName()." IN (".implode(', ', $selected).")"))
{ $cnt = $this->getTreeModel()->update($field, "'".$value."'", $selected, $value, false);
e107::getMessage()->add('<strong>'.$value.'</strong> set for <strong>'.$cnt.'</strong> records.', E_MESSAGE_SUCCESS, true); if($cnt)
{
$vttl = $this->getUI()->renderValue($field, $value, $this->getFieldAttr($field));
$this->getTreeModel()->addMessageSuccess('<strong>'.$vttl.'</strong> set for <strong>'.$cnt.'</strong> records.');
} }
$this->redirectAction(); $this->getTreeModel()->setMessages();
//$this->redirectAction();
} }
break; break;
} }
@@ -2274,39 +2293,102 @@ class e_admin_ui extends e_admin_controller_ui
$searchQuery = $tp->toDB($request->getQuery('searchquery', '')); $searchQuery = $tp->toDB($request->getQuery('searchquery', ''));
list($filterField, $filterValue) = $tp->toDB(explode('__', $request->getQuery('filter_options', ''))); list($filterField, $filterValue) = $tp->toDB(explode('__', $request->getQuery('filter_options', '')));
if($filterField) // TODO - we have var types in current model, use them!
if($filterField && $filterValue !== '' && isset($this->fields[$filterField]))
{ {
$searchQry[] = $filterField." = '".$filterValue."'"; $ftable = vartrue($this->fields[$filterField]['table'], $this->getTableName());
$searchQry[] = "`{$ftable}.`$filterField` = '".$filterValue."'";
} }
$filter = array(); $filter = array();
foreach($this->fields as $key=>$var) foreach($this->fields as $key=>$var)
{ {
$ftable = vartrue($var['table'], $this->getTableName());
if(($var['type'] == 'text' || $var['type'] == 'method') && $searchQuery) if(($var['type'] == 'text' || $var['type'] == 'method') && $searchQuery)
{ {
$filter[] = "(".$key." REGEXP ('".$searchQuery."'))"; $filter[] = "(`{$ftable}`.`".$key."` REGEXP ('".$searchQuery."'))";
} }
} }
if(count($filter)>0)
//$qry = $this->listQry;
// We dont need list qry anymore!
$jwhere = array();
$joins = array();
if($this->tableJoin)
{
$qry = "SELECT `#".$this->getTableName()."`.*";
foreach ($this->tableJoin as $jtable => $tparams)
{
// Select fields
$fields = vartrue($tparams['fields']);
if('*' === $fields)
{
$qry .= ", `#{$jtable}`.*";
}
else
{
$fields = array_map('trim', explode(',', $fields));
foreach ($fields as $field)
{
$qry .= ", `#{$jtable}`.`{$field}`";
}
}
// Prepare Joins
$joins[] = "
".vartrue($tparams['joinType'], 'LEFT JOIN')." `#{$jtable}` ON `#".vartrue($tparams['leftTable'], $this->getTableName())."`.`".vartrue($tparams['leftField'])."` = `#{$jtable}`.`".vartrue($tparams['rightField'])."`".(vartrue($tparams['whereJoin']) ? ' '.$tparams['whereJoin'] : '');
// Prepare Where
if(vartrue($tparams['where']))
{
$jwhere[] = $tparams['where'];
}
}
//From
$qry .= " FROM `#".$this->getTableName()."`";
// Joins
if(count($joins) > 0)
{
$qry .= "\n".implode("\n", $joins);
}
}
else
{
$qry = "SELECT `#".$this->getTableName()."`.* FROM `#".$this->getTableName()."`";
}
// join where
if(count($jwhere) > 0)
{
$searchQry[] = " (".implode(" AND ",$jwhere)." )";
}
// filter where
if(count($filter) > 0)
{ {
$searchQry[] = " (".implode(" OR ",$filter)." )"; $searchQry[] = " (".implode(" OR ",$filter)." )";
} }
$qry = $this->listQry; // where query
if(count($searchQry) > 0) if(count($searchQry) > 0)
{ {
$qry .= " WHERE ".implode(" AND ", $searchQry); $qry .= " WHERE ".implode(" AND ", $searchQry);
} }
$orderField = $request->getQuery('field', $this->getPrimaryName());
$qry .= ' ORDER BY '.$tp->toDB($request->getQuery('field', $this->getPrimaryName())).' '.($request->getQuery('asc') == 'desc' ? 'DESC' : 'ASC'); if(isset($this->fields[$orderField]))
{
$ftable = vartrue($this->fields[$orderField]['table'], $this->getTableName());
// no need of sanitize - it's found in field array
$qry .= ' ORDER BY `#'.$ftable.'`.`'.$orderField.'` '.($request->getQuery('asc') == 'desc' ? 'DESC' : 'ASC');
}
if($this->getPerPage()) if($this->getPerPage())
{ {
$from = $request->getQuery('from', 0) < 1 ? 1 : intval($request->getQuery('from')); $from = intval($request->getQuery('from', 0));
$startfrom = ($from-1) * intval($this->getPerPage()); //$startfrom = ($from-1) * intval($this->getPerPage());
$qry .= ' LIMIT '.$startfrom.', '.intval($this->getPerPage()); $qry .= ' LIMIT '.$from.', '.intval($this->getPerPage());
} }
return $qry; return $qry;
} }

View File

@@ -9,9 +9,9 @@
* Form Handler * Form Handler
* *
* $Source: /cvs_backup/e107_0.8/e107_handlers/form_handler.php,v $ * $Source: /cvs_backup/e107_0.8/e107_handlers/form_handler.php,v $
* $Revision: 1.68 $ * $Revision: 1.69 $
* $Date: 2009-11-05 12:26:44 $ * $Date: 2009-11-05 17:32:18 $
* $Author: e107coders $ * $Author: secretr $
* *
*/ */
@@ -848,7 +848,8 @@ class e_form
* @param string $pid - eg. table_id * @param string $pid - eg. table_id
* @return * @return
*/ */
function trow($fieldarray, $currentlist, $fieldvalues, $pid)
function renderTableRow($fieldarray, $currentlist, $fieldvalues, $pid)
{ {
$cnt = 0; $cnt = 0;
$ret = ''; $ret = '';
@@ -857,6 +858,8 @@ class e_form
$currentlist = $obj->fieldpref; $currentlist = $obj->fieldpref;
$pid = $obj->pid;*/ $pid = $obj->pid;*/
$trclass = vartrue($fieldvalues['__trclass']) ? ' class="'.$trclass.'"' : '';
unset($fieldvalues['__trclass']);
foreach ($fieldarray as $field => $data) foreach ($fieldarray as $field => $data)
{ {
@@ -878,169 +881,8 @@ class e_form
} }
$tdclass = vartrue($data['class']); $tdclass = vartrue($data['class']);
$value = $fieldvalues[$field]; if($field == 'checkboxes') $tdclass = $tdclass ? $tdclass.' autocheck e-pointer' : 'autocheck e-pointer';
$tp = e107::getParser(); $value = $this->renderValue($field, $fieldvalues[$field], $data, $fieldvalues[$pid]);
$parms = array();
if(isset($data['readParms']))
{
if(is_string($data['readParms'])) parse_str($data['readParms'], $data['readParms']);
$parms = $data['readParms'];
}
switch($field) // special fields
{
case 'options':
if(!$value)
{
parse_str(str_replace('&amp;', '&', e_QUERY), $query); //FIXME - FIX THIS
// keep other vars in tact
$query['action'] = 'edit';
$query['id'] = $fieldvalues[$pid];
//$edit_query = array('mode' => varset($query['mode']), 'action' => varset($query['action']), 'id' => $fieldvalues[$pid]);
$query = http_build_query($query);
$value = "<a href='".e_SELF."?{$query}' title='".LAN_EDIT."'><img class='icon action edit' src='".ADMIN_EDIT_ICON_PATH."' alt='".LAN_EDIT."' /></a>&nbsp;";
$value .= $this->submit_image('etrigger_delete['.$fieldvalues[$pid].']', $fieldvalues[$pid], 'delete', LAN_DELETE.' [ ID: '.$fieldvalues[$pid].' ]');
}
$data['type'] = 'text';
break;
case 'checkboxes':
$value = $this->checkbox(vartrue($data['toggle'], 'multiselect').'['.$fieldvalues[$pid].']', $fieldvalues[$pid]);
$data['type'] = 'text';
$tdclass = $tdclass ? $tdclass.' autocheck e-pointer' : 'autocheck e-pointer';
break;
}
//FIXME - move this block to separate method renderValue(), similar to renderElement()
switch($data['type'])
{
case 'number':
if($parms)
{
if(!isset($parms['sep'])) $value = number_format($number, $parms['decimals']);
else $value = number_format($number, $parms['decimals'], vartrue($parms['point'], '.'), vartrue($parms['sep'], ' '));
}
$value = vartrue($parms['pre']).$value.vartrue($parms['post']);
// else same
break;
case 'dropdown':
case 'text':
if(vartrue($parms['truncate']))
{
$value = $tp->text_truncate($value, $parms['truncate'], '...');
}
elseif(vartrue($parms['htmltruncate']))
{
$value = $tp->html_truncate($value, $parms['htmltruncate'], '...');
}
$value = vartrue($parms['pre']).$value.vartrue($parms['post']);
break;
case 'bbarea':
case 'textarea':
$expand = '...';
$toexpand = false;
if($data['type'] == 'bbarea' && !isset($parms['bb'])) $parms['bb'] = true; //force bb parsing for bbareas
$id = trim(str_replace('_', '-', $field));
if(!vartrue($parms['noparse'])) $value = $tp->toHTML($value, (vartrue($parms['bb']) ? true : false), vartrue($parms['parse']));
if(vartrue($parms['expand']))
{
$expand = '&nbsp;<a href="#'.$id.'-expand" class="e-show-if-js e-expandit">'.defset($parms['expand'], $parms['expand'])."</a>";
}
$oldval = $value;
if(vartrue($parms['truncate']))
{
$value = $oldval = strip_tags($value);
$value = $tp->text_truncate($value, $parms['truncate'], $expand);
$toexpand = $value != $oldval;
}
elseif(vartrue($parms['htmltruncate']))
{
$value = $tp->html_truncate($value, $parms['htmltruncate'], $expand);
$toexpand = $value != $oldval;
}
if($toexpand)
{
// force hide! TODO - core style .expand-c (expand container)
$value .= '<div class="expand-c" style="display: none" id="'.$id.'-expand"><div>'.$oldval.'</div></div>';
}
break;
case 'icon':
$value = '<img src="'.$tp->replaceConstants(vartrue($parms['pre']).$value, 'abs').'" alt="'.basename($value).'" class="icon'.(vartrue($parms['class']) ? ' '.$parms['class'] : '').'" />';
break;
case 'image': //TODO - thumb, js tooltip...
$ttl = vartrue($parms['title'], 'LAN_PREVIEW');
$value = '<a href="'.$tp->replaceConstants(vartrue($parms['pre']).$value, 'abs').'" title="'.basename($value).'">'.defset($ttl, $ttl).'</a>';
break;
case 'datestamp':
$value = e107::getDateConvert()->convert_date($value, vartrue($parms['mask'], 'short'));
break;
case 'userclass':
$value = $this->_uc->uc_get_classname($value);
break;
case 'userclasses':
$classes = explode(',', $value);
$value = array();
foreach ($classes as $cid)
{
$value[] = $this->_uc->uc_get_classname($cid);
}
$value = implode(vartrue($parms['separator']), $pieces);
break;
case 'user_name':
case 'user_loginname':
case 'user_login':
case 'user_customtitle':
case 'user_email':
$value = get_user_data($value);
if($value)
{
$value = $value[$data['type']] ? $value[$data['type']] : $value['user_name'];
}
else
{
$value = 'not found';
}
if(vartrue($parms['truncate']))
{
$value = $tp->text_truncate($value, $parms['truncate'], '...');
}
break;
case 'boolean':
$value = $value ? ADMIN_TRUE_ICON : '';// TODO - ADMIN_FALSE_ICON
break;
case 'url':
$ttl = $value;
if(vartrue($parms['truncate']))
{
$ttl = $tp->text_truncate($value, $parms['truncate'], '...');
}
$value = "<a href='".$tp->replaceConstants(vartrue($parms['pre']).$value, 'abs')."' title='{$value}'>".$ttl."</a>";
break;
case 'method': // Custom Function
$method = $field;
$value = call_user_func_array(array($this, $method), array($value, 'read', $parms));
break;
//TODO - form_userclass, order,... and maybe more types
default:
continue; //unknown type
break;
}
if($tdclass) if($tdclass)
{ {
@@ -1057,7 +899,6 @@ class e_form
if($cnt) if($cnt)
{ {
$trclass = vartrue($fieldvalues['trclass']) ? ' class="'.$trclass.'"' : '';
return ' return '
<tr'.$trclass.'> <tr'.$trclass.'>
'.$ret.' '.$ret.'
@@ -1068,11 +909,184 @@ class e_form
return ''; return '';
} }
/**
* Render Field Value
* @param string $field field name
* @param mixed $value field value
* @param array $attributes field attributes including render parameters, element options - see e_admin_ui::$fields for required format
* @return string
*/
function renderValue($field, $value, $attributes, $id = 0)
{
$parms = array();
if(isset($attributes['readParms']))
{
if(is_string($attributes['readParms'])) parse_str($attributes['readParms'], $attributes['readParms']);
$parms = $attributes['readParms'];
}
$tp = e107::getParser();
switch($field) // special fields
{
case 'options':
if(!$value)
{
parse_str(str_replace('&amp;', '&', e_QUERY), $query); //FIXME - FIX THIS
// keep other vars in tact
$query['action'] = 'edit';
$query['id'] = $id;
//$edit_query = array('mode' => varset($query['mode']), 'action' => varset($query['action']), 'id' => $id);
$query = http_build_query($query);
$value = "<a href='".e_SELF."?{$query}' title='".LAN_EDIT."'><img class='icon action edit' src='".ADMIN_EDIT_ICON_PATH."' alt='".LAN_EDIT."' /></a>&nbsp;";
$value .= $this->submit_image('etrigger_delete['.$id.']', $id, 'delete', LAN_DELETE.' [ ID: '.$id.' ]');
}
//$attributes['type'] = 'text';
return $value;
break;
case 'checkboxes':
$value = $this->checkbox(vartrue($attributes['toggle'], 'multiselect').'['.$id.']', $id);
//$attributes['type'] = 'text';
return $value;
break;
}
switch($attributes['type'])
{
case 'number':
if($parms)
{
if(!isset($parms['sep'])) $value = number_format($number, $parms['decimals']);
else $value = number_format($number, $parms['decimals'], vartrue($parms['point'], '.'), vartrue($parms['sep'], ' '));
}
$value = vartrue($parms['pre']).$value.vartrue($parms['post']);
// else same
break;
case 'dropdown':
case 'text':
if(vartrue($parms['truncate']))
{
$value = $tp->text_truncate($value, $parms['truncate'], '...');
}
elseif(vartrue($parms['htmltruncate']))
{
$value = $tp->html_truncate($value, $parms['htmltruncate'], '...');
}
$value = vartrue($parms['pre']).$value.vartrue($parms['post']);
break;
case 'bbarea':
case 'textarea':
$expand = '...';
$toexpand = false;
if($attributes['type'] == 'bbarea' && !isset($parms['bb'])) $parms['bb'] = true; //force bb parsing for bbareas
$elid = trim(str_replace('_', '-', $field)).'-'.$id;
if(!vartrue($parms['noparse'])) $value = $tp->toHTML($value, (vartrue($parms['bb']) ? true : false), vartrue($parms['parse']));
if(vartrue($parms['expand']))
{
$expand = '&nbsp;<a href="#'.$elid.'-expand" class="e-show-if-js e-expandit">'.defset($parms['expand'], $parms['expand'])."</a>";
}
$oldval = $value;
if(vartrue($parms['truncate']))
{
$value = $oldval = strip_tags($value);
$value = $tp->text_truncate($value, $parms['truncate'], $expand);
$toexpand = $value != $oldval;
}
elseif(vartrue($parms['htmltruncate']))
{
$value = $tp->html_truncate($value, $parms['htmltruncate'], $expand);
$toexpand = $value != $oldval;
}
if($toexpand)
{
// force hide! TODO - core style .expand-c (expand container)
$value .= '<div class="expand-c" style="display: none" id="'.$elid.'-expand"><div>'.$oldval.'</div></div>';
}
break;
case 'icon':
$value = '<img src="'.$tp->replaceConstants(vartrue($parms['pre']).$value, 'abs').'" alt="'.basename($value).'" class="icon'.(vartrue($parms['class']) ? ' '.$parms['class'] : '').'" />';
break;
case 'image': //TODO - thumb, js tooltip...
$ttl = vartrue($parms['title'], 'LAN_PREVIEW');
$value = '<a href="'.$tp->replaceConstants(vartrue($parms['pre']).$value, 'abs').'" title="'.basename($value).'">'.defset($ttl, $ttl).'</a>';
break;
case 'datestamp':
$value = e107::getDateConvert()->convert_date($value, vartrue($parms['mask'], 'short'));
break;
case 'userclass':
$value = $this->_uc->uc_get_classname($value);
break;
case 'userclasses':
$classes = explode(',', $value);
$value = array();
foreach ($classes as $cid)
{
$value[] = $this->_uc->uc_get_classname($cid);
}
$value = implode(vartrue($parms['separator']), $pieces);
break;
case 'user_name':
case 'user_loginname':
case 'user_login':
case 'user_customtitle':
case 'user_email':
if(is_numeric($value))
{
$value = get_user_data($value);
if($value)
{
$value = $value[$attributes['type']] ? $value[$attributes['type']] : $value['user_name'];
}
else
{
$value = 'not found';
}
}
break;
case 'boolean':
$value = $value ? ADMIN_TRUE_ICON : '';// TODO - ADMIN_FALSE_ICON
break;
case 'url':
$ttl = $value;
if(vartrue($parms['truncate']))
{
$ttl = $tp->text_truncate($value, $parms['truncate'], '...');
}
$value = "<a href='".$tp->replaceConstants(vartrue($parms['pre']).$value, 'abs')."' title='{$value}'>".$ttl."</a>";
break;
case 'method': // Custom Function
$method = $field;
$value = call_user_func_array(array($this, $method), array($value, 'read', $parms));
break;
//TODO - form_userclass, order,... and maybe more types
default:
//unknown type
break;
}
return $value;
}
/** /**
* Auto-render Form Element * Auto-render Form Element
* @param string $key * @param string $key
* @param mixed $value * @param mixed $value
* @param array $attributes field attributes including render parameters, element options * @param array $attributes field attributes including render parameters, element options - see e_admin_ui::$fields for required format
* @return string * @return string
*/ */
function renderElement($key, $value, $attributes) function renderElement($key, $value, $attributes)
@@ -1238,7 +1252,7 @@ class e_form
{ {
foreach($tree as $model) foreach($tree as $model)
{ {
$text .= $this->trow($fields, $current_fields, $model->getData(), $options['pid']); $text .= $this->renderTableRow($fields, $current_fields, $model->getData(), $options['pid']);
} }
} }

View File

@@ -9,8 +9,8 @@
* e107 Base Model * e107 Base Model
* *
* $Source: /cvs_backup/e107_0.8/e107_handlers/model_class.php,v $ * $Source: /cvs_backup/e107_0.8/e107_handlers/model_class.php,v $
* $Revision: 1.31 $ * $Revision: 1.32 $
* $Date: 2009-11-05 00:38:21 $ * $Date: 2009-11-05 17:32:19 $
* $Author: secretr $ * $Author: secretr $
*/ */
@@ -1537,11 +1537,11 @@ class e_admin_model extends e_model
/** /**
* Move model System messages (if any) to the default eMessage stack * Move model System messages (if any) to the default eMessage stack
* *
* @param boolean $validation move validation messages as well
* @param boolean $session store messages to session * @param boolean $session store messages to session
* @param boolean $validation move validation messages as well
* @return e_admin_model * @return e_admin_model
*/ */
public function setMessages($validation = true, $session = false) public function setMessages($session = false, $validation = true)
{ {
if($validation) if($validation)
{ {
@@ -1626,7 +1626,7 @@ class e_admin_model extends e_model
{ {
if($destroy) if($destroy)
{ {
$this->setMessages(true, $session_messages)->destroy(); $this->setMessages($session_messages)->destroy();
} }
} }
return $ret; return $ret;
@@ -2081,22 +2081,24 @@ class e_tree_model extends e_model
class e_admin_tree_model extends e_tree_model class e_admin_tree_model extends e_tree_model
{ {
/** /**
* Delete records * Batch Delete records
* @param mixed $ids * @param mixed $ids
* @param boolean $destroy [optional] destroy object instance after db delete * @param boolean $destroy [optional] destroy object instance after db delete
* @param boolean $session_messages [optional] * @param boolean $session_messages [optional]
* @return mixed integer deleted records or false on DB error * @return integer deleted records number or false on DB error
*/ */
public function delete($ids, $destroy = true, $session_messages = false) public function delete($ids, $destroy = true, $session_messages = false)
{ {
if(!$ids) return $this; if(!$ids) return 0;
if(is_array($ids)) if(!is_array($ids))
{ {
$ids = implode(',', $ids); $ids = array_map('tirm', explode(',', $ids));
} }
$ids = e107::getParser()->toDB($ids); $ids = array_map('intval', $ids);
$idstr = implode(', ', $ids);
$sql = e107::getDb(); $sql = e107::getDb();
$res = $sql->db_Delete($this->getModelTable(), $this->getFieldIdName().' IN ('.$ids.')'); $res = $sql->db_Delete($this->getModelTable(), $this->getFieldIdName().' IN ('.$idstr.')');
if(!$res) if(!$res)
{ {
if($sql->getLastErrorNumber()) if($sql->getLastErrorNumber())
@@ -2107,16 +2109,11 @@ class e_admin_tree_model extends e_tree_model
} }
elseif($destroy) elseif($destroy)
{ {
if(!is_array($ids))
{
$ids = explode(',', $ids);
}
foreach ($ids as $id) foreach ($ids as $id)
{ {
if($this->getNode($id)) if($this->hasNode($id))
{ {
$this->getNode($id)->setMessages(true, $session_messages); $this->getNode($id)->setMessages($session_messages);
call_user_func(array($this->getNode(trim($id)), 'destroy')); // first call model destroy method if any call_user_func(array($this->getNode(trim($id)), 'destroy')); // first call model destroy method if any
$this->setNode($id, null); $this->setNode($id, null);
} }
@@ -2125,6 +2122,65 @@ class e_admin_tree_model extends e_tree_model
return $res; return $res;
} }
/**
* Batch update tree records/nodes
* @param string $field field name
* @param string $value
* @param string|array $ids numerical array or string comma separated ids
* @param mixed $syncvalue value to be used for model data synchronization (db value could be something like '1-field_name'), null - no sync
* @param boolean $sanitize [optional] default true
* @param boolean $session_messages [optional] default false
* @return integer updated count or false on error
*/
public function update($field, $value, $ids, $syncvalue = null, $sanitize = true, $session_messages = false)
{
$tp = e107::getParser();
$sql = e107::getDb();
if(empty($ids))
{
return 0;
}
if(!is_array($ids))
{
$ids = array_map('tirm', explode(',', $ids));
}
if($sanitize)
{
$ids = array_map('intval', $ids);
$field = $tp->toDb($field);
$value = "'".$tp->toDb($value)."'";
}
$idstr = implode(', ', $ids);
$res = $sql->db_Update($this->getModelTable(), "{$field}={$value} WHERE ".$this->getFieldIdName().' IN ('.$idstr.')');
if(!$res)
{
if($sql->getLastErrorNumber())
{
$this->addMessageError(LAN_UPDATED_FAILED, $session_messages);
$this->addMessageDebug('SQL Error #'.$sql->getLastErrorNumber().': '.$sql->getLastErrorText());
}
else
{
$this->addMessageInfo(LAN_NO_CHANGE, $session_messages);
}
}
if(null === $syncvalue) return $res;
foreach ($ids as $id)
{
if($this->hasNode($id))
{
$this->getNode($id)
->set($field, $syncvalue)
->setMessages($session_messages);
}
}
return $res;
}
} }

View File

@@ -9,8 +9,8 @@
* Release Plugin Administration UI * Release Plugin Administration UI
* *
* $Source: /cvs_backup/e107_0.8/e107_plugins/release/includes/admin.php,v $ * $Source: /cvs_backup/e107_0.8/e107_plugins/release/includes/admin.php,v $
* $Revision: 1.5 $ * $Revision: 1.6 $
* $Date: 2009-11-05 00:28:25 $ * $Date: 2009-11-05 17:32:18 $
* $Author: secretr $ * $Author: secretr $
*/ */
@@ -59,20 +59,54 @@ class plugin_release_admin_ui extends e_admin_ui
// required // required
protected $pluginTitle = "e107 Release"; protected $pluginTitle = "e107 Release";
// required /**
* plugin name or 'core'
* IMPORTANT: should be 'core' for non-plugin areas because this
* value defines what CONFIG will be used. However, I think this should be changed
* very soon (awaiting discussion with Cam)
* Maybe we need something like $prefs['core'], $prefs['release'] ... multiple getConfig support?
*
* @var string
*/
protected $pluginName = 'release'; protected $pluginName = 'release';
// required - if no custom model is set in init() // required
protected $table = "release"; protected $table = "release";
/**
* If present this array will be used to build your list query
* You can link fileds from $field array with 'table' parameter, which should equal to a key (table) from this array
* 'leftField', 'rightField' and 'fields' attributes here are required, the rest is optional
*
* @var array [optional] table_name => array join parameters
*/
protected $tableJoin = array(
//'user' => array('leftField' => 'user_id', 'rightField' => 'comment_author_id', 'fields' => '*'/*, 'joinType' => 'LEFT JOIN', 'whereJoin' => '', 'where' => ''*/)
);
// required if no custom tree model is set in init()
// NOT NEEDED ANYMORE!!!
//protected $listQry = "SELECT * FROM #release";
// without any Order or Limit.
// optional - required only in case of e.g. tables JOIN. This also could be done with custom model (set it in init())
// NOT NEEDED ANYMORE!!!
//protected $editQry = "SELECT * FROM #release WHERE release_id = {ID}";
// required - if no custom model is set in init() (primary id) // required - if no custom model is set in init() (primary id)
protected $pid = "release_id"; protected $pid = "release_id";
// optional // optional
protected $perPage = 20; protected $perPage = 20;
// default - true // default - true - TODO - move to displaySettings
protected $batchDelete = true; protected $batchDelete = true;
// UNDER CONSTRUCTION
protected $displaySettings = array();
// UNDER CONSTRUCTION
protected $disallowPages = array('main/create', 'main/prefs');
//TODO change the release_url type back to URL before release. //TODO change the release_url type back to URL before release.
// required // required
@@ -85,13 +119,15 @@ class plugin_release_admin_ui extends e_admin_ui
* *
* - type (string) null (means system), number, text, dropdown, url, image, icon, datestamp, userclass, userclasses, user[_name|_loginname|_login|_customtitle|_email], * - type (string) null (means system), number, text, dropdown, url, image, icon, datestamp, userclass, userclasses, user[_name|_loginname|_login|_customtitle|_email],
* boolean, method * boolean, method
* full/most recent reference list - e_form::trow(), e_form::renderElement(), e_admin_form_ui::renderBatchFilter() * full/most recent reference list - e_form::renderTableRow(), e_form::renderElement(), e_admin_form_ui::renderBatchFilter()
* *
* - data (string) Data type, one of the following: int, integer, string, str, float, bool, boolean, model, null * - data (string) Data type, one of the following: int, integer, string, str, float, bool, boolean, model, null
* Used only if $dataFields is not set * Used only if $dataFields is not set
* full/most recent reference list - e_admin_model::sanitize(), db::_getFieldValue() * full/most recent reference list - e_admin_model::sanitize(), db::_getFieldValue()
* - primary (boolean) primary field (obsolete, $pid is now used) * - primary (boolean) primary field (obsolete, $pid is now used)
* *
* - table (string) if there and non-empty - value is coming from another table, which SHOULD be found in $tableJoin (see above)
*
* - help (string) edit/create table - inline help, constant name will be accpeted as well, optional * - help (string) edit/create table - inline help, constant name will be accpeted as well, optional
* - note (string) edit/create table - text shown below the field title (left column), constant name will be accpeted as well, optional * - note (string) edit/create table - text shown below the field title (left column), constant name will be accpeted as well, optional
* *
@@ -196,12 +232,6 @@ class plugin_release_admin_ui extends e_admin_ui
'pref_name' => array('title'=> 'name', 'type' => 'text', 'data' => 'string', 'validate' => 'regex', 'rule' => '#^[\w]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore') 'pref_name' => array('title'=> 'name', 'type' => 'text', 'data' => 'string', 'validate' => 'regex', 'rule' => '#^[\w]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore')
); );
// required if no custom tree model is set in init()
protected $listQry = "SELECT * FROM #release"; // without any Order or Limit.
// optional - required only in case of e.g. tables JOIN. This also could be done with custom model (set it in init())
protected $editQry = "SELECT * FROM #release WHERE release_id = {ID}";
// optional // optional
public function init() public function init()
{ {