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

This commit is contained in:
Kevin Granger
2013-10-04 19:13:13 +02:00
31 changed files with 349 additions and 187 deletions
@@ -7,25 +7,29 @@
</label>
<div class="col-lg-8">
{foreach from=$languages item=language}
{if $languages|count > 1}
<div class="row">
<div class="translatable-field lang-{$language.id_lang}" {if $language.id_lang != $id_lang_default}style="display:none"{/if}>
<div class="input-group col-lg-12">
<div class="col-lg-9">
{/if}
<input id="name_{$language.id_lang|intval}" type="text" name="name_{$language.id_lang|intval}" value="{$currentTab->getFieldValue($currentObject, 'name', $language.id_lang|intval)|escape:html:'UTF-8'}">
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<img src="{$base_url}/img/l/{$language.id_lang|intval}.jpg" alt="">
{$language.iso_code}
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
{foreach from=$languages item=language}
<li><a href="javascript:hideOtherLanguage({$language.id_lang});" tabindex="-1"><img src="{$base_url}/img/l/{$language.id_lang|intval}.jpg" alt=""> {$language.name}</a></li>
{/foreach}
</ul>
</div>
{if $languages|count > 1}
</div>
<div class="col-lg-2">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<img src="{$base_url}/img/l/{$language.id_lang|intval}.jpg" alt="">
{$language.iso_code}
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
{foreach from=$languages item=language}
<li><a href="javascript:hideOtherLanguage({$language.id_lang});" tabindex="-1"><img src="{$base_url}/img/l/{$language.id_lang|intval}.jpg" alt=""> {$language.name}</a></li>
{/foreach}
</ul>
</div>
</div>
</div>
{/if}
{/foreach}
</div>
</div>
@@ -68,14 +68,17 @@
</td>
<td>
{foreach from=$languages key=k item=language}
{if $languages|count > 1}
<div class="row translatable-field lang-{$language.id_lang}">
<div class="col-lg-9">
{/if}
<textarea
class="custom_{$available_feature.id_feature}_{$language.id_lang}"
class="custom_{$available_feature.id_feature}_{$language.id_lang} textarea-autosize"
name="custom_{$available_feature.id_feature}_{$language.id_lang}"
cols="40"
rows="1"
onkeyup="if (isArrowKey(event)) return ;$('#feature_{$available_feature.id_feature}_value').val(0);" >{$available_feature.val[$k].value|escape:'htmlall':'UTF-8'|default:""}</textarea>
{if $languages|count > 1}
</div>
<div class="col-lg-3">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
@@ -93,6 +96,7 @@
</ul>
</div>
</div>
{/if}
{/foreach}
</td>
@@ -112,4 +116,5 @@
{/if}
<script type="text/javascript">
hideOtherLanguage({$default_language});
$(".textarea-autosize").autosize();
</script>
@@ -45,9 +45,9 @@
success: function(jsonData){
if (!jsonData.has_errors)
{
if (jsonData.value)
if (jsonData.value != undefined)
$('#{$id|addslashes} .value').html(jsonData.value);
if (jsonData.data)
if (jsonData.data != undefined)
{
$("#{$id|addslashes} .boxchart svg").remove();
set_d3_{$id|str_replace:'-':'_'|addslashes}(jsonData.data);
@@ -230,13 +230,18 @@
<div class="col-lg-9">
<div class="row">
{foreach $field['languages'] AS $id_lang => $value}
{if $field['languages']|count > 1}
<div class="translatable-field lang-{$id_lang}" {if $id_lang != $current_id_lang}style="display:none;"{/if}>
<div class="col-lg-9">
{else}
<div class="col-lg-12">
{/if}
<input type="text"
name="{$key}_{$id_lang}"
value="{$value|escape:'htmlall':'UTF-8'}"
{if isset($input.class)}class="{$input.class}"{/if}
/>
{if $field['languages']|count > 1}
</div>
<div class="col-lg-2">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
@@ -253,6 +258,9 @@
</ul>
</div>
</div>
{else}
</div>
{/if}
{/foreach}
</div>
</div>
+11 -1
View File
@@ -142,10 +142,12 @@ class ProductSaleCore
$sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');
$sql = 'SELECT p.id_product, pl.`link_rewrite`, pl.`name`, pl.`description_short`, MAX(image_shop.`id_image`) id_image, il.`legend`,
ps.`quantity` AS sales, p.`ean13`, p.`upc`, cl.`link_rewrite` AS category
ps.`quantity` AS sales, p.`ean13`, p.`upc`, cl.`link_rewrite` AS category, p.show_price, p.available_for_order, p.quantity, p.customizable,
IFNULL(pa.minimal_quantity, p.minimal_quantity) as minimal_quantity, p.out_of_stock
FROM `'._DB_PREFIX_.'product_sale` ps
LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product`
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (ps.`id_product` = pa.`id_product` AND pa.default_on = 1)
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
ON p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
@@ -166,6 +168,7 @@ class ProductSaleCore
GROUP BY product_shop.id_product
ORDER BY sales DESC
LIMIT '.(int)($page_number * $nb_products).', '.(int)$nb_products;
if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql))
return false;
@@ -173,6 +176,13 @@ class ProductSaleCore
{
$row['link'] = $context->link->getProductLink($row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']);
$row['id_image'] = Product::defineProductImage($row, $id_lang);
$row['allow_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']);
$row['price_tax_exc'] = Product::getPriceStatic(
(int)$row['id_product'],
false,
((isset($row['id_product_attribute']) && !empty($row['id_product_attribute'])) ? (int)$row['id_product_attribute'] : null),
(Product::$_taxCalculationMethod == PS_TAX_EXC ? 2 : 6)
);
}
return $result;
}
@@ -142,9 +142,9 @@ class AdminCarrierWizardControllerCore extends AdminController
$bread_extended = array_unique($this->breadcrumbs);
if (Tools::getValue('id_carrier'))
$bread_extended[1] = $this->l('Edit');
$bread_extended[2] = $this->l('Edit');
else
$bread_extended[1] = $this->l('Add new');
$bread_extended[2] = $this->l('Add new');
$this->toolbar_title = $bread_extended;
}
+8 -8
View File
@@ -208,14 +208,14 @@ class AdminGroupsControllerCore extends AdminController
$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('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'),
'active' => array('title' => $this->l('Enabled'),'align' => 'center','width' => 20, 'active' => 'status','type' => 'bool')
'id_customer' => array('title' => $this->l('ID'), 'align' => 'center', 'filter_key' => 'c!id_customer', 'class' => 'fixed-width-xs'),
'id_gender' => array('title' => $this->l('Titles'), 'icon' => $genders_icon, 'list' => $genders),
'firstname' => array('title' => $this->l('First name')),
'lastname' => array('title' => $this->l('Last name')),
'email' => array('title' => $this->l('Email address'), 'filter_key' => 'c!email', 'orderby' => true),
'birthday' => array('title' => $this->l('Birth date'), 'type' => 'date', 'class' => 'fixed-width-md', 'align' => 'center'),
'date_add' => array('title' => $this->l('Register date'), 'type' => 'date', 'class' => 'fixed-width-md', 'align' => 'center'),
'active' => array('title' => $this->l('Enabled'),'align' => 'center', 'class' => 'fixed-width-sm', 'active' => 'status','type' => 'bool')
));
$this->_select = 'c.*';
$this->_join = 'LEFT JOIN `'._DB_PREFIX_.'customer` c ON (a.`id_customer` = c.`id_customer`)';
@@ -2212,6 +2212,9 @@ class AdminProductsControllerCore extends AdminController
public function initContent($token = null)
{
//Required for Features Textarea autosize
$this->addJS(_PS_JS_DIR_.'jquery/plugins/jquery.autosize.min.js');
if ($this->display == 'edit' || $this->display == 'add')
{
$this->fields_form = array();
@@ -159,6 +159,7 @@ class AdminStockMvtControllerCore extends AdminController
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON (pac.id_product_attribute = stock.id_product_attribute)
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (
al.id_attribute = pac.id_attribute
AND pac.id_product_attribute <> 0
AND al.id_lang = '.(int)$this->context->language->id.'
)';
// overrides group
+39 -41
View File
@@ -34,6 +34,7 @@ class AdminTabsControllerCore extends AdminController
$this->context = Context::getContext();
$this->multishop_context = Shop::CONTEXT_ALL;
$this->table = 'tab';
$this->list_id = 'tab';
$this->className = 'Tab';
$this->lang = true;
@@ -85,11 +86,19 @@ class AdminTabsControllerCore extends AdminController
public function initPageHeaderToolbar()
{
$this->page_header_toolbar_title = $this->l('Menus');
$this->page_header_toolbar_btn['new_menu'] = array(
'href' => self::$currentIndex.'&amp;addtab&amp;token='.$this->token,
'desc' => $this->l('Add new menu'),
'icon' => 'process-icon-new'
);
if ($this->display == 'details')
$this->page_header_toolbar_btn['back_to_list'] = array(
'href' => Context::getContext()->link->getAdminLink('AdminTabs'),
'desc' => $this->l('Back to list'),
'icon' => 'process-icon-back'
);
else
$this->page_header_toolbar_btn['new_menu'] = array(
'href' => self::$currentIndex.'&amp;addtab&amp;token='.$this->token,
'desc' => $this->l('Add new menu'),
'icon' => 'process-icon-new'
);
parent::initPageHeaderToolbar();
}
@@ -212,53 +221,42 @@ class AdminTabsControllerCore extends AdminController
return parent::renderList();
}
/**
* method call when ajax request is made with the details row action
* @see AdminController::postProcess()
*/
public function ajaxProcessDetails()
public function initProcess()
{
if (($id = Tools::getValue('id')))
if (Tools::getIsset('details'.$this->table))
{
// override attributes
$this->display = 'list';
$this->lang = false;
$this->list_id = 'details';
if (isset($_POST['submitReset'.$this->list_id]))
$this->processResetFilters();
}
else
$this->list_id = 'tab';
return parent::initProcess();
}
public function renderDetails()
{
if (($id = Tools::getValue('id_tab')))
{
$this->lang = false;
$this->list_id = 'details';
$this->addRowAction('edit');
$this->addRowAction('delete');
$this->toolbar_btn = array();
$tab = $this->loadObject($id);
$this->toolbar_title = $tab->name[$this->context->employee->id_lang];
$this->_select = 'b.*';
$this->_join = 'LEFT JOIN `'._DB_PREFIX_.'tab_lang` b ON (b.`id_tab` = a.`id_tab` AND b.`id_lang` = '.$this->context->language->id.')';
$this->_where = 'AND a.`id_parent` = '.(int)$id;
$this->_orderBy = 'position';
// get list and force no limit clause in the request
$this->getList($this->context->language->id);
// Render list
$helper = new HelperList();
$helper->actions = $this->actions;
$helper->list_skip_actions = $this->list_skip_actions;
$helper->no_link = true;
$helper->shopLinkType = '';
$helper->identifier = $this->identifier;
$helper->imageType = $this->imageType;
$helper->toolbar_scroll = false;
$helper->show_toolbar = false;
$helper->orderBy = 'position';
$helper->orderWay = 'ASC';
$helper->currentIndex = self::$currentIndex;
$helper->token = $this->token;
$helper->table = $this->table;
$helper->position_identifier = $this->position_identifier;
// Force render - no filter, form, js, sorting ...
$helper->simple_header = true;
$content = $helper->generateList($this->_list, $this->fields_list);
echo Tools::jsonEncode(array('use_parent_structure' => false, 'data' => $content));
self::$currentIndex = self::$currentIndex.'&details'.$this->table;
$this->processFilter();
return parent::renderList();
}
die;
}
public function postProcess()
+4 -2
View File
@@ -44,6 +44,7 @@ class AddressControllerCore extends FrontController
{
parent::setMedia();
$this->addJS(_THEME_JS_DIR_.'tools/statesManagement.js');
$this->addJS(_PS_JS_DIR_.'validate.js');
}
/**
@@ -268,6 +269,7 @@ class AddressControllerCore extends FrontController
// Assign common vars
$this->context->smarty->assign(array(
'address_validation' => Address::$definition['fields'],
'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'),
'onr_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), //retro compat
'ajaxurl' => _MODULE_DIR_,
@@ -339,8 +341,8 @@ class AddressControllerCore extends FrontController
protected function assignAddressFormat()
{
$id_country = is_null($this->_address)? 0 : (int)$this->_address->id_country;
$dlv_adr_fields = AddressFormat::getOrderedAddressFields($id_country, true, true);
$this->context->smarty->assign('ordered_adr_fields', $dlv_adr_fields);
$ordered_adr_fields = AddressFormat::getOrderedAddressFields($id_country, true, true);
$this->context->smarty->assign('ordered_adr_fields', $ordered_adr_fields);
}
/**
+6
View File
@@ -65,6 +65,7 @@ class CompareControllerCore extends FrontController
die('1');
}
die('0');
}
/**
@@ -73,6 +74,8 @@ class CompareControllerCore extends FrontController
*/
public function initContent()
{
if (Tools::getValue('ajax'))
return;
parent::initContent();
//Clean compare product table
@@ -86,7 +89,10 @@ class CompareControllerCore extends FrontController
if (($product_list = Tools::getValue('compare_product_list')) && ($postProducts = (isset($product_list) ? rtrim($product_list, '|') : '')))
$ids = array_unique(explode('|', $postProducts));
else if (isset($this->context->cookie->id_compare))
{
$ids = CompareProduct::getCompareProducts($this->context->cookie->id_compare);
Tools::redirect($this->context->link->getPageLink('products-comparison', null, $this->context->language->id, array('compare_product_list' => implode('|', $ids))));
}
else
$ids = null;
+1
View File
@@ -100,4 +100,5 @@
<tab id="Warehouses" name="Armaz&#xE9;ns"/>
<tab id="Webservice" name="Servi&#xE7;o Web"/>
<tab id="Zones" name="Regi&#xF5;es"/>
<tab id="CarrierWizard" name="Carrier"/>
</entity_tab>
+1
View File
@@ -100,4 +100,5 @@
<tab id="Warehouses" name="Lagerort"/>
<tab id="Webservice" name="Webdienste"/>
<tab id="Zones" name="Zonen"/>
<tab id="CarrierWizard" name="Carrier"/>
</entity_tab>
+1
View File
@@ -100,4 +100,5 @@
<tab id="Stock_Coverage" name="Stock Coverage"/>
<tab id="Supply_orders" name="Supply orders"/>
<tab id="Configuration" name="Configuration"/>
<tab id="CarrierWizard" name="Carrier"/>
</entity_tab>
+1
View File
@@ -100,4 +100,5 @@
<tab id="Warehouses" name="Almacenes"/>
<tab id="Webservice" name="Servicio Web"/>
<tab id="Zones" name="Zonas"/>
<tab id="CarrierWizard" name="Carrier"/>
</entity_tab>
+1
View File
@@ -100,4 +100,5 @@
<tab id="Warehouses" name="Entrep&#xF4;ts"/>
<tab id="Webservice" name="Service web"/>
<tab id="Zones" name="Zones"/>
<tab id="CarrierWizard" name="Transporteur"/>
</entity_tab>
+1
View File
@@ -100,4 +100,5 @@
<tab id="Warehouses" name="Magazzino"/>
<tab id="Webservice" name="Webservice"/>
<tab id="Zones" name="Zone"/>
<tab id="CarrierWizard" name="Carrier"/>
</entity_tab>
+1
View File
@@ -102,4 +102,5 @@
<tab id="Stock_Coverage" name="Stock Coverage"/>
<tab id="Supply_orders" name="Supply orders"/>
<tab id="Configuration" name="Configuration"/>
<tab id="CarrierWizard" name="Carrier"/>
</entity_tab>
+1
View File
@@ -100,4 +100,5 @@
<tab id="Warehouses" name="Hurtownie"/>
<tab id="Webservice" name="Us&#x142;ugi internetowe"/>
<tab id="Zones" name="Strefy"/>
<tab id="CarrierWizard" name="Carrier"/>
</entity_tab>
@@ -21,9 +21,9 @@ function SmartWizard(target, options) {
this.elmStepContainer = $('<div></div>').addClass("stepContainer");
this.loader = $('<div>Loading</div>').addClass("loader");
this.buttons = {
next : $('<a>'+options.labelNext+'</a>').attr("href","#").addClass("buttonNext"),
previous : $('<a>'+options.labelPrevious+'</a>').attr("href","#").addClass("buttonPrevious"),
finish : $('<a>'+options.labelFinish+'</a>').attr("href","#").addClass("buttonFinish")
next : $('<a>'+options.labelNext+'</a>').attr("href","#").addClass("buttonNext").addClass("btn"),
previous : $('<a>'+options.labelPrevious+'</a>').attr("href","#").addClass("buttonPrevious").addClass("btn"),
finish : $('<a>'+options.labelFinish+'</a>').attr("href","#").addClass("buttonFinish").addClass("btn")
};
/*
+72
View File
@@ -0,0 +1,72 @@
/*
* 2007-2013 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @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
*/
function validate_isName(s)
{
var reg = /^[^0-9!<>,;?=+()@#"°{}_$%:]+$/;
return reg.test(s);
}
function validate_isGenericName(s)
{
var reg = /^[^<>={}]+$/;
return reg.test(s);
}
function validate_isAddress(s)
{
var reg = /^[^!<>?=+@{}_$%]+$/;
return reg.test(s);
}
function validate_isPostCode(s)
{
var reg = /^[a-z 0-9-]+$/i;
return reg.test(s);
}
function validate_isCityName(s)
{
var reg = /^[^!<>;?=+@#"°{}_$%]+$/;
return reg.test(s);
}
function validate_isMessage(s)
{
var reg = /^[^<>{}]+$/;
return reg.test(s);
}
function validate_isPhoneNumber(s)
{
var reg = /^[+0-9. ()-]+$/;
return reg.test(s);
}
function validate_isDniLite(s)
{
var reg = /^[0-9a-z-.]{1,16}$/i;
return reg.test(s);
}
@@ -217,7 +217,7 @@ class BlockBestSellers extends Module
if (Configuration::get('PS_CATALOG_MODE'))
return false;
if (!($result = ProductSale::getBestSalesLight((int)$params['cookie']->id_lang, 0, 5)))
if (!($result = ProductSale::getBestSalesLight((int)$params['cookie']->id_lang, 0, 8)))
return (Configuration::get('PS_BLOCK_BESTSELLERS_DISPLAY') ? array() : false);
$bestsellers = array();
+1
View File
@@ -112,6 +112,7 @@ class HomeFeatured extends Module
public function hookHeader($params)
{
$this->context->controller->addCSS(($this->_path).'homefeatured.css', 'all');
$this->context->controller->addJS(($this->_path).'js/homefeatured.js');
}
public function hookDisplayHome($params)
+36
View File
@@ -0,0 +1,36 @@
/*
* 2007-2013 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
$(document).ready(function()
{
$('.title_block').click(function(){
var button = $(this);
$('#index #center_column .products_block').removeClass('active');
button.parent('.products_block').addClass('active');
$('#index #center_column .products_block .block_content').hide(0, function(){
button.next('.block_content').show(0);
});
});
});
+22 -13
View File
@@ -100,7 +100,7 @@ $(function(){ldelim}
{if $field_name eq 'company'}
<p class="text">
<label for="company">{l s='Company'}</label>
<input type="text" id="company" name="company" value="{if isset($smarty.post.company)}{$smarty.post.company}{else}{if isset($address->company)}{$address->company|escape:'html'}{/if}{/if}" />
<input type="text" id="company" name="company" value="{if isset($smarty.post.company)}{$smarty.post.company}{else}{if isset($address->company)}{$address->company|escape:'html'}{/if}{/if}" onkeyup="if (validate_{$address_validation.$field_name.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
{/if}
{if $field_name eq 'vat_number'}
@@ -108,7 +108,7 @@ $(function(){ldelim}
<div id="vat_number">
<p class="text">
<label for="vat_number">{l s='VAT number'}</label>
<input type="text" class="text" name="vat_number" value="{if isset($smarty.post.vat_number)}{$smarty.post.vat_number}{else}{if isset($address->vat_number)}{$address->vat_number|escape:'html'}{/if}{/if}" />
<input type="text" class="text" name="vat_number" value="{if isset($smarty.post.vat_number)}{$smarty.post.vat_number}{else}{if isset($address->vat_number)}{$address->vat_number|escape:'html'}{/if}{/if}" onkeyup="if (validate_{$address_validation.$field_name.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
</div>
</div>
@@ -116,38 +116,43 @@ $(function(){ldelim}
{if $field_name eq 'firstname'}
<p class="required text">
<label for="firstname">{l s='First name'} <sup>*</sup></label>
<input type="text" name="firstname" id="firstname" value="{if isset($smarty.post.firstname)}{$smarty.post.firstname}{else}{if isset($address->firstname)}{$address->firstname|escape:'html'}{/if}{/if}" />
<input type="text" name="firstname" id="firstname" value="{if isset($smarty.post.firstname)}{$smarty.post.firstname}{else}{if isset($address->firstname)}{$address->firstname|escape:'html'}{/if}{/if}"
onkeyup="if (validate_{$address_validation.$field_name.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
{/if}
{if $field_name eq 'lastname'}
<p class="required text">
<label for="lastname">{l s='Last name'} <sup>*</sup></label>
<input type="text" id="lastname" name="lastname" value="{if isset($smarty.post.lastname)}{$smarty.post.lastname}{else}{if isset($address->lastname)}{$address->lastname|escape:'html'}{/if}{/if}" />
<input type="text" id="lastname" name="lastname" value="{if isset($smarty.post.lastname)}{$smarty.post.lastname}{else}{if isset($address->lastname)}{$address->lastname|escape:'html'}{/if}{/if}"
onkeyup="if (validate_{$address_validation.$field_name.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
{/if}
{if $field_name eq 'address1'}
<p class="required text">
<label for="address1">{l s='Address'} <sup>*</sup></label>
<input type="text" id="address1" name="address1" value="{if isset($smarty.post.address1)}{$smarty.post.address1}{else}{if isset($address->address1)}{$address->address1|escape:'html'}{/if}{/if}" />
<input type="text" id="address1" name="address1" value="{if isset($smarty.post.address1)}{$smarty.post.address1}{else}{if isset($address->address1)}{$address->address1|escape:'html'}{/if}{/if}"
onkeyup="if (validate_{$address_validation.$field_name.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
{/if}
{if $field_name eq 'address2'}
<p class="required text">
<label for="address2">{l s='Address (Line 2)'}</label>
<input type="text" id="address2" name="address2" value="{if isset($smarty.post.address2)}{$smarty.post.address2}{else}{if isset($address->address2)}{$address->address2|escape:'html'}{/if}{/if}" />
<input type="text" id="address2" name="address2" value="{if isset($smarty.post.address2)}{$smarty.post.address2}{else}{if isset($address->address2)}{$address->address2|escape:'html'}{/if}{/if}"
onkeyup="if (validate_{$address_validation.$field_name.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
{/if}
{if $field_name eq 'postcode'}
{assign var="postCodeExist" value="true"}
<p class="required postcode text">
<label for="postcode">{l s='Zip / Postal Code'} <sup>*</sup></label>
<input type="text" id="postcode" name="postcode" value="{if isset($smarty.post.postcode)}{$smarty.post.postcode}{else}{if isset($address->postcode)}{$address->postcode|escape:'html'}{/if}{/if}" onkeyup="$('#postcode').val($('#postcode').val().toUpperCase());" />
<input type="text" id="postcode" name="postcode" value="{if isset($smarty.post.postcode)}{$smarty.post.postcode}{else}{if isset($address->postcode)}{$address->postcode|escape:'html'}{/if}{/if}" onkeyup="$('#postcode').val($('#postcode').val().toUpperCase()); if (validate_{$address_validation.$field_name.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
{/if}
{if $field_name eq 'city'}
<p class="required text">
<label for="city">{l s='City'} <sup>*</sup></label>
<input type="text" name="city" id="city" value="{if isset($smarty.post.city)}{$smarty.post.city}{else}{if isset($address->city)}{$address->city|escape:'html'}{/if}{/if}" maxlength="64" />
<input type="text" name="city" id="city" value="{if isset($smarty.post.city)}{$smarty.post.city}{else}{if isset($address->city)}{$address->city|escape:'html'}{/if}{/if}" maxlength="64"
onkeyup="if (validate_{$address_validation.$field_name.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
{*
if customer hasn't update his layout address, country has to be verified
@@ -199,7 +204,8 @@ $(function(){ldelim}
{if $postCodeExist eq "false"}
<p class="required postcode text hidden">
<label for="postcode">{l s='Zip / Postal Code'} <sup>*</sup></label>
<input type="text" id="postcode" name="postcode" value="{if isset($smarty.post.postcode)}{$smarty.post.postcode}{else}{if isset($address->postcode)}{$address->postcode|escape:'html'}{/if}{/if}" onkeyup="$('#postcode').val($('#postcode').val().toUpperCase());" />
<input type="text" id="postcode" name="postcode" value="{if isset($smarty.post.postcode)}{$smarty.post.postcode}{else}{if isset($address->postcode)}{$address->postcode|escape:'html'}{/if}{/if}" onkeyup="$('#postcode').val($('#postcode').val().toUpperCase());"
onkeyup="if (validate_{$address_validation.$field_name.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
{/if}
{if $stateExist eq "false"}
@@ -212,22 +218,25 @@ $(function(){ldelim}
{/if}
<p class="textarea">
<label for="other">{l s='Additional information'}</label>
<textarea id="other" name="other" cols="26" rows="3">{if isset($smarty.post.other)}{$smarty.post.other}{else}{if isset($address->other)}{$address->other|escape:'html'}{/if}{/if}</textarea>
<textarea id="other" name="other" cols="26" rows="3"
onkeyup="if (validate_{$address_validation.other.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');">{if isset($smarty.post.other)}{$smarty.post.other}{else}{if isset($address->other)}{$address->other|escape:'html'}{/if}{/if}</textarea>
</p>
{if isset($one_phone_at_least) && $one_phone_at_least}
<p class="inline-infos required">{l s='You must register at least one phone number.'}</p>
{/if}
<p class="text">
<label for="phone">{l s='Home phone'}</label>
<input type="text" id="phone" name="phone" value="{if isset($smarty.post.phone)}{$smarty.post.phone}{else}{if isset($address->phone)}{$address->phone|escape:'html'}{/if}{/if}" />
<input type="text" id="phone" name="phone" value="{if isset($smarty.post.phone)}{$smarty.post.phone}{else}{if isset($address->phone)}{$address->phone|escape:'html'}{/if}{/if}"
onkeyup="if (validate_{$address_validation.phone.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
<p class="{if isset($one_phone_at_least) && $one_phone_at_least}required {/if}text">
<label for="phone_mobile">{l s='Mobile phone'}{if isset($one_phone_at_least) && $one_phone_at_least} <sup>*</sup>{/if}</label>
<input type="text" id="phone_mobile" name="phone_mobile" value="{if isset($smarty.post.phone_mobile)}{$smarty.post.phone_mobile}{else}{if isset($address->phone_mobile)}{$address->phone_mobile|escape:'html'}{/if}{/if}" />
<input type="text" id="phone_mobile" name="phone_mobile" value="{if isset($smarty.post.phone_mobile)}{$smarty.post.phone_mobile}{else}{if isset($address->phone_mobile)}{$address->phone_mobile|escape:'html'}{/if}{/if}" onkeyup="if (validate_{$address_validation.phone_mobile.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
<p class="required text" id="adress_alias">
<label for="alias">{l s='Please assign an address title for future reference.'} <sup>*</sup></label>
<input type="text" id="alias" name="alias" value="{if isset($smarty.post.alias)}{$smarty.post.alias}{else if isset($address->alias)}{$address->alias|escape:'html'}{elseif !$select_address}{l s='My address'}{/if}" />
<input type="text" id="alias" name="alias" value="{if isset($smarty.post.alias)}{$smarty.post.alias}{else if isset($address->alias)}{$address->alias|escape:'html'}{elseif !$select_address}{l s='My address'}{/if}"
onkeyup="if (validate_{$address_validation.alias.validate}($(this).val())) $(this).css('background-color', '#DFF0D8'); else $(this).css('background-color', '#F2DEDE');" />
</p>
</fieldset>
<p class="submit2">
@@ -22,35 +22,5 @@
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<!-- MODULE Home Block best sellers -->
<div id="best-sellers_block_center" class="block products_block">
<p class="title_block">{l s='Top sellers' mod='blockbestsellers'}</p>
{if isset($best_sellers) AND $best_sellers}
<div class="block_content">
{assign var='liHeight' value=320}
{assign var='nbItemsPerLine' value=4}
{assign var='nbLi' value=$best_sellers|@count}
{math equation="nbLi/nbItemsPerLine" nbLi=$nbLi nbItemsPerLine=$nbItemsPerLine assign=nbLines}
{math equation="nbLines*liHeight" nbLines=$nbLines|ceil liHeight=$liHeight assign=ulHeight}
<ul style="height:{$ulHeight}px;">
{foreach from=$best_sellers item=product name=myLoop}
<li style="border-bottom:0" class="ajax_block_product {if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if} {if $smarty.foreach.myLoop.iteration%$nbItemsPerLine == 0}last_item_of_line{elseif $smarty.foreach.myLoop.iteration%$nbItemsPerLine == 1}clear{/if} {if $smarty.foreach.myLoop.iteration > ($smarty.foreach.myLoop.total - ($smarty.foreach.myLoop.total % $nbItemsPerLine))}last_line{/if}">
<p class="s_title_block"><a href="{$product.link|escape:'html'}" title="{$product.name|truncate:32:'...'|escape:'htmlall':'UTF-8'}">{$product.name|truncate:27:'...'|escape:'htmlall':'UTF-8'}</a></p>
<div class="product_desc"><a href="{$product.link|escape:'html'}" title="{l s='More' mod='blockbestsellers'}">{$product.description_short|strip_tags|truncate:130:'...'}</a></div>
<a href="{$product.link|escape:'html'}" title="{$product.name|escape:html:'UTF-8'}" class="product_image"><img src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'home_default')|escape:'html'}" height="{$homeSize.height}" width="{$homeSize.width}" alt="{$product.name|escape:html:'UTF-8'}" /></a>
<div>
{if !$PS_CATALOG_MODE}<p class="price_container"><span class="price">{$product.price}</span></p>{else}<div style="height:21px;"></div>{/if}
<a class="button" href="{$product.link|escape:'html'}" title="{l s='View' mod='blockbestsellers'}">{l s='View' mod='blockbestsellers'}</a>
</div>
</li>
{/foreach}
</ul>
<p class="clearfix" style="padding: 5px;"><a style="float:right;" href="{$link->getPageLink('best-sales')|escape:'html'}" title="{l s='All best sellers' mod='blockbestsellers'}" class="button_large">{l s='All best sellers' mod='blockbestsellers'}</a></p>
</div>
{else}
<p>{l s='No best sellers at this time' mod='blockbestsellers'}</p>
{/if}
<br class="clear"/>
</div>
<!-- /MODULE Home Block best sellers -->
{capture name=title}{l s='Best sellers' mod='blockbestsellers'}{/capture}
{include file="$tpl_dir./product-list-home.tpl" id="blockbestsellers_block" title=$smarty.capture.title products=$best_sellers}
@@ -22,29 +22,5 @@
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<!-- MODULE Block new products -->
<div id="new-products_block_right" class="block products_block">
<p class="title_block"><a href="{$link->getPageLink('new-products')|escape:'html'}" title="{l s='New products' mod='blocknewproducts'}">{l s='New products' mod='blocknewproducts'}</a></p>
<div class="block_content">
{if $new_products !== false}
<ul class="product_images clearfix">
{foreach from=$new_products item='product' name='newProducts'}
{if $smarty.foreach.newProducts.index < 2}
<li{if $smarty.foreach.newProducts.first} class="first"{/if}><a href="{$product.link|escape:'html'}" title="{$product.legend|escape:html:'UTF-8'}"><img src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'medium_default')|escape:'html'}" height="{$mediumSize.height}" width="{$mediumSize.width}" alt="{$product.legend|escape:html:'UTF-8'}" /></a></li>
{/if}
{/foreach}
</ul>
<dl class="products">
{foreach from=$new_products item=newproduct name=myLoop}
<dt class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}"><a href="{$newproduct.link|escape:'html'}" title="{$newproduct.name|escape:html:'UTF-8'}">{$newproduct.name|strip_tags|escape:html:'UTF-8'}</a></dt>
{if $newproduct.description_short}<dd class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}"><a href="{$newproduct.link|escape:'html'}">{$newproduct.description_short|strip_tags:'UTF-8'|truncate:75:'...'}</a><br /><a href="{$newproduct.link}" class="lnk_more">{l s='Read more' mod='blocknewproducts'}</a></dd>{/if}
{/foreach}
</dl>
<p><a href="{$link->getPageLink('new-products')|escape:'html'}" title="{l s='All new products' mod='blocknewproducts'}" class="button_large">&raquo; {l s='All new products' mod='blocknewproducts'}</a></p>
{else}
<p>&raquo; {l s='No new products at this time' mod='blocknewproducts'}</p>
{/if}
</div>
</div>
<!-- /MODULE Block new products -->
{capture name=title}{l s='New arrivals' mod='blocknewproducts'}{/capture}
{include file="$tpl_dir./product-list-home.tpl" id="blocknewproducts_block" title=$smarty.capture.title products=$new_products}
@@ -22,45 +22,5 @@
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<!-- MODULE Home Featured Products -->
<div id="featured-products_block_center" class="block products_block clearfix">
<p class="title_block">{l s='Featured products' mod='homefeatured'}</p>
{if isset($products) AND $products}
<div class="block_content">
{assign var='liHeight' value=250}
{assign var='nbItemsPerLine' value=4}
{assign var='nbLi' value=$products|@count}
{math equation="nbLi/nbItemsPerLine" nbLi=$nbLi nbItemsPerLine=$nbItemsPerLine assign=nbLines}
{math equation="nbLines*liHeight" nbLines=$nbLines|ceil liHeight=$liHeight assign=ulHeight}
<ul style="height:{$ulHeight}px;">
{foreach from=$products item=product name=homeFeaturedProducts}
{math equation="(total%perLine)" total=$smarty.foreach.homeFeaturedProducts.total perLine=$nbItemsPerLine assign=totModulo}
{if $totModulo == 0}{assign var='totModulo' value=$nbItemsPerLine}{/if}
<li class="ajax_block_product {if $smarty.foreach.homeFeaturedProducts.first}first_item{elseif $smarty.foreach.homeFeaturedProducts.last}last_item{else}item{/if} {if $smarty.foreach.homeFeaturedProducts.iteration%$nbItemsPerLine == 0}last_item_of_line{elseif $smarty.foreach.homeFeaturedProducts.iteration%$nbItemsPerLine == 1} {/if} {if $smarty.foreach.homeFeaturedProducts.iteration > ($smarty.foreach.homeFeaturedProducts.total - $totModulo)}last_line{/if}">
<a href="{$product.link|escape:'html'}" title="{$product.name|escape:html:'UTF-8'}" class="product_image"><img src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'home_default')|escape:'html'}" height="{$homeSize.height}" width="{$homeSize.width}" alt="{$product.name|escape:html:'UTF-8'}" />{if isset($product.new) && $product.new == 1}<span class="new">{l s='New' mod='homefeatured'}</span>{/if}</a>
<p class="s_title_block"><a href="{$product.link|escape:'html'}" title="{$product.name|truncate:50:'...'|escape:'htmlall':'UTF-8'}">{$product.name|truncate:35:'...'|escape:'htmlall':'UTF-8'}</a></p>
<div class="product_desc"><a href="{$product.link|escape:'html'}" title="{l s='More' mod='homefeatured'}">{$product.description_short|strip_tags|truncate:65:'...'}</a></div>
<div>
<a class="lnk_more" href="{$product.link|escape:'html'}" title="{l s='View' mod='homefeatured'}">{l s='View' mod='homefeatured'}</a>
{if $product.show_price AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE}<p class="price_container"><span class="price">{if !$priceDisplay}{convertPrice price=$product.price}{else}{convertPrice price=$product.price_tax_exc}{/if}</span></p>{else}<div style="height:21px;"></div>{/if}
{if ($product.id_product_attribute == 0 OR (isset($add_prod_display) AND ($add_prod_display == 1))) AND $product.available_for_order AND !isset($restricted_country_mode) AND $product.minimal_quantity == 1 AND $product.customizable != 2 AND !$PS_CATALOG_MODE}
{if ($product.quantity > 0 OR $product.allow_oosp)}
<a class="exclusive ajax_add_to_cart_button" rel="ajax_id_product_{$product.id_product}" href="{$link->getPageLink('cart')|escape:'html'}?qty=1&amp;id_product={$product.id_product}&amp;token={$static_token}&amp;add" title="{l s='Add to cart' mod='homefeatured'}">{l s='Add to cart' mod='homefeatured'}</a>
{else}
<span class="exclusive">{l s='Add to cart' mod='homefeatured'}</span>
{/if}
{else}
<div style="height:23px;"></div>
{/if}
</div>
</li>
{/foreach}
</ul>
</div>
{else}
<p>{l s='No featured products' mod='homefeatured'}</p>
{/if}
</div>
<!-- /MODULE Home Featured Products -->
{capture name=title}{l s='Popular' mod='homefeatured'}{/capture}
{include file="$tpl_dir./product-list-home.tpl" id="homefeatured_block" title=$smarty.capture.title}
+31
View File
@@ -0,0 +1,31 @@
{*
* 2007-2013 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<ul id="color_to_pick_list" class="clearfix">
{foreach from=$colors_list item='color'}
<li><a id="color_{$color.id_product_attribute|intval}" class="color_pick" style="background: {$color.color};"></a></li>
{/foreach}
</ul>
+62
View File
@@ -0,0 +1,62 @@
{*
* 2007-2013 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<div{if isset($id)} id="{$id}"{/if} class="block products_block{if isset($id) && $id eq 'blocknewproducts_block'} active{/if}">
<h4 class="title_block">{if isset($title)}{$title}{/if}</h4>
{if isset($products) AND $products}
<div class="block_content">
{assign var='liHeight' value=250}
{assign var='nbItemsPerLine' value=4}
{assign var='nbLi' value=$products|@count}
{math equation="nbLi/nbItemsPerLine" nbLi=$nbLi nbItemsPerLine=$nbItemsPerLine assign=nbLines}
{math equation="nbLines*liHeight" nbLines=$nbLines|ceil liHeight=$liHeight assign=ulHeight}
<ul style="height:{$ulHeight}px;">
{foreach from=$products item=product name=homeProducts}
{math equation="(total%perLine)" total=$smarty.foreach.homeProducts.total perLine=$nbItemsPerLine assign=totModulo}
{if $totModulo == 0}{assign var='totModulo' value=$nbItemsPerLine}{/if}
<li class="ajax_block_product {if $smarty.foreach.homeProducts.first}first_item{elseif $smarty.foreach.homeProducts.last}last_item{else}item{/if} {if $smarty.foreach.homeProducts.iteration%$nbItemsPerLine == 0}last_item_of_line{elseif $smarty.foreach.homeProducts.iteration%$nbItemsPerLine == 1} {/if} {if $smarty.foreach.homeProducts.iteration > ($smarty.foreach.homeProducts.total - $totModulo)}last_line{/if}">
<a href="{$product.link|escape:'html'}" title="{$product.name|escape:html:'UTF-8'}" class="product_image"><img src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'home_default')|escape:'html'}" height="{$homeSize.height}" width="{$homeSize.width}" alt="{$product.name|escape:html:'UTF-8'}" />{if isset($product.new) && $product.new == 1}<span class="new">{l s='New'}</span>{/if}</a>
<h5 class="s_title_block"><a href="{$product.link|escape:'html'}" title="{$product.name|truncate:50:'...'|escape:'htmlall':'UTF-8'}">{$product.name|truncate:35:'...'|escape:'htmlall':'UTF-8'}</a></h5>
<div class="product_desc"><a href="{$product.link|escape:'html'}" title="{l s='More'}">{$product.description_short|strip_tags|truncate:65:'...'}</a></div>
<div>
<a class="lnk_more" href="{$product.link|escape:'html'}" title="{l s='View'}">{l s='View'}</a>
{if isset($product.show_price) && $product.show_price AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE}<p class="price_container"><span class="price">{if !$priceDisplay}{convertPrice price=$product.price}{else}{convertPrice price=$product.price_tax_exc}{/if}</span></p>{else}<div style="height:21px;"></div>{/if}
{if ((isset($product.id_product_attribute) && $product.id_product_attribute == 0) OR (isset($add_prod_display) AND ($add_prod_display == 1))) AND (isset($product.available_for_order) && $product.available_for_order) AND !isset($restricted_country_mode) AND $product.minimal_quantity == 1 AND $product.customizable != 2 AND !$PS_CATALOG_MODE}
{if ($product.quantity > 0 OR $product.allow_oosp)}
<a class="exclusive ajax_add_to_cart_button" rel="ajax_id_product_{$product.id_product}" href="{$link->getPageLink('cart')|escape:'html'}?qty=1&amp;id_product={$product.id_product}&amp;token={$static_token}&amp;add" title="{l s='Add to cart'}">{l s='Add to cart'}</a>
{else}
<span class="exclusive">{l s='Add to cart'}</span>
{/if}
{else}
<div style="height:23px;"></div>
{/if}
</div>
</li>
{/foreach}
</ul>
</div>
{else}
<p>{l s='No products'}</p>
{/if}
</div>