Reputation: 550
I have an opencart shop with around 1300 categories and i'm not able to insert a new category or edit the existing category. I have installed pagination function, but it speeds up only category view. i did some debugging and found that the below function goes into an infinite loop once i click insert or edit inside the admin panel. Can anyone help me how to fix this
public function getCategories($parent_id = 0) {
$category_data = $this->cache->get('category.' . (int)$this->config->get('config_language_id') . '.' . (int)$parent_id);
if (!$category_data) {
$category_data = array();
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY c.sort_order, cd.name ASC");
foreach ($query->rows as $result) {
$category_data[] = array(
'category_id' => $result['category_id'],
'name' => $this->getPath($result['category_id'], $this->config->get('config_language_id')),
'status' => $result['status'],
'sort_order' => $result['sort_order']
);
$category_data = array_merge($category_data, $this->getCategories($result['category_id']));
}
$this->cache->set('category.' . (int)$this->config->get('config_language_id') . '.' . (int)$parent_id, $category_data);
}
return $category_data;
}
Upvotes: 0
Views: 729
Reputation: 57
First Solution:
Do you also have Category Descriptions in database? If so, these so many descriptions being loaded by MySQL may be making burden over server. Try optimize the Query, select only required columns, you may change query as under:
$query = $this->db->query("SELECT c.category_id, cd.name FROM ...
Second Solution You can do one more debug trick which once solved my problem. Add an echo statement:
echo $result['name'];
$category_data = array_merge($category_data, $this->getCategories($result['category_id']));` `
This way you'll get to know the exact location of the category where process gets hanged. There may be some problem with that particular category only.
Third Solution Try changing
'name' => $this->getPath($result['category_id'], $this->config->get('config_language_id')),
To:
'name' => $result['name'],
Hope this helps.
Upvotes: 1
Reputation: 550
I have a current but not permanent solution that worked for me... I dont know whether it's the right way to do, but it works for me.I changed the query to this
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c ORDER BY c.parent_id,c.sort_order");
And commented off
//$category_data = array_merge($category_data, $this->getCategories($result['category_id']));
This currently works for me, but i don't know whether it's the correct way or not. Thanks for the quick help everyone.
Upvotes: 0