diff --git a/admin-dev/themes/default/template/controllers/groups/helpers/view/view.tpl b/admin-dev/themes/default/template/controllers/groups/helpers/view/view.tpl index e2503c9a6..96908c212 100755 --- a/admin-dev/themes/default/template/controllers/groups/helpers/view/view.tpl +++ b/admin-dev/themes/default/template/controllers/groups/helpers/view/view.tpl @@ -58,7 +58,7 @@

{l s='Members of this customer group'}

-

{l s='Limited to the 100th first customers.'} {l s='Please use filters to narrow your search.'}

+

{l s='Limited to the first 100 customers.'} {l s='Please use filters to narrow your search.'}

{$customerList} -{/block} \ No newline at end of file +{/block} diff --git a/admin-dev/themes/default/template/controllers/import/helpers/form/form.tpl b/admin-dev/themes/default/template/controllers/import/helpers/form/form.tpl index c867b6c6d..8f43ea1d8 100644 --- a/admin-dev/themes/default/template/controllers/import/helpers/form/form.tpl +++ b/admin-dev/themes/default/template/controllers/import/helpers/form/form.tpl @@ -67,20 +67,31 @@ Uplaod{l s='Upload'}
- {l s='Click to view our sample import csv files.'} - +
+ {l s='Click to view our sample import csv files.'} + +
+
+ {l s='Click to view your csv files.'} + +
 
diff --git a/admin-dev/themes/default/template/controllers/orders/form.tpl b/admin-dev/themes/default/template/controllers/orders/form.tpl index e8de6bf14..6f3ea7ac4 100755 --- a/admin-dev/themes/default/template/controllers/orders/form.tpl +++ b/admin-dev/themes/default/template/controllers/orders/form.tpl @@ -38,6 +38,11 @@ var defaults_order_state = new Array(); var customization_errors = false; var pic_dir = '{$pic_dir}'; + var currency_format = 5; + var currency_sign = ''; + var currency_blank = false; + var priceDisplayPrecision = 2; + {foreach from=$defaults_order_state key='module' item='id_order_state'} defaults_order_state['{$module}'] = '{$id_order_state}'; {/foreach} @@ -505,7 +510,6 @@ } displaySummary(res); resetBind(); - updateCurrencySign(); } }); } @@ -652,11 +656,12 @@ var id_product = Number(this.id_product); var id_product_attribute = Number(this.id_product_attribute); cart_quantity[Number(this.id_product)+'_'+Number(this.id_product_attribute)+'_'+Number(this.id_customization)] = this.cart_quantity; - cart_content += ''+this.name+'
'+this.attributes_small+''+this.reference+' '; + cart_content += ''+this.name+'
'+this.attributes_small+''+this.reference+''; cart_content += (!this.id_customization ? '

' : ''); cart_content += (!this.id_customization ? '
' : ''); cart_content += (!this.id_customization ? '
' : ''); - cart_content += ''+this.total+' '; + cart_content += '' + formatCurrency(parseFloat(this.total.replace(',', '.')), currency_format, currency_sign, currency_blank) + ''; + if (this.id_customization && this.id_customization != 0) { $.each(this.customized_datas[this.id_product][this.id_product_attribute][id_address_delivery], function() { @@ -712,6 +717,11 @@ function displaySummary(jsonSummary) { + currency_format = jsonSummary.currency.format; + currency_sign = jsonSummary.currency.sign; + currency_blank = jsonSummary.currency.blank; + priceDisplayPrecision = jsonSummary.currency.decimals ? 2 : 0; + updateCartProducts(jsonSummary.summary.products, jsonSummary.summary.gift_products, jsonSummary.cart.id_address_delivery); updateCartVouchers(jsonSummary.summary.discounts); updateAddressesList(jsonSummary.addresses, jsonSummary.cart.id_address_delivery, jsonSummary.cart.id_address_invoice); @@ -737,20 +747,19 @@ $('#free_shipping').removeAttr('checked'); $('#gift_message').html(jsonSummary.cart.gift_message); - if(!changed_shipping_price) - $('#shipping_price').html(''+jsonSummary.summary.total_shipping+''); + if (!changed_shipping_price) + $('#shipping_price').html('' + formatCurrency(parseFloat(jsonSummary.summary.total_shipping), currency_format, currency_sign, currency_blank) + ''); shipping_price_selected_carrier = jsonSummary.summary.total_shipping; - - $('#total_vouchers').html(jsonSummary.summary.total_discounts_tax_exc); - $('#total_shipping').html(jsonSummary.summary.total_shipping_tax_exc); - $('#total_taxes').html(jsonSummary.summary.total_tax); - $('#total_without_taxes').html(jsonSummary.summary.total_price_without_tax); - $('#total_with_taxes').html(jsonSummary.summary.total_price); - $('#total_products').html(jsonSummary.summary.total_products); + + $('#total_vouchers').html(formatCurrency(parseFloat(jsonSummary.summary.total_discounts_tax_exc.replace(',', '.')), currency_format, currency_sign, currency_blank)); + $('#total_shipping').html(formatCurrency(parseFloat(jsonSummary.summary.total_shipping_tax_exc.replace(',', '.')), currency_format, currency_sign, currency_blank)); + $('#total_taxes').html(formatCurrency(parseFloat(jsonSummary.summary.total_tax.replace(',', '.')), currency_format, currency_sign, currency_blank)); + $('#total_without_taxes').html(formatCurrency(parseFloat(jsonSummary.summary.total_price_without_tax.replace(',', '.')), currency_format, currency_sign, currency_blank)); + $('#total_with_taxes').html(formatCurrency(parseFloat(jsonSummary.summary.total_price.replace(',', '.')), currency_format, currency_sign, currency_blank)); + $('#total_products').html(formatCurrency(parseFloat(jsonSummary.summary.total_products.replace(',', '.')), currency_format, currency_sign, currency_blank)); id_currency = jsonSummary.cart.id_currency; $('#id_currency option').removeAttr('selected'); $('#id_currency option[value="'+id_currency+'"]').attr('selected', true); - updateCurrencySign(); id_lang = jsonSummary.cart.id_lang; $('#id_lang option').removeAttr('selected'); $('#id_lang option[value="'+id_lang+'"]').attr('selected', true); @@ -778,21 +787,21 @@ qty: qty, id_customer: id_customer, id_cart: id_cart, - }, + }, success : function(res) { - displaySummary(res); - var errors = ''; - if(res.errors.length) - { - $.each(res.errors, function() { - errors += this+'
'; - }); - $('#products_err').show(); - } - else - $('#products_err').hide(); - $('#products_err').html(errors); + displaySummary(res); + var errors = ''; + if (res.errors.length) + { + $.each(res.errors, function() { + errors += this + '
'; + }); + $('#products_err').show(); + } + else + $('#products_err').hide(); + $('#products_err').html(errors); } }); } @@ -888,11 +897,6 @@ }); } - function updateCurrencySign() - { - $('.currency_sign').html(currencies[id_currency]); - } - function sendMailToCustomer() { $.ajax({ @@ -984,7 +988,7 @@
-

{l s='Search a customer by tapping the first letters of his/her name'}

+

{l s='Search a customer by typing the first letters of his/her name'}

{l s='Add new customer'} @@ -999,7 +1003,7 @@
-

{l s='Search a product by tapping the first letters of his/her name.'}

+

{l s='Search a product by typing the first letters of his/her name.'}

@@ -1184,7 +1188,7 @@

-    +

@@ -1208,12 +1212,12 @@

    -
  • {l s='Total products'}
  • -
  • {l s='Total vouchers'}
  • -
  • {l s='Total shipping'}
  • -
  • {l s='Total taxes'}
  • -
  • {l s='Total without taxes'}
  • -
  • {l s='Total with taxes'}
  • +
  • {l s='Total products'}
  • +
  • {l s='Total vouchers'}
  • +
  • {l s='Total shipping'}
  • +
  • {l s='Total taxes'}
  • +
  • {l s='Total without taxes'}
  • +
  • {l s='Total with taxes'}
diff --git a/admin-dev/themes/default/template/controllers/specific_price_rule/helpers/form/form.tpl b/admin-dev/themes/default/template/controllers/specific_price_rule/helpers/form/form.tpl index 5e8d4e00d..98e1aeda6 100755 --- a/admin-dev/themes/default/template/controllers/specific_price_rule/helpers/form/form.tpl +++ b/admin-dev/themes/default/template/controllers/specific_price_rule/helpers/form/form.tpl @@ -41,7 +41,7 @@
diff --git a/classes/Cart.php b/classes/Cart.php index 71b9eaee4..4ad99456e 100644 --- a/classes/Cart.php +++ b/classes/Cart.php @@ -340,6 +340,7 @@ class CartCore extends ObjectModel '.($filter == CartRule::FILTER_ACTION_SHIPPING ? 'AND free_shipping = 1' : '').' '.($filter == CartRule::FILTER_ACTION_GIFT ? 'AND gift_product != 0' : '').' '.($filter == CartRule::FILTER_ACTION_REDUCTION ? 'AND (reduction_percent != 0 OR reduction_amount != 0)' : '') + .' ORDER by cr.priority ASC' ); Cache::store($cache_key, $result); } @@ -1260,7 +1261,7 @@ class CartCore extends ObjectModel return true; } - public static function getTotalCart($id_cart, $use_tax_display = false, $type = CART::BOTH) + public static function getTotalCart($id_cart, $use_tax_display = false, $type = Cart::BOTH) { $cart = new Cart($id_cart); if (!Validate::isLoadedObject($cart)) diff --git a/classes/Language.php b/classes/Language.php index e90700112..ce3762ab2 100644 --- a/classes/Language.php +++ b/classes/Language.php @@ -691,6 +691,7 @@ class LanguageCore extends ObjectModel // Initialize the language $lang = new Language(); $lang->iso_code = $iso_code; + $lang->language_code = $iso_code; $lang->active = true; // If the language pack has not been provided, retrieve it from prestashop.com @@ -700,13 +701,15 @@ class LanguageCore extends ObjectModel // If a language pack has been found or provided, prefill the language object with the value if ($lang_pack) foreach (get_object_vars($lang_pack) as $key => $value) - $lang->$key = $value; + if ($key != 'iso_code' && isset(Language::$definition['fields'][$key])) + $lang->$key = $value; // Use the values given in parameters to override the data retrieved automatically if ($params_lang !== null && is_array($params_lang)) foreach ($params_lang as $key => $value) - $lang->$key = $value; - + if ($key != 'iso_code' && isset(Language::$definition['fields'][$key])) + $lang->$key = $value; + if (!$lang->add(true, false, $only_add)) return false; @@ -724,7 +727,7 @@ class LanguageCore extends ObjectModel } else Language::_copyNoneFlag((int)$lang->id); - + $files_copy = array( '/en.jpg', '/en-default-'.ImageType::getFormatedName('thickbox').'.jpg', @@ -734,7 +737,7 @@ class LanguageCore extends ObjectModel '/en-default-'.ImageType::getFormatedName('small').'.jpg', '/en-default-'.ImageType::getFormatedName('scene').'.jpg' ); - + foreach (array(_PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_PROD_IMG_DIR_, _PS_SUPP_IMG_DIR_) as $to) foreach ($files_copy as $file) @copy(dirname(__FILE__).'/../img/l'.$file, $to.str_replace('/en', '/'.$iso_code, $file)); diff --git a/classes/PaymentModule.php b/classes/PaymentModule.php index 022e580ec..9d638ecd3 100644 --- a/classes/PaymentModule.php +++ b/classes/PaymentModule.php @@ -399,6 +399,8 @@ abstract class PaymentModuleCore extends Module } // end foreach ($products) $cart_rules_list = ''; + $total_reduction_value_ti = 0; + $total_reduction_value_tex = 0; foreach ($cart_rules as $cart_rule) { $package = array('id_carrier' => $order->id_carrier, 'id_address' => $order->id_address_delivery, 'products' => $order->product_list); @@ -419,7 +421,8 @@ abstract class PaymentModuleCore extends Module ** THEN ** The voucher is cloned with a new value corresponding to the remainder */ - if (count($order_list) == 1 && $values['tax_incl'] > $order->total_products_wt && $cart_rule['obj']->partial_use == 1 && $cart_rule['obj']->reduction_amount > 0) + + if (count($order_list) == 1 && $values['tax_incl'] > ($order->total_products_wt - $total_reduction_value_ti) && $cart_rule['obj']->partial_use == 1 && $cart_rule['obj']->reduction_amount > 0) { // Create a new voucher from the original $voucher = new CartRule($cart_rule['obj']->id); // We need to instantiate the CartRule without lang parameter to allow saving it @@ -432,9 +435,9 @@ abstract class PaymentModuleCore extends Module // Set the new voucher value if ($voucher->reduction_tax) - $voucher->reduction_amount = $values['tax_incl'] - $order->total_products_wt - ($voucher->free_shipping == 1 ? $order->total_shipping_tax_incl : 0); + $voucher->reduction_amount = $values['tax_incl'] - ($order->total_products_wt - $total_reduction_value_ti) - ($voucher->free_shipping == 1 ? $order->total_shipping_tax_incl : 0); else - $voucher->reduction_amount = $values['tax_excl'] - $order->total_products - ($voucher->free_shipping == 1 ? $order->total_shipping_tax_excl : 0); + $voucher->reduction_amount = $values['tax_excl'] - ($order->total_products - $total_reduction_value_tex) - ($voucher->free_shipping == 1 ? $order->total_shipping_tax_excl : 0); $voucher->id_customer = $order->id_customer; $voucher->quantity = 1; @@ -466,7 +469,10 @@ abstract class PaymentModuleCore extends Module $values['tax_incl'] -= $values['tax_incl'] - $order->total_products_wt; $values['tax_excl'] -= $values['tax_excl'] - $order->total_products; + } + $total_reduction_value_ti += $values['tax_incl']; + $total_reduction_value_tex += $values['tax_excl']; $order->addCartRule($cart_rule['obj']->id, $cart_rule['obj']->name, $values, 0, $cart_rule['obj']->free_shipping); diff --git a/classes/Product.php b/classes/Product.php index 5c91ccb90..b43e19015 100644 --- a/classes/Product.php +++ b/classes/Product.php @@ -1368,8 +1368,8 @@ class ProductCore extends ObjectModel } $product_supplier->product_supplier_reference = pSQL($supplier_reference); - $product_supplier->product_supplier_price_te = (float)$price; - $product_supplier->id_currency = (int)$id_currency; + $product_supplier->product_supplier_price_te = !is_null($price) ? (float)$price : (float)$product_supplier->product_supplier_price_te; + $product_supplier->id_currency = !is_null($id_currency) ? (int)$id_currency : (int)$product_supplier->id_currency; $product_supplier->save(); } } @@ -3160,8 +3160,9 @@ class ProductCore extends ObjectModel LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (p.`id_manufacturer`= m.`id_manufacturer`) '.Product::sqlStock('p', 0).' WHERE `id_product_1` = '.(int)$this->id. - ($active ? ' AND product_shop.`active` = 1' : '').' + ($active ? ' AND product_shop.`active` = 1 AND product_shop.`visibility` != \'none\'' : '').' GROUP BY product_shop.id_product'; + if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql)) return false; foreach ($result as &$row) diff --git a/classes/ProductSale.php b/classes/ProductSale.php index 2f8166a4d..2e6d2973c 100644 --- a/classes/ProductSale.php +++ b/classes/ProductSale.php @@ -103,7 +103,7 @@ class ProductSaleCore LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) '.Product::sqlStock('p').' WHERE product_shop.`active` = 1 - AND p.`visibility` != \'none\' + AND product_shop.`visibility` != \'none\' AND p.`id_product` IN ( SELECT cp.`id_product` FROM `'._DB_PREFIX_.'category_group` cg @@ -156,7 +156,7 @@ class ProductSaleCore ON cl.`id_category` = product_shop.`id_category_default` AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').' WHERE product_shop.`active` = 1 - AND p.`visibility` != \'none\' + AND product_shop.`visibility` != \'none\' AND p.`id_product` IN ( SELECT cp.`id_product` FROM `'._DB_PREFIX_.'category_group` cg diff --git a/classes/SpecificPrice.php b/classes/SpecificPrice.php index 27475c771..ca3795f41 100644 --- a/classes/SpecificPrice.php +++ b/classes/SpecificPrice.php @@ -169,7 +169,8 @@ class SpecificPriceCore extends ObjectModel $priority = SpecificPrice::getPriority($id_product); foreach (array_reverse($priority) as $k => $field) - $select .= ' IF (`'.bqSQL($field).'` = '.(int)$$field.', '.pow(2, $k + 1).', 0) + '; + if (!empty($field)) + $select .= ' IF (`'.bqSQL($field).'` = '.(int)$$field.', '.pow(2, $k + 1).', 0) + '; return rtrim($select, ' +').') AS `score`'; } @@ -228,7 +229,7 @@ class SpecificPriceCore extends ObjectModel (`to` = \'0000-00-00 00:00:00\' OR \''.$now.'\' <= `to`) ) AND id_cart IN (0, '.(int)$id_cart.')'. - (($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$real_quantity).' + (($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.max(1, (int)$real_quantity)).' ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC'); } return self::$_specificPriceCache[$key]; diff --git a/classes/Tools.php b/classes/Tools.php index 9a68d7685..343eb070b 100644 --- a/classes/Tools.php +++ b/classes/Tools.php @@ -494,6 +494,20 @@ class ToolsCore if (($is_negative = ($price < 0))) $price *= -1; $price = Tools::ps_round($price, $c_decimals); + + /* + * If the language is RTL and the selected currency format contains spaces as thousands separator + * then the number will be printed in reverse since the space is interpreted as separating words. + * To avoid this we replace the currency format containing a space with the one containing a comma (,) as thousand + * separator when the language is RTL. + * + * TODO: This is not ideal, a currency format should probably be tied to a language, not to a currency. + */ + if(($c_format == 2) && ($context->language->is_rtl == 1)) + { + $c_format = 4; + } + switch ($c_format) { /* X 0,000.00 */ diff --git a/classes/controller/AdminController.php b/classes/controller/AdminController.php index 1cb676e22..00ddd5964 100644 --- a/classes/controller/AdminController.php +++ b/classes/controller/AdminController.php @@ -654,7 +654,7 @@ class AdminControllerCore extends Controller 'export_content' => $content ) ); - + $this->layout = 'layout-export.tpl'; } @@ -2112,6 +2112,7 @@ class AdminControllerCore extends Controller */ public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false) { + if (!isset($this->list_id)) $this->list_id = $this->table; @@ -2166,12 +2167,20 @@ class AdminControllerCore extends Controller $order_by = $this->fields_list[$order_by]['order_key']; /* Determine offset from current page */ + + if ((isset($_POST['submitFilter'.$this->list_id]) || isset($_POST['submitFilter'.$this->list_id.'_x']) || isset($_POST['submitFilter'.$this->list_id.'_y'])) && !empty($_POST['submitFilter'.$this->list_id]) && is_numeric($_POST['submitFilter'.$this->list_id])) $start = ((int)$_POST['submitFilter'.$this->list_id] - 1) * $limit; + elseif (empty($start) && isset($this->context->cookie->{$this->list_id.'_start'}) && Tools::isSubmit('export'.$this->table)) + $start = $this->context->cookie->{$this->list_id.'_start'}; + else + $start = $this->_listTotal; + + $this->context->cookie->{$this->list_id.'_start'} = $start; /* Cache */ $this->_lang = (int)$id_lang; @@ -2241,8 +2250,6 @@ class AdminControllerCore extends Controller $having_clause .= $this->_having.' '; } - - $this->_listsql = ' SELECT SQL_CALC_FOUND_ROWS '.($this->_tmpTableFilter ? ' * FROM (SELECT ' : ''); diff --git a/classes/controller/ModuleFrontController.php b/classes/controller/ModuleFrontController.php index f2db4a085..437fad571 100644 --- a/classes/controller/ModuleFrontController.php +++ b/classes/controller/ModuleFrontController.php @@ -60,7 +60,7 @@ class ModuleFrontControllerCore extends FrontController elseif (Tools::file_exists_cache($this->getTemplatePath().$template)) $this->template = $this->getTemplatePath().$template; else - throw new PrestaShopException("Template '$template'' not found"); + throw new PrestaShopException("Template '$template' not found"); } /** diff --git a/classes/order/OrderInvoice.php b/classes/order/OrderInvoice.php index 31614f2c5..4e4e0d2ab 100644 --- a/classes/order/OrderInvoice.php +++ b/classes/order/OrderInvoice.php @@ -243,7 +243,7 @@ class OrderInvoiceCore extends ObjectModel WHERE od.`id_order` = '.(int)$this->id_order.' AND od.`id_order_invoice` = '.(int)$this->id.' AND od.`tax_computation_method` = '.(int)TaxCalculator::ONE_AFTER_ANOTHER_METHOD - ); + ) || Configuration::get('PS_INVOICE_TAXES_BREAKDOWN'); } /** @@ -301,7 +301,7 @@ class OrderInvoiceCore extends ObjectModel { // sum by order details in order to retrieve real taxes rate $taxes_infos = Db::getInstance()->executeS(' - SELECT odt.`id_order_detail`, t.`rate` AS `name`, SUM(od.`total_price_tax_excl`) AS total_price_tax_excl, SUM(t.`rate`) AS rate, SUM(`total_amount`) AS `total_amount`, od.`ecotax`, od.`ecotax_tax_rate`, od.`product_quantity` + SELECT odt.`id_order_detail`, t.`rate` AS `name`, od.`total_price_tax_excl` AS total_price_tax_excl, SUM(t.`rate`) AS rate, SUM(`total_amount`) AS `total_amount`, od.`ecotax`, od.`ecotax_tax_rate`, od.`product_quantity` FROM `'._DB_PREFIX_.'order_detail_tax` odt LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = odt.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON (od.`id_order_detail` = odt.`id_order_detail`) diff --git a/classes/webservice/WebserviceRequest.php b/classes/webservice/WebserviceRequest.php index 2dca1bdb3..5e4ec0b3f 100644 --- a/classes/webservice/WebserviceRequest.php +++ b/classes/webservice/WebserviceRequest.php @@ -1187,7 +1187,7 @@ class WebserviceRequestCore else { $object = new $this->resourceConfiguration['retrieveData']['className'](); - if ($object->isMultiShopField($this->resourceConfiguration['fields'][$fieldName]['sqlId'])) + if ($object->isMultiShopField($this->resourceConfiguration['fields'][$fieldName]['sqlId']) || $fieldName == 'id') $table_alias = 'multi_shop_'.$this->resourceConfiguration['retrieveData']['table']; else $table_alias = ''; diff --git a/controllers/admin/AdminAttributesGroupsController.php b/controllers/admin/AdminAttributesGroupsController.php index 80d665edb..2ddc03360 100644 --- a/controllers/admin/AdminAttributesGroupsController.php +++ b/controllers/admin/AdminAttributesGroupsController.php @@ -264,7 +264,7 @@ class AdminAttributesGroupsControllerCore extends AdminController 'input' => array( array( 'type' => 'select', - 'label' => $this->l('Attribute type:'), + 'label' => $this->l('Attribute group:'), 'name' => 'id_attribute_group', 'required' => true, 'options' => array( @@ -272,7 +272,7 @@ class AdminAttributesGroupsControllerCore extends AdminController 'id' => 'id_attribute_group', 'name' => 'name' ), - 'desc' => $this->l('Choose the type of the attribute') + 'desc' => $this->l('Choose the group of the attribute') ), array( 'type' => 'text', diff --git a/controllers/admin/AdminCartsController.php b/controllers/admin/AdminCartsController.php index b4c5bf35c..32e01834a 100755 --- a/controllers/admin/AdminCartsController.php +++ b/controllers/admin/AdminCartsController.php @@ -684,18 +684,21 @@ class AdminCartsControllerCore extends AdminController $free_shipping = true; break; } - return array('summary' => $this->getCartSummary(), - 'delivery_option_list' => $this->getDeliveryOptionList(), - 'cart' => $this->context->cart, - 'addresses' => $this->context->customer->getAddresses((int)$this->context->cart->id_lang), - 'id_cart' => $id_cart, - 'order_message' => $message_content, - 'link_order' => $this->context->link->getPageLink( - 'order', false, - (int)$this->context->cart->id_lang, - 'step=3&recover_cart='.$id_cart.'&token_cart='.md5(_COOKIE_KEY_.'recover_cart_'.$id_cart)), - 'free_shipping' => (int)$free_shipping - ); + return array( + 'summary' => $this->getCartSummary(), + 'delivery_option_list' => $this->getDeliveryOptionList(), + 'cart' => $this->context->cart, + 'currency' => new Currency($this->context->cart->id_currency), + 'addresses' => $this->context->customer->getAddresses((int)$this->context->cart->id_lang), + 'id_cart' => $id_cart, + 'order_message' => $message_content, + 'link_order' => $this->context->link->getPageLink( + 'order', false, + (int)$this->context->cart->id_lang, + 'step=3&recover_cart='.$id_cart.'&token_cart='.md5(_COOKIE_KEY_.'recover_cart_'.$id_cart) + ), + 'free_shipping' => (int)$free_shipping + ); } public function initToolbar() diff --git a/controllers/admin/AdminGroupsController.php b/controllers/admin/AdminGroupsController.php index 007bd38b0..7579370c7 100644 --- a/controllers/admin/AdminGroupsController.php +++ b/controllers/admin/AdminGroupsController.php @@ -30,6 +30,7 @@ class AdminGroupsControllerCore extends AdminController { $this->table = 'group'; $this->className = 'Group'; + $this->list_id = 'group'; $this->lang = true; $this->addRowAction('edit'); $this->addRowAction('view'); @@ -153,6 +154,16 @@ class AdminGroupsControllerCore extends AdminController if (Tools::isSubmit('changeShowPricesVal') && $this->id_object) $this->action = 'change_show_prices_val'; + if (Tools::getIsset('viewgroup')) + { + $this->list_id = 'customer_group'; + + if (isset($_POST['submitReset'.$this->list_id])) + $this->processResetFilters(); + } + else + $this->list_id = 'group'; + parent::initProcess(); } @@ -181,30 +192,29 @@ class AdminGroupsControllerCore extends AdminController $genders_icon[$gender->id] = '../genders/'.(int)$gender->id.'.jpg'; $genders[$gender->id] = $gender->name; } - $customer_fields_display = (array( - 'id_customer' => array('title' => $this->l('ID'), 'width' => 15, 'align' => 'center'), + $this->table = 'customer_group'; + $this->lang = false; + $this->list_id = 'customer_group'; + $this->actions = array(); + $this->bulk_actions = false; + $this->no_link = true; + $this->fields_list = (array( + 'id_customer' => array('title' => $this->l('ID'), 'width' => 15, 'align' => 'center', 'filter_key' => 'c!id_customer'), 'id_gender' => array('title' => $this->l('Titles'), 'align' => 'center', 'width' => 50,'icon' => $genders_icon, 'list' => $genders), - 'firstname' => array('title' => $this->l('Name'), 'align' => 'center'), - 'lastname' => array('title' => $this->l('Name'), 'align' => 'center'), - 'email' => array('title' => $this->l('Email address'), 'width' => 150, 'align' => 'center'), + 'firstname' => array('title' => $this->l('First name'), 'align' => 'center'), + 'lastname' => array('title' => $this->l('Last name'), 'align' => 'center'), + 'email' => array('title' => $this->l('Email address'), 'width' => 150, 'align' => 'center', 'filter_key' => 'c!email', 'orderby' => true), 'birthday' => array('title' => $this->l('Birth date'), 'width' => 150, 'align' => 'right', 'type' => 'date'), 'date_add' => array('title' => $this->l('Register date'), 'width' => 150, 'align' => 'right', 'type' => 'date'), - 'orders' => array('title' => $this->l('Orders'), 'align' => 'center'), 'active' => array('title' => $this->l('Enabled'),'align' => 'center','width' => 20, 'active' => 'status','type' => 'bool') )); - $customer_list = $group->getCustomers(false, 0, 100, true); - - $helper = new HelperList(); - $helper->currentIndex = Context::getContext()->link->getAdminLink('AdminCustomers', false); - $helper->token = Tools::getAdminTokenLite('AdminCustomers'); - $helper->shopLinkType = ''; - $helper->table = 'customer'; - $helper->identifier = 'id_customer'; - $helper->actions = array('edit', 'view'); - $helper->show_toolbar = false; - - return $helper->generateList($customer_list, $customer_fields_display); + $this->_select = 'c.*'; + $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'customer` c ON (a.`id_customer` = c.`id_customer`)'; + $this->_where = 'AND a.`id_group` = '.(int)$group->id.' AND c.`deleted` != 1'; + self::$currentIndex = self::$currentIndex.'&viewgroup'; + $this->processFilter(); + return parent::renderList(); } public function renderForm() diff --git a/controllers/admin/AdminImportController.php b/controllers/admin/AdminImportController.php index 8d8b81c6b..4087f8c6c 100644 --- a/controllers/admin/AdminImportController.php +++ b/controllers/admin/AdminImportController.php @@ -513,7 +513,7 @@ class AdminImportControllerCore extends AdminController $this->context->cookie->entity_selected = (int)Tools::getValue('entity'); - if ($csv_selected = Tools::getValue('csv')) + if (Tools::getValue('csv')) $this->context->cookie->csv_selected = Tools::getValue('csv'); $this->tpl_view_vars = array( @@ -670,7 +670,8 @@ class AdminImportControllerCore extends AdminController $fd = fopen($uniqid_path, 'r'); $tab = fgetcsv($fd, MAX_LINE_SIZE, $separator); fclose($fd); - unlink($uniqid_path); + if (file_exists($uniqid_path)) + @unlink($uniqid_path); } if (empty($tab) || (!is_array($tab))) @@ -928,7 +929,7 @@ class AdminImportControllerCore extends AdminController $this->errors[] = sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), $category_to_create->name[$default_language_id], - (isset($category_to_create->id) ? $category_to_create->id : 'null') + (isset($category_to_create->id) && !empty($category_to_create->id))? $category_to_create->id : 'null' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -961,7 +962,7 @@ class AdminImportControllerCore extends AdminController $this->warnings[] = sprintf( Tools::displayError('Rewrite link for %1$s (ID: %2$s) was re-written as %3$s.'), $bak, - (isset($info['id']) ? $info['id'] : 'null'), + (isset($info['id']) && !empty($info['id']))? $info['id'] : 'null', $category->link_rewrite[$default_language_id] ); $res = false; @@ -1009,8 +1010,8 @@ class AdminImportControllerCore extends AdminController { $this->errors[] = sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), - (isset($info['name']) ? Tools::safeOutput($info['name']) : 'No Name'), - (isset($info['id']) ? Tools::safeOutput($info['id']) : 'No ID') + (isset($info['name']) && !empty($info['name']))? Tools::safeOutput($info['name']) : 'No Name', + (isset($info['id']) && !empty($info['id']))? Tools::safeOutput($info['id']) : 'No ID' ); $error_tmp = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : '').Db::getInstance()->getMsgError(); if ($error_tmp != '') @@ -1067,13 +1068,23 @@ class AdminImportControllerCore extends AdminController if (Tools::getValue('forceIDs') && isset($info['id']) && (int)$info['id']) $product = new Product((int)$info['id']); - else + elseif (Tools::getValue('match_ref') && array_key_exists('reference', $info)) { - if (array_key_exists('id', $info) && (int)$info['id'] && Product::existsInDatabase((int)$info['id'], 'product')) - $product = new Product((int)$info['id']); - else - $product = new Product(); + $datas = Db::getInstance()->getRow(' + SELECT p.`id_product` + FROM `'._DB_PREFIX_.'product` p + '.Shop::addSqlAssociation('product', 'p').' + WHERE p.`reference` = "'.pSQL($info['reference']).'" + '); + if (isset($datas['id_product']) && $datas['id_product']) + $product = new Product((int)$datas['id_product']); + else + $product = new Product(); } + elseif (array_key_exists('id', $info) && (int)$info['id'] && Product::existsInDatabase((int)$info['id'], 'product')) + $product = new Product((int)$info['id']); + else + $product = new Product(); if (array_key_exists('id', $info) && (int)$info['id'] && Product::existsInDatabase((int)$info['id'], 'product')) { @@ -1138,7 +1149,7 @@ class AdminImportControllerCore extends AdminController $this->errors[] = sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), $manufacturer->name, - (isset($manufacturer->id) ? $manufacturer->id : 'null') + (isset($manufacturer->id) && !empty($manufacturer->id))? $manufacturer->id : 'null' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -1169,7 +1180,7 @@ class AdminImportControllerCore extends AdminController $this->errors[] = sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), $supplier->name, - (isset($supplier->id) ? $supplier->id : 'null') + (isset($supplier->id) && !empty($supplier->id))? $supplier->id : 'null' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -1215,7 +1226,7 @@ class AdminImportControllerCore extends AdminController $this->errors[] = sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), $category_to_create->name[$default_language_id], - (isset($category_to_create->id) ? $category_to_create->id : 'null') + (isset($category_to_create->id) && !empty($category_to_create->id))? $category_to_create->id : 'null' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -1247,7 +1258,7 @@ class AdminImportControllerCore extends AdminController $this->errors[] = sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), $category_to_create->name[$default_language_id], - (isset($category_to_create->id) ? $category_to_create->id : 'null') + (isset($category_to_create->id) && !empty($category_to_create->id))? $category_to_create->id : 'null' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -1259,7 +1270,7 @@ class AdminImportControllerCore extends AdminController $product->id_category_default = isset($product->id_category[0]) ? (int)$product->id_category[0] : ''; - $link_rewrite = (is_array($product->link_rewrite) && count($product->link_rewrite)) ? trim($product->link_rewrite[$id_lang]) : ''; + $link_rewrite = (is_array($product->link_rewrite) && isset($product->link_rewrite[$id_lang])) ? trim($product->link_rewrite[$id_lang]) : ''; $valid_link = Validate::isLinkRewrite($link_rewrite); @@ -1274,11 +1285,11 @@ class AdminImportControllerCore extends AdminController $this->warnings[] = sprintf( Tools::displayError('Rewrite link for %1$s (ID: %2$s) was re-written as %3$s.'), $product->name[$id_lang], - (isset($info['id']) ? $info['id'] : 'null'), + (isset($info['id']) && !empty($info['id']))? $info['id'] : 'null', $link_rewrite ); - if (!Tools::getValue('match_ref') || !(is_array($product->link_rewrite) && count($product->link_rewrite))) + if (!Tools::getValue('match_ref') || !(is_array($product->link_rewrite) && count($product->link_rewrite) && !empty($product->link_rewrite[$id_lang]))) $product->link_rewrite = AdminImportController::createMultiLangField($link_rewrite); // replace the value of separator by coma @@ -1311,7 +1322,7 @@ class AdminImportControllerCore extends AdminController SELECT product_shop.`date_add`, p.`id_product` FROM `'._DB_PREFIX_.'product` p '.Shop::addSqlAssociation('product', 'p').' - WHERE p.`reference` = "'.$product->reference.'" + WHERE p.`reference` = "'.pSQL($product->reference).'" '); $product->id = (int)$datas['id_product']; $product->date_add = pSQL($datas['date_add']); @@ -1357,8 +1368,8 @@ class AdminImportControllerCore extends AdminController { $this->errors[] = sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), - (isset($info['name']) ? Tools::safeOutput($info['name']) : 'No Name'), - (isset($info['id']) ? Tools::safeOutput($info['id']) : 'No ID') + (isset($info['name']) && !empty($info['name']))? Tools::safeOutput($info['name']) : 'No Name', + (isset($info['id']) && !empty($info['id']))? Tools::safeOutput($info['id']) : 'No ID' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -1384,31 +1395,67 @@ class AdminImportControllerCore extends AdminController } // SpecificPrice (only the basic reduction feature is supported by the import) - if ((isset($info['reduction_price']) && $info['reduction_price'] > 0) || (isset($info['reduction_percent']) && $info['reduction_percent'] > 0)) - { - $specific_price = new SpecificPrice(); - $specific_price->id_product = (int)$product->id; - // @todo multishop specific price import - $specific_price->id_shop = $this->context->shop->id; - $specific_price->id_currency = 0; - $specific_price->id_country = 0; - $specific_price->id_group = 0; - $specific_price->price = -1; - $specific_price->id_customer = 0; - $specific_price->from_quantity = 1; - $specific_price->reduction = (isset($info['reduction_price']) && $info['reduction_price']) ? $info['reduction_price'] : $info['reduction_percent'] / 100; - $specific_price->reduction_type = (isset($info['reduction_price']) && $info['reduction_price']) ? 'amount' : 'percentage'; - $specific_price->from = (isset($info['reduction_from']) && Validate::isDate($info['reduction_from'])) ? $info['reduction_from'] : '0000-00-00 00:00:00'; - $specific_price->to = (isset($info['reduction_to']) && Validate::isDate($info['reduction_to'])) ? $info['reduction_to'] : '0000-00-00 00:00:00'; - if (!$specific_price->add()) - $this->addProductWarning(Tools::safeOutput($info['name']), $product->id, $this->l('Discount is invalid')); - } + if (!Shop::isFeatureActive()) + $info['shop'] = 1; + elseif (!isset($info['shop']) || empty($info['shop'])) + $info['shop'] = implode($this->multiple_value_separator, Shop::getContextListShopID()); + + // Get shops for each attributes + $info['shop'] = explode($this->multiple_value_separator, $info['shop']); + + $id_shop_list = array(); + foreach ($info['shop'] as $shop) + if (!is_numeric($shop)) + $id_shop_list[] = (int)Shop::getIdByName($shop); + else + $id_shop_list[] = $shop; + + if ((isset($info['reduction_price']) && $info['reduction_price'] > 0) || (isset($info['reduction_percent']) && $info['reduction_percent'] > 0)) + foreach($id_shop_list as $id_shop) + { + $specific_price = SpecificPrice::getSpecificPrice($product->id, $id_shop, 0, 0, 0, 1, 0, 0, 0, 0); + + if (is_array($specific_price)) + $specific_price = new SpecificPrice((int)$specific_price['id_specific_price']); + else + $specific_price = new SpecificPrice(); + $specific_price->id_product = (int)$product->id; + $specific_price->id_specific_price_rule = 0; + $specific_price->id_shop = $id_shop; + $specific_price->id_currency = 0; + $specific_price->id_country = 0; + $specific_price->id_group = 0; + $specific_price->price = -1; + $specific_price->id_customer = 0; + $specific_price->from_quantity = 1; + $specific_price->reduction = (isset($info['reduction_price']) && $info['reduction_price']) ? $info['reduction_price'] : $info['reduction_percent'] / 100; + $specific_price->reduction_type = (isset($info['reduction_price']) && $info['reduction_price']) ? 'amount' : 'percentage'; + $specific_price->from = (isset($info['reduction_from']) && Validate::isDate($info['reduction_from'])) ? $info['reduction_from'] : '0000-00-00 00:00:00'; + $specific_price->to = (isset($info['reduction_to']) && Validate::isDate($info['reduction_to'])) ? $info['reduction_to'] : '0000-00-00 00:00:00'; + if (!$specific_price->save()) + $this->addProductWarning(Tools::safeOutput($info['name']), $product->id, $this->l('Discount is invalid')); + } if (isset($product->tags) && !empty($product->tags)) { + if (isset($product->id) && $product->id) + { + $tags = Tag::getProductTags($product->id); + if (is_array($tags) && count($tags)) + { + if (!empty($product->tags)) + $product->tags = explode($this->multiple_value_separator, $product->tags); + if (is_array($product->tags) && count($product->tags)) + { + foreach ($product->tags as $key => $tag) + $product->tags[$key] = trim($tag); + $tags[$id_lang] = $product->tags; + $product->tags = $tags; + } + } + } // Delete tags for this id product, for no duplicating error Tag::deleteTagsForProduct($product->id); - if (!is_array($product->tags)) { $product->tags = AdminImportController::createMultiLangField($product->tags); @@ -1761,8 +1808,9 @@ class AdminImportControllerCore extends AdminController null, $id_shop_list ); - $id_product_attribute_update = true; + if (isset($info['supplier_reference']) && !empty($info['supplier_reference'])) + $product->addSupplierReference($product->id_supplier, $id_product_attribute, $info['supplier_reference']); } } } @@ -1788,8 +1836,10 @@ class AdminImportControllerCore extends AdminController (int)$info['minimal_quantity'], $id_shop_list ); + if (isset($info['supplier_reference']) && !empty($info['supplier_reference'])) + $product->addSupplierReference($product->id_supplier, $id_product_attribute, $info['supplier_reference']); } - + // fills our attributes array, in order to add the attributes to the product_attribute afterwards if(isset($attributes[$group.'_'.$attribute])) $attributes_to_add[] = (int)$attributes[$group.'_'.$attribute]; @@ -1964,7 +2014,7 @@ class AdminImportControllerCore extends AdminController $this->errors[] = sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), $info['email'], - (isset($info['id']) ? $info['id'] : 'null') + (isset($info['id']) && !empty($info['id']))? $info['id'] : 'null' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -2061,7 +2111,7 @@ class AdminImportControllerCore extends AdminController Tools::displayError('%1$s does not exist in database %2$s (ID: %3$s) cannot be saved'), Db::getInstance()->getMsgError(), $address->customer_email, - (isset($info['id']) ? $info['id'] : 'null') + (isset($info['id']) && !empty($info['id']))? $info['id'] : 'null' ); } else @@ -2110,7 +2160,7 @@ class AdminImportControllerCore extends AdminController $this->errors[] = Db::getInstance()->getMsgError().' '.sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), $manufacturer->name, - (isset($manufacturer->id) ? $manufacturer->id : 'null') + (isset($manufacturer->id) && !empty($manufacturer->id))? $manufacturer->id : 'null' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -2131,7 +2181,7 @@ class AdminImportControllerCore extends AdminController $this->errors[] = Db::getInstance()->getMsgError().' '.sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), $supplier->name, - (isset($supplier->id) ? $supplier->id : 'null') + (isset($supplier->id) && !empty($supplier->id))? $supplier->id : 'null' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -2160,7 +2210,7 @@ class AdminImportControllerCore extends AdminController $this->errors[] = sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), $info['alias'], - (isset($info['id']) ? $info['id'] : 'null') + (isset($info['id']) && !empty($info['id']))? $info['id'] : 'null' ); } } @@ -2177,7 +2227,7 @@ class AdminImportControllerCore extends AdminController $this->errors[] = sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), $info['alias'], - (isset($info['id']) ? $info['id'] : 'null') + (isset($info['id']) && !empty($info['id']))? $info['id'] : 'null' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -2247,8 +2297,8 @@ class AdminImportControllerCore extends AdminController { $this->errors[] = Db::getInstance()->getMsgError().' '.sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), - (isset($info['name']) ? Tools::safeOutput($info['name']) : 'No Name'), - (isset($info['id']) ? Tools::safeOutput($info['id']) : 'No ID') + (isset($info['name']) && !empty($info['name']))? Tools::safeOutput($info['name']) : 'No Name', + (isset($info['id']) && !empty($info['id']))? Tools::safeOutput($info['id']) : 'No ID' ); $this->errors[] = ($field_error !== true ? $field_error : '').(isset($lang_field_error) && $lang_field_error !== true ? $lang_field_error : ''). Db::getInstance()->getMsgError(); @@ -2294,8 +2344,8 @@ class AdminImportControllerCore extends AdminController if (!$res) $this->errors[] = Db::getInstance()->getMsgError().' '.sprintf( Tools::displayError('%1$s (ID: %2$s) cannot be saved'), - (isset($info['name']) ? Tools::safeOutput($info['name']) : 'No Name'), - (isset($info['id']) ? Tools::safeOutput($info['id']) : 'No ID') + (isset($info['name']) && !empty($info['name']))? Tools::safeOutput($info['name']) : 'No Name', + (isset($info['id']) && !empty($info['id']))? Tools::safeOutput($info['id']) : 'No ID' ); else { @@ -2553,13 +2603,9 @@ class AdminImportControllerCore extends AdminController protected static function usortFiles($a, $b) { - $a = strrev(substr(strrev($a), 0, 14)); - $b = strrev(substr(strrev($b), 0, 14)); - if ($a == $b) return 0; - - return ($a < $b) ? 1 : -1; + return ($b < $a) ? 1 : -1; } protected function openCsvFile() @@ -2604,37 +2650,37 @@ class AdminImportControllerCore extends AdminController unlink(_PS_CAT_IMG_DIR_.$d); break; case $this->entities[$this->l('Products')]: - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_shop'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'feature_product'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_lang'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'category_product'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_tag'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'image'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'image_lang'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'image_shop'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'specific_price'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'specific_price_priority'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_carrier'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'cart_product'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'compare_product'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_shop`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'feature_product`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_lang`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'category_product`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_tag`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'image`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'image_lang`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'image_shop`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'specific_price`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'specific_price_priority`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_carrier`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'cart_product`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'compare_product`'); if (count(Db::getInstance()->executeS('SHOW TABLES LIKE \''._DB_PREFIX_.'favorite_product\' '))) //check if table exist - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'favorite_product'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attachment'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_country_tax'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_download'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_group_reduction_cache'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_sale'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_supplier'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'scene_products'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'warehouse_product_location'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'stock'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'stock_available'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'stock_mvt'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'customization'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'customization_field'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'supply_order_detail'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_impact'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'favorite_product`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attachment`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_country_tax`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_download`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_group_reduction_cache`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_sale`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_supplier`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'scene_products`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'warehouse_product_location`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'stock`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'stock_available`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'stock_mvt`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'customization`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'customization_field`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'supply_order_detail`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_impact`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_shop`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_combination`'); @@ -2645,7 +2691,7 @@ class AdminImportControllerCore extends AdminController break; case $this->entities[$this->l('Combinations')]: Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute`'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_impact'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_impact`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_lang`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_group`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_group_lang`'); @@ -2655,26 +2701,26 @@ class AdminImportControllerCore extends AdminController Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_shop`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_combination`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_image`'); - Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'stock_available` WHERE id_product_attribute !=0'); + Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'stock_available` WHERE id_product_attribute != 0'); break; case $this->entities[$this->l('Customers')]: - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'customer'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'customer`'); break; case $this->entities[$this->l('Addresses')]: - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'address'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'address`'); break; case $this->entities[$this->l('Manufacturers')]: - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'manufacturer'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'manufacturer_lang'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'manufacturer_shop'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'manufacturer`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'manufacturer_lang`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'manufacturer_shop`'); foreach (scandir(_PS_MANU_IMG_DIR_) as $d) if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $d)) unlink(_PS_MANU_IMG_DIR_.$d); break; case $this->entities[$this->l('Suppliers')]: - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'supplier'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'supplier_lang'); - Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'supplier_shop'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'supplier`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'supplier_lang`'); + Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'supplier_shop`'); foreach (scandir(_PS_SUPP_IMG_DIR_) as $d) if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $d)) unlink(_PS_SUPP_IMG_DIR_.$d); @@ -2703,6 +2749,7 @@ class AdminImportControllerCore extends AdminController if (Tools::isSubmit('submitFileUpload')) { + $path = _PS_ADMIN_DIR_.'/import/'.date('Ymdhis').'-'; if (isset($_FILES['file']) && !empty($_FILES['file']['error'])) { switch ($_FILES['file']['error']) @@ -2729,12 +2776,15 @@ class AdminImportControllerCore extends AdminController } } else if (!file_exists($_FILES['file']['tmp_name']) || - !@move_uploaded_file($_FILES['file']['tmp_name'], _PS_ADMIN_DIR_.'/import/'.date('Ymdhis').'-'.$_FILES['file']['name'])) + !@move_uploaded_file($_FILES['file']['tmp_name'], $path.$_FILES['file']['name'])) $this->errors[] = $this->l('An error occurred while uploading / copying the file.'); else + { + @chmod($path.$_FILES['file']['name'], 0664); Tools::redirectAdmin(self::$currentIndex.'&token='.Tools::getValue('token').'&conf=18'); + } } - else if (Tools::getValue('import')) + elseif (Tools::getValue('import')) { // Check if the CSV file exist if (Tools::getValue('csv')) @@ -2798,7 +2848,41 @@ class AdminImportControllerCore extends AdminController else $this->errors[] = $this->l('You must upload a file in order to proceed to the next step'); } - + elseif ($filename = Tools::getValue('csvfilename')) + { + $filename = base64_decode($filename); + $file = _PS_ADMIN_DIR_.'/import/'.basename($filename); + if (realpath(dirname($file)) != _PS_ADMIN_DIR_.'/import') + exit(); + if (!empty($filename)) + { + $bName = basename($filename); + if ($delete = Tools::getValue('delete') && file_exists($file)) + @unlink($file); + elseif (file_exists($file)) + { + $bName = explode('.', $bName); + $bName = strtolower($bName[count($bName) - 1]); + $mimeTypes = array('csv' => 'text/csv'); + + if (isset($mimeTypes[$bName])) + $mimeType = $mimeTypes[$bName]; + else + $mimeType = 'application/octet-stream'; + if (ob_get_level()) + ob_end_clean(); + + header('Content-Transfer-Encoding: binary'); + header('Content-Type: '.$mimeType); + header('Content-Length: '.filesize($file)); + header('Content-Disposition: attachment; filename="'.$filename.'"'); + $fp = fopen($file, 'rb'); + while (is_resource($fp) && !feof($fp)) + echo fgets($fp, 16384); + exit; + } + } + } parent::postProcess(); } diff --git a/controllers/admin/AdminInvoicesController.php b/controllers/admin/AdminInvoicesController.php index 4eee707a4..11a285f75 100644 --- a/controllers/admin/AdminInvoicesController.php +++ b/controllers/admin/AdminInvoicesController.php @@ -42,6 +42,12 @@ class AdminInvoicesControllerCore extends AdminController 'cast' => 'intval', 'type' => 'bool' ), + 'PS_INVOICE_TAXES_BREAKDOWN' => array( + 'title' => $this->l('Enable the breakdown of taxes on the invoice:'), + 'desc' => $this->l('Show a breakdown of taxes by tax rate on the invoice when there are several taxes combined'), + 'cast' => 'intval', + 'type' => 'bool' + ), 'PS_INVOICE_PREFIX' => array( 'title' => $this->l('Invoice prefix:'), 'desc' => $this->l('Prefix used for invoice name (e.g. IN00001)'), diff --git a/controllers/admin/AdminLogsController.php b/controllers/admin/AdminLogsController.php index 5a4dc1255..b9db383c1 100644 --- a/controllers/admin/AdminLogsController.php +++ b/controllers/admin/AdminLogsController.php @@ -35,7 +35,7 @@ class AdminLogsControllerCore extends AdminController $this->fields_list = array( 'id_log' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), - 'employee' => array('title' => $this->l('Employee'), 'align' => 'center', 'width' => 100), + 'employee' => array('title' => $this->l('Employee'), 'align' => 'center', 'width' => 100, 'havingFilter' => true), 'severity' => array('title' => $this->l('Severity (1-4)'), 'align' => 'center', 'width' => 50), 'message' => array('title' => $this->l('Message')), 'object_type' => array('title' => $this->l('Object type'), 'width' => 75), diff --git a/controllers/admin/AdminProductsController.php b/controllers/admin/AdminProductsController.php index 03764fe67..cbc235f59 100644 --- a/controllers/admin/AdminProductsController.php +++ b/controllers/admin/AdminProductsController.php @@ -2023,7 +2023,7 @@ class AdminProductsControllerCore extends AdminController // Check multilingual fields validity foreach ($rules['validateLang'] as $fieldLang => $function) foreach ($languages as $language) - if ($this->isProductFieldUpdated('description_short', $language['id_lang']) && ($value = Tools::getValue($fieldLang.'_'.$language['id_lang']))) + if ($this->isProductFieldUpdated($fieldLang, $language['id_lang']) && ($value = Tools::getValue($fieldLang.'_'.$language['id_lang']))) if (!Validate::$function($value, (int)Configuration::get('PS_ALLOW_HTML_IFRAME'))) $this->errors[] = sprintf( Tools::displayError('The %1$s field (%2$s) is invalid.'), diff --git a/controllers/front/ParentOrderController.php b/controllers/front/ParentOrderController.php index 10e17bb85..3a02dd9dd 100644 --- a/controllers/front/ParentOrderController.php +++ b/controllers/front/ParentOrderController.php @@ -372,6 +372,7 @@ class ParentOrderControllerCore extends FrontController 'currencyFormat' => $this->context->currency->format, 'currencyBlank' => $this->context->currency->blank, 'show_option_allow_separate_package' => $show_option_allow_separate_package, + 'smallSize' => Image::getSize(ImageType::getFormatedName('small')), )); diff --git a/install-dev/fixtures/apple/langs/bn/data/attribute.xml b/install-dev/fixtures/apple/langs/bn/data/attribute.xml new file mode 100644 index 000000000..f27df851c --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/attribute.xml @@ -0,0 +1,63 @@ + + + + 2GB + + + 4GB + + + Metal + + + Blue + + + Pink + + + Green + + + Orange + + + Optional 64GB solid-state drive + + + 80GB Parallel ATA Drive @ 4200 rpm + + + 1.60GHz Intel Core 2 Duo + + + 1.80GHz Intel Core 2 Duo + + + 80GB: 20,000 Songs + + + 160GB: 40,000 Songs + + + Black + + + 8GB + + + 16GB + + + 32GB + + + Purple + + + Yellow + + + Red + + diff --git a/install-dev/fixtures/apple/langs/bn/data/attribute_group.xml b/install-dev/fixtures/apple/langs/bn/data/attribute_group.xml new file mode 100644 index 000000000..221a81bc7 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/attribute_group.xml @@ -0,0 +1,15 @@ + + + + Disk space + Disk space + + + Color + Color + + + ICU + Processor + + diff --git a/install-dev/fixtures/apple/langs/bn/data/attributegroup.xml b/install-dev/fixtures/apple/langs/bn/data/attributegroup.xml new file mode 100644 index 000000000..977fceeb7 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/attributegroup.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/install-dev/fixtures/apple/langs/bn/data/carrier.xml b/install-dev/fixtures/apple/langs/bn/data/carrier.xml new file mode 100644 index 000000000..c59766e73 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/carrier.xml @@ -0,0 +1,6 @@ + + + + Delivery next day! + + diff --git a/install-dev/fixtures/apple/langs/bn/data/category.xml b/install-dev/fixtures/apple/langs/bn/data/category.xml new file mode 100644 index 000000000..eeae63831 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/category.xml @@ -0,0 +1,27 @@ + + + + iPods + Now that you can buy movies from the iTunes Store and sync them to your iPod, the whole world is your theater. + music-ipods + + + + + + Accessories + Wonderful accessories for your iPod + accessories-ipod + + + + + + Laptops + The latest Intel processor, a bigger hard drive, plenty of memory, and even more new features all fit inside just one liberating inch. The new Mac laptops have the performance, power, and connectivity of a desktop computer. Without the desk part. + laptops + Apple laptops + Apple laptops MacBook Air + Powerful and chic Apple laptops + + diff --git a/install-dev/fixtures/apple/langs/bn/data/feature.xml b/install-dev/fixtures/apple/langs/bn/data/feature.xml new file mode 100644 index 000000000..7682c6495 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/feature.xml @@ -0,0 +1,18 @@ + + + + Height + + + Width + + + Depth + + + Weight + + + Headphone + + diff --git a/install-dev/fixtures/apple/langs/bn/data/feature_value.xml b/install-dev/fixtures/apple/langs/bn/data/feature_value.xml new file mode 100644 index 000000000..d3a824d22 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/feature_value.xml @@ -0,0 +1,45 @@ + + + + Jack stereo + + + Mini-jack stereo + + + 2.75 in + + + 2.06 in + + + 49.2 g + + + 0.26 in + + + 1.07 in + + + 1.62 in + + + 15.5 g + + + 0.41 in (clip included) + + + 4.33 in + + + 2.76 in + + + 120g + + + 0.31 in + + diff --git a/install-dev/fixtures/apple/langs/bn/data/featurevalue.xml b/install-dev/fixtures/apple/langs/bn/data/featurevalue.xml new file mode 100644 index 000000000..d101bed96 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/featurevalue.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/install-dev/fixtures/apple/langs/bn/data/image.xml b/install-dev/fixtures/apple/langs/bn/data/image.xml new file mode 100644 index 000000000..49a836dc3 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/image.xml @@ -0,0 +1,81 @@ + + + + MacBook Air + + + MacBook Air + + + MacBook Air + + + MacBook Air + + + MacBook Air + + + MacBook Air SuperDrive + + + iPod touch + + + iPod touch + + + iPod touch + + + iPod touch + + + iPod touch + + + iPod touch + + + housse-portefeuille-en-cuir + + + Shure SE210 Sound-Isolating Earphones for iPod and iPhone + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod shuffle + + + iPod shuffle + + + iPod shuffle + + + iPod shuffle + + diff --git a/install-dev/fixtures/apple/langs/bn/data/index.php b/install-dev/fixtures/apple/langs/bn/data/index.php new file mode 100644 index 000000000..fcb7f5c2b --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/index.php @@ -0,0 +1,35 @@ + +* @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 +*/ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../../../../../../'); +exit; \ No newline at end of file diff --git a/install-dev/fixtures/apple/langs/bn/data/manufacturer.xml b/install-dev/fixtures/apple/langs/bn/data/manufacturer.xml new file mode 100644 index 000000000..f06ff9661 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/manufacturer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/install-dev/fixtures/apple/langs/bn/data/order_message.xml b/install-dev/fixtures/apple/langs/bn/data/order_message.xml new file mode 100644 index 000000000..93ad3b501 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/order_message.xml @@ -0,0 +1,12 @@ + + + + Delay + Hi, + +Unfortunately, an item on your order is currently out of stock. This may cause a slight delay in delivery. +Please accept our apologies and rest assured that we are working hard to rectify this. + +Best regards, + + diff --git a/install-dev/fixtures/apple/langs/bn/data/ordermessage.xml b/install-dev/fixtures/apple/langs/bn/data/ordermessage.xml new file mode 100644 index 000000000..e743f5d97 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/ordermessage.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/install-dev/fixtures/apple/langs/bn/data/product.xml b/install-dev/fixtures/apple/langs/bn/data/product.xml new file mode 100644 index 000000000..0c405b001 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/product.xml @@ -0,0 +1,135 @@ + + + + <p><strong><span style="font-size: small;">Curved ahead of the curve.</span></strong></p> +<p>For those about to rock, we give you nine amazing colors. But that's only part of the story. Feel the curved, all-aluminum and glass design and you won't want to put iPod nano down.</p> +<p><strong><span style="font-size: small;">Great looks. And brains, too.</span></strong></p> +<p>The new Genius feature turns iPod nano into your own highly intelligent, personal DJ. It creates playlists by finding songs in your library that go great together.</p> +<p><strong><span style="font-size: small;">Made to move with your moves.</span></strong></p> +<p>The accelerometer comes to iPod nano. Give it a shake to shuffle your music. Turn it sideways to view Cover Flow. And play games designed with your moves in mind.</p> + <p>New design. New features. Now in 8GB and 16GB. iPod nano rocks like never before.</p> + ipod-nano + + + + iPod Nano + In stock + + + + <p><span style="font-size: small;"><strong>Instant attachment.</strong></span></p> +<p>Wear up to 500 songs on your sleeve. Or your belt. Or your gym shorts. iPod shuffle is a badge of musical devotion. Now in new, more brilliant colors.</p> +<p><span style="font-size: small;"><strong>Feed your iPod shuffle.</strong></span></p> +<p>iTunes is your entertainment superstore. It’s your ultra-organized music collection and jukebox. And it’s how you load up your iPod shuffle in one click.</p> +<p><span style="font-size: small;"><strong>Beauty and the beat.</strong></span></p> +<p>Intensely colorful anodized aluminum complements the simple design of iPod shuffle. Now in blue, green, pink, red, and original silver.</p> + <p>iPod shuffle, the world’s most wearable music player, now clips on in more vibrant blue, green, pink, and red.</p> + ipod-shuffle + + + + iPod shuffle + In stock + + + + <p>MacBook Air is nearly as thin as your index finger. Practically every detail that could be streamlined has been. Yet it still has a 13.3-inch widescreen LED display, full-size keyboard, and large multi-touch trackpad. It’s incomparably portable without the usual ultraportable screen and keyboard compromises.</p><p>The incredible thinness of MacBook Air is the result of numerous size- and weight-shaving innovations. From a slimmer hard drive to strategically hidden I/O ports to a lower-profile battery, everything has been considered and reconsidered with thinness in mind.</p><p>MacBook Air is designed and engineered to take full advantage of the wireless world. A world in which 802.11n Wi-Fi is now so fast and so available, people are truly living untethered — buying and renting movies online, downloading software, and sharing and storing files on the web. </p> + MacBook Air is ultrathin, ultraportable, and ultra unlike anything else. But you don’t lose inches and pounds overnight. It’s the result of rethinking conventions. Of multiple wireless innovations. And of breakthrough design. With MacBook Air, mobile computing suddenly has a new standard. + macbook-air + + + + MacBook Air + + + + + Every MacBook has a larger hard drive, up to 250GB, to store growing media collections and valuable data.<br /><br />The 2.4GHz MacBook models now include 2GB of memory standard — perfect for running more of your favorite applications smoothly. + MacBook makes it easy to hit the road thanks to its tough polycarbonate case, built-in wireless technologies, and innovative MagSafe Power Adapter that releases automatically if someone accidentally trips on the cord. + macbook + + + + MacBook + + + + + <h3>Five new hands-on applications</h3> +<p>View rich HTML email with photos as well as PDF, Word, and Excel attachments. Get maps, directions, and real-time traffic information. Take notes and read stock and weather reports.</p> +<h3>Touch your music, movies, and more</h3> +<p>The revolutionary Multi-Touch technology built into the gorgeous 3.5-inch display lets you pinch, zoom, scroll, and flick with your fingers.</p> +<h3>Internet in your pocket</h3> +<p>With the Safari web browser, see websites the way they were designed to be seen and zoom in and out with a tap.<sup>2</sup> And add Web Clips to your Home screen for quick access to favorite sites.</p> +<h3>What's in the box</h3> +<ul> +<li><span></span>iPod touch</li> +<li><span></span>Earphones</li> +<li><span></span>USB 2.0 cable</li> +<li><span></span>Dock adapter</li> +<li><span></span>Polishing cloth</li> +<li><span></span>Stand</li> +<li><span></span>Quick Start guide</li> +</ul> + <ul> +<li>Revolutionary Multi-Touch interface</li> +<li>3.5-inch widescreen color display</li> +<li>Wi-Fi (802.11b/g)</li> +<li>8 mm thin</li> +<li>Safari, YouTube, Mail, Stocks, Weather, Notes, iTunes Wi-Fi Music Store, Maps</li> +</ul> + ipod-touch + + + + iPod touch + + + + + <p>Lorem ipsum</p> + <p>Lorem ipsum</p> + belkin-leather-folio-for-ipod-nano-black-chocolate + + + + Belkin Leather Folio for iPod nano - Black / Chocolate + + + + + <div class="product-overview-full">Using Hi-Definition MicroSpeakers to deliver full-range audio, the ergonomic and lightweight design of the SE210 earphones is ideal for premium on-the-go listening on your iPod or iPhone. They offer the most accurate audio reproduction from both portable and home stereo audio sources--for the ultimate in precision highs and rich low end. In addition, the flexible design allows you to choose the most comfortable fit from a variety of wearing positions. <br /> <br /> <strong>Features </strong> <br /> +<ul> +<li>Sound-isolating design </li> +<li> Hi-Definition MicroSpeaker with a single balanced armature driver </li> +<li> Detachable, modular cable so you can make the cable longer or shorter depending on your activity </li> +<li> Connector compatible with earphone ports on both iPod and iPhone </li> +</ul> +<strong>Specifications </strong><br /> +<ul> +<li>Speaker type: Hi-Definition MicroSpeaker </li> +<li> Frequency range: 25Hz-18.5kHz </li> +<li> Impedance (1kHz): 26 Ohms </li> +<li> Sensitivity (1mW): 114 dB SPL/mW </li> +<li> Cable length (with extension): 18.0 in./45.0 cm (54.0 in./137.1 cm) </li> +</ul> +<strong>In the box</strong><br /> +<ul> +<li>Shure SE210 earphones </li> +<li> Extension cable (36.0 in./91.4 cm) </li> +<li> Three pairs foam earpiece sleeves (small, medium, large) </li> +<li> Three pairs soft flex earpiece sleeves (small, medium, large) </li> +<li> One pair triple-flange earpiece sleeves </li> +<li> Carrying case </li> +</ul> +Warranty<br /> Two-year limited <br />(For details, please visit <br />www.shure.com/PersonalAudio/CustomerSupport/ProductReturnsAndWarranty/index.htm.) <br /><br /> Mfr. Part No.: SE210-A-EFS <br /><br />Note: Products sold through this website that do not bear the Apple Brand name are serviced and supported exclusively by their manufacturers in accordance with terms and conditions packaged with the products. Apple's Limited Warranty does not apply to products that are not Apple-branded, even if packaged or sold with Apple products. Please contact the manufacturer directly for technical support and customer service.</div> + <p>Evolved from personal monitor technology road-tested by pro musicians and perfected by Shure engineers, the lightweight and stylish SE210 delivers full-range audio that's free from outside noise.</p> + ecouteurs-a-isolation-sonore-shure-se210-blanc + + + + Shure SE210 Sound-Isolating Earphones for iPod and iPhone + + + + diff --git a/install-dev/fixtures/apple/langs/bn/data/profile.xml b/install-dev/fixtures/apple/langs/bn/data/profile.xml new file mode 100644 index 000000000..02aa4d76c --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/profile.xml @@ -0,0 +1,15 @@ + + + + Administrator + + + Logistician + + + Translator + + + Salesman + + diff --git a/install-dev/fixtures/apple/langs/bn/data/scene.xml b/install-dev/fixtures/apple/langs/bn/data/scene.xml new file mode 100644 index 000000000..f7270d3ff --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/scene.xml @@ -0,0 +1,12 @@ + + + + The iPods Nano + + + The iPods + + + The MacBooks + + diff --git a/install-dev/fixtures/apple/langs/bn/data/supplier.xml b/install-dev/fixtures/apple/langs/bn/data/supplier.xml new file mode 100644 index 000000000..e9db64034 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/supplier.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/install-dev/fixtures/apple/langs/bn/data/tag.xml b/install-dev/fixtures/apple/langs/bn/data/tag.xml new file mode 100644 index 000000000..b781c0ed2 --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/data/tag.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/install-dev/fixtures/apple/langs/bn/index.php b/install-dev/fixtures/apple/langs/bn/index.php new file mode 100644 index 000000000..67d9932bf --- /dev/null +++ b/install-dev/fixtures/apple/langs/bn/index.php @@ -0,0 +1,35 @@ + +* @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 +*/ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../../../../../'); +exit; \ No newline at end of file diff --git a/install-dev/fixtures/apple/langs/id/data/attribute.xml b/install-dev/fixtures/apple/langs/id/data/attribute.xml new file mode 100644 index 000000000..f27df851c --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/attribute.xml @@ -0,0 +1,63 @@ + + + + 2GB + + + 4GB + + + Metal + + + Blue + + + Pink + + + Green + + + Orange + + + Optional 64GB solid-state drive + + + 80GB Parallel ATA Drive @ 4200 rpm + + + 1.60GHz Intel Core 2 Duo + + + 1.80GHz Intel Core 2 Duo + + + 80GB: 20,000 Songs + + + 160GB: 40,000 Songs + + + Black + + + 8GB + + + 16GB + + + 32GB + + + Purple + + + Yellow + + + Red + + diff --git a/install-dev/fixtures/apple/langs/id/data/attribute_group.xml b/install-dev/fixtures/apple/langs/id/data/attribute_group.xml new file mode 100644 index 000000000..221a81bc7 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/attribute_group.xml @@ -0,0 +1,15 @@ + + + + Disk space + Disk space + + + Color + Color + + + ICU + Processor + + diff --git a/install-dev/fixtures/apple/langs/id/data/attributegroup.xml b/install-dev/fixtures/apple/langs/id/data/attributegroup.xml new file mode 100644 index 000000000..977fceeb7 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/attributegroup.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/install-dev/fixtures/apple/langs/id/data/carrier.xml b/install-dev/fixtures/apple/langs/id/data/carrier.xml new file mode 100644 index 000000000..c59766e73 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/carrier.xml @@ -0,0 +1,6 @@ + + + + Delivery next day! + + diff --git a/install-dev/fixtures/apple/langs/id/data/category.xml b/install-dev/fixtures/apple/langs/id/data/category.xml new file mode 100644 index 000000000..eeae63831 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/category.xml @@ -0,0 +1,27 @@ + + + + iPods + Now that you can buy movies from the iTunes Store and sync them to your iPod, the whole world is your theater. + music-ipods + + + + + + Accessories + Wonderful accessories for your iPod + accessories-ipod + + + + + + Laptops + The latest Intel processor, a bigger hard drive, plenty of memory, and even more new features all fit inside just one liberating inch. The new Mac laptops have the performance, power, and connectivity of a desktop computer. Without the desk part. + laptops + Apple laptops + Apple laptops MacBook Air + Powerful and chic Apple laptops + + diff --git a/install-dev/fixtures/apple/langs/id/data/feature.xml b/install-dev/fixtures/apple/langs/id/data/feature.xml new file mode 100644 index 000000000..7682c6495 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/feature.xml @@ -0,0 +1,18 @@ + + + + Height + + + Width + + + Depth + + + Weight + + + Headphone + + diff --git a/install-dev/fixtures/apple/langs/id/data/feature_value.xml b/install-dev/fixtures/apple/langs/id/data/feature_value.xml new file mode 100644 index 000000000..d3a824d22 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/feature_value.xml @@ -0,0 +1,45 @@ + + + + Jack stereo + + + Mini-jack stereo + + + 2.75 in + + + 2.06 in + + + 49.2 g + + + 0.26 in + + + 1.07 in + + + 1.62 in + + + 15.5 g + + + 0.41 in (clip included) + + + 4.33 in + + + 2.76 in + + + 120g + + + 0.31 in + + diff --git a/install-dev/fixtures/apple/langs/id/data/featurevalue.xml b/install-dev/fixtures/apple/langs/id/data/featurevalue.xml new file mode 100644 index 000000000..d101bed96 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/featurevalue.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/install-dev/fixtures/apple/langs/id/data/image.xml b/install-dev/fixtures/apple/langs/id/data/image.xml new file mode 100644 index 000000000..49a836dc3 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/image.xml @@ -0,0 +1,81 @@ + + + + MacBook Air + + + MacBook Air + + + MacBook Air + + + MacBook Air + + + MacBook Air + + + MacBook Air SuperDrive + + + iPod touch + + + iPod touch + + + iPod touch + + + iPod touch + + + iPod touch + + + iPod touch + + + housse-portefeuille-en-cuir + + + Shure SE210 Sound-Isolating Earphones for iPod and iPhone + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod Nano + + + iPod shuffle + + + iPod shuffle + + + iPod shuffle + + + iPod shuffle + + diff --git a/install-dev/fixtures/apple/langs/id/data/index.php b/install-dev/fixtures/apple/langs/id/data/index.php new file mode 100644 index 000000000..fcb7f5c2b --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/index.php @@ -0,0 +1,35 @@ + +* @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 +*/ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../../../../../../'); +exit; \ No newline at end of file diff --git a/install-dev/fixtures/apple/langs/id/data/manufacturer.xml b/install-dev/fixtures/apple/langs/id/data/manufacturer.xml new file mode 100644 index 000000000..f06ff9661 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/manufacturer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/install-dev/fixtures/apple/langs/id/data/order_message.xml b/install-dev/fixtures/apple/langs/id/data/order_message.xml new file mode 100644 index 000000000..93ad3b501 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/order_message.xml @@ -0,0 +1,12 @@ + + + + Delay + Hi, + +Unfortunately, an item on your order is currently out of stock. This may cause a slight delay in delivery. +Please accept our apologies and rest assured that we are working hard to rectify this. + +Best regards, + + diff --git a/install-dev/fixtures/apple/langs/id/data/ordermessage.xml b/install-dev/fixtures/apple/langs/id/data/ordermessage.xml new file mode 100644 index 000000000..e743f5d97 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/ordermessage.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/install-dev/fixtures/apple/langs/id/data/product.xml b/install-dev/fixtures/apple/langs/id/data/product.xml new file mode 100644 index 000000000..0c405b001 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/product.xml @@ -0,0 +1,135 @@ + + + + <p><strong><span style="font-size: small;">Curved ahead of the curve.</span></strong></p> +<p>For those about to rock, we give you nine amazing colors. But that's only part of the story. Feel the curved, all-aluminum and glass design and you won't want to put iPod nano down.</p> +<p><strong><span style="font-size: small;">Great looks. And brains, too.</span></strong></p> +<p>The new Genius feature turns iPod nano into your own highly intelligent, personal DJ. It creates playlists by finding songs in your library that go great together.</p> +<p><strong><span style="font-size: small;">Made to move with your moves.</span></strong></p> +<p>The accelerometer comes to iPod nano. Give it a shake to shuffle your music. Turn it sideways to view Cover Flow. And play games designed with your moves in mind.</p> + <p>New design. New features. Now in 8GB and 16GB. iPod nano rocks like never before.</p> + ipod-nano + + + + iPod Nano + In stock + + + + <p><span style="font-size: small;"><strong>Instant attachment.</strong></span></p> +<p>Wear up to 500 songs on your sleeve. Or your belt. Or your gym shorts. iPod shuffle is a badge of musical devotion. Now in new, more brilliant colors.</p> +<p><span style="font-size: small;"><strong>Feed your iPod shuffle.</strong></span></p> +<p>iTunes is your entertainment superstore. It’s your ultra-organized music collection and jukebox. And it’s how you load up your iPod shuffle in one click.</p> +<p><span style="font-size: small;"><strong>Beauty and the beat.</strong></span></p> +<p>Intensely colorful anodized aluminum complements the simple design of iPod shuffle. Now in blue, green, pink, red, and original silver.</p> + <p>iPod shuffle, the world’s most wearable music player, now clips on in more vibrant blue, green, pink, and red.</p> + ipod-shuffle + + + + iPod shuffle + In stock + + + + <p>MacBook Air is nearly as thin as your index finger. Practically every detail that could be streamlined has been. Yet it still has a 13.3-inch widescreen LED display, full-size keyboard, and large multi-touch trackpad. It’s incomparably portable without the usual ultraportable screen and keyboard compromises.</p><p>The incredible thinness of MacBook Air is the result of numerous size- and weight-shaving innovations. From a slimmer hard drive to strategically hidden I/O ports to a lower-profile battery, everything has been considered and reconsidered with thinness in mind.</p><p>MacBook Air is designed and engineered to take full advantage of the wireless world. A world in which 802.11n Wi-Fi is now so fast and so available, people are truly living untethered — buying and renting movies online, downloading software, and sharing and storing files on the web. </p> + MacBook Air is ultrathin, ultraportable, and ultra unlike anything else. But you don’t lose inches and pounds overnight. It’s the result of rethinking conventions. Of multiple wireless innovations. And of breakthrough design. With MacBook Air, mobile computing suddenly has a new standard. + macbook-air + + + + MacBook Air + + + + + Every MacBook has a larger hard drive, up to 250GB, to store growing media collections and valuable data.<br /><br />The 2.4GHz MacBook models now include 2GB of memory standard — perfect for running more of your favorite applications smoothly. + MacBook makes it easy to hit the road thanks to its tough polycarbonate case, built-in wireless technologies, and innovative MagSafe Power Adapter that releases automatically if someone accidentally trips on the cord. + macbook + + + + MacBook + + + + + <h3>Five new hands-on applications</h3> +<p>View rich HTML email with photos as well as PDF, Word, and Excel attachments. Get maps, directions, and real-time traffic information. Take notes and read stock and weather reports.</p> +<h3>Touch your music, movies, and more</h3> +<p>The revolutionary Multi-Touch technology built into the gorgeous 3.5-inch display lets you pinch, zoom, scroll, and flick with your fingers.</p> +<h3>Internet in your pocket</h3> +<p>With the Safari web browser, see websites the way they were designed to be seen and zoom in and out with a tap.<sup>2</sup> And add Web Clips to your Home screen for quick access to favorite sites.</p> +<h3>What's in the box</h3> +<ul> +<li><span></span>iPod touch</li> +<li><span></span>Earphones</li> +<li><span></span>USB 2.0 cable</li> +<li><span></span>Dock adapter</li> +<li><span></span>Polishing cloth</li> +<li><span></span>Stand</li> +<li><span></span>Quick Start guide</li> +</ul> + <ul> +<li>Revolutionary Multi-Touch interface</li> +<li>3.5-inch widescreen color display</li> +<li>Wi-Fi (802.11b/g)</li> +<li>8 mm thin</li> +<li>Safari, YouTube, Mail, Stocks, Weather, Notes, iTunes Wi-Fi Music Store, Maps</li> +</ul> + ipod-touch + + + + iPod touch + + + + + <p>Lorem ipsum</p> + <p>Lorem ipsum</p> + belkin-leather-folio-for-ipod-nano-black-chocolate + + + + Belkin Leather Folio for iPod nano - Black / Chocolate + + + + + <div class="product-overview-full">Using Hi-Definition MicroSpeakers to deliver full-range audio, the ergonomic and lightweight design of the SE210 earphones is ideal for premium on-the-go listening on your iPod or iPhone. They offer the most accurate audio reproduction from both portable and home stereo audio sources--for the ultimate in precision highs and rich low end. In addition, the flexible design allows you to choose the most comfortable fit from a variety of wearing positions. <br /> <br /> <strong>Features </strong> <br /> +<ul> +<li>Sound-isolating design </li> +<li> Hi-Definition MicroSpeaker with a single balanced armature driver </li> +<li> Detachable, modular cable so you can make the cable longer or shorter depending on your activity </li> +<li> Connector compatible with earphone ports on both iPod and iPhone </li> +</ul> +<strong>Specifications </strong><br /> +<ul> +<li>Speaker type: Hi-Definition MicroSpeaker </li> +<li> Frequency range: 25Hz-18.5kHz </li> +<li> Impedance (1kHz): 26 Ohms </li> +<li> Sensitivity (1mW): 114 dB SPL/mW </li> +<li> Cable length (with extension): 18.0 in./45.0 cm (54.0 in./137.1 cm) </li> +</ul> +<strong>In the box</strong><br /> +<ul> +<li>Shure SE210 earphones </li> +<li> Extension cable (36.0 in./91.4 cm) </li> +<li> Three pairs foam earpiece sleeves (small, medium, large) </li> +<li> Three pairs soft flex earpiece sleeves (small, medium, large) </li> +<li> One pair triple-flange earpiece sleeves </li> +<li> Carrying case </li> +</ul> +Warranty<br /> Two-year limited <br />(For details, please visit <br />www.shure.com/PersonalAudio/CustomerSupport/ProductReturnsAndWarranty/index.htm.) <br /><br /> Mfr. Part No.: SE210-A-EFS <br /><br />Note: Products sold through this website that do not bear the Apple Brand name are serviced and supported exclusively by their manufacturers in accordance with terms and conditions packaged with the products. Apple's Limited Warranty does not apply to products that are not Apple-branded, even if packaged or sold with Apple products. Please contact the manufacturer directly for technical support and customer service.</div> + <p>Evolved from personal monitor technology road-tested by pro musicians and perfected by Shure engineers, the lightweight and stylish SE210 delivers full-range audio that's free from outside noise.</p> + ecouteurs-a-isolation-sonore-shure-se210-blanc + + + + Shure SE210 Sound-Isolating Earphones for iPod and iPhone + + + + diff --git a/install-dev/fixtures/apple/langs/id/data/profile.xml b/install-dev/fixtures/apple/langs/id/data/profile.xml new file mode 100644 index 000000000..02aa4d76c --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/profile.xml @@ -0,0 +1,15 @@ + + + + Administrator + + + Logistician + + + Translator + + + Salesman + + diff --git a/install-dev/fixtures/apple/langs/id/data/scene.xml b/install-dev/fixtures/apple/langs/id/data/scene.xml new file mode 100644 index 000000000..f7270d3ff --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/scene.xml @@ -0,0 +1,12 @@ + + + + The iPods Nano + + + The iPods + + + The MacBooks + + diff --git a/install-dev/fixtures/apple/langs/id/data/supplier.xml b/install-dev/fixtures/apple/langs/id/data/supplier.xml new file mode 100644 index 000000000..e9db64034 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/supplier.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/install-dev/fixtures/apple/langs/id/data/tag.xml b/install-dev/fixtures/apple/langs/id/data/tag.xml new file mode 100644 index 000000000..b781c0ed2 --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/data/tag.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/install-dev/fixtures/apple/langs/id/index.php b/install-dev/fixtures/apple/langs/id/index.php new file mode 100644 index 000000000..67d9932bf --- /dev/null +++ b/install-dev/fixtures/apple/langs/id/index.php @@ -0,0 +1,35 @@ + +* @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 +*/ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../../../../../'); +exit; \ No newline at end of file diff --git a/install-dev/langs/bn/data/carrier.xml b/install-dev/langs/bn/data/carrier.xml new file mode 100644 index 000000000..db968ca0e --- /dev/null +++ b/install-dev/langs/bn/data/carrier.xml @@ -0,0 +1,6 @@ + + + + দোকান থেকে নিন + + diff --git a/install-dev/langs/bn/data/category.xml b/install-dev/langs/bn/data/category.xml new file mode 100644 index 000000000..be0c6bd95 --- /dev/null +++ b/install-dev/langs/bn/data/category.xml @@ -0,0 +1,19 @@ + + + + রুট + + root + + + + + + হোম + + home + + + + + diff --git a/install-dev/langs/bn/data/cms.xml b/install-dev/langs/bn/data/cms.xml new file mode 100644 index 000000000..85941f6ef --- /dev/null +++ b/install-dev/langs/bn/data/cms.xml @@ -0,0 +1,45 @@ + + + + বিতরন + বিতরনের শর্ত সমূহ + conditions, delivery, delay, shipment, pack + <h2>বিলি এবং ফেরত</h2><h3>আপনার প্যাক বিলিt</h3><p>প্যাকেজ সাধারণত পেমেন্ট প্রাপ্তির পর 2 দিনের মধ্যে প্রেষিত হয় এবং স্বাক্ষর ছাড়াই ট্র্যাকিং এবং ড্রপ অফ সঙ্গে ইউ.পি. মাধ্যমে প্রেরণ করা হয়. আপনি প্রয়োজনীয় স্বাক্ষর সঙ্গে অতিরিক্ত ইউ.পি. দ্বারা ডেলিভারি পছন্দ করেন, একটি অতিরিক্ত খরচ প্রয়োগ করা হবে, তাই এই পদ্ধতি চয়ন করার আগে আমাদের সাথে যোগাযোগ করুন. আপনি যেটা পছন্দ চালান, আমরা আপনাকে আপনার প্যাকেজ অনলাইন ট্র্যাক একটি লিঙ্ক প্রদান করা হবে.</p><p>শিপিং ফি ফি হিসেবে ডাকমাসুল খরচ সামলাচ্ছে ও প্যাকিং অন্তর্ভুক্ত. পরিবহন ফি চালানের মোট ওজন অনুযায়ী পরিবর্তন হওয়ার সম্ভাবনা রয়েছে, যেহেতু সামলাচ্ছে ফি, সংশোধন করা হয়. আমরা এক করার জন্য আপনার আইটেম গ্রুপে আপনাকে উপদেশ. আমরা আলাদা আলাদাভাবে স্থাপিত দুটি স্বতন্ত্র আদেশ গ্রুপ করতে পারবে না, এবং শিপিং ফি তাদের প্রতিটি ক্ষেত্রে প্রযোজ্য হবে. আপনার প্যাকেজ আপনার নিজের ঝুঁকিতে প্রেষিত করা হবে, কিন্তু ভঙ্গুর বস্তুর রক্ষা বিশেষ যত্ন নেওয়া হয়.<br /><br />বক্সগুলিতে যা আছে পর্যাপ্তভাবে মাপের এবং আপনার আইটেম ভাল সুরক্ষিত হয়.</p> + delivery + + + আইনি বিজ্ঞপ্তি + আইনি বিজ্ঞপ্তি + notice, legal, credits + <h2>আইনগত</h2><h3>বকেয়া</h3><p>ধারনা এবং উৎপাদন:</p><p>এই ওয়েব সাইট টি ব্যাবহার করে তৈরি<a href="http://www.prestashop.com">PrestaShop</a>&trade; open-source software.</p> + legal-notice + + + ব্যাবহারের শর্ত + আমাদের ব্যাবহারের শর্ত + conditions, terms, use, sell + <h2>আপনার জন্য ব্যাবহারের শর্ত</h2><h3>নিয়ম ১</h3><p>এখানে নিয়ম ১ content</p> +<h3>নিয়ম২</h3><p>এখানে নিয়ম২</p> +<h3>নিয়ম ৩</h3><p>এখানে নিয়ম৩ content</p> + terms-and-conditions-of-use + + + আমাদের সম্পর্কে + আমাদের সম্পর্কে আরও জানুন + about us, informations + <h2>আমাদের সম্পর্কে</h2> +<h3>আমাদের কোম্পানি</h3><p>Our company</p> +<h3>আমাদের টিম</h3><p>Our team</p> +<h3>তথ্য</h3><p>Informations</p> + about-us + + + নিরাপদ পরিশোধ + আমাদের নিরাপদ পরিশোধ পদ্ধতি + secure payment, ssl, visa, mastercard, paypal + <h2>নিরাপদ পরিশোধ</h2> +<h3>আমাদের নিরাপদ পরিশোধ</h3><p>With SSL</p> +<h3>ব্যাবহার করে Visa/Mastercard/Paypal</h3><p>এই সেবা সম্পর্কে</p> + secure-payment + + diff --git a/install-dev/langs/bn/data/cms_category.xml b/install-dev/langs/bn/data/cms_category.xml new file mode 100644 index 000000000..ae6a122c7 --- /dev/null +++ b/install-dev/langs/bn/data/cms_category.xml @@ -0,0 +1,11 @@ + + + + হোম + + home + + + + + diff --git a/install-dev/langs/bn/data/configuration.xml b/install-dev/langs/bn/data/configuration.xml new file mode 100644 index 000000000..8f30677d3 --- /dev/null +++ b/install-dev/langs/bn/data/configuration.xml @@ -0,0 +1,18 @@ + + + + ভিতরে + + + ডি ই + + + একটি|এটি|থেকে|এবং|হতে + + + 0 + + + প্রিয় গ্রাহক, শুভেচ্ছা, গ্রাহক সেবা বিভাগ + + diff --git a/install-dev/langs/bn/data/contact.xml b/install-dev/langs/bn/data/contact.xml new file mode 100644 index 000000000..d1917ad61 --- /dev/null +++ b/install-dev/langs/bn/data/contact.xml @@ -0,0 +1,9 @@ + + + + যদি এই ওয়েব সাইটে একটি টেকনিকাল ত্রুটি ঘটে + + + যে কোনো পণ্য সম্পর্কে প্রশ্ন, একটি অর্ডার + + diff --git a/install-dev/langs/bn/data/country.xml b/install-dev/langs/bn/data/country.xml new file mode 100644 index 000000000..d57ea1e36 --- /dev/null +++ b/install-dev/langs/bn/data/country.xml @@ -0,0 +1,735 @@ + + + + Germany + + + Austria + + + Belgium + + + Canada + + + China + + + Spain + + + Finland + + + France + + + Greece + + + Italy + + + Japan + + + Luxemburg + + + Netherlands + + + Poland + + + Portugal + + + Czech Republic + + + United Kingdom + + + Sweden + + + Switzerland + + + Denmark + + + United States + + + HongKong + + + Norway + + + Australia + + + Singapore + + + Ireland + + + New Zealand + + + South Korea + + + Israel + + + South Africa + + + Nigeria + + + Ivory Coast + + + Togo + + + Bolivia + + + Mauritius + + + Romania + + + Slovakia + + + Algeria + + + American Samoa + + + + Angola + + + Anguilla + + + Antigua and Barbuda + + + Argentina + + + Armenia + + + Aruba + + + Azerbaijan + + + Bahamas + + + Bahrain + + + Bangladesh + + + Barbados + + + Belarus + + + Belize + + + Benin + + + Bermuda + + + Bhutan + + + Botswana + + + Brazil + + + Brunei + + + Burkina Faso + + + Burma (Myanmar) + + + Burundi + + + Cambodia + + + Cameroon + + + Cape Verde + + + Central African Republic + + + Chad + + + Chile + + + Colombia + + + Comoros + + + Congo, Dem. Republic + + + Congo, Republic + + + Costa Rica + + + Croatia + + + Cuba + + + Cyprus + + + Djibouti + + + Dominica + + + Dominican Republic + + + East Timor + + + Ecuador + + + Egypt + + + El Salvador + + + Equatorial Guinea + + + Eritrea + + + Estonia + + + Ethiopia + + + Falkland Islands + + + Faroe Islands + + + Fiji + + + Gabon + + + Gambia + + + Georgia + + + Ghana + + + Grenada + + + Greenland + + + Gibraltar + + + Guadeloupe + + + Guam + + + Guatemala + + + Guernsey + + + Guinea + + + Guinea-Bissau + + + Guyana + + + Haiti + + + Heard Island and McDonald Islands + + + Vatican City State + + + Honduras + + + Iceland + + + India + + + Indonesia + + + Iran + + + Iraq + + + Man Island + + + Jamaica + + + Jersey + + + Jordan + + + Kazakhstan + + + Kenya + + + Kiribati + + + Korea, Dem. Republic of + + + Kuwait + + + Kyrgyzstan + + + Laos + + + Latvia + + + Lebanon + + + Lesotho + + + Liberia + + + Libya + + + Liechtenstein + + + Lithuania + + + Macau + + + Macedonia + + + Madagascar + + + Malawi + + + Malaysia + + + Maldives + + + Mali + + + Malta + + + Marshall Islands + + + Martinique + + + Mauritania + + + Hungary + + + Mayotte + + + Mexico + + + Micronesia + + + Moldova + + + Monaco + + + Mongolia + + + Montenegro + + + Montserrat + + + Morocco + + + Mozambique + + + Namibia + + + Nauru + + + Nepal + + + Netherlands Antilles + + + New Caledonia + + + Nicaragua + + + Niger + + + Niue + + + Norfolk Island + + + Northern Mariana Islands + + + Oman + + + Pakistan + + + Palau + + + Palestinian Territories + + + Panama + + + Papua New Guinea + + + Paraguay + + + Peru + + + Philippines + + + Pitcairn + + + Puerto Rico + + + Qatar + + + Reunion Island + + + Russian Federation + + + Rwanda + + + Saint Barthelemy + + + Saint Kitts and Nevis + + + Saint Lucia + + + Saint Martin + + + Saint Pierre and Miquelon + + + Saint Vincent and the Grenadines + + + Samoa + + + San Marino + + + São Tomé and Príncipe + + + Saudi Arabia + + + Senegal + + + Serbia + + + Seychelles + + + Sierra Leone + + + Slovenia + + + Solomon Islands + + + Somalia + + + South Georgia and the South Sandwich Islands + + + Sri Lanka + + + Sudan + + + Suriname + + + Svalbard and Jan Mayen + + + Swaziland + + + Syria + + + Taiwan + + + Tajikistan + + + Tanzania + + + Thailand + + + Tokelau + + + Tonga + + + Trinidad and Tobago + + + Tunisia + + + Turkey + + + Turkmenistan + + + Turks and Caicos Islands + + + Tuvalu + + + Uganda + + + Ukraine + + + United Arab Emirates + + + Uruguay + + + Uzbekistan + + + Vanuatu + + + Venezuela + + + Vietnam + + + Virgin Islands (British) + + + Virgin Islands (U.S.) + + + Wallis and Futuna + + + Western Sahara + + + Yemen + + + Zambia + + + Zimbabwe + + + Albania + + + Afghanistan + + + Antarctica + + + Bosnia and Herzegovina + + + Bouvet Island + + + British Indian Ocean Territory + + + Bulgaria + + + Cayman Islands + + + Christmas Island + + + Cocos (Keeling) Islands + + + Cook Islands + + + French Guiana + + + French Polynesia + + + French Southern Territories + + + Åland Islands + + diff --git a/install-dev/langs/bn/data/gender.xml b/install-dev/langs/bn/data/gender.xml new file mode 100644 index 000000000..5c3b92391 --- /dev/null +++ b/install-dev/langs/bn/data/gender.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/install-dev/langs/bn/data/group.xml b/install-dev/langs/bn/data/group.xml new file mode 100644 index 000000000..e1bc26538 --- /dev/null +++ b/install-dev/langs/bn/data/group.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/install-dev/langs/bn/data/index.php b/install-dev/langs/bn/data/index.php new file mode 100644 index 000000000..10edbfe91 --- /dev/null +++ b/install-dev/langs/bn/data/index.php @@ -0,0 +1,35 @@ + +* @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 +*/ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../../../../'); +exit; \ No newline at end of file diff --git a/install-dev/langs/bn/data/meta.xml b/install-dev/langs/bn/data/meta.xml new file mode 100644 index 000000000..de0ac4c12 --- /dev/null +++ b/install-dev/langs/bn/data/meta.xml @@ -0,0 +1,159 @@ + + + + ৪০৪-ত্রুটি + এই পেইজ টি খুজে পাওয়া যায় নি + + page-not-found + + + সেরা বিক্রি + আমাদের সেরা বিক্রি + + best-sales + + + আমাদের সাথে যোগাযোগ করুন + আমাদের সাথে যোগাযোগ করতে যোগাযোগ ফর্ম ব্যবহার করুন + + contact-us + + + + <description>PrestaShop দ্বারা চালিত</description> + <keywords/> + <url_rewrite/> + </meta> + <meta id='manufacturer' id_shop='1'> + <title>উতপাদক + উতপাদক তালিকা + + manufacturers + + + নতুন পণ্য + আমাদের নতুন পণ্য + + new-products + + + আপানর পাসওয়ার্ড ভুলে গেছেন? + আপনার নতুন পাসওয়ার্ড মেইল এ পেতে রেজিসট্রেসন মেইল ঠিকানা দিন + + password-recovery + + + মূল্য কমানো + আমাদের বিশেষ পণ্য + + prices-drop + + + সাইট ম্যাপ + ভুলে গেছেন? যা চান তা খুজুন + + sitemap + + + সরবরাহকারী + সরবরাহকারির তালিকা + + supplier + + + ঠিকানা + + + address + + + ঠিকানা + + + addresses + + + লগ ইন + + + login + + + কার্ট + + + cart + + + মূল্য ছার + + + discount + + + অর্ডার ইতিহাস + + + order-history + + + পরিচয় + + + identity + + + আমার আকাউনট + + + my-account + + + অর্ডার ফলো + + + order-follow + + + অর্ডার স্লিপ + + + order-slip + + + অর্ডার + + + order + + + খোজ + + + search + + + দোকান + + + stores + + + অর্ডার + + + quick-order + + + অতিত্থি অনুসরন + + + guest-tracking + + + অর্ডার নিশ্চিত করন + + + order-confirmation + + diff --git a/install-dev/langs/bn/data/order_return_state.xml b/install-dev/langs/bn/data/order_return_state.xml new file mode 100644 index 000000000..259ad4ebb --- /dev/null +++ b/install-dev/langs/bn/data/order_return_state.xml @@ -0,0 +1,18 @@ + + + + নিশ্চিত করনের জন্য অপেক্ষমান + + + প্যাকিং এর জন্য অপেক্ষমাণ + + + প্যাকেজ রিসিভ করা হয়েছে + + + ফেরত বাতিল + + + ফেরত সম্পন্ন + + diff --git a/install-dev/langs/bn/data/order_state.xml b/install-dev/langs/bn/data/order_state.xml new file mode 100644 index 000000000..c189d6afe --- /dev/null +++ b/install-dev/langs/bn/data/order_state.xml @@ -0,0 +1,51 @@ + + + + অপেক্ষমান চেক পেমেন্ট + + + + পেমেন্ট গৃহীত + + + + প্রস্তুতি আগাচ্ছে + + + + বিলি হয়েছে + + + + পৌঁছানো হয়েছে +