Prestashop 1.6 категория дерево перестроить
Я создал из исходного кода PHP код C#, чтобы перестроить дерево категорий для prestashop 1.6. Но что-то не так. Некоторые категории не будут отображаться правильно, и я думаю, что где-то что-то не так... Проблема должна быть в $n переменных, где они представляют левую и правильную нумерацию. Это должно быть что-то вроде этого: 1 Home 8 2 cat1 7 3 cat2 6 4 cat3 5 Я думаю, что это что-то с ссылкой ref... Код PHP:
public static function regenerateEntireNtree()
{
$id = Context::getContext()->shop->id;
$id_shop = $id ? $id: Configuration::get('PS_SHOP_DEFAULT');
$categories = Db::getInstance()->executeS('
SELECT c.`id_category`, c.`id_parent`
FROM `'._DB_PREFIX_.'category` c
LEFT JOIN `'._DB_PREFIX_.'category_shop` cs
ON (c.`id_category` = cs.`id_category` AND cs.`id_shop` = '.(int)$id_shop.')
ORDER BY c.`id_parent`, cs.`position` ASC');
$categories_array = array();
foreach ($categories as $category)
$categories_array[$category['id_parent']]['subcategories'][] = $category['id_category'];
$n = 1;
if (isset($categories_array[0]) && $categories_array[0]['subcategories'])
Category::_subTree($categories_array, $categories_array[0]['subcategories'][0], $n);
}
protected static function _subTree(&$categories, $id_category, &$n)
{
$left = $n++;
if (isset($categories[(int)$id_category]['subcategories']))
foreach ($categories[(int)$id_category]['subcategories'] as $id_subcategory)
Category::_subTree($categories, (int)$id_subcategory, $n);
$right = (int)$n++;
Db::getInstance()->execute('
UPDATE '._DB_PREFIX_.'category
SET nleft = '.(int)$left.', nright = '.(int)$right.'
WHERE id_category = '.(int)$id_category.' LIMIT 1');
}
И мой код C#:
public bool ReGenerateEntireTree()
{
System.Data.DataTable Table = SelectQuery("SELECT c.`id_category`, c.`id_parent` FROM `ps_category` c LEFT JOIN `ps_category_shop` cs " +
"ON (c.`id_category` = cs.`id_category` AND cs.`id_shop` = 1) " +
"ORDER BY c.`id_parent`, cs.`position` ASC");
Dictionary<int, int> categoryArray = new Dictionary<int, int>();
for (int i = 0; i < Table.Rows.Count; i++)
{
categoryArray.Add(Convert.ToInt32(Table.Rows[i]["id_category"]), Convert.ToInt32(Table.Rows[i]["id_parent"]));
}
int n = 1;
SubTree(ref categoryArray, 1, ref n);
return true;
}
private static void SubTree(ref Dictionary<int, int> categories, int id_category, ref int n)
{
int left;
int right;
left = n++;
if (categories.ContainsValue(id_category))
{
var keysWithMatchingValues = categories.Where(p => p.Value == id_category).Select(p => p.Key);
foreach (var key in keysWithMatchingValues)
{
int id_subcategory = key;
SubTree(ref categories, id_subcategory, ref n);
}
}
right = n++;
string SQL = "UPDATE ps_category SET nleft = '" + left + "', nright = '" + right + "' WHERE id_category = " + id_category + " LIMIT 1";
if (UpdateQuery(SQL) == 1)
{
//recalculateLevelDepth(id_category);
}
}
Спасибо!