Merge branch 'bootstrap' of https://github.com/PrestaShop/PrestaShop into bootstrap

This commit is contained in:
Kevin Granger
2013-11-25 17:17:15 +01:00
33 changed files with 218 additions and 83 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
Contributing
------------
PrestaShop is an open-source e-commerce solution - To contribute to our project, you can make pull requests on the development branch.
PrestaShop is an open-source e-commerce solution - To contribute to our project, you can make pull requests on the bootstrap branch.
If you need some help to make a [pull-request][1]
All contributions must respect [the coding norm][2] and [the commit norm][3] in your pull-request.
All core files you commit in your pull request must have Open Software License (OSL 3.0)
+1 -1
View File
@@ -13,7 +13,7 @@ Tree.prototype =
{
var that = $(this);
this.$element.find("label.tree-toggler").click(
this.$element.find("label.tree-toggler, .icon-folder-close, .icon-folder-open").click(
function ()
{
if ($(this).parent().parent().children("ul.tree").is(":visible"))
@@ -132,11 +132,11 @@
<section class="dash_simulation panel">
<h3><i class="icon-link"></i> {l s="Simulation Mode"}</h3>
<span class="switch prestashop-switch">
<input id="PS_DASHBOARD_SIMULATION_on" class="ps_dashboard_simulation" type="radio" checked="checked" value="1" name="PS_DASHBOARD_SIMULATION">
<input id="PS_DASHBOARD_SIMULATION_on" class="ps_dashboard_simulation" type="radio" {if $PS_DASHBOARD_SIMULATION == 1}checked="checked"{/if} value="1" name="PS_DASHBOARD_SIMULATION">
<label class="radioCheck" for="PS_DASHBOARD_SIMULATION_on">
<i class="icon-check-sign color_success"></i> {l s='Yes'}
</label>
<input id="PS_DASHBOARD_SIMULATION_off" class="ps_dashboard_simulation" type="radio" value="0" name="PS_DASHBOARD_SIMULATION">
<input id="PS_DASHBOARD_SIMULATION_off" class="ps_dashboard_simulation" type="radio" {if $PS_DASHBOARD_SIMULATION == 0}checked="checked"{/if} value="0" name="PS_DASHBOARD_SIMULATION">
<label class="radioCheck" for="PS_DASHBOARD_SIMULATION_off">
<i class="icon-ban-circle color_danger"></i> {l s='No'}
</label>
@@ -146,6 +146,9 @@
// if the tab has not already been loaded, load it now
tabs_manager.display(id, true);
if (btn_name == 'Associations')
handleSaveButtons();
tabs_manager.onLoad(id, function(){
$("#product-tab-content-"+id).show(0, function(){
$(this).trigger('displayed');
@@ -169,7 +172,8 @@
{
$('#desc-product-newCombination').hide();
// if pack is enabled, save button are visible only if pack is valid
handleSaveButtons();
if (btn_name != 'Informations')
handleSaveButtons();
}
hideOtherLanguage(default_language);
$('.label-tooltip').tooltip();
@@ -181,10 +185,6 @@
if ($('#product-tab-content-Associations').hasClass('not-loaded'))
disableSave();
tabs_manager.onLoad('Associations', function(){
handleSaveButtons();
});
$('.confirm_leave').live('click', function(){
// Double quotes are necessary when the translated string has single quotes
return confirm("{l s='You will lose all unsaved modifications. Are you sure that you\'d like to proceed?' js=1}");
@@ -38,6 +38,14 @@
function()
{
$(this).prop("checked", true);
$('select#id_category_default').append('<option value="'+$(this).val()+'">'+($(this).val() !=1 ? $(this).parent().find('label').html() : home)+'</option>');
if ($('select#id_category_default option').length > 0)
{
$('select#id_category_default').closest('.form-group').show();
$('#no_default_category').hide();
}
$(this).parent().addClass("tree-selected");
}
);
@@ -49,6 +57,14 @@
function()
{
$(this).prop("checked", false);
$('select#id_category_default option[value='+$(this).val()+']').remove();
if ($('select#id_category_default option').length == 0)
{
$('select#id_category_default').closest('.form-group').hide();
$('#no_default_category').show();
}
$(this).parent().removeClass("tree-selected");
}
);
@@ -112,5 +128,29 @@
}
);
{/if}
$("#{$id}").find(":input[type=checkbox]").click(
function()
{
if ($(this).prop("checked"))
{
$('select#id_category_default').append('<option value="'+$(this).val()+'">'+($(this).val() !=1 ? $(this).parent().find('label').html() : home)+'</option>');
if ($('select#id_category_default option').length > 0)
{
$('select#id_category_default').closest('.form-group').show();
$('#no_default_category').hide();
}
}
else
{
$('select#id_category_default option[value='+$(this).val()+']').remove();
if ($('select#id_category_default option').length == 0)
{
$('select#id_category_default').closest('.form-group').hide();
$('#no_default_category').show();
}
}
}
);
});
</script>
@@ -57,7 +57,7 @@
},
function(res)
{
$('#categories-treeview').parent().html(res);
$('#categories-tree').parent().parent().html(res);
}
);
});
@@ -23,9 +23,9 @@
* International Registered Trademark & Property of PrestaShop SA
*}
<li class="tree-item{if isset($node['disabled']) && $node['disabled'] == true} tree-item-disable{/if}">
<label class="tree-item-name">
<input type="checkbox" name="categoryBox[]" value="{$node['id_category']}"{if isset($node['disabled']) && $node['disabled'] == true} disabled="disabled"{/if} />
<i class="tree-dot"></i>
{$node['name']}
</label>
<span class="tree-item-name{if isset($node['disabled']) && $node['disabled'] == true} tree-item-name-disable{/if}">
<input type="checkbox" name="categoryBox[]" value="{$node['id_category']}"{if isset($node['disabled']) && $node['disabled'] == true} disabled="disabled"{/if} />
<i class="tree-dot"></i>
<label class="tree-toggler">{$node['name']}</label>
</span>
</li>
+9 -5
View File
@@ -248,9 +248,13 @@ class QqUploadedFileXhr
public function getSize()
{
if (isset($_SERVER['CONTENT_LENGTH']))
return (int)$_SERVER['CONTENT_LENGTH'];
else
throw new Exception('Getting content length is not supported.');
if (isset($_SERVER['CONTENT_LENGTH']) || isset($_SERVER['HTTP_CONTENT_LENGTH']))
{
if (isset($_SERVER['HTTP_CONTENT_LENGTH']))
return (int)$_SERVER['HTTP_CONTENT_LENGTH'];
else
return (int)$_SERVER['CONTENT_LENGTH'];
}
return false;
}
}
}
+3 -3
View File
@@ -87,9 +87,9 @@ class HelperCore
$override_tpl_path = _PS_MODULE_DIR_.$this->module->name.'/views/templates/admin/_configure/'.$this->override_folder.$this->base_folder.$tpl_name;
else
{
if (file_exists($this->context->smarty->getTemplateDir(1).DIRECTORY_SEPARATOR.$this->override_folder.$this->base_folder.$tpl_name))
$override_tpl_path = $this->context->smarty->getTemplateDir(1).DIRECTORY_SEPARATOR.$this->override_folder.$this->base_folder.$tpl_name;
else if (file_exists($this->context->smarty->getTemplateDir(0).DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.$this->override_folder.$this->base_folder.$tpl_name))
if (file_exists($this->context->smarty->getTemplateDir(1).$this->override_folder.$this->base_folder.$tpl_name))
$override_tpl_path = $this->context->smarty->getTemplateDir(1).$this->override_folder.$this->base_folder.$tpl_name;
else if (file_exists($this->context->smarty->getTemplateDir(0).'controllers'.DIRECTORY_SEPARATOR.$this->override_folder.$this->base_folder.$tpl_name))
$override_tpl_path = $this->context->smarty->getTemplateDir(0).'controllers'.DIRECTORY_SEPARATOR.$this->override_folder.$this->base_folder.$tpl_name;
}
@@ -527,6 +527,10 @@ class AdminAttributesGroupsControllerCore extends AdminController
'desc' => $this->l('Add New Attributes')
);
}
$this->toolbar_btn['import'] = array(
'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type=combinations',
'desc' => $this->l('Import')
);
}
public function initToolbarTitle()
+10 -5
View File
@@ -60,8 +60,11 @@ class AdminCustomersControllerCore extends AdminController
$titles_array[$gender->id_gender] = $gender->name;
$this->_select = '
a.date_add, gl.name as title,
IF (YEAR(`birthday`) = 0, "-", (YEAR(CURRENT_DATE)-YEAR(`birthday`)) - (RIGHT(CURRENT_DATE, 5) < RIGHT(birthday, 5))) AS `age`, (
a.date_add, gl.name as title, (
SELECT SUM(total_paid_tax_excl / conversion_rate) FROM '._DB_PREFIX_.'orders o
WHERE o.id_customer = a.id_customer
AND active = 1
) as total_spent, (
SELECT c.date_add FROM '._DB_PREFIX_.'guest g
LEFT JOIN '._DB_PREFIX_.'connections c ON c.id_guest = g.id_guest
WHERE g.id_customer = a.id_customer
@@ -92,10 +95,12 @@ class AdminCustomersControllerCore extends AdminController
'email' => array(
'title' => $this->l('Email address')
),
'age' => array(
'title' => $this->l('Age'),
'total_spent' => array(
'title' => $this->l('Sales'),
'type' => 'price',
'search' => false,
'align' => 'center'
'havingFilter' => true,
'align' => 'right'
),
'active' => array(
'title' => $this->l('Enabled'),
@@ -236,6 +236,7 @@ class AdminDashboardControllerCore extends AdminController
'new_version_url' => Tools::getCurrentUrlProtocolPrefix().'api.prestashop.com/version/check_version.php?v='._PS_VERSION_.'&lang='.$this->context->language->iso_code,
'dashboard_use_push' => Configuration::get('PS_DASHBOARD_USE_PUSH'),
'calendar' => $calendar_helper->generate(),
'PS_DASHBOARD_SIMULATION' => Configuration::get('PS_DASHBOARD_SIMULATION'),
'datepickerFrom' => Tools::getValue('datepickerFrom', $this->context->employee->stats_date_from),
'datepickerTo' => Tools::getValue('datepickerTo', $this->context->employee->stats_date_to)
);
+33 -1
View File
@@ -46,10 +46,14 @@ class AdminOrdersControllerCore extends AdminController
CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`,
osl.`name` AS `osname`,
os.`color`,
IF((SELECT COUNT(so.id_order) FROM `'._DB_PREFIX_.'orders` so WHERE so.id_customer = a.id_customer) > 1, 0, 1) as new';
IF((SELECT COUNT(so.id_order) FROM `'._DB_PREFIX_.'orders` so WHERE so.id_customer = a.id_customer) > 1, 0, 1) as new,
country_lang.name as cname';
$this->_join = '
LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`)
INNER JOIN `'._DB_PREFIX_.'address` address ON address.id_address = a.id_address_delivery
INNER JOIN `'._DB_PREFIX_.'country` country ON address.id_country = country.id_country
INNER JOIN `'._DB_PREFIX_.'country_lang` country_lang ON (country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = '.(int)$this->context->language->id.')
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = a.`current_state`)
LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)$this->context->language->id.')';
$this->_orderBy = 'id_order';
@@ -115,6 +119,34 @@ class AdminOrdersControllerCore extends AdminController
'search' => false,
'remove_onclick' => true)
);
if (Country::isCurrentlyUsed('country', true))
{
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
SELECT DISTINCT c.id_country, cl.`name`
FROM `'._DB_PREFIX_.'orders` o
'.Shop::addSqlAssociation('orders', 'o').'
INNER JOIN `'._DB_PREFIX_.'address` a ON a.id_address = o.id_address_delivery
INNER JOIN `'._DB_PREFIX_.'country` c ON a.id_country = c.id_country
INNER JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country` AND cl.`id_lang` = '.(int)$this->context->language->id.')
ORDER BY cl.name ASC');
$country_array = array();
foreach ($result as $row)
$country_array[$row['id_country']] = $row['name'];
$part1 = array_slice($this->fields_list, 0, 3);
$part2 = array_slice($this->fields_list, 3);
$part1['cname'] = array(
'title' => $this->l('Delivery'),
'type' => 'select',
'list' => $country_array,
'filter_key' => 'country!id_country',
'filter_type' => 'int',
'order_key' => 'cname'
);
$this->fields_list = array_merge($part1, $part2);
}
$this->shopLinkType = 'shop';
$this->shopShareDatas = Shop::SHARE_ORDER;
@@ -2479,6 +2479,11 @@ class AdminProductsControllerCore extends AdminController
'class' => 'toolbar-new'
);
}
else
$this->toolbar_btn['import'] = array(
'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type=products',
'desc' => $this->l('Import')
);
$this->context->smarty->assign('toolbar_scroll', 1);
$this->context->smarty->assign('show_toolbar', 1);
+3 -2
View File
@@ -203,8 +203,9 @@ class AdminShopControllerCore extends AdminController
$children = Category::getChildren($root_category['id_category'], $this->context->language->id);
foreach ($children as $child)
$selected_cat[] = $child['id_category'];
$helper = new Helper();
$this->content = $helper->renderCategoryTree($root_category, $selected_cat);
$helper = new HelperTreeCategories('categories-tree', null, $root_category['id_category']);
$this->content = $helper->setSelectedCategories($selected_cat)->setUseSearch(true)->setUseCheckBox(true)->render();
}
parent::displayAjax();
}
+1 -1
View File
@@ -1,4 +1,4 @@
ID;Active (0/1);Name *;Parent category;Root category (0/1) ;Description;Meta title;Meta keywords;Meta description;URL rewritten;Image URL
ID;Active (0/1);Name *;Parent category;Root category (0/1);Description;Meta title;Meta keywords;Meta description;URL rewritten;Image URL
10;1;iPods;Home;0;Now that you can buy movies from the iTunes Store and sync them to your iPod, the whole world is your theater.;Meta title-iPods;Meta keywords-iPods;Meta description-iPods;music-ipods;http://yourlinktotheimage.com/img1000.jpg
11;1;Accessories;Home;0;Wonderful accessories for your iPod;Meta title-Accessories;Meta keywords-Accessories;Meta description-Accessories;accessories-ipod;http://yourlinktotheimage.com/img1001.jpg
12;1;Laptops;Home;0;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.;Meta title-Laptops;Meta keywords-Laptops;Meta description-Laptops;laptops;http://yourlinktotheimage.com/img1002.jpg
1 ID Active (0/1) Name * Parent category Root category (0/1)  Root category (0/1) Description Meta title Meta keywords Meta description URL rewritten Image URL
2 10 1 iPods Home 0 0 Now that you can buy movies from the iTunes Store and sync them to your iPod, the whole world is your theater. Meta title-iPods Meta keywords-iPods Meta description-iPods music-ipods http://yourlinktotheimage.com/img1000.jpg
3 11 1 Accessories Home 0 0 Wonderful accessories for your iPod Meta title-Accessories Meta keywords-Accessories Meta description-Accessories accessories-ipod http://yourlinktotheimage.com/img1001.jpg
4 12 1 Laptops Home 0 0 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. Meta title-Laptops Meta keywords-Laptops Meta description-Laptops laptops http://yourlinktotheimage.com/img1002.jpg
+1 -1
View File
@@ -1,4 +1,4 @@
Product ID*;Attribute (Name:Type:Position)*;Value (Value:Position)*;Supplier reference;Reference;EAN13;UPC;Wholesale price;Impact on price;Ecotax;Quantity;Minimal quantity;Impact on weight;Default (0 = No, 1 = Yes);Image position;Image URL;Delete existing images (0 = No, 1 = Yes);ID / Name of shop 
Product ID*;Attribute (Name:Type:Position)*;Value (Value:Position)*;Supplier reference;Reference;EAN13;UPC;Wholesale price;Impact on price;Ecotax;Quantity;Minimal quantity;Impact on weight;Default (0 = No, 1 = Yes);Image position;Image URL;Delete existing images (0 = No, 1 = Yes);ID / Name of shop
1;Color:color:0, Disk space:select:1;Blue:0, 16GB:1;RF-Nano-Blue-16GB;RP-Nano-Blue-16GB;0000080446392;;100;40;;10;1;0;0;1;http://youdomain.com/img.jpg;1;
1;Color:color:0, Disk space:select:1;Blue:0, 8GB:1;RF-Nano-Blue-8GB;RP-Nano-Blue-8GB;0000080446393;;80;0;;10;1;0;0;2;http://youdomain.com/img.jpg;1;
1;Color:color:0, Disk space:select:1;Yellow:0, 16GB:1;RF-Nano-Yellow-16GB;RP-Nano-Yellow-16GB;0000080446394;;100;40;;10;1;0;0;3;http://youdomain.com/img.jpg;1;
1 Product ID* Attribute (Name:Type:Position)* Value (Value:Position)* Supplier reference Reference EAN13 UPC Wholesale price Impact on price Ecotax Quantity Minimal quantity Impact on weight Default (0 = No, 1 = Yes) Image position Image URL Delete existing images (0 = No, 1 = Yes) ID / Name of shop  ID / Name of shop
2 1 Color:color:0, Disk space:select:1 Blue:0, 16GB:1 RF-Nano-Blue-16GB RP-Nano-Blue-16GB 0000080446392 100 40 10 1 0 0 1 http://youdomain.com/img.jpg 1
3 1 Color:color:0, Disk space:select:1 Blue:0, 8GB:1 RF-Nano-Blue-8GB RP-Nano-Blue-8GB 0000080446393 80 0 10 1 0 0 2 http://youdomain.com/img.jpg 1
4 1 Color:color:0, Disk space:select:1 Yellow:0, 16GB:1 RF-Nano-Yellow-16GB RP-Nano-Yellow-16GB 0000080446394 100 40 10 1 0 0 3 http://youdomain.com/img.jpg 1
+1 -1
View File
@@ -1,4 +1,4 @@
ID;Active (0/1);Name *;Categories (x,y,z...);Price tax excluded or Price tax included;Tax rules ID;Wholesale price;On sale (0/1);Discount amount;Discount percent;Discount from (yyyy-mm-dd);Discount to (yyyy-mm-dd);Reference #;Supplier reference #;Supplier;Manufacturer;EAN13;UPC;Ecotax;;;;Weight;Quantity;;;;;;Short description;Description;Tags (x,y,z...);Meta title;Meta keywords;Meta description;URL rewritten;Text when in stock;Text when backorder allowed;Available for order (0 = No, 1 = Yes);Product available date;Product creation date;Show price (0 = No, 1 = Yes);Image URLs (x,y,z...);Delete existing images (0 = No, 1 = Yes);Feature(Name:Value:Position);Available online only (0 = No, 1 = Yes);Condition;Customizable (0 = No, 1 = Yes);Uploadable files (0 = No, 1 = Yes);Text fields (0 = No, 1 = Yes);Out_of_stock;Advanced stock management;ID / Name of shop 
ID;Active (0/1);Name *;Categories (x,y,z...);Price tax excluded or Price tax included;Tax rules ID;Wholesale price;On sale (0/1);Discount amount;Discount percent;Discount from (yyyy-mm-dd);Discount to (yyyy-mm-dd);Reference #;Supplier reference #;Supplier;Manufacturer;EAN13;UPC;Ecotax;Width;Height;Depth;Weight;Quantity;Minimal quantity;Visibility;Additional shipping cost;Unity;Unit price ratio;Short description;Description;Tags (x,y,z...);Meta title;Meta keywords;Meta description;URL rewritten;Text when in stock;Text when backorder allowed;Available for order (0 = No, 1 = Yes);Product available date;Product creation date;Show price (0 = No, 1 = Yes);Image URLs (x,y,z...);Delete existing images (0 = No, 1 = Yes);Feature(Name:Value:Position);Available online only (0 = No, 1 = Yes);Condition;Customizable (0 = No, 1 = Yes);Uploadable files (0 = No, 1 = Yes);Text fields (0 = No, 1 = Yes);Out_of_stock;Advanced stock management;ID / Name of shop
1;1;iPod Nano;iPods;100;1;80;1;;5.5;2013-06-01;2018-12-31;RP-demo_1;RF-demo_1;Applestore;Apple;1234567890123;;1;0.6;0.2;0.4;0.068357;160;1;;;;;<p>New design.</p>;<p>New design.</p>;apple, ipod, nano;Meta title-Nano;Meta keywords-Nano;Meta description-Nano;iPod-Nano;In Stock;Current supply. Ordering availlable;1;2013-03-01;2013-01-01;1;http://localhost/prestashop_1.5.6.0/img/p/1/5/15.jpg;0;;0;new;0;0;0;0;0;
2;1;iPod shuffle;iPods;60;1;40;1;;;2013-06-01;2018-12-31;RP-demo_2;RF-demo_2;Applestore;Apple;1234567890123;;1;0.1;0.1;0.1;0.027563;120;1;both;;;;<p>New design.</p>;<p>New design.</p>;ipod, shuffle;Meta title-Shuffle;Meta keywords-Shuffle;Meta description-Shuffle;iPod-shuffle;In Stock;Current supply. Ordering availlable;1;2013-03-01;2013-01-02;1;http://localhost/prestashop_1.5.6.0/img/p/2/3/23.jpg;0;;0;new;0;0;0;0;0;
3;1;MacBook Air;Laptops;1500;1;1000;1;100;;2013-06-01;2018-12-31;RP-demo_3;RF-demo_3;Applestore;Apple;1234567890123;;2;1.31;0.3;1;2.976846;400;1;catalog;;;;<p>New design.</p>;<p>New design.</p>;MacBook, Air;Meta title-McBookAir;Meta keywords-McBookAir;Meta description-McBookAir;MacBook-Air;In Stock;Current supply. Ordering availlable;1;2013-03-01;2013-01-03;1;http://localhost/prestashop_1.5.6.0/img/p/1/1.jpg;1;;0;new;0;0;0;0;0;
1 ID Active (0/1) Name * Categories (x,y,z...) Price tax excluded or Price tax included Tax rules ID Wholesale price On sale (0/1) Discount amount Discount percent Discount from (yyyy-mm-dd) Discount to (yyyy-mm-dd) Reference # Supplier reference # Supplier Manufacturer EAN13 UPC Ecotax Width Height Depth Weight Quantity Minimal quantity Visibility Additional shipping cost Unity Unit price ratio Short description Description Tags (x,y,z...) Meta title Meta keywords Meta description URL rewritten Text when in stock Text when backorder allowed Available for order (0 = No, 1 = Yes) Product available date Product creation date Show price (0 = No, 1 = Yes) Image URLs (x,y,z...) Delete existing images (0 = No, 1 = Yes) Feature(Name:Value:Position) Available online only (0 = No, 1 = Yes) Condition Customizable (0 = No, 1 = Yes) Uploadable files (0 = No, 1 = Yes) Text fields (0 = No, 1 = Yes) Out_of_stock Advanced stock management ID / Name of shop  ID / Name of shop
2 1 1 iPod Nano iPods 100 1 80 1 5.5 2013-06-01 2018-12-31 RP-demo_1 RF-demo_1 Applestore Apple 1234567890123 1 0.6 0.6 0.2 0.2 0.4 0.4 0.068357 160 1 1 <p>New design.</p> <p>New design.</p> apple, ipod, nano Meta title-Nano Meta keywords-Nano Meta description-Nano iPod-Nano In Stock Current supply. Ordering availlable 1 2013-03-01 2013-01-01 1 http://localhost/prestashop_1.5.6.0/img/p/1/5/15.jpg 0 0 new 0 0 0 0 0
3 2 1 iPod shuffle iPods 60 1 40 1 2013-06-01 2018-12-31 RP-demo_2 RF-demo_2 Applestore Apple 1234567890123 1 0.1 0.1 0.1 0.1 0.1 0.1 0.027563 120 1 1 both both <p>New design.</p> <p>New design.</p> ipod, shuffle Meta title-Shuffle Meta keywords-Shuffle Meta description-Shuffle iPod-shuffle In Stock Current supply. Ordering availlable 1 2013-03-01 2013-01-02 1 http://localhost/prestashop_1.5.6.0/img/p/2/3/23.jpg 0 0 new 0 0 0 0 0
4 3 1 MacBook Air Laptops 1500 1 1000 1 100 2013-06-01 2018-12-31 RP-demo_3 RF-demo_3 Applestore Apple 1234567890123 2 1.31 1.31 0.3 0.3 1 1 2.976846 400 1 1 catalog catalog <p>New design.</p> <p>New design.</p> MacBook, Air Meta title-McBookAir Meta keywords-McBookAir Meta description-McBookAir MacBook-Air In Stock Current supply. Ordering availlable 1 2013-03-01 2013-01-03 1 http://localhost/prestashop_1.5.6.0/img/p/1/1.jpg 1 0 new 0 0 0 0 0
+4 -4
View File
@@ -1,4 +1,4 @@
ID;Active (0/1);Name *;Description;Short description;Meta title;Meta keywords;Meta description
1;1;Applestore;<p>The Apple Store is a chain of retail stores owned and operated by Apple Inc., dealing in computers and consumer electronics. The stores sell Macintosh personal computers, software, iPods, iPads, iPhones, third-party accessories, and other consumer electronics such as Apple TV. Some high profile stores feature a Theatre for presentations and workshops and a Studio for training with Apple products; all stores offer a Genius Bar for technical support and repairs, as well as free workshops available to the public. Under the leadership of Ron Johnson, the former Senior Vice President of Retail Operations, the Apple Stores have, according to an article in the New York Times, been responsible for "[turning] the boring computer sales floor into a sleek playroom filled with gadgets".</p>;;Meta title-Applestore;Meta keywords-Applestore;Meta description-Applestore
2;1;Shure Online Store;<p><em>- No description -</em></p>;;Meta title-Shure Online Store;Meta keywords-Shure Online Store;Meta description-Shure Online Store
3;1;Nippon Electronic Import;<p><em>- No description -</em></p>;;Meta title-Nippon Electronic Import;Meta keywords-Nippon Electronic Import;Meta description-Nippon Electronic Import
ID;Active (0/1);Name *;Description;Short description;Meta title;Meta keywords;Meta description;Image URL
1;1;Applestore;<p>The Apple Store is a chain of retail stores owned and operated by Apple Inc., dealing in computers and consumer electronics. The stores sell Macintosh personal computers, software, iPods, iPads, iPhones, third-party accessories, and other consumer electronics such as Apple TV. Some high profile stores feature a Theatre for presentations and workshops and a Studio for training with Apple products; all stores offer a Genius Bar for technical support and repairs, as well as free workshops available to the public. Under the leadership of Ron Johnson, the former Senior Vice President of Retail Operations, the Apple Stores have, according to an article in the New York Times, been responsible for "[turning] the boring computer sales floor into a sleek playroom filled with gadgets".</p>;Meta title-Applestore;Meta keywords-Applestore;Meta description-Applestore;http://localhost/prestashop/img/su/Pic-of-this-supplier.jpg
2;1;Shure Online Store;<p><em>- No description -</em></p>;<p><em>- No description -</em></p>;Meta title-Shure Online Store;Meta keywords-Shure Online Store;Meta description-Shure Online Store;http://localhost/prestashop/img/su/Pic-of-this-supplier-2.jpg
3;1;Nippon Electronic Import;<p><em>- No description -</em></p>;<p><em>- No description -</em></p>;Meta title-Nippon Electronic Import;Meta keywords-Nippon Electronic Import;Meta description-Nippon Electronic Import;http://localhost/prestashop/img/su/Pic-of-this-supplier-3.jpg
Can't render this file because it contains an unexpected character in line 2 and column 718.
+16 -13
View File
@@ -74,6 +74,9 @@ class InstallControllerHttpSystem extends InstallControllerHttp
if (!isset($this->tests['optional']))
$this->tests['optional'] = $this->model_system->checkOptionalTests();
if (!is_callable('getenv') || !($user = @getenv('APACHE_RUN_USER')))
$user = 'Apache';
// Generate display array
$this->tests_render = array(
'required' => array(
@@ -96,21 +99,21 @@ class InstallControllerHttpSystem extends InstallControllerHttp
)
),
array(
'title' => $this->l('Recursive write permissions on files and folders:'),
'title' => $this->l('Permissions on files and folders'),
'success' => 1,
'checks' => array(
'config_dir' => '~/config/',
'cache_dir' => '~/cache/',
'log_dir' => '~/log/',
'img_dir' => '~/img/',
'mails_dir' => '~/mails/',
'module_dir' => '~/modules/',
'theme_lang_dir' => '~/themes/default/lang/',
'theme_pdf_lang_dir' => '~/themes/default/pdf/lang/',
'theme_cache_dir' => '~/themes/default/cache/',
'translations_dir' => '~/translations/',
'customizable_products_dir' => '~/upload/',
'virtual_products_dir' => '~/download/'
'config_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/config/'),
'cache_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/cache/'),
'log_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/log/'),
'img_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/img/'),
'mails_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/mails/'),
'module_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/modules/'),
'theme_lang_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/themes/default/lang/'),
'theme_pdf_lang_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/themes/default/pdf/lang/'),
'theme_cache_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/themes/default/cache/'),
'translations_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/translations/'),
'customizable_products_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/upload/'),
'virtual_products_dir' => $this->l('Recursive write permissions for %1$s user on %2$s', $user, '~/download/')
)
),
),
-1
View File
@@ -145,7 +145,6 @@ product_tabs['Combinations'] = new function(){
this.bindDefault = function(){
$('table[id=combinations-list]').delegate('a.default', 'click', function(e){
e.preventDefault();
console.log('ok');
self.defaultProductAttribute(this.href, this);
});
};
+12 -2
View File
@@ -123,7 +123,7 @@ $(document).ready(function()
hideFilterValueAction(this);
});
// To be sure there is no other events attached to the selectPrductSort, change the ID
// To be sure there is no other events attached to the selectProductSort, change the ID
var id = 1;
while ($('#selectPrductSort').length) { // Because ids are duplicated
// Unbind event change on #selectPrductSort
@@ -134,8 +134,18 @@ $(document).ready(function()
$('label[for=selectPrductSort]').attr('for', 'selectPrductSort'+id);
id++;
}
while ($('#selectProductSort').length) { // Because ids are duplicated
// Unbind event change on #selectProductSort
$('#selectProductSort').unbind('change');
$('#selectProductSort').attr('onchange', '');
$('#selectProductSort').addClass('selectProductSort');
$('#selectProductSort').attr('id', 'selectProductSort'+id);
$('label[for=selectProductSort]').attr('for', 'selectProductSort'+id);
id++;
}
// Since 1.5, event is add to .selectProductSort and not to #selectPrductSort
// Since 1.5, event is add to .selectProductSort and not to #selectProductSort
setTimeout(function() {
$('.selectProductSort').unbind('change');
}, 100);
+22 -3
View File
@@ -1347,7 +1347,9 @@ class BlockLayered extends Module
$this->context->controller->addJS(($this->_path).'blocklayered.js');
$this->context->controller->addJQueryUI('ui.slider');
$this->context->controller->addJS(_PS_JS_DIR_.'jquery/jquery-ui-1.8.10.custom.min.js');
$this->context->controller->addJQueryUI('ui.slider');
$this->context->controller->addCSS(_PS_CSS_DIR_.'jquery-ui-1.8.10.custom.css"');
$this->context->controller->addCSS(($this->_path).'blocklayered-15.css', 'all');
$this->context->controller->addJQueryPlugin('scrollTo');
@@ -1435,7 +1437,7 @@ class BlockLayered extends Module
//<![CDATA[
$(document).ready(function()
{
$(\'#selectPrductSort\').unbind(\'change\').bind(\'change\', function()
$(\'#selectProductSort\').unbind(\'change\').bind(\'change\', function()
{
reloadContent();
})
@@ -2863,7 +2865,7 @@ class BlockLayered extends Module
AND '.$alias.'.active = 1 AND '.$alias.'.`visibility` IN ("both", "catalog")';
$sql_query['group'] = ') count_products
FROM '._DB_PREFIX_.'category c
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = c.id_category AND cl.id_lang = '.$id_lang.')
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = c.id_category AND cl.`id_shop` = '.(int)Context::getContext()->shop->id.' and cl.id_lang = '.$id_lang.')
WHERE c.nleft > '.(int)$parent->nleft.'
AND c.nright < '.(int)$parent->nright.'
'.($depth ? 'AND c.level_depth <= '.($parent->level_depth+(int)$depth) : '').'
@@ -3166,6 +3168,23 @@ class BlockLayered extends Module
if (isset($selected_filters['id_feature'][$feature['id_feature_value']]))
$feature_array[$feature['id_feature']]['values'][$feature['id_feature_value']]['checked'] = true;
}
//Natural sort
foreach ($feature_array as $key => $value)
{
$temp = array();
foreach ($feature_array[$key]['values'] as $keyint => $valueint)
$temp[$keyint] = $valueint['name'];
natcasesort($temp);
$temp2 = array();
foreach ($temp as $keytemp => $valuetemp)
$temp2[$keytemp] = $feature_array[$key]['values'][$keytemp];
$feature_array[$key]['values'] = $temp2;
}
$filter_blocks = array_merge($filter_blocks, $feature_array);
}
break;
+2 -2
View File
@@ -94,7 +94,7 @@ param_product_url = '';
{if $value.nbr || !$hide_0_values}
<li class="nomargin {if $smarty.foreach.fe.index >= $filter.filter_show_limit}hiddable{/if}">
{if isset($filter.is_color_group) && $filter.is_color_group}
<input class="color-option {if isset($value.checked) && $value.checked}on{/if} {if !$value.nbr}disable{/if}" type="button" name="layered_{$filter.type_lite}_{$id_value}" rel="{$id_value}_{$filter.id_key}" id="layered_id_attribute_group_{$id_value}" {if !$value.nbr}disabled="disabled"{/if} style="background: {if isset($value.color)}{if file_exists($col_img_dir|cat:$id_value|cat:'.jpg')}url({$img_col_dir}{$id_value}.jpg){else}{$value.color}{/if}{else}#CCC{/if};" />
<input class="color-option {if isset($value.checked) && $value.checked}on{/if} {if !$value.nbr}disable{/if}" type="button" name="layered_{$filter.type_lite}_{$id_value}" rel="{$id_value}_{$filter.id_key}" id="layered_id_attribute_group_{$id_value}" {if !$value.nbr}disabled="disabled"{/if} style="background: {if isset($value.color)}{if file_exists($col_img_dir|cat:$id_value|cat:'.jpg')}url({$img_col_dir}{$id_value}.jpg){else}{$value.color}{/if}{else}#CCC{/if};" title="{$value.name|escape:html:'UTF-8'}" />
{if isset($value.checked) && $value.checked}<input type="hidden" name="layered_{$filter.type_lite}_{$id_value}" value="{$id_value}" />{/if}
{else}
<input type="checkbox" class="checkbox" name="layered_{$filter.type_lite}_{$id_value}" id="layered_{$filter.type_lite}{if $id_value || $filter.type == 'quantity'}_{$id_value}{/if}" value="{$id_value}{if $filter.id_key}_{$filter.id_key}{/if}"{if isset($value.checked)} checked="checked"{/if}{if !$value.nbr} disabled="disabled"{/if} />
@@ -115,7 +115,7 @@ param_product_url = '';
{if $value.nbr || !$hide_0_values}
<li class="nomargin {if $smarty.foreach.fe.index >= $filter.filter_show_limit}hiddable{/if}">
{if isset($filter.is_color_group) && $filter.is_color_group}
<input class="radio color-option {if isset($value.checked) && $value.checked}on{/if} {if !$value.nbr}disable{/if}" type="button" name="layered_{$filter.type_lite}_{$id_value}" rel="{$id_value}_{$filter.id_key}" id="layered_id_attribute_group_{$id_value}" {if !$value.nbr}disabled="disabled"{/if} style="background: {if isset($value.color)}{if file_exists($col_img_dir|cat:$id_value|cat:'.jpg')}url({$img_col_dir}{$id_value}.jpg){else}{$value.color}{/if}{else}#CCC{/if};"/>
<input class="radio color-option {if isset($value.checked) && $value.checked}on{/if} {if !$value.nbr}disable{/if}" type="button" name="layered_{$filter.type_lite}_{$id_value}" rel="{$id_value}_{$filter.id_key}" id="layered_id_attribute_group_{$id_value}" {if !$value.nbr}disabled="disabled"{/if} style="background: {if isset($value.color)}{if file_exists($col_img_dir|cat:$id_value|cat:'.jpg')}url({$img_col_dir}{$id_value}.jpg){else}{$value.color}{/if}{else}#CCC{/if};" title="{$value.name|escape:html:'UTF-8'}"/>
{if isset($value.checked) && $value.checked}<input type="hidden" name="layered_{$filter.type_lite}_{$id_value}" value="{$id_value}" />{/if}
{else}
<input type="radio" class="radio layered_{$filter.type_lite}_{$id_value}" name="layered_{$filter.type_lite}{if $filter.id_key}_{$filter.id_key}{else}_1{/if}" id="layered_{$filter.type_lite}{if $id_value || $filter.type == 'quantity'}_{$id_value}{if $filter.id_key}_{$filter.id_key}{/if}{/if}" value="{$id_value}{if $filter.id_key}_{$filter.id_key}{/if}"{if isset($value.checked)} checked="checked"{/if}{if !$value.nbr} disabled="disabled"{/if} />
+3 -3
View File
@@ -38,7 +38,7 @@ class BlockWishList extends Module
{
$this->name = 'blockwishlist';
$this->tab = 'front_office_features';
$this->version = 0.3;
$this->version = 0.4;
$this->author = 'PrestaShop';
$this->need_instance = 0;
@@ -258,7 +258,7 @@ class BlockWishList extends Module
$this->_html .= '
<tr>
<td class="first_item">
<img src="'.$this->context->link->getImageLink($product['link_rewrite'], $product['cover'], 'small').'" alt="'.htmlentities($product['name'], ENT_COMPAT, 'UTF-8').'" style="float:left;" />
<img src="'.$this->context->link->getImageLink($product['link_rewrite'], $product['cover'], ImageType::getFormatedName('small')).'" alt="'.htmlentities($product['name'], ENT_COMPAT, 'UTF-8').'" style="float:left;" />
'.$product['name'];
if (isset($product['attributes_small']))
$this->_html .= '<br /><i>'.htmlentities($product['attributes_small'], ENT_COMPAT, 'UTF-8').'</i>';
@@ -409,7 +409,7 @@ class BlockWishList extends Module
foreach ($products as $key => $val)
{
$image = Image::getCover($val['id_product']);
$products[$key]['image'] = $this->context->link->getImageLink($val['link_rewrite'], $image['id_image'], 'small');
$products[$key]['image'] = $this->context->link->getImageLink($val['link_rewrite'], $image['id_image'], ImageType::getFormatedName('small'));
}
$fields_list = array(
+1 -1
View File
@@ -2,7 +2,7 @@
<module>
<name>blockwishlist</name>
<displayName><![CDATA[Wishlist block]]></displayName>
<version><![CDATA[0.3]]></version>
<version><![CDATA[0.4]]></version>
<description><![CDATA[Adds a block containing the customer&#039;s wishlists.]]></description>
<author><![CDATA[PrestaShop]]></author>
<tab><![CDATA[front_office_features]]></tab>
+1 -1
View File
@@ -52,7 +52,7 @@
<div class="clearfix">
<div class="product_image">
<a href="{$link->getProductlink($product.id_product, $product.link_rewrite, $product.category_rewrite)|escape:'html'}" title="{l s='Product detail' mod='blockwishlist'}">
<img src="{$link->getImageLink($product.link_rewrite, $product.cover, 'medium_default')|escape:'html'}" alt="{$product.name|escape:'html':'UTF-8'}" />
<img src="{$link->getImageLink($product.link_rewrite, $product.cover, ImageType::getFormatedName('medium'))|escape:'html'}" alt="{$product.name|escape:'html':'UTF-8'}" />
</a>
</div>
<div class="product_infos">
+1 -1
View File
@@ -46,7 +46,7 @@
<div class="clearfix">
<div class="product_image">
<a href="{$link->getProductlink($product.id_product, $product.link_rewrite, $product.category_rewrite)|escape:'html'}" title="{l s='Product detail' mod='blockwishlist'}">
<img src="{$link->getImageLink($product.link_rewrite, $product.cover, 'medium_default')|escape:'html'}" alt="{$product.name|escape:'html':'UTF-8'}" />
<img src="{$link->getImageLink($product.link_rewrite, $product.cover, ImageType::getFormatedName('medium'))|escape:'html'}" alt="{$product.name|escape:'html':'UTF-8'}" />
</a>
</div>
<div class="product_infos">
+13 -13
View File
@@ -62,11 +62,11 @@
var priceDisplayMethod = {$priceDisplay};
var roundMode = {$roundMode};
</script>
<link href="{$css_dir}/bootstrap_lib/bootstrap.css" rel="stylesheet" type="text/css" media="all" />
<link href="{$css_dir}/font-awesome.css" rel="stylesheet" type="text/css" media="all" />
<link href="{$css_dir}/jquery/uniform.default.css" rel="stylesheet" type="text/css" media="all" />
<link href="{$css_dir}/highdpi.css" rel="stylesheet" media="only screen and (-webkit-min-device-pixel-ratio: 2)" />
<link href="{$css_dir}/jquery/footable.core.css" rel="stylesheet" type="text/css" media="all" />
<link href="{$css_dir}bootstrap_lib/bootstrap.css" rel="stylesheet" type="text/css" media="all" />
<link href="{$css_dir}font-awesome.css" rel="stylesheet" type="text/css" media="all" />
<link href="{$css_dir}jquery/uniform.default.css" rel="stylesheet" type="text/css" media="all" />
<link href="{$css_dir}highdpi.css" rel="stylesheet" media="only screen and (-webkit-min-device-pixel-ratio: 2)" />
<link href="{$css_dir}jquery/footable.core.css" rel="stylesheet" type="text/css" media="all" />
<link href="{$css_dir}jquery/jquery.bxslider.css" rel="stylesheet" type="text/css" media="all" />
<link href='//fonts.googleapis.com/css?family=Open+Sans:400,400italic,300italic,300,600,600italic,700,700italic,800,800italic' rel='stylesheet' type='text/css' />
{if isset($css_files)}
@@ -79,18 +79,18 @@
<script type="text/javascript" src="{$js_uri}"></script>
{/foreach}
{/if}
<script src="{$js_dir}/tools/bootstrap.min.js"></script>
<script src="{$js_dir}tools/bootstrap.min.js"></script>
<!--[if IE 8]><html class="no-js lt-ie9 ie8" lang="{$lang_iso}">
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<script src="{$js_dir}/tools/jquery.total-storage.min.js"></script>
<script src="{$js_dir}/jquery/jquery.uniform-modify.js"></script>
<script src="{$js_dir}/jquery/highdpi.js"></script>
<script src="{$js_dir}/jquery/jquery.bxslider.js"></script>
<script src="{$js_dir}/jquery/footable.js"></script>
<script src="{$js_dir}/jquery/footable.sort.js"></script>
<script src="{$js_dir}/jquery/resonsive_utilites.js"></script>
<script src="{$js_dir}tools/jquery.total-storage.min.js"></script>
<script src="{$js_dir}jquery/jquery.uniform-modify.js"></script>
<script src="{$js_dir}jquery/highdpi.js"></script>
<script src="{$js_dir}jquery/jquery.bxslider.js"></script>
<script src="{$js_dir}jquery/footable.js"></script>
<script src="{$js_dir}jquery/footable.sort.js"></script>
<script src="{$js_dir}jquery/resonsive_utilites.js"></script>
{$HOOK_HEADER}
</head>
@@ -1073,6 +1073,8 @@ $(window).load(function () {
$("select.form-control,input[type='checkbox']:not(.comparator), input[type='radio'],input#id_carrier2, input[type='file']").uniform();
$("#uniform-selectPrductSort1").innerWidth(0);
$("#uniform-selectPrductSort1 span").innerWidth(0);
$("#uniform-selectProductSort1").innerWidth(0);
$("#uniform-selectProductSort1 span").innerWidth(0);
});
@@ -123,7 +123,7 @@ $(document).ready(function()
hideFilterValueAction(this);
});
// To be sure there is no other events attached to the selectPrductSort, change the ID
// To be sure there is no other events attached to the selectProductSort, change the ID
var id = 1;
while ($('#selectPrductSort').length) { // Because ids are duplicated
// Unbind event change on #selectPrductSort
@@ -134,6 +134,16 @@ $(document).ready(function()
$('label[for=selectPrductSort]').attr('for', 'selectPrductSort'+id);
id++;
}
while ($('#selectProductSort').length) { // Because ids are duplicated
// Unbind event change on #selectProductSort
$('#selectProductSort').unbind('change');
$('#selectProductSort').attr('onchange', '');
$('#selectProductSort').addClass('selectProductSort');
$('#selectProductSort').attr('id', 'selectProductSort'+id);
$('label[for=selectProductSort]').attr('for', 'selectProductSort'+id);
id++;
}
// Since 1.5, event is add to .selectProductSort and not to #selectPrductSort
setTimeout(function() {
@@ -40,7 +40,7 @@
//<![CDATA[
$(document).ready(function()
{
$('.selectPrductSort').change(function()
$('.selectProductSort').change(function()
{
var requestSortProducts = '{$request}';
var splitData = $(this).val().split(':');
@@ -53,7 +53,7 @@
<div class="{$container_class}">
<form id="productsSortForm" action="{$request|escape:'html':'UTF-8'}">
<select class="selectPrductSort">
<select class="selectProductSort">
<option value="{$orderbydefault|escape:'html':'UTF-8'}:{$orderwaydefault|escape:'html':'UTF-8'}" {if $orderby eq $orderbydefault}selected="selected"{/if}>{l s='Sort by'}</option>
{if !$PS_CATALOG_MODE}
<option value="price:asc" {if $orderby eq 'price' AND $orderway eq 'asc'}selected="selected"{/if}>{l s='Price: Lowest first'}</option>
+2 -2
View File
@@ -60,8 +60,8 @@ $(document).ready(function(){
{/if}
<form id="productsSortForm{if isset($paginationId)}_{$paginationId}{/if}" action="{$request|escape:'html':'UTF-8'}" class="productsSortForm">
<div class="select selector1">
<label for="selectPrductSort{if isset($paginationId)}_{$paginationId}{/if}">{l s='Sort by'}</label>
<select id="selectPrductSort{if isset($paginationId)}_{$paginationId}{/if}" class="selectProductSort form-control">
<label for="selectProductSort{if isset($paginationId)}_{$paginationId}{/if}">{l s='Sort by'}</label>
<select id="selectProductSort{if isset($paginationId)}_{$paginationId}{/if}" class="selectProductSort form-control">
<option value="{$orderbydefault|escape:'html':'UTF-8'}:{$orderwaydefault|escape:'html':'UTF-8'}" {if $orderby eq $orderbydefault}selected="selected"{/if}>{l s='--'}</option>
{if !$PS_CATALOG_MODE}
<option value="price:asc" {if $orderby eq 'price' AND $orderway eq 'asc'}selected="selected"{/if}>{l s='Price: Lowest first'}</option>