* @copyright 2007-2011 PrestaShop SA * @version Release: $Revision$ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ abstract class InstallFixtures { /** * @var array List of errors logged during fixtures process */ private $errors = array(); /** * @var InstallLanguages */ protected $language; /** * @var Db */ protected $db; /** * @var array List of installed languages */ protected $installed_languages = array(); /** * @var array Store created ids for each object with ID argument */ protected $ids = array(); /** * Process fixtures installation */ abstract protected function install(); public function __construct(InstallLanguages $language) { require_once _PS_ROOT_DIR_.'/images.inc.php'; $this->db = Db::getInstance(); $this->language = $language; Db::getInstance()->delete('prefix_manufacturer'); Db::getInstance()->delete('prefix_manufacturer_lang'); Db::getInstance()->delete('prefix_supplier'); Db::getInstance()->delete('prefix_supplier_lang'); Db::getInstance()->delete('prefix_address'); Db::getInstance()->delete('prefix_product'); Db::getInstance()->delete('prefix_product_lang'); Db::getInstance()->delete('prefix_category', 'id_category <> 1'); Db::getInstance()->delete('prefix_category_product'); Db::getInstance()->delete('prefix_category_lang', 'id_category <> 1'); Db::getInstance()->delete('prefix_scene'); Db::getInstance()->delete('prefix_scene_lang'); Db::getInstance()->delete('prefix_scene_products'); Db::getInstance()->delete('prefix_scene_category'); Db::getInstance()->delete('prefix_attribute_group'); Db::getInstance()->delete('prefix_attribute_group_lang'); Db::getInstance()->delete('prefix_attribute'); Db::getInstance()->delete('prefix_attribute_lang'); Db::getInstance()->delete('prefix_product_attribute'); Db::getInstance()->delete('prefix_product_attribute_combination'); Db::getInstance()->delete('prefix_product_attribute_image'); Db::getInstance()->delete('prefix_order_message'); Db::getInstance()->delete('prefix_order_message_lang'); Db::getInstance()->delete('prefix_feature'); Db::getInstance()->delete('prefix_feature_lang'); Db::getInstance()->delete('prefix_feature_value'); Db::getInstance()->delete('prefix_feature_value_lang'); Db::getInstance()->delete('prefix_feature_product'); Db::getInstance()->delete('prefix_store'); Db::getInstance()->delete('prefix_image'); Db::getInstance()->delete('prefix_image_lang'); Db::getInstance()->delete('prefix_tag'); Db::getInstance()->delete('prefix_alias'); Db::getInstance()->delete('prefix_customer'); Db::getInstance()->delete('prefix_guest'); Db::getInstance()->delete('prefix_connections'); Db::getInstance()->delete('prefix_customer_group'); Db::getInstance()->delete('prefix_cart'); Db::getInstance()->delete('prefix_cart_product'); Db::getInstance()->delete('prefix_orders'); Db::getInstance()->delete('prefix_order_detail'); Db::getInstance()->delete('prefix_order_history'); Db::getInstance()->delete('prefix_range_price'); Db::getInstance()->delete('prefix_range_weight'); Db::getInstance()->delete('prefix_delivery'); Db::getInstance()->delete('prefix_specific_price'); foreach (Language::getLanguages(false) as $lang) $this->installed_languages[$lang['id_lang']] = $lang['iso_code']; } /** * Log an error during fixtures process */ protected function setError() { } /** * Get list of errors * * @return array */ public function getErrors() { return $this->errors; } /** * Install fixtures */ public function process() { $this->loadData(); $this->install(); Search::indexation(true); } protected function getId($entity, $identifier) { return isset($this->ids[$entity.':'.$identifier]) ? $this->ids[$entity.':'.$identifier] : 0; } protected function hydrateEntity(ObjectModel $object, array $data, array $mapper) { $hydrate_data = $this->getHydratedData($data, $mapper); $object->hydrate($hydrate_data); } protected function getHydratedData(array $data, array $mapper) { $hydrate_data = array(); foreach ($mapper as $key => $info) { $value = (array_key_exists($key, $data)) ? $data[$key] : $info['default']; switch ($info['type']) { case 'bool': if (strtolower($value) == 'true') $value = true; else if (strtolower($value) == 'false') $value = false; $hydrate_data[$key] = (bool)$value; break; case 'int': $hydrate_data[$key] = (int)$value; break; case 'float': $hydrate_data[$key] = (float)$value; break; case 'string': $hydrate_data[$key] = (string)$value; break; case 'date': if (!Validate::isDateFormat($value)) $value = '0000-00-00'; $hydrate_data[$key] = $value; break; case 'relation': if (!isset($data[$info['field']]) && isset($data[$key])) $hydrate_data[$info['field']] = $this->getId($info['entity'], $value); break; case 'relation_table': if (!isset($data[$info['field']]) && isset($data[$key])) $hydrate_data[$info['field']] = $this->db->getValue(' SELECT '.$info['field'].' FROM '._DB_PREFIX_.$info['table'].' WHERE '.$info['target_field'].' = \''.pSQL($data[$key]).'\' '); } } return $hydrate_data; } protected function fillTranslation($entity, $id, $tag) { $translations = array(); foreach ($this->installed_languages as $id_lang => $iso) $translations[$id_lang] = str_replace(array('\n', '\r'), array("\n", "\r"), $this->language->getFixtureTranslation($iso, $entity.'_'.$id.'_'.$tag)); return $translations; } protected function createEntityImages($entity, $id, $entity_id, $image_type, $target_folder) { return; $path = _PS_INSTALL_FIXTURES_PATH_.'apple/img/'.$entity.'/'; $dst_path = _PS_INSTALL_FIXTURES_PATH_.'apple/img/TESTS/'.$target_folder.'/'; if (!@copy($path.$id.'.jpg', $dst_path.$entity_id.'.jpg')) { $this->setError($this->language->l('Cannot create image "%s"', $id)); return; } @chmod($dst_path.$entity_id.'.jpg', 0644); $types = ImageType::getImagesTypes($image_type); foreach ($types as $type) { $subpath = ''; if ($type['name'] == 'thumb_scene') $subpath = 'thumbs/'; $origin_file = $path.$subpath.$id.'-'.$type['name'].'.jpg'; $target_file = $dst_path.$subpath.$entity_id.'-'.$type['name'].'.jpg'; // Test if dest folder is writable if (!is_writable(dirname($target_file))) $this->setError($this->language->l('Cannot create image "%1$s" (bad permissions on folder "%2$s")', $id.'-'.$type['name'], dirname($target_file))); // If a file named folder/entity-type.jpg exists just copy it, this is an optimisation in order to prevent to much resize else if (file_exists($origin_file)) { if (!@copy($origin_file, $target_file)) $this->setError($this->language->l('Cannot create image "%s"', $id.'-'.$type['name'])); @chmod($target_file, 0644); } // Resize the image if no cache was prepared in fixtures else if (!imageResize($path.$id.'.jpg', $target_file, $type['width'], $type['height'])) $this->setError($this->language->l('Cannot create image "%s"', $id.'-'.$type['name'])); } } protected function createProductImages(Image $image, $id, $id_product) { return; $path = _PS_INSTALL_FIXTURES_PATH_.'apple/img/product/'; $dst_path = $image->getPathForCreation(); //$dst_path = str_replace(_PS_ROOT_DIR_.'/img/', _PS_INSTALL_FIXTURES_PATH_.'apple/img/TESTS/', $dst_path); if (!@copy($path.$id.'.jpg', $dst_path.'.'.$image->image_format)) { $this->setError($this->language->l('Cannot create image "%s"', $id)); return; } @chmod($dst_path.'.'.$image->image_format, 0644); $types = ImageType::getImagesTypes('products'); foreach ($types as $type) { $origin_file = $path.$id.'-'.$type['name'].'.jpg'; $target_file = $dst_path.'-'.$type['name'].'.'.$image->image_format; // Test if dest folder is writable if (!is_writable(dirname($target_file))) $this->setError($this->language->l('Cannot create image "%1$s" (bad permissions on folder "%2$s")', $id.'-'.$type['name'], dirname($target_file))); // If a file named folder/entity-type.jpg exists just copy it, this is an optimisation in order to prevent to much resize else if (file_exists($origin_file)) { if (!@copy($origin_file, $target_file)) $this->setError($this->language->l('Cannot create image "%s"', $id.'-'.$type['name'])); @chmod($target_file, 0644); } // Resize the image if no cache was prepared in fixtures else if (!imageResize($path.$id.'.jpg', $target_file, $type['width'], $type['height'])) $this->setError($this->language->l('Cannot create image "%s"', $id.'-'.$type['name'])); } } protected function loadData() { $this->loadEntity('manufacturer'); $this->loadEntity('supplier'); $this->loadEntity('alias'); $this->loadEntity('ordermessage'); $this->loadEntity('carrier'); $this->loadEntity('range'); $this->loadEntity('delivery'); $this->loadEntity('customer'); $this->loadEntity('guest'); $this->loadEntity('address'); $this->loadEntity('store'); $this->loadEntity('category'); $this->loadEntity('feature'); $this->loadEntity('featurevalue'); $this->loadEntity('attributegroup'); $this->loadEntity('attribute'); $this->loadEntity('product'); $this->loadEntity('specificprice'); $this->loadEntity('image'); $this->loadEntity('productattribute'); $this->loadEntity('scene'); $this->loadEntity('cart'); $this->loadEntity('order'); } protected function loadEntity($entity) { $entity_file = _PS_INSTALL_FIXTURES_PATH_.'apple/data/'.$entity.'.xml'; if (!file_exists($entity_file)) return; $xml = simplexml_load_file($entity_file); foreach ($xml->$entity as $node) { // Entity identifier $identifier = (string)$node['id']; // Entity data $data = array(); foreach ($node->attributes() as $attr_name => $attr_value) $data[$attr_name] = (string)$attr_value; foreach ($node->children() as $child_node) $data[$child_node->getName()] = $this->parseNode($child_node); $method = 'Install'.ucfirst($entity); $this->$method($identifier, $data); } } protected function parseNode(SimpleXMLElement $node) { $children = $node->children(); if (!$children) return (string)$node; else { $data = array(); foreach ($node->attributes() as $k => $v) $data[$k] = (string)$v; foreach ($children as $child) if ($child->getName() == 'item') $data[] = $this->parseNode($child); else $data[$child->getName()] = $this->parseNode($child); return $data; } } protected function installGenericEntity($classname, $identifier, array $data, array $mapper, array $lang_fields = array()) { $entity = strtolower($classname); $object = new $classname(); $this->hydrateEntity($object, $data, $mapper); foreach ($lang_fields as $field) $object->$field = $this->fillTranslation($entity, $identifier, $field); if (!$object->add()) { $this->setError($this->language->l('Cannot create entity "%s" with identifier "%s"', $entity, $identifier)); return false; } $this->ids[$entity.':'.$identifier] = $object->id; return $object; } protected function installManufacturer($identifier, array $data) { $object = $this->installGenericEntity( 'Manufacturer', $identifier, $data, array( 'name' => array('type' => 'string', 'default' => ''), 'active' => array('type' => 'bool', 'default' => true), ), array('description', 'short_description', 'meta_description', 'meta_title', 'meta_keywords') ); if ($object) $this->createEntityImages('manufacturer', $identifier, $object->id, 'manufacturers', 'm'); } protected function installSupplier($identifier, array $data) { $object = $this->installGenericEntity( 'Supplier', $identifier, $data, array( 'name' => array('type' => 'string', 'default' => ''), 'active' => array('type' => 'bool', 'default' => true), ), array('description', 'short_description', 'meta_description', 'meta_title', 'meta_keywords') ); if ($object) $this->createEntityImages('supplier', $identifier, $object->id, 'suppliers', 'su'); } protected function installAlias($identifier, array $data) { $object = $this->installGenericEntity( 'Alias', $identifier, $data, array( 'alias' => array('type' => 'string', 'default' => ''), 'search' => array('type' => 'string', 'default' => ''), 'active' => array('type' => 'bool', 'default' => true), ) ); } protected function installOrderMessage($identifier, array $data) { $object = $this->installGenericEntity( 'OrderMessage', $identifier, $data, array(), array('name', 'message') ); } protected function installCarrier($identifier, array $data) { $object = $this->installGenericEntity( 'Carrier', $identifier, $data, array( 'id_tax_rules_group' => array('type' => 'int', 'default' => 0), 'name' => array('type' => 'string', 'default' => ''), 'shipping_handling' => array('type' => 'bool', 'default' => false), 'is_free' => array('type' => 'bool', 'default' => false), 'active' => array('type' => 'bool', 'default' => true), ), array('delay') ); if ($object) { // Add zones to carrier if (isset($data['zones'])) { foreach ($data['zones'] as $zone) $object->addZone(Zone::getIdByName($zone)); } // Add carrier to groups if (isset($data['groups'])) { foreach ($data['groups'] as $id_group) $this->db->autoExecute(_DB_PREFIX_.'carrier_group', array( 'id_carrier' => (int)$object->id, 'id_group' => (int)$id_group, ), 'INSERT'); } } } protected function installCustomer($identifier, array $data) { if (isset($data['passwd'])) $data['passwd'] = Tools::encrypt($data['passwd']); $object = $this->installGenericEntity( 'Customer', $identifier, $data, array( 'firstname' => array('type' => 'string', 'default' => ''), 'lastname' => array('type' => 'string', 'default' => ''), 'email' => array('type' => 'string', 'default' => ''), 'passwd' => array('type' => 'string', 'default' => ''), 'birthday' => array('type' => 'date', 'default' => '0000-00-00'), 'id_gender' => array('type' => 'int', 'default' => 1), 'id_default_group' => array('type' => 'int', 'default' => 1), 'is_guest' => array('type' => 'bool', 'default' => false), 'active' => array('type' => 'bool', 'default' => true), ) ); } protected function installGuest($identifier, array $data) { $object = $this->installGenericEntity( 'Guest', $identifier, $data, array( 'id_operating_system' => array('type' => 'int', 'default' => 0), 'operating_system' => array('type' => 'relation_table', 'field' => 'id_operating_system', 'table' => 'operating_system', 'target_field' => 'name', 'default' => ''), 'id_web_browser' => array('type' => 'int', 'default' => 0), 'web_browser' => array('type' => 'relation_table', 'field' => 'id_web_browser', 'table' => 'web_browser', 'target_field' => 'name', 'default' => ''), 'id_customer' => array('type' => 'int', 'default' => 0), 'customer' => array('type' => 'relation', 'field' => 'id_customer', 'entity' => 'customer', 'default' => ''), 'screen_resolution_x' => array('type' => 'int', 'default' => 0), 'screen_resolution_y' => array('type' => 'int', 'default' => 0), 'screen_color' => array('type' => 'int', 'default' => 0), 'javascript' => array('type' => 'bool', 'default' => true), 'sun_java' => array('type' => 'bool', 'default' => false), 'adobe_flash' => array('type' => 'bool', 'default' => false), 'adobe_director' => array('type' => 'bool', 'default' => false), 'apple_quicktime' => array('type' => 'bool', 'default' => false), 'real_player' => array('type' => 'bool', 'default' => false), 'windows_media' => array('type' => 'bool', 'default' => false), 'accept_language' => array('type' => 'string', 'default' => ''), 'id_shop' => array('type' => 'int', 'default' => Context::getContext()->shop->id), ) ); if (isset($data['connections']) && is_array($data['connections'])) { foreach ($data['connections'] as $connection_data) { if (isset($connection_data['id'])) { $connection_data['id_guest'] = $object->id; $this->installConnection($connection_data['id'], $connection_data); } } } } protected function installConnection($identifier, array $data) { if (isset($data['ip_address'])) $data['ip_address'] = ip2long($data['ip_address']); $object = $this->installGenericEntity( 'Connection', $identifier, $data, array( 'id_guest' => array('type' => 'int', 'default' => 0), 'guest' => array('type' => 'relation', 'field' => 'id_guest', 'entity' => 'guest', 'default' => ''), 'id_page' => array('type' => 'int', 'default' => 0), 'ip_address' => array('type' => 'string', 'default' => ''), 'http_referer' => array('type' => 'string', 'default' => ''), 'id_shop' => array('type' => 'int', 'default' => Context::getContext()->shop->id), 'id_group_shop' => array('type' => 'int', 'default' => Context::getContext()->shop->getGroupID()), ) ); } protected function installAddress($identifier, array $data) { if (isset($data['country'])) $data['id_country'] = Country::getByIso($data['country']); if (isset($data['state'])) { $state = $data['state']; $data['id_state'] = State::getIdByName($state); if (!$data['id_state']) $data['id_state'] = State::getIdByIso($state); } $object = $this->installGenericEntity( 'Address', $identifier, $data, array( 'firstname' => array('type' => 'string', 'default' => ''), 'lastname' => array('type' => 'string', 'default' => ''), 'address1' => array('type' => 'string', 'default' => ''), 'address2' => array('type' => 'string', 'default' => ''), 'postcode' => array('type' => 'string', 'default' => ''), 'city' => array('type' => 'string', 'default' => ''), 'phone' => array('type' => 'string', 'default' => ''), 'alias' => array('type' => 'string', 'default' => ''), 'company' => array('type' => 'string', 'default' => ''), 'id_country' => array('type' => 'int', 'default' => 0), 'id_state' => array('type' => 'int', 'default' => 0), 'id_customer' => array('type' => 'int', 'default' => 0), 'customer' => array('type' => 'relation', 'field' => 'id_customer', 'entity' => 'customer', 'default' => ''), 'id_manufacturer' =>array('type' => 'int', 'default' => 0), 'manufacturer' => array('type' => 'relation', 'field' => 'id_manufacturer', 'entity' => 'manufacturer', 'default' => ''), 'id_supplier' => array('type' => 'int', 'default' => 0), 'supplier' => array('type' => 'relation', 'field' => 'id_supplier', 'entity' => 'supplier', 'default' => ''), 'active' => array('type' => 'bool', 'default' => true), ) ); } protected function installStore($identifier, array $data) { if (isset($data['country'])) $data['id_country'] = Country::getByIso($data['country']); if (isset($data['state'])) { $state = $data['state']; $data['id_state'] = State::getIdByName($state); if (!$data['id_state']) $data['id_state'] = State::getIdByIso($state); } if (isset($data['hours']) && is_array($data['hours'])) $data['hours'] = serialize($data['hours']); $object = $this->installGenericEntity( 'Store', $identifier, $data, array( 'id_country' => array('type' => 'int', 'default' => 0), 'id_state' => array('type' => 'int', 'default' => 0), 'name' => array('type' => 'string', 'default' => ''), 'address1' => array('type' => 'string', 'default' => ''), 'address2' => array('type' => 'string', 'default' => ''), 'city' => array('type' => 'string', 'default' => ''), 'postcode' => array('type' => 'string', 'default' => ''), 'latitude' => array('type' => 'float', 'default' => 0.00), 'longitude' => array('type' => 'float', 'default' => 0.00), 'hours' => array('type' => 'string', 'default' => ''), 'phone' => array('type' => 'string', 'default' => ''), 'fax' => array('type' => 'string', 'default' => ''), 'email' => array('type' => 'string', 'default' => ''), 'note' => array('type' => 'string', 'default' => ''), 'active' => array('type' => 'bool', 'default' => true), ) ); } protected function installCategory($identifier, array $data) { $object = $this->installGenericEntity( 'Category', $identifier, $data, array( 'id_parent' => array('type' => 'int', 'default' => 1), 'parent' => array('type' => 'relation', 'field' => 'id_parent', 'entity' => 'category', 'default' => 0), 'active' => array('type' => 'bool', 'default' => true), ), array('name', 'description', 'link_rewrite', 'meta_title', 'meta_keyword', 'meta_description') ); $this->createEntityImages('category', $identifier, $object->id, 'categories', 'c'); } protected function installFeature($identifier, array $data) { $object = $this->installGenericEntity( 'Feature', $identifier, $data, array(), array('name') ); } protected function installFeatureValue($identifier, array $data) { $object = $this->installGenericEntity( 'FeatureValue', $identifier, $data, array( 'id_feature' => array('type' => 'int', 'default' => 1), 'feature' => array('type' => 'relation', 'field' => 'id_feature', 'entity' => 'feature', 'default' => 0), 'custom' => array('type' => 'bool', 'default' => false), ), array('value') ); } protected function installAttributeGroup($identifier, array $data) { $object = $this->installGenericEntity( 'AttributeGroup', $identifier, $data, array( 'group_type' => array('type' => 'string', 'default' => 'select'), 'is_color_group' => array('type' => 'bool', 'default' => false), ), array('name', 'public_name') ); } protected function installAttribute($identifier, array $data) { $object = $this->installGenericEntity( 'Attribute', $identifier, $data, array( 'id_attribute_group' => array('type' => 'int', 'default' => 1), 'attribute_group' => array('type' => 'relation', 'field' => 'id_attribute_group', 'entity' => 'attributegroup', 'default' => 0), 'color' => array('type' => 'string', 'default' => ''), ), array('name', 'public_name') ); } protected function installProduct($identifier, array $data) { $object = $this->installGenericEntity( 'Product', $identifier, $data, array( 'id_supplier' => array('type' => 'int', 'default' => 0), 'supplier' => array('type' => 'relation', 'field' => 'id_supplier', 'entity' => 'supplier', 'default' => 0), 'id_manufacturer' => array('type' => 'int', 'default' => 0), 'manufacturer' => array('type' => 'relation', 'field' => 'id_manufacturer', 'entity' => 'manufacturer', 'default' => 0), 'id_tax_rules_group' => array('type' => 'int', 'default' => 0), 'id_category_default' =>array('type' => 'int', 'default' => 1), 'category_default' => array('type' => 'relation', 'field' => 'id_category_default', 'entity' => 'category', 'default' => 0), 'on_sale' => array('type' => 'int', 'default' => 0), 'online_only' => array('type' => 'int', 'default' => 0), 'ecotax' => array('type' => 'float', 'default' => 0.00), 'price' => array('type' => 'float', 'default' => 0.00), 'wholesale_price' => array('type' => 'float', 'default' => 0.00), 'ean13' => array('type' => 'string', 'default' => ''), 'reference' => array('type' => 'string', 'default' => ''), 'supplier_reference' => array('type' => 'string', 'default' => ''), 'weight' => array('type' => 'int', 'default' => 0), 'out_of_stock' => array('type' => 'int', 'default' => 2), 'quantity_discount' => array('type' => 'int', 'default' => 0), 'customizable' => array('type' => 'int', 'default' => 0), 'uploadable_files' => array('type' => 'int', 'default' => 0), 'text_fields' => array('type' => 'int', 'default' => 0), 'available_date' => array('type' => 'date', 'default' => '0000-00-00'), 'indexed' => array('type' => 'bool', 'default' => true), 'active' => array('type' => 'bool', 'default' => true), ), array('description', 'description_short', 'link_rewrite', 'meta_description', 'meta_keywords', 'meta_title', 'name', 'available_now', 'available_later') ); if ($object) { // Add product to categories if (isset($data['categories']) && is_array($data['categories'])) { $categories = array(); foreach ($data['categories'] as $category) $categories = (is_array($category)) ? $this->getId('category', $category['id']) : (int)$category; $object->addToCategories($categories); } // Add features to the product if (isset($data['features']) && is_array($data['features'])) { static $cache_features = array(); foreach ($data['features'] as $id_feature_value) { $id_feature_value = (is_array($id_feature_value)) ? $this->getId('featurevalue', $id_feature_value['id']) : (int)$id_feature_value; if (!isset($cache_features[$id_feature_value])) $cache_features[$id_feature_value] = $this->db->getValue(' SELECT id_feature FROM '._DB_PREFIX_.'feature_value WHERE id_feature_value = '.(int)$id_feature_value ); Product::addFeatureProductImport($object->id, $cache_features[$id_feature_value], $id_feature_value); } } // Add specific price if (isset($data['specific_prices']) && is_array($data['specific_prices'])) { foreach ($data['specific_prices'] as $price_data) { $price_data['id_product'] = $object->id; $this->installSpecificPrice($price_data['id'], $price_data); } } // Add images if (isset($data['images']) && is_array($data['images'])) { foreach ($data['images'] as $image_data) { $image_data['id_product'] = $object->id; $this->installImage($image_data['id'], $image_data); } } // Add combinations if (isset($data['combinations']) && is_array($data['combinations'])) { foreach ($data['combinations'] as $combination_data) { $combination_data['id_product'] = $object->id; $this->installCombination($combination_data['id'], $combination_data); } } } } protected function installSpecificPrice($identifier, array $data) { if (isset($data['country'])) $data['id_country'] = Country::getByIso($data['country']); if (isset($data['currency'])) $data['id_currency'] = Currency::getIdByIsoCode($data['currency']); $object = $this->installGenericEntity( 'SpecificPrice', $identifier, $data, array( 'id_product' => array('type' => 'int', 'default' => 0), 'product' => array('type' => 'relation', 'field' => 'id_product', 'entity' => 'product', 'default' => 0), 'id_shop' => array('type' => 'int', 'default' => 0), 'id_currency' => array('type' => 'int', 'default' => 0), 'id_country' => array('type' => 'int', 'default' => 0), 'id_group' => array('type' => 'int', 'default' => 0), 'price' => array('type' => 'float', 'default' => 0), 'from_quantity' => array('type' => 'int', 'default' => 0), 'reduction' => array('type' => 'float', 'default' => 0), 'reduction_type' => array('type' => 'string', 'default' => 'percentage'), 'from' => array('type' => 'date', 'default' => '0000-00-00 00:00:00'), 'to' => array('type' => 'date', 'default' => '0000-00-00 00:00:00'), ) ); } protected function installImage($identifier, array $data) { $object = $this->installGenericEntity( 'Image', $identifier, $data, array( 'id_product' => array('type' => 'int', 'default' => 0), 'product' => array('type' => 'relation', 'field' => 'id_product', 'entity' => 'product', 'default' => 0), 'cover' => array('type' => 'bool', 'default' => false), ), array('legend') ); $this->createProductImages($object, $identifier, $object->id_product); } protected function installCombination($identifier, array $data) { if (!isset($data['id_product'])) return; $d = $this->getHydratedData($data, array( 'reference' => array('type' => 'string', 'default' => ''), 'supplier_reference' => array('type' => 'string', 'default' => ''), 'ean13' => array('type' => 'string', 'default' => ''), 'price' => array('type' => 'float', 'default' => 0.000000), 'ecotax' => array('type' => 'float', 'default' => 0.00), 'weight' => array('type' => 'float', 'default' => 0), 'default_on' => array('type' => 'bool', 'default' => false), 'unit_price_impact' => array('type' => 'float', 'default' => 0.00), )); $product = new Product($data['id_product']); if (!Validate::isLoadedObject($product)) return; $images = array(); if (isset($data['images']) && is_array($data['images'])) { $images = array(); foreach ($data['images'] as $image) $images[] = (is_array($image)) ? $this->getId('image', $image['id']) : (int)$image; } $id_product_attribute = $product->addProductAttribute( $d['price'], $d['weight'], $d['unit_price_impact'], $d['ecotax'], $images, $d['reference'], $d['supplier_reference'], $d['ean13'], $d['default_on'] ); if (!$id_product_attribute) { $this->setError($this->language->l('Cannot create product attribute')); return false; } if (isset($data['attributes']) && is_array($data['attributes'])) { $attributes = array(); foreach ($data['attributes'] as $attribute) $attributes[] = (is_array($attribute)) ? $this->getId('attribute', $attribute['id']) : (int)$attribute; $product->addAttributeCombinaison($id_product_attribute, $attributes); } $this->ids['combination:'.$identifier] = $id_product_attribute; } protected function installScene($identifier, array $data) { $object = $this->installGenericEntity( 'Scene', $identifier, $data, array( 'active' => array('type' => 'bool', 'default' => true), ), array('legend') ); // Add categories to scene if (isset($data['categories']) && is_array($data['categories'])) { $categories = array(); foreach ($data['categories'] as $category) $categories[] = (is_array($category)) ? $this->getId('categories', $category['id']) : (int)$category; $object->addCategories($categories); } // Add products to scene if (isset($data['zones']) && is_array($data['zones'])) { $zones = array(); foreach ($data['zones'] as $zone) { if (isset($zone['product']) && !isset($zone['id_product'])) $zone['id_product'] = $this->getId('product', $zone['product']); $zones[] = $zone; } $object->addZoneProducts($zones); } $this->createEntityImages('scene', $identifier, $object->id, 'scenes', 'scenes'); } protected function installRange($identifier, array $data) { $class = (isset($data) && $data['type'] == 'price') ? 'RangePrice' : 'RangeWeight'; $object = $this->installGenericEntity( $class, $identifier, $data, array( 'id_carrier' => array('type' => 'int', 'default' => 0), 'carrier' => array('type' => 'relation', 'field' => 'id_carrier', 'entity' => 'carrier', 'default' => 0), 'delimiter1' => array('type' => 'int', 'default' => 0), 'delimiter2' => array('type' => 'int', 'default' => 0), ) ); } protected function installDelivery($identifier, array $data) { if (isset($data['zone'])) $data['id_zone'] = Zone::getIdByName($data['zone']); $object = $this->installGenericEntity( 'Delivery', $identifier, $data, array( 'id_range_price' => array('type' => 'int', 'default' => 0), 'range_price' => array('type' => 'relation', 'field' => 'id_range_price', 'entity' => 'rangeprice', 'default' => 0), 'id_range_weight' =>array('type' => 'int', 'default' => 0), 'range_weight' => array('type' => 'relation', 'field' => 'id_range_weight', 'entity' => 'rangeweight', 'default' => 0), 'id_carrier' => array('type' => 'int', 'default' => 0), 'carrier' => array('type' => 'relation', 'field' => 'id_carrier', 'entity' => 'carrier', 'default' => 0), 'id_zone' => array('type' => 'int', 'default' => 0), 'price' => array('type' => 'float', 'default' => 0.00), ) ); } protected function installCart($identifier, array $data) { if (isset($data['lang'])) $data['id_lang'] = Language::getIdByIso($data['lang']); if (isset($data['currency'])) $data['id_currency'] = Currency::getIdByIsoCode($data['currency']); $object = $this->installGenericEntity( 'Cart', $identifier, $data, array( 'id_carrier' => array('type' => 'int', 'default' => 0), 'carrier' => array('type' => 'relation', 'field' => 'id_carrier', 'entity' => 'carrier', 'default' => 0), 'id_lang' => array('type' => 'int', 'default' => Configuration::get('PS_LANG_DEFAULT')), 'id_address_delivery' => array('type' => 'int', 'default' => 0), 'address_delivery' => array('type' => 'relation', 'field' => 'id_address_delivery', 'entity' => 'address', 'default' => 0), 'id_address_invoice' => array('type' => 'int', 'default' => 0), 'address_invoice' => array('type' => 'relation', 'field' => 'id_address_invoice', 'entity' => 'address', 'default' => 0), 'id_currency' => array('type' => 'int', 'default' => Configuration::get('PS_CURRENCY_DEFAULT')), 'id_customer' => array('type' => 'int', 'default' => 0), 'customer' => array('type' => 'relation', 'field' => 'id_customer', 'entity' => 'customer', 'default' => 0), 'id_guest' => array('type' => 'int', 'default' => 0), 'guest' => array('type' => 'relation', 'field' => 'id_guest', 'entity' => 'guest', 'default' => 0), 'id_shop' => array('type' => 'int', 'default' => Context::getContext()->shop->id), 'recyclable' => array('type' => 'bool', 'default' => false), 'gift' => array('type' => 'bool', 'default' => false), ) ); // Add products to cart if ($object && $data['products'] && is_array($data['products'])) { foreach ($data['products'] as $product) { if (isset($product['product'])) $product['id_product'] = $this->getId('product', $product['product']); if (isset($product['combination'])) $product['id_product_attribute'] = $this->getId('combination', $product['combination']); $this->db->autoExecute(_DB_PREFIX_.'cart_product', array( 'id_product' => (isset($product['id_product'])) ? (int)$product['id_product'] : 0, 'id_product_attribute' => (isset($product['id_product_attribute'])) ? (int)$product['id_product_attribute'] : 0, 'id_cart' => (int)$object->id, 'id_shop' => (isset($product['id_shop'])) ? $product['id_shop'] : Context::getContext()->shop->id, 'quantity' => (isset($product['quantity'])) ? (int)$product['quantity'] : 1, 'date_add' => date('Y-m-d H:i:s') ), 'INSERT'); } } } protected function installOrder($identifier, array $data) { if (isset($data['currency'])) $data['id_currency'] = Currency::getIdByIsoCode($data['currency']); $object = $this->installGenericEntity( 'Order', $identifier, $data, array( 'id_lang' => array('type' => 'int', 'default' => Configuration::get('PS_LANG_DEFAULT')), 'id_shop' => array('type' => 'int', 'default' => Context::getContext()->shop->id), 'id_group_shop' => array('type' => 'int', 'default' => Context::getContext()->shop->getGroupID()), 'id_carrier' => array('type' => 'int', 'default' => Configuration::get('PS_CARRIER_DEFAULT')), 'carrier' => array('type' => 'relation', 'field' => 'id_carrier', 'entity' => 'carrier', 'default' => 0), 'id_customer' => array('type' => 'int', 'default' => 0), 'customer' => array('type' => 'relation', 'field' => 'id_customer', 'entity' => 'customer', 'default' => 0), 'id_cart' => array('type' => 'int', 'default' => 0), 'cart' => array('type' => 'relation', 'field' => 'id_cart', 'entity' => 'cart', 'default' => 0), 'id_currency' => array('type' => 'int', 'default' => Configuration::get('PS_CURRENCY_DEFAULT')), 'id_address_delivery' => array('type' => 'int', 'default' => 0), 'address_delivery' => array('type' => 'relation', 'field' => 'id_address_delivery', 'entity' => 'address', 'default' => 0), 'id_address_invoice' => array('type' => 'int', 'default' => 0), 'address_invoice' => array('type' => 'relation', 'field' => 'id_address_invoice', 'entity' => 'address', 'default' => 0), 'secure_key' => array('type' => 'string', 'default' => ''), 'payment' => array('type' => 'string', 'default' => ''), 'module' => array('type' => 'string', 'default' => ''), 'recyclable' => array('type' => 'bool', 'default' => false), 'gift' => array('type' => 'bool', 'default' => false), 'gift_message' => array('type' => 'string', 'default' => ''), 'shipping_number' => array('type' => 'string', 'default' => ''), 'total_discounts' => array('type' => 'float', 'default' => 0.00), 'total_paid' => array('type' => 'float', 'default' => 0.00), 'total_paid_real' => array('type' => 'float', 'default' => 0.00), 'total_products' => array('type' => 'float', 'default' => 0.00), 'total_products_wt' => array('type' => 'float', 'default' => 0.00), 'total_shipping' => array('type' => 'float', 'default' => 0.00), 'conversion_rate' => array('type' => 'float', 'default' => 1.000000), 'invoice_number' => array('type' => 'int', 'default' => 0), 'delivery_number' => array('type' => 'int', 'default' => 0), 'invoice_date' => array('type' => 'date', 'default' => '0000-00-00 00:00:00'), 'delivery_date' => array('type' => 'date', 'default' => '0000-00-00 00:00:00'), 'valid' => array('type' => 'bool', 'default' => false), ) ); if ($object) { // Add order details if (isset($data['details']) && is_array($data['details'])) { foreach ($data['details'] as $detail_data) { $detail_data['id_order'] = $object->id; $this->installOrderDetail($detail_data['id'], $detail_data); } } // Add order history if (isset($data['histories']) && is_array($data['histories'])) { foreach ($data['histories'] as $history_data) { $history_data['id_order'] = $object->id; $this->installOrderHistory($history_data['id'], $history_data); } } } } protected function installOrderDetail($identifier, array $data) { $object = $this->installGenericEntity( 'OrderDetail', $identifier, $data, array( 'id_order' => array('type' => 'int', 'default' => 0), 'order' => array('type' => 'relation', 'field' => 'id_order', 'entity' => 'order', 'default' => 0), 'product_id' => array('type' => 'int', 'default' => 0), 'product' => array('type' => 'relation', 'field' => 'product_id', 'entity' => 'product', 'default' => 0), 'product_attribute_id' => array('type' => 'int', 'default' => 0), 'combination' => array('type' => 'relation', 'field' => 'product_attribute_id', 'entity' => 'combination', 'default' => 0), 'product_name' => array('type' => 'string', 'default' => ''), 'product_quantity' => array('type' => 'int', 'default' => 1), 'product_quantity_return' => array('type' => 'int', 'default' => 0), 'product_price' => array('type' => 'float', 'default' => 0.000000), 'product_quantity_discount' => array('type' => 'float', 'default' => 0.000000), 'product_ean13' => array('type' => 'string', 'default' => ''), 'product_reference' => array('type' => 'string', 'default' => ''), 'product_supplier_reference' => array('type' => 'string', 'default' => ''), 'product_weight' => array('type' => 'int', 'default' => 0), 'ecotax' => array('type' => 'float', 'default' => 0.00), 'download_hash' => array('type' => 'string', 'default' => ''), 'download_nb' => array('type' => 'int', 'default' => 0), 'download_deadline' => array('type' => 'date', 'default' => '0000-00-00 00:00:00'), ) ); } protected function installOrderHistory($identifier, array $data) { $object = $this->installGenericEntity( 'OrderHistory', $identifier, $data, array( 'id_order' => array('type' => 'int', 'default' => 0), 'order' => array('type' => 'relation', 'field' => 'id_order', 'entity' => 'order', 'default' => 0), 'id_employee' => array('type' => 'int', 'default' => 0), 'id_order_state' => array('type' => 'int', 'default' => 0), ) ); } }