1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-06 14:46:56 +02:00

Issue #2487 - Category Tree fixes.

This commit is contained in:
Cameron
2017-03-28 15:16:27 -07:00
parent c2cc206d21
commit a2026244a3
5 changed files with 226 additions and 20 deletions

View File

@@ -440,7 +440,7 @@ if (!defined('E_16_FAILEDLOGIN')) {
define("E_32_TRUE", "<i class='S32 e-true-32'></i>");
define("ADMIN_CHILD_ICON", '<img src="'.e_IMAGE_ABS.'generic/branchbottom.gif" class="level-x icon" alt="" />'); // must use single quotes.
define("ADMIN_CHILD_ICON", '<img src="'.e_IMAGE_ABS.'generic/branchbottom.gif" class="treeprefix level-x icon" alt="" />'); // must use single quotes.
define("ADMIN_TRUE_ICON", "<i class='fa fa-check text-success'></i>");
define("ADMIN_FALSE_ICON", "<i class='fa fa-times text-danger'></i>");
define("ADMIN_WARNING_ICON", "<i class='fa fa-warning text-warning'></i>");

View File

@@ -2420,6 +2420,10 @@ class e_admin_controller_ui extends e_admin_controller
*/
protected $sortField = null;
/**
* @var string field containing the order number
*/
protected $treePrefix = null;
/**
* @var string field containing the parent field
@@ -2621,6 +2625,26 @@ class e_admin_controller_ui extends e_admin_controller
{
return $this->sortField;
}
/**
* Get Sort Field data
* @return string
*/
public function getSortParent()
{
return $this->sortParent;
}
/**
* Get Sort Field data
* @return string
*/
public function getTreePrefix()
{
return $this->treePrefix;
}
/**
* Get Tab data
@@ -4015,9 +4039,10 @@ class e_admin_controller_ui extends e_admin_controller
}
elseif($this->sortField && $this->sortParent) // automated 'tree' sorting.
{
$qry = "SELECT SQL_CALC_FOUND_ROWS a. *, CASE WHEN a.".$this->sortParent." = 0 THEN a.".$this->sortField." ELSE b.".$this->sortField." + (( a.".$this->sortField.")/1000) END AS treesort FROM `#".$this->table."` AS a LEFT JOIN `#".$this->table."` AS b ON a.".$this->sortParent." = b.".$this->pid;
$this->listOrder = 'treesort,'.$this->sortField;
$this->orderStep = ($this->orderStep === 1) ? 100 : $this->orderStep;
// $qry = "SELECT SQL_CALC_FOUND_ROWS a. *, CASE WHEN a.".$this->sortParent." = 0 THEN a.".$this->sortField." ELSE b.".$this->sortField." + (( a.".$this->sortField.")/1000) END AS treesort FROM `#".$this->table."` AS a LEFT JOIN `#".$this->table."` AS b ON a.".$this->sortParent." = b.".$this->pid;
$qry = $this->getParentChildQuery();
$this->listOrder = '_treesort '; // .$this->sortField;
// $this->orderStep = ($this->orderStep === 1) ? 100 : $this->orderStep;
}
else
{
@@ -4140,6 +4165,75 @@ class e_admin_controller_ui extends e_admin_controller
return $qry;
}
protected function getParentChildQuery()
{
$parent= $this->getSortParent();
$table = $this->getTableName();
$pid = $this->getPrimaryName();
$order = $this->getSortField();
$sql = "
DROP FUNCTION IF EXISTS `getDepth` ;
CREATE FUNCTION `getDepth` (project_id INT) RETURNS int
BEGIN
DECLARE depth INT;
SET depth=1;
WHILE project_id > 0 DO
SELECT IFNULL(".$parent.",-1)
INTO project_id
FROM ( SELECT ".$parent." FROM `#".$table."` WHERE ".$pid." = project_id) t;
IF project_id > 0 THEN
SET depth = depth + 1;
END IF;
END WHILE;
RETURN depth;
END
;
DROP FUNCTION IF EXISTS `getTreeSort`;
CREATE FUNCTION getTreeSort(incid INT)
RETURNS CHAR(255)
BEGIN
SET @parentstr = CONVERT(incid, CHAR);
SET @parent = -1;
label1: WHILE @parent != 0 DO
SET @parent = (SELECT ".$parent." FROM `#".$table."` WHERE ".$pid." =incid);
SET @order = (SELECT ".$order." FROM `#".$table."` WHERE ".$pid." =incid);
SET @parentstr = CONCAT(if(@parent = 0,'',@parent), LPAD(@order,3,0), @parentstr);
SET incid = @parent;
END WHILE label1;
RETURN @parentstr;
END
;
";
// FIXME - make order work correctly (modify @order) when twin digits or higher are used.
e107::getDb()->gen($sql);
return "SELECT *, getTreeSort(".$pid.") as _treesort, getDepth(".$pid.") as _depth FROM `#".$table."` ";
}
/**
* Manage submit item
* Note: $callbackBefore will break submission if returns false
@@ -4318,6 +4412,7 @@ class e_admin_ui extends e_admin_controller_ui
protected $sortField;
protected $sortParent;
protected $orderStep;
protected $treePrefix;
/**
@@ -5276,10 +5371,18 @@ class e_admin_ui extends e_admin_controller_ui
$updated[] = "#".$id." -- ".$this->sortField." = ".$c;
}
// echo($sql->getLastQuery()."\n");
$c += $step;
$c++; // += $step;
}
if(!empty($this->sortParent) && !empty($this->sortField) )
{
return null;
}
//file_put_contents(e_LOG."sortAjax.log", print_r($_POST['all'],true));
// Increment every other record after the current page of records.
// $changed = (intval($_POST['neworder']) * $step) + $from ;
$changed = $c - $step;
@@ -5289,10 +5392,10 @@ class e_admin_ui extends e_admin_controller_ui
// ------------ Fix Child Order when parent is used. ----------------
/*
if(!empty($this->sortParent) && !empty($this->sortField) ) // Make sure there is space for at least 99
{
$parent = array();
$data2 = $sql->retrieve($this->table,$this->pid.','.$this->sortField,$this->sortParent .' = 0',true);
foreach($data2 as $val)
@@ -5322,7 +5425,7 @@ class e_admin_ui extends e_admin_controller_ui
$sql->update($this->table, $this->sortField . ' = '.$c.' WHERE '.$this->pid.' = '.intval($row[$this->pid]).' LIMIT 1');
}
*/
@@ -5897,6 +6000,76 @@ class e_admin_form_ui extends e_form
{
}
/**
* @todo Get a 'depth/level' field working with mysql and change the 'level' accordingly
* @param mixed $curVal
* @param string $mode read|write|inline
* @param array $parm
* @return array|string
*/
public function treePrefix($curVal, $mode, $parm)
{
$controller = $this->getController();
$parentField = $controller->getSortParent();
$treePrefixField = $controller->getTreePrefix();
$parent = $controller->getListModel()->get($parentField);
$level = $controller->getListModel()->get("_depth");
if($mode === 'read')
{
$inline = $this->getController()->getFieldAttr($treePrefixField,'inline');
if($inline === true)
{
return $curVal;
}
$level_image = $parent ? str_replace('level-x','level-'.$level, ADMIN_CHILD_ICON) : '';
return ($parent) ? $level_image.$curVal : $curVal;
}
if($mode === 'inline')
{
$ret = array('inlineType'=>'text');
if(!empty($parent))
{
$ret['inlineParms'] = array('pre'=> str_replace('level-x','level-'.$level, ADMIN_CHILD_ICON));
}
return $ret;
}
/*
if($mode == 'write') // not used.
{
// return $frm->text('forum_name',$curVal,255,'size=xxlarge');
}
if($mode == 'filter')
{
return;
}
if($mode == 'batch')
{
return;
}
*/
}
/**
* Generic DB Record Creation Form.
* @return string
@@ -6052,6 +6225,22 @@ class e_admin_form_ui extends e_form
$fields['options']['sort'] = false;
}
if($treefld = $controller->getTreePrefix())
{
$fields[$treefld]['type'] = 'method';
$fields[$treefld]['method'] = 'treePrefix'; /* @see e_admin_form_ui::treePrefix(); */
$tr = $controller->getTreeModel()->toArray();
foreach($tr as $row)
{
e107::getDebug()->log($row[$treefld].' > '.$row['_treesort']);
}
}
// ------------------------------------------
$coreBatchOptions = array(

View File

@@ -4031,6 +4031,7 @@ class e_form
}
if(!empty($attributes['inline'])) $parms['editable'] = true; // attribute alias
if(!empty($attributes['sort'])) $parms['sort'] = true; // attribute alias
@@ -4872,11 +4873,11 @@ class e_form
}
// print_a($attributes);
// Inline Editing.
if(!vartrue($attributes['noedit']) && vartrue($parms['editable'])) // avoid bad markup, better solution coming up
if(empty($attributes['noedit']) && !empty($parms['editable'])) // avoid bad markup, better solution coming up
{
$mode = preg_replace('/[^\w]/', '', vartrue($_GET['mode'], ''));
$methodParms = call_user_func_array(array($this, $method), array($value, 'inline', $parms));
$methodParms = call_user_func_array(array($this, $meth), array($value, 'inline', $parms));
$inlineParms = (!empty($methodParms['inlineParms'])) ? $methodParms['inlineParms'] : null;

View File

@@ -131,31 +131,43 @@ class download_cat_ui extends e_admin_ui
protected $table = "download_category";
protected $pid = "download_category_id";
protected $perPage = 0; //no limit
// protected $listOrder = 'download_category_parent,download_category_order';
protected $batchCopy = true;
// initiate as a parent/child tree.
protected $sortField = 'download_category_order';
protected $sortParent = 'download_category_parent';
protected $listOrder = null; // automatic
protected $treePrefix = 'download_category_name';
// protected $orderStep = 1000;
// protected $listOrder = null; // automatic
protected $fields = array(
'checkboxes' => array('title'=> '', 'type' => null, 'width' =>'5%', 'forced'=> TRUE, 'thclass'=>'center', 'class'=>'center'),
'download_category_icon' => array('title'=> LAN_ICON, 'type' => 'method', 'width' => '5%', 'thclass' => 'center','class'=>'center','writeParms'=>'glyphs=1' ),
'download_category_id' => array('title'=> LAN_ID, 'type' => 'number', 'width' =>'5%', 'forced'=> TRUE),
'download_category_name' => array('title'=> LAN_TITLE, 'type' => 'text', 'inline' => true, 'width' => 'auto', 'thclass' => 'left', 'writeParms'=>'size=xxlarge'),
'download_category_sef' => array('title'=> LAN_SEFURL, 'type' => 'text', 'inline' => true, 'width' => 'auto', 'thclass' => 'left', 'writeParms'=>'size=xxlarge'),
'download_category_name' => array('title'=> LAN_TITLE, 'type' => 'text', 'data'=>'str', 'inline' => true, 'width' => 'auto', 'thclass' => 'left', 'writeParms'=>'size=xxlarge'),
'download_category_sef' => array('title'=> LAN_SEFURL, 'type' => 'text', 'data'=>'str', 'inline' => true, 'width' => 'auto', 'thclass' => 'left', 'writeParms'=>'size=xxlarge'),
'download_category_description' => array('title'=> LAN_DESCRIPTION, 'type' => 'bbarea', 'width' => '30%', 'readParms' => 'expand=...&truncate=50&bb=1'), // Display name
'download_category_description' => array('title'=> LAN_DESCRIPTION, 'type' => 'bbarea', 'data'=>'str', 'width' => '30%', 'readParms' => 'expand=...&truncate=50&bb=1'), // Display name
'download_category_parent' => array('title'=> LAN_PARENT, 'type' => 'method', 'width' => '5%', 'batch' => TRUE, 'filter'=>TRUE),
'download_category_class' => array('title'=> LAN_VISIBILITY, 'type' => 'userclass', 'inline' => true, 'width' => 'auto', 'data' => 'int', 'batch' => TRUE, 'filter'=>TRUE),
'download_category_order' => array('title'=> LAN_ORDER, 'type' => 'number', 'data'=>'int', 'width' => '5%', 'thclass' => 'right', 'class'=> 'right' ),
'download_category_order' => array('title'=> LAN_ORDER, 'type' => 'number', 'nolist'=>true, 'data'=>'int', 'width' => '5%', 'thclass' => 'right', 'class'=> 'right' ),
'options' => array('title'=> LAN_OPTIONS, 'type' => null, 'width' => '10%', 'forced'=>TRUE, 'thclass' => 'center last', 'class' => 'center', 'sort'=>1)
);
protected $fieldpref = array('download_category_icon', 'download_category_id', 'download_category_name', 'download_category_sef', 'download_category_class', 'download_category_order');
function init()
{
if(deftrue('e_DEBUG'))
{
$this->fields['download_category_order']['nolist'] = false;
}
}
function getDownloadCategoryTree($id = false, $default = 'n/a')
{

View File

@@ -1552,8 +1552,12 @@ body#admin-menus #sc-admin-help .panel-body {
td img.thumbnail { margin-bottom:0 }
/* Parent/Child Indicator */
.treeprefix {margin-right:4px}
.treeprefix.level-2 { margin-left:10px }
.treeprefix.level-3 { margin-left:30px }
.treeprefix.level-4 { margin-left:50px }
.treeprefix.level-5 { margin-left:70px }