chops07876 Posted July 22, 2013 Share Posted July 22, 2013 Hi everyone, I have been developing my shop locally and have copied the data and SQL to my live webhost. Back Office is fine. Front Office is accessible (products are listed; images and all) apart from when I want to access a product. When I click the link I get an "Internal Server Error 500". I've enabled Dev and the message translates as: "Fatal error: Class 'Pack' not found in *myserver*/prestashop/controllers/front/ProductController.php on line 177" Everything is fine locally, so I'm a bit confused on this. Has anyone seen this before? Cheers, Rob. Link to comment Share on other sites More sharing options...
PascalVG Posted July 23, 2013 Share Posted July 23, 2013 Hi Rob, Interesting: in 1.5.3.1 there was a file /override/classes/Pack.php with contents: <?php class Pack extends PackCore { } in it. This file seems to have disappeared in 1.5.4.0/1.5.4.1. (A quick search gives only a pack.php in /classes folder, being the 'PackCore' class, not the overriding 'Pack' class...) Maybe try if it helps if you add a file Pack.php to the /override/classes/ folder with contents as given above? (Permissions: 644) Give it a try and let me know, pascal. Link to comment Share on other sites More sharing options...
chops07876 Posted July 24, 2013 Author Share Posted July 24, 2013 Hi Pascal, Thanks for your reply. Unfortunately, this produces the following error: Warning: require(/*myserver*/prestashop): failed to open stream: Success in /*myserver*/prestashop/classes/Autoload.php on line 112 Fatal error: require(): Failed opening required '/*myserver*/prestashop/' (include_path='.:/usr/local/lib/php-5.3.13/lib/php') in /*myserver*/prestashop/classes/Autoload.php on line 112 Rob. Link to comment Share on other sites More sharing options...
vekia Posted July 25, 2013 Share Posted July 25, 2013 may i know what ps version you use? Link to comment Share on other sites More sharing options...
chops07876 Posted July 26, 2013 Author Share Posted July 26, 2013 Sure, 1.5.4. Link to comment Share on other sites More sharing options...
vekia Posted July 26, 2013 Share Posted July 26, 2013 1.5.4.0 / 1.5.4.1 ? im trying to reproduce the issue and unfortunately i can't can you show the contents of your Pack class? classes/Pack.php here it is mine: <?php /* * 2007-2013 PrestaShop * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/osl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA <[email protected]> * @copyright 2007-2013 PrestaShop SA * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class PackCore extends Product { protected static $cachePackItems = array(); protected static $cacheIsPack = array(); protected static $cacheIsPacked = array(); /** * Is product a pack? * * @static * @param $id_product * @return bool */ public static function isPack($id_product) { if (!Pack::isFeatureActive()) return false; if (!$id_product) return false; if (!array_key_exists($id_product, self::$cacheIsPack)) { $result = Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'pack WHERE id_product_pack = '.(int)$id_product); self::$cacheIsPack[$id_product] = ($result > 0); } return self::$cacheIsPack[$id_product]; } /** * Is product in a pack? * * @static * @param $id_product * @return bool */ public static function isPacked($id_product) { if (!Pack::isFeatureActive()) return false; if (!array_key_exists($id_product, self::$cacheIsPacked)) { $result = Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'pack WHERE id_product_item = '.(int)$id_product); self::$cacheIsPacked[$id_product] = ($result > 0); } return self::$cacheIsPacked[$id_product]; } public static function noPackPrice($id_product) { $sum = 0; $price_display_method = !self::$_taxCalculationMethod; $items = Pack::getItems($id_product, Configuration::get('PS_LANG_DEFAULT')); foreach ($items as $item) $sum += $item->getPrice($price_display_method) * $item->pack_quantity; return $sum; } public static function getItems($id_product, $id_lang) { if (!Pack::isFeatureActive()) return array(); if (array_key_exists($id_product, self::$cachePackItems)) return self::$cachePackItems[$id_product]; $result = Db::getInstance()->executeS('SELECT id_product_item, quantity FROM '._DB_PREFIX_.'pack where id_product_pack = '.(int)$id_product); $array_result = array(); foreach ($result as $row) { $p = new Product($row['id_product_item'], false, $id_lang); $p->loadStockData(); $p->pack_quantity = $row['quantity']; $array_result[] = $p; } self::$cachePackItems[$id_product] = $array_result; return self::$cachePackItems[$id_product]; } public static function isInStock($id_product) { if (!Pack::isFeatureActive()) return true; $items = Pack::getItems((int)$id_product, Configuration::get('PS_LANG_DEFAULT')); foreach ($items as $item) { // Updated for 1.5.0 if (Product::getQuantity($item->id) < $item->pack_quantity && !$item->isAvailableWhenOutOfStock((int)$item->out_of_stock)) return false; } return true; } public static function getItemTable($id_product, $id_lang, $full = false) { if (!Pack::isFeatureActive()) return array(); $sql = 'SELECT p.*, product_shop.*, pl.*, MAX(image_shop.`id_image`) id_image, il.`legend`, cl.`name` AS category_default, a.quantity AS pack_quantity, product_shop.`id_category_default`, a.id_product_pack FROM `'._DB_PREFIX_.'pack` a LEFT JOIN `'._DB_PREFIX_.'product` p ON p.id_product = a.id_product_item LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON p.id_product = pl.id_product AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').' LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'. Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').' LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') '.Shop::addSqlAssociation('product', 'p').' LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON product_shop.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').' WHERE product_shop.`id_shop` = '.(int)Context::getContext()->shop->id.' AND a.`id_product_pack` = '.(int)$id_product.' GROUP BY product_shop.id_product'; $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); foreach ($result as &$line) $line = Product::getTaxesInformations($line); if (!$full) return $result; $array_result = array(); foreach ($result as $prow) if (!Pack::isPack($prow['id_product'])) $array_result[] = Product::getProductProperties($id_lang, $prow); return $array_result; } public static function getPacksTable($id_product, $id_lang, $full = false, $limit = null) { if (!Pack::isFeatureActive()) return array(); $packs = Db::getInstance()->getValue(' SELECT GROUP_CONCAT(a.`id_product_pack`) FROM `'._DB_PREFIX_.'pack` a WHERE a.`id_product_item` = '.(int)$id_product); if (!(int)$packs) return array(); $sql = ' SELECT p.*, product_shop.*, pl.*, MAX(image_shop.`id_image`) id_image, il.`legend` FROM `'._DB_PREFIX_.'product` p NATURAL LEFT JOIN `'._DB_PREFIX_.'product_lang` pl '.Shop::addSqlAssociation('product', 'p').' LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'. Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').' LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') WHERE pl.`id_lang` = '.(int)$id_lang.' '.Shop::addSqlRestrictionOnLang('pl').' AND p.`id_product` IN ('.$packs.') GROUP BY product_shop.id_product'; if ($limit) $sql .= ' LIMIT '.(int)$limit; $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); if (!$full) return $result; $array_result = array(); foreach ($result as $row) if (!Pack::isPacked($row['id_product'])) $array_result[] = Product::getProductProperties($id_lang, $row); return $array_result; } public static function deleteItems($id_product) { return Db::getInstance()->update('product', array('cache_is_pack' => 0), 'id_product = '.(int)$id_product) && Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'pack` WHERE `id_product_pack` = '.(int)$id_product) && Configuration::updateGlobalValue('PS_PACK_FEATURE_ACTIVE', Pack::isCurrentlyUsed()); } /** * Add an item to the pack * * @param integer $id_product * @param integer $id_item * @param integer $qty * @return boolean true if everything was fine */ public static function addItem($id_product, $id_item, $qty) { return Db::getInstance()->update('product', array('cache_is_pack' => 1), 'id_product = '.(int)$id_product) && Db::getInstance()->insert('pack', array('id_product_pack' => (int)$id_product, 'id_product_item' => (int)$id_item, 'quantity' => (int)$qty)) && Configuration::updateGlobalValue('PS_PACK_FEATURE_ACTIVE', '1'); } public static function duplicate($id_product_old, $id_product_new) { Db::getInstance()->execute('INSERT INTO '._DB_PREFIX_.'pack (id_product_pack, id_product_item, quantity) (SELECT '.(int)$id_product_new.', id_product_item, quantity FROM '._DB_PREFIX_.'pack WHERE id_product_pack = '.(int)$id_product_old.')'); // If return query result, a non-pack product will return false return true; } /** * This method is allow to know if a feature is used or active * @since 1.5.0.1 * @return bool */ public static function isFeatureActive() { return Configuration::get('PS_PACK_FEATURE_ACTIVE'); } /** * This method is allow to know if a Pack entity is currently used * @since 1.5.0 * @param $table * @param $has_active_column * @return bool */ public static function isCurrentlyUsed($table = null, $has_active_column = false) { // We dont't use the parent method because the identifier isn't id_pack return (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' SELECT `id_product_pack` FROM `'._DB_PREFIX_.'pack` '); } /** * For a given pack, tells if it has at least one product using the advanced stock management * * @param int $id_product id_pack * @return bool */ public static function usesAdvancedStockManagement($id_product) { if (!Pack::isPack($id_product)) return false; $products = Pack::getItems($id_product, Configuration::get('PS_LANG_DEFAULT')); foreach ($products as $product) { // if one product uses the advanced stock management if ($product->advanced_stock_management == 1) return true; } // not used return false; } } you can try to use it in your own Pack class. Link to comment Share on other sites More sharing options...
chops07876 Posted July 26, 2013 Author Share Posted July 26, 2013 Pack.php was present but was completely empty! Sorry, I really should've checked that! All is now well. Apologies for wasting your time. Link to comment Share on other sites More sharing options...
vekia Posted July 26, 2013 Share Posted July 26, 2013 so the problem is SOLVED? Link to comment Share on other sites More sharing options...
chops07876 Posted July 26, 2013 Author Share Posted July 26, 2013 Yes. Products are now accessible. Link to comment Share on other sites More sharing options...
vekia Posted July 26, 2013 Share Posted July 26, 2013 great, im glad that it works for you now im going to mark this thread as [solved] best regards Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now