www.plici.net  |  Forum  |  Wiki  |  Blog  |  Projet  |  PhpDoc

Plici

Vous êtes sur outil qui permet à tout le monde de déposer un dysfonctionnement du logiciel, de suivre son évolution et de demander des nouvelles fonctionnalités.

Écosystème gratuit : Une fois la demande déposée, tout membre de la communauté en fonction de ses capacités et de sa disponibilité interviendra.

Écosystème payant : Utilisez le support pour accéder à des interlocuteurs spécialisés sur PLICI et obtenir des réponses et des interventions de qualité professionnelle.
Liste des tâches

FS#515 - Quantité Minimum

Concerne le projet: Plici
Ouverte par SOTRON Nicolas (nicolas_s) - jeudi, 15 janvier 2009, 10:54 GMT+2
Dernière édition par SOTRON Nicolas (nicolas_s) - mardi, 03 février 2009, 12:41 GMT+2
Type de tâche Nouveautés
Catégorie Site public
Etat En cours
Assignée à Personne
Système d'exploitation All
Sévérité Moyenne
Priorité Normale
Basée sur la version 1.0.0.RC4.r.925
Due pour la version 3.2.0
Date d'échéance Non décidé
Pourcentage achevé: 90%
Votes 0
Privée Non

Détails

Certains produits ne seront achetable qu'avec une quantité minimum.
Cette quantité sera définie pour chaque déclinaison de produits.

----------
[plici_sponsor_url]http://www.rgdcom.fr/[/plici_sponsor_url]
[plici_sponsor_name]RG Design[/plici_sponsor_name]


Cette tâche dépend de

Commentaire de SOTRON Nicolas (nicolas_s) - jeudi, 29 janvier 2009, 15:18 GMT+2
  • Champ changé: Pourcentage achevé: (30% → 70%)
Il reste les tests à effectuer.
Commentaire de SOTRON Nicolas (nicolas_s) - mardi, 03 février 2009, 12:41 GMT+2
  • Champ changé: Pourcentage achevé: (70% → 90%)
Mise en place chez le client
Commentaire de SOTRON Nicolas (nicolas_s) - mardi, 03 février 2009, 12:59 GMT+2
Message du javascript(Lien+Détail du produit) a afficher : "quantite minimum de var_quantite_minimum"
Commentaire de GOZLAN Rémi (remig) - mardi, 03 février 2009, 13:19 GMT+2
AMELIORATION DE LA FONCTION :

lorsque nous commandons une quantité de prooduit > a la quantité de stock, que ce soit dans la liste des produits ou le detail du produit, faire apparaitre une fenettre javascript avec le message suivant

"Stock restant var_quantite_stock" sans laisser la possibiliter de commander + du stock restant.
Commentaire de SOTRON Nicolas (nicolas_s) - mardi, 03 février 2009, 16:46 GMT+2
Voici la liste des modifications des templates a effectuer
=== default_product.html ===
Remplacer
<select onfocus="inFoc(this);" onfocusin="inFoc(this);" onblur="inBlu(this);" name="quantity" id="id_quantity" onchange="javascript: updateProductByQuantity();">
<option value="1">1</option>
</select>

par
<input type="text"
name="quantity"
id="id_quantity"
size="4"
maxlength="3"
value="1"
onchange="javascript: updateProductByQuantity();"
onfocus="inFoc(this);"
onfocusin="inFoc(this);"
onblur="inBlu(this);" />

Remplacer
<script language="javascript" type="text/javascript">
//<![CDATA[
var imageURL = "";
var imageTitle = "";
var imageWidth = "";
var imageHeight = "";

function updateProduct(){literal}{{/literal}
return updateProductWithParameters("TRUE");
}

function updateProductByQuantity(){literal}{{/literal}
return updateProductWithParameters("FALSE");
}

function updateProductWithParameters(reset_quantity) {literal}{{/literal}
var count_id_used = new Array();
var value_id_used = new Array();

var array_ref = new Array();
var array_stock = new Array();
var array_weight = new Array();
var array_weight_quantity = new Array();
var array_price = new Array();
var array_price_quantity = new Array();
var array_pic_http_path = new Array();
var array_pic_desc = new Array();
var array_pic_height = new Array();
var array_pic_width = new Array();
var array_pic_http_path_full = new Array();
var array_pic_desc_full = new Array();
var array_pic_height_full = new Array();
var array_pic_width_full = new Array();
var array_can_bought = new Array();


var default_id_if_unique_ref;
<plici_foreach from="$psl" item="array_ref">

array_ref[{$array_ref.psl_id}]="{$array_ref.psl_reference}";
array_stock[{$array_ref.psl_id}]="{$array_ref.psl_stock_text}";
array_weight[{$array_ref.psl_id}]="{$array_ref.psl_weight|net_print:"weight"}";
array_price[{$array_ref.psl_id}]="{$array_ref.psl_tax_included_price|net_print:"price"}";
array_pic_http_path[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_medium_array.pic_http_path}";
array_pic_desc[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_medium_array.pic_desc|net_value}";
array_pic_height[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_medium_array.pic_height}";
array_pic_width[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_medium_array.pic_width}";

array_pic_http_path_full[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_full_array.pic_http_path}";
array_pic_desc_full[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_full_array.pic_desc|net_value}";
array_pic_height_full[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_full_array.pic_height}";
array_pic_width_full[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_full_array.pic_width}";

array_can_bought[{$array_ref.psl_id}]="{$array_ref.psl_can_bought}";

array_price_quantity[{$array_ref.psl_id}] = new Array();
<plici_foreach from="$array_ref.psl_price_list" item="price_quantity" name="price_by_quantity" key="quantity">

array_price_quantity[{$array_ref.psl_id}][{$quantity}]="{$price_quantity}";
</plici_foreach>

array_weight_quantity[{$array_ref.psl_id}] = new Array();
<plici_foreach from="$array_ref.psl_weight_list" item="weight_quantity" name="weight_by_quantity" key="quantity">

array_weight_quantity[{$array_ref.psl_id}][{$quantity}]="{$weight_quantity}";
</plici_foreach>

default_id_if_unique_ref = {$array_ref.psl_id};
</plici_foreach>



findDOM('id_detail_visible_if_js_activated',1).display = "block";
findDOM('id_detail_not_visible_if_js_activated',1).display = "none";

var i_to_split = 0;
var to_split = new Array();
<plici_foreach from="$select_att" item="array_select" key="select_name">

to_split[i_to_split++] = document.fn_add_to_caddy.{$select_name}.value;
</plici_foreach>

var j; var i; var splited; var is_known;
for (var k=0;k<to_split.length;k++) {literal}{{/literal}
splited = to_split[k].split("|");
for (i=0;i<splited.length;i++) {literal}{{/literal}
if (splited[i] != "") {literal}{{/literal}
is_known = false;
for (j=0;j<count_id_used.length;j++) {literal}{{/literal}
if (value_id_used[j] == splited[i]) {literal}{{/literal}
count_id_used[j] = count_id_used[j] +1;
is_known = true;
}
}
if (!is_known) {literal}{{/literal}
count_id_used[count_id_used.length] = 1;
value_id_used[value_id_used.length] = splited[i];
}
}
}
}

var max_finded = 0;
var id_finded = 0;
for (i=0;i<count_id_used.length;i++) {literal}{{/literal}
if (count_id_used[i] > max_finded) {literal}{{/literal}
max_finded = count_id_used[i];
id_finded = value_id_used[i];
}
}

if (max_finded == to_split.length) {literal}{{/literal}

if (max_finded == 0) {literal}{{/literal}id_finded = default_id_if_unique_ref; }
findDOM('id_pd_prix',0).innerHTML = array_price[id_finded];
findDOM('id_pd_reference',0).innerHTML = array_ref[id_finded];
<plici_if if="~YES~==$setting_stock_management">

findDOM('id_pd_stock',0).innerHTML = array_stock[id_finded];
</plici_if>


<plici_if if="$setting_display_weight=='TRUE'">
findDOM('id_pd_weight',0).innerHTML = array_weight[id_finded];
</plici_if>


findDOM('url_pic_pic',0).href = array_pic_http_path_full[id_finded];
findDOM('url_pic_link',0).href = array_pic_http_path_full[id_finded];
findDOM('id_pro_pic',0).src = array_pic_http_path[id_finded];
findDOM('id_pro_pic',0).alt = array_pic_desc[id_finded];
findDOM('id_pro_pic',0).height = array_pic_height[id_finded];
findDOM('id_pro_pic',0).width = array_pic_width[id_finded];

// on active le ajouter au panier
findDOM('id_add_to_caddy',1).display = "block";

var quantity = findDOM('id_quantity',0).value;

// Rebuild quantity list //
// Delete old list and save id selected
var select_form = findDOM("id_quantity", 0);
var list_length = select_form.length;
var old_id = -1;
for (var i=0; i<list_length; i++) {literal}{{/literal}
if(true == select_form.options[i].selected) {literal}{{/literal}
old_id = select_form.options[i].value;
}
}
select_form.length = 0; //Hack - hack not working on Opera 5.12

// Save quantity
if ("TRUE"==reset_quantity)
{literal}{{/literal}
quantity = 1
old_id = quantity;
}

//Build new list
if (0<array_price_quantity[id_finded].length) {literal}{{/literal}
for (iteration_ind in array_price_quantity[id_finded]) {literal}{{/literal}

if (old_id==iteration_ind) {literal}{{/literal}
select_form.options[select_form.options.length] = new Option(""+iteration_ind, iteration_ind, true, true);
} else {literal}{{/literal}
select_form.options[select_form.options.length] = new Option(""+iteration_ind, iteration_ind, false, false);
}
}
}

if (sessionParam.indexOf("?")>0)
sessionParam = "&"+sessionParam.substring(sessionParam.indexOf("?")+1);
else
sessionParam = "";

findDOM('id_link_add_to_caddy',0).href = "{net_url type='SELF' nes=true _shopcart_pm_id=$pma_id _shopcart_ps_id=0'}"+id_finded+"&shopcart_quantity="+quantity+sessionParam;

if (array_can_bought[id_finded] == "NO")
findDOM('id_add_to_caddy',1).display = "none";

findDOM('id_caddy_pd_total',0).innerHTML = array_price_quantity[id_finded][quantity];

<plici_if if="$setting_display_weight=='TRUE'">
findDOM('id_caddy_weight_total',0).innerHTML = array_weight_quantity[id_finded][quantity];
</plici_if>

imageURL = array_pic_http_path_full[id_finded];
imageTitle = array_pic_desc_full[id_finded];
imageWidth = array_pic_width_full[id_finded];
imageHeight = array_pic_height_full[id_finded];


} else {literal}{{/literal}
findDOM('id_pd_prix',0).innerHTML = '{"lang_str_indisponible"|tr}';
findDOM('id_pd_reference',0).innerHTML = '{"lang_str_indisponible"|tr}';
findDOM('id_pd_stock',0).innerHTML = '{"lang_str_indisponible"|tr}';
<plici_if if="$setting_display_weight=='TRUE'">
findDOM('id_pd_weight',0).innerHTML = '{"lang_str_indisponible"|tr}';
</plici_if>

findDOM('id_caddy_pd_total',0).innerHTML = '{"lang_str_indisponible"|tr}';
<plici_if if="$setting_display_weight=='TRUE'">
findDOM('id_caddy_weight_total',0).innerHTML = '{"lang_str_indisponible"|tr}';
</plici_if>

// on ne change pas l'image, on garde la dernière

// on active le ajouter au panier
findDOM('id_add_to_caddy',1).display = "none";

imageURL = "";
imageTitle = "";
imageWidth = "";
imageHeight = "";
}
}


var sessionParam = findDOM('id_link_add_to_caddy',0).href;
updateProduct();
//]]>
</script>

Par
<script language="javascript" type="text/javascript">
//<![CDATA[
var imageURL = "";
var imageTitle = "";
var imageWidth = "";
var imageHeight = "";


function net_print_price(p_price) {literal}{{/literal}
var symbol_null = "{$format_price.symbol_null|default:"Indisponible"}";
var symbol_free = "{$format_price.symbol_free|default:"n.c."}";
var symbol_money = "{$format_price.symbol|default:"&euro;"}";
var separator_hundred = "{$format_price.hundred_separator|default:" "}";
var separator_decimal = "{$format_price.decimal_separator|default:","}";
var number_decimal = {$format_price.number_of_decimal|default:2};

if (form_input_is_int(p_price)) {literal}{{/literal}
if (0 == p_price) {literal}{{/literal}
return symbol_free;
} else {literal}{{/literal}
price_array = explode(".", p_price, 2);
// Hundred part treatement
hundred_part = strrev(price_array[0]);
hundred_part = wordwrap(hundred_part, 3, separator_hundred, 1);
hundred_part = strrev(hundred_part);
// Decimal part treatement
if (2 == price_array.length) {literal}{{/literal}
decimal_part = substr(price_array[1], 0, number_decimal);
} else {literal}{{/literal}
decimal_part = 0;
}
decimal_part = str_pad(decimal_part, number_decimal, "0");

// Rebuild price
price_string = hundred_part;
if (0 < decimal_part) {literal}{{/literal}
price_string = price_string+separator_decimal+decimal_part;
}

// Add money symbol
return price_string+" "+symbol_money;

}
} else {literal}{{/literal}
return symbol_null;
}
}

function net_print_weight(p_weight) {literal}{{/literal}
var symbol_null = "{$format_weight.null.symbol|default:"Indisponible"}";
var symbol = new Array();
symbol["gr"] = "{$format_weight.gr.symbol|default:"gr"}";
symbol["kg"] = "{$format_weight.kg.symbol|default:"kg"}";
symbol["t"] = "{$format_weight.t.symbol|default:"t"}";
var number_decimal = new Array();
number_decimal["gr"] = {$format_weight.gr.nof_decimal|default:2};
number_decimal["kg"] = {$format_weight.kg.nof_decimal|default:2};
number_decimal["t"] = {$format_weight.t.nof_decimal|default:2};
var separator_decimal = new Array();
separator_decimal["gr"] = "{$format_weight.gr.decimal_separator|default:","}";
separator_decimal["kg"] = "{$format_weight.kg.decimal_separator|default:","}";
separator_decimal["t"] = "{$format_weight.t.decimal_separator|default:","}";
var factor_divise = new Array();
factor_divise["gr"] = 1;
factor_divise["kg"] = 1000;
factor_divise["t"] = 1000000;

if (form_input_is_int(p_weight)) {literal}{{/literal}
weight_class = "gr";
if ( 1000 > p_weight) {literal}{{/literal}
weight_class = "gr";
} else {literal}{{/literal}
if (1000000 > p_weight) {literal}{{/literal}
weight_class = "kg";
} else {literal}{{/literal}
weight_class = "t";
}
}
weight_string = sprintf("%."+str_replace('%', '%%',number_decimal[weight_class])+"f ", p_weight/factor_divise[weight_class]);
return str_replace(".", separator_decimal[weight_class], weight_string)+symbol[weight_class];
} else {literal}{{/literal}
return symbol_null;
}
}

function updateProduct(){literal}{{/literal}
return updateProductWithParameters("TRUE");
}

function updateProductByQuantity(){literal}{{/literal}
return updateProductWithParameters("FALSE");
}

function updateProductWithParameters(reset_quantity) {literal}{{/literal}
var count_id_used = new Array();
var value_id_used = new Array();

var array_ref = new Array();
var array_stock = new Array();
var array_quantity_min = new Array();
var array_weight = new Array();
var array_price = new Array();
var array_pic_http_path = new Array();
var array_pic_desc = new Array();
var array_pic_height = new Array();
var array_pic_width = new Array();
var array_pic_http_path_full = new Array();
var array_pic_desc_full = new Array();
var array_pic_height_full = new Array();
var array_pic_width_full = new Array();
var array_can_bought = new Array();

var default_id_if_unique_ref;
<plici_foreach from="$psl" item="array_ref">

array_ref[{$array_ref.psl_id}]="{$array_ref.psl_reference}";
array_stock[{$array_ref.psl_id}]="{$array_ref.psl_stock_text}";
array_quantity_min[{$array_ref.psl_id}]= Math.max({$array_ref.psl_quant_min}, 1);
array_weight[{$array_ref.psl_id}]="{$array_ref.psl_weight}";
array_price[{$array_ref.psl_id}]="{$array_ref.psl_tax_included_price}";
array_pic_http_path[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_medium_array.pic_http_path}";
array_pic_desc[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_medium_array.pic_desc|net_value}";
array_pic_height[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_medium_array.pic_height}";
array_pic_width[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_medium_array.pic_width}";

array_pic_http_path_full[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_full_array.pic_http_path}";
array_pic_desc_full[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_full_array.pic_desc|net_value}";
array_pic_height_full[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_full_array.pic_height}";
array_pic_width_full[{$array_ref.psl_id}]="{$array_ref.psl_pic_id_full_array.pic_width}";

array_can_bought[{$array_ref.psl_id}]="{$array_ref.psl_can_bought}";

default_id_if_unique_ref = {$array_ref.psl_id};
</plici_foreach>



findDOM('id_detail_visible_if_js_activated',1).display = "block";
findDOM('id_detail_not_visible_if_js_activated',1).display = "none";

var i_to_split = 0;
var to_split = new Array();
<plici_foreach from="$select_att" item="array_select" key="select_name">

to_split[i_to_split++] = document.fn_add_to_caddy.{$select_name}.value;
</plici_foreach>

var j; var i; var splited; var is_known;
for (var k=0;k<to_split.length;k++) {literal}{{/literal}
splited = to_split[k].split("|");
for (i=0;i<splited.length;i++) {literal}{{/literal}
if (splited[i] != "") {literal}{{/literal}
is_known = false;
for (j=0;j<count_id_used.length;j++) {literal}{{/literal}
if (value_id_used[j] == splited[i]) {literal}{{/literal}
count_id_used[j] = count_id_used[j] +1;
is_known = true;
}
}
if (!is_known) {literal}{{/literal}
count_id_used[count_id_used.length] = 1;
value_id_used[value_id_used.length] = splited[i];
}
}
}
}

var max_finded = 0;
var id_finded = 0;
for (i=0;i<count_id_used.length;i++) {literal}{{/literal}
if (count_id_used[i] > max_finded) {literal}{{/literal}
max_finded = count_id_used[i];
id_finded = value_id_used[i];
}
}

if (max_finded == to_split.length) {literal}{{/literal}

if (max_finded == 0) {literal}{{/literal}id_finded = default_id_if_unique_ref; }
findDOM('id_pd_prix',0).innerHTML = net_print_price(array_price[id_finded]);
findDOM('id_pd_reference',0).innerHTML = array_ref[id_finded];
<plici_if if="~YES~==$setting_stock_management">

findDOM('id_pd_stock',0).innerHTML = array_stock[id_finded];
</plici_if>


<plici_if if="$setting_display_weight=='TRUE'">
findDOM('id_pd_weight',0).innerHTML = net_print_weight(array_weight[id_finded]);
</plici_if>


findDOM('url_pic_pic',0).href = array_pic_http_path_full[id_finded];
findDOM('url_pic_link',0).href = array_pic_http_path_full[id_finded];
findDOM('id_pro_pic',0).src = array_pic_http_path[id_finded];
findDOM('id_pro_pic',0).alt = array_pic_desc[id_finded];
findDOM('id_pro_pic',0).height = array_pic_height[id_finded];
findDOM('id_pro_pic',0).width = array_pic_width[id_finded];

// on active le ajouter au panier
findDOM('id_add_to_caddy',1).display = "block";

var quantity = parseInt(findDOM('id_quantity',0).value);

if ("TRUE"!=reset_quantity) {literal}{{/literal}
if (isNaN(quantity)) {literal}{{/literal}
alert('{"lang_error_parameter"|tr:"JS"} : '+'{"lang_str_quantity"|tr:"JS"}');
reset_quantity = "TRUE";
} else {literal}{{/literal}
if (quantity < array_quantity_min[id_finded]) {literal}{{/literal}
alert('{"lang_error_quant_min_not_reached"|tr:"JS"}');
reset_quantity = "TRUE";
} else if (255 < quantity) {literal}{{/literal}
alert('{"lang_error_quant_max_reached"|tr:"JS"} : 255');
findDOM('id_quantity',0).value = 255;
}
}
}

// Reset Quantity
if ("TRUE"==reset_quantity)
{literal}{{/literal}
quantity = array_quantity_min[id_finded];
findDOM('id_quantity',0).value = quantity;
}

if (sessionParam.indexOf("?")>0)
sessionParam = "&"+sessionParam.substring(sessionParam.indexOf("?")+1);
else
sessionParam = "";

findDOM('id_link_add_to_caddy',0).href = "{net_url type='SELF' nes=true _shopcart_pm_id=$pma_id _shopcart_ps_id=0'}"+id_finded+"&shopcart_quantity="+quantity+sessionParam;

if (array_can_bought[id_finded] == "NO")
findDOM('id_add_to_caddy',1).display = "none";

findDOM('id_caddy_pd_total',0).innerHTML = net_print_price(array_price[id_finded] * quantity);

<plici_if if="$setting_display_weight=='TRUE'">
findDOM('id_caddy_weight_total',0).innerHTML = net_print_weight(array_weight[id_finded] * quantity );
</plici_if>

imageURL = array_pic_http_path_full[id_finded];
imageTitle = array_pic_desc_full[id_finded];
imageWidth = array_pic_width_full[id_finded];
imageHeight = array_pic_height_full[id_finded];


} else {literal}{{/literal}
findDOM('id_pd_prix',0).innerHTML = '{"lang_str_indisponible"|tr}';
findDOM('id_pd_reference',0).innerHTML = '{"lang_str_indisponible"|tr}';
findDOM('id_pd_stock',0).innerHTML = '{"lang_str_indisponible"|tr}';
<plici_if if="$setting_display_weight=='TRUE'">
findDOM('id_pd_weight',0).innerHTML = '{"lang_str_indisponible"|tr}';
</plici_if>

findDOM('id_caddy_pd_total',0).innerHTML = '{"lang_str_indisponible"|tr}';
<plici_if if="$setting_display_weight=='TRUE'">
findDOM('id_caddy_weight_total',0).innerHTML = '{"lang_str_indisponible"|tr}';
</plici_if>

// on ne change pas l'image, on garde la dernière

// on active le ajouter au panier
findDOM('id_add_to_caddy',1).display = "none";

imageURL = "";
imageTitle = "";
imageWidth = "";
imageHeight = "";
}
}


var sessionParam = findDOM('id_link_add_to_caddy',0).href;
if ( 1 != {$quantity_product_list}) {literal}{{/literal}
findDOM('id_quantity',0).value = {$quantity_product_list};
updateProductByQuantity();
} else {literal}{{/literal}
updateProduct();
}
//]]>
</script>
Commentaire de SOTRON Nicolas (nicolas_s) - mardi, 03 février 2009, 16:48 GMT+2
=== _shopping_cart.html ===

=> Remplacer
<plici_if if="$display_sc_modify_quantity &amp;&amp; $is_not_protected_product == ~TRUE~">
=> Par
<plici_if if="($display_sc_modify_quantity)
&amp;&amp; ($is_not_protected_product == ~TRUE~)
&amp;&amp; ($product.psl_quant_min < $product.sca_quantity)">
Commentaire de SOTRON Nicolas (nicolas_s) - mardi, 03 février 2009, 16:49 GMT+2
=== js_general.js ===
Rajouter à la fin du fichier



// Php Function in Javascript
// @author: http://www.andrewpeace.com/

// @author: http://www.andrewpeace.com/javascript-is-int.html
function form_input_is_int(input){
return !isNaN(input)&& ((parseInt(input)==input) || (parseFloat(input)==input));
}
//@author: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_explode/
function explode( delimiter, string, limit ) {
// http://kevin.vanzonneveld.net
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: kenneth
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: d3x
// + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// * example 1: explode(' ', 'Kevin van Zonneveld');
// * returns 1: {0: 'Kevin', 1: 'van', 2: 'Zonneveld'}
// * example 2: explode('=', 'a=bc=d', 2);
// * returns 2: ['a', 'bc=d']

var emptyArray = { 0: '' };

// third argument is not required
if ( arguments.length < 2
|| typeof arguments[0] == 'undefined'
|| typeof arguments[1] == 'undefined' )
{
return null;
}

if ( delimiter === ''
|| delimiter === false
|| delimiter === null )
{
return false;
}

if ( typeof delimiter == 'function'
|| typeof delimiter == 'object'
|| typeof string == 'function'
|| typeof string == 'object' )
{
return emptyArray;
}

if ( delimiter === true ) {
delimiter = '1';
}

if (!limit) {
return string.toString().split(delimiter.toString());
} else {
// support for limit argument
var splitted = string.toString().split(delimiter.toString());
var partA = splitted.splice(0, limit - 1);
var partB = splitted.join(delimiter.toString());
partA.push(partB);
return partA;
}
}
// @author http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_wordwrap/
function wordwrap( str, int_width, str_break, cut ) {
// http://kevin.vanzonneveld.net
// + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// + improved by: Nick Callen
// + revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Sakimori
// * example 1: wordwrap('Kevin van Zonneveld', 6, '|', true);
// * returns 1: 'Kevin |van |Zonnev|eld'
// * example 2: wordwrap('The quick brown fox jumped over the lazy dog.', 20, '<br />\n');
// * returns 2: 'The quick brown fox <br />\njumped over the lazy<br />\n dog.'
// * example 3: wordwrap('Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.');
// * returns 3: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod \ntempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim \nveniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea \ncommodo consequat.'

// PHP Defaults
var m = ((arguments.length >= 2) ? arguments[1] : 75 );
var b = ((arguments.length >= 3) ? arguments[2] : "\n" );
var c = ((arguments.length >= 4) ? arguments[3] : false);

var i, j, l, s, r;

str += '';

if (m < 1) {
return str;
}

for (i = -1, l = (r = str.split("\n")).length; ++i < l; r[i] += s) {
for(s = r[i], r[i] = ""; s.length > m; r[i] += s.slice(0, j) + ((s = s.slice(j)).length ? b : "")){
j = c == 2 || (j = s.slice(0, m + 1).match(/\S*(\s)?$/))[1] ? m : j.input.length - j[0].length || c == 1 && m || j.input.length + (j = s.slice(m).match(/^\S*/)).input.length;
}
}

return r.join("\n");
}
//@author http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strrev/
function strrev( string ){
// http://kevin.vanzonneveld.net
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Onno Marsman
// * example 1: strrev('Kevin van Zonneveld');
// * returns 1: 'dlevennoZ nav niveK'

var ret = '', i = 0;

string += '';
for ( i = string.length-1; i >= 0; i-- ){
ret += string.charAt(i);
}

return ret;
}
// @author: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_str_pad/
function str_pad( input, pad_length, pad_string, pad_type ) {
// http://kevin.vanzonneveld.net
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + namespaced by: Michael White (http://getsprink.com)
// * example 1: str_pad('Kevin van Zonneveld', 30, '-=', 'STR_PAD_LEFT');
// * returns 1: '-=-=-=-=-=-Kevin van Zonneveld'
// * example 2: str_pad('Kevin van Zonneveld', 30, '-', 'STR_PAD_BOTH');
// * returns 2: '------Kevin van Zonneveld-----'

var half = '', pad_to_go;

var str_pad_repeater = function(s, len) {
var collect = '', i;

while(collect.length < len) collect += s;
collect = collect.substr(0,len);

return collect;
};

input += '';

if (pad_type != 'STR_PAD_LEFT' && pad_type != 'STR_PAD_RIGHT' && pad_type != 'STR_PAD_BOTH') { pad_type = 'STR_PAD_RIGHT'; }
if ((pad_to_go = pad_length - input.length) > 0) {
if (pad_type == 'STR_PAD_LEFT') { input = str_pad_repeater(pad_string, pad_to_go) + input; }
else if (pad_type == 'STR_PAD_RIGHT') { input = input + str_pad_repeater(pad_string, pad_to_go); }
else if (pad_type == 'STR_PAD_BOTH') {
half = str_pad_repeater(pad_string, Math.ceil(pad_to_go/2));
input = half + input + half;
input = input.substr(0, pad_length);
}
}

return input;
}
// @author:http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_substr/
function substr( f_string, f_start, f_length ) {
// http://kevin.vanzonneveld.net
// + original by: Martijn Wieringa
// + bugfixed by: T.Wild
// + tweaked by: Onno Marsman
// * example 1: substr('abcdef', 0, -1);
// * returns 1: 'abcde'
// * example 2: substr(2, 0, -6);
// * returns 2: ''

f_string += '';

if(f_start < 0) {
f_start += f_string.length;
}

if(f_length == undefined) {
f_length = f_string.length;
} else if(f_length < 0){
f_length += f_string.length;
} else {
f_length += f_start;
}

if(f_length < f_start) {
f_length = f_start;
}

return f_string.substring(f_start, f_length);
}

// @author: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_str_replace/
function str_replace(search, replace, subject) {
// http://kevin.vanzonneveld.net
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Gabriel Paderni
// + improved by: Philip Peterson
// + improved by: Simon Willison (http://simonwillison.net)
// + revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// + bugfixed by: Anton Ongson
// + input by: Onno Marsman
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + tweaked by: Onno Marsman
// * example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
// * returns 1: 'Kevin.van.Zonneveld'
// * example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
// * returns 2: 'hemmo, mars'

var f = search, r = replace, s = subject;
var ra = r instanceof Array, sa = s instanceof Array, f = [].concat(f), r = [].concat(r), i = (s = [].concat(s)).length;

while (j = 0, i--) {
if (s[i]) {
while (s[i] = (s[i]+'').split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};
}
};

return sa ? s : s[0];
}

// @author: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_sprintf/
function sprintf( ) {
// http://kevin.vanzonneveld.net
// + original by: Ash Searle (http://hexmen.com/blog/)
// + namespaced by: Michael White (http://getsprink.com)
// + tweaked by: Jack
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + input by: Paulo Ricardo F. Santos
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// * example 1: sprintf("%01.2f", 123.1);
// * returns 1: 123.10
// * example 2: sprintf("[%10s]", 'monkey');
// * returns 2: '[ monkey]'
// * example 3: sprintf("[%'#10s]", 'monkey');
// * returns 3: '[####monkey]'

var regex = /%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;
var a = arguments, i = 0, format = a[i++];

// pad()
var pad = function(str, len, chr, leftJustify) {
if (!chr) chr = ' ';
var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
return leftJustify ? str + padding : padding + str;
};

// justify()
var justify = function(value, prefix, leftJustify, minWidth, zeroPad, customPadChar) {
var diff = minWidth - value.length;
if (diff > 0) {
if (leftJustify || !zeroPad) {
value = pad(value, minWidth, customPadChar, leftJustify);
} else {
value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
}
}
return value;
};

// formatBaseX()
var formatBaseX = function(value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
// Note: casts negative numbers to positive ones
var number = value >>> 0;
prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
value = prefix + pad(number.toString(base), precision || 0, '0', false);
return justify(value, prefix, leftJustify, minWidth, zeroPad);
};

// formatString()
var formatString = function(value, leftJustify, minWidth, precision, zeroPad, customPadChar) {
if (precision != null) {
value = value.slice(0, precision);
}
return justify(value, '', leftJustify, minWidth, zeroPad, customPadChar);
};

// finalFormat()
var doFormat = function(substring, valueIndex, flags, minWidth, _, precision, type) {
if (substring == '%%') return '%';

// parse flags
var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false, customPadChar = ' ';
var flagsl = flags.length;
for (var j = 0; flags && j < flagsl; j++) switch (flags.charAt(j)) {
case ' ': positivePrefix = ' '; break;
case '+': positivePrefix = '+'; break;
case '-': leftJustify = true; break;
case "'": customPadChar = flags.charAt(j+1); break;
case '0': zeroPad = true; break;
case '#': prefixBaseX = true; break;
}

// parameters may be null, undefined, empty-string or real valued
// we want to ignore null, undefined and empty-string values
if (!minWidth) {
minWidth = 0;
} else if (minWidth == '*') {
minWidth = +a[i++];
} else if (minWidth.charAt(0) == '*') {
minWidth = +a[minWidth.slice(1, -1)];
} else {
minWidth = +minWidth;
}

// Note: undocumented perl feature:
if (minWidth < 0) {
minWidth = -minWidth;
leftJustify = true;
}

if (!isFinite(minWidth)) {
throw new Error('sprintf: (minimum-)width must be finite');
}

if (!precision) {
precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);
} else if (precision == '*') {
precision = +a[i++];
} else if (precision.charAt(0) == '*') {
precision = +a[precision.slice(1, -1)];
} else {
precision = +precision;
}

// grab value using valueIndex if required?
var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];

switch (type) {
case 's': return formatString(String(value), leftJustify, minWidth, precision, zeroPad, customPadChar);
case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
case 'i':
case 'd': {
var number = parseInt(+value);
var prefix = number < 0 ? '-' : positivePrefix;
value = prefix + pad(String(Math.abs(number)), precision, '0', false);
return justify(value, prefix, leftJustify, minWidth, zeroPad);
}
case 'e':
case 'E':
case 'f':
case 'F':
case 'g':
case 'G': {
var number = +value;
var prefix = number < 0 ? '-' : positivePrefix;
var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
value = prefix + Math.abs(number)[method](precision);
return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
}
default: return substring;
}
};

return format.replace(regex, doFormat);
}
Commentaire de SOTRON Nicolas (nicolas_s) - mardi, 03 février 2009, 16:50 GMT+2
=== _product_list.html ===
=>Remplacer
<plici_if if="$product.pma_min_price != 0 &amp;&amp; $product.pma_min_price != ~~">
<plici_if if="'NO'==$setting_stock_management || ~not_define~ == $product.psl_min_stock || 0 &lt; $product.psl_min_stock">
<div class="sw_ic_ajouter_panier">
<a href="{net_url type='SELF' _shopcart_pm_id=$product.pma_id _h=$h _f_adv=$f_adv _order_by=$order_by_for_product_list _f_lcp=$listpaging_current_page}"><plici_net_img id="ic_ajouter_panier"/></a>
<a href="{net_url type='SELF' _shopcart_pm_id=$product.pma_id _h=$h _f_adv=$f_adv _order_by=$order_by_for_product_list _f_lcp=$listpaging_current_page}">{"lang_str_ajouteraupanier"|tr}</a>
</div>
</plici_if>
</plici_if>

=>Par


<plici_if if="$product.psl_quant_min <= 1">
{assign var="quant_min" value="1"}
<plici_else />
{assign var="quant_min" value=$product.psl_quant_min}
</plici_if>
<plici_if if="($product.pma_min_price != 0)
&amp;&amp; ($product.pma_min_price != ~~)
&amp;&amp; ('NO'==$setting_stock_management
|| ~not_define~ == $product.psl_min_stock
|| (0 &lt; $product.psl_min_stock
&amp;&amp; $quant_min &lt; $product.psl_min_stock)
)">

<plici_if if="(~not_define~ == $product.psl_min_stock) || (255 <= $product.psl_min_stock)">
{assign var="quant_max" value="255"}
<plici_else />
{assign var="quant_max" value=$product.psl_min_stock}
</plici_if>
<form name="fn_add_product_{$product.pma_id}" action="{net_url type='SELF' _shopcart_pm_id=$product.pma_id _h=$h _f_adv=$f_adv _order_by=$order_by_for_product_list _f_lcp=$listpaging_current_page}" method="post">
<div class="sw_ic_ajouter_panier">

<a href="#" onclick="document.forms.fn_add_product_{$product.pma_id}.submit();">
<plici_net_img id="ic_ajouter_panier" />
{"lang_str_ajouteraupanier"|tr}
</a>
&nbsp;
<input type="text"
name="shopcart_quantity"
id="shopcart_quantity_{$product.pma_id}"
size="4"
maxlength="3"
value="{$quant_min}"
onchange="javascript: validQuantity('shopcart_quantity_{$product.pma_id}', {$quant_min}, {$quant_max});"
/>
</div>
</form>

=======================================================
=>Rajouter a la fin du fichier

<script language="javascript" type="text/javascript">
//<![CDATA[

/**
* Valid Quantity input field
* Check Number
* Check Quantity min
* Check Quantity max
*/
function validQuantity(p_quantity_field, p_quant_min, p_quant_max) {literal}{{/literal}
var quantity = parseInt(findDOM(p_quantity_field,0).value);
if ( (isNaN(quantity)) || (quantity < 1)){literal}{{/literal}
alert("{'lang_error_parameter'|tr:'JS'} : {'lang_str_quantity'|tr:'JS'}");
findDOM(p_quantity_field,0).value = p_quant_min;
} else {literal}{{/literal}
if (quantity < p_quant_min) {literal}{{/literal}
alert("{'lang_error_quant_min_not_reached'|tr:'JS'}");
findDOM(p_quantity_field,0).value = p_quant_min;
} else if (p_quant_max < parseInt(quantity)) {literal}{{/literal}
alert("{'lang_error_quant_max_reached'|tr:'JS'} : "+p_quant_max);
findDOM(p_quantity_field,0).value = p_quant_max;
}
}
return true;
}

//]]>
</script>
Commentaire de GOZLAN Rémi (remig) - mercredi, 04 février 2009, 12:10 GMT+2
est ce possible d'avoir un code plus propre avec le js séparé ?
car en faisant les manip, plus rien ne s'affiche ...
je vais essayé de retrouver une ancienne sauvegarde
pour le js_general.js c est celui qui est dans for plici que tu as modifié ?
Commentaire de GOZLAN Rémi (remig) - samedi, 07 février 2009, 02:11 GMT+2
tu as oublié de mettre un </plici_if> a la fin du code du fichier _product_list.html, c est pour ca que ma page planté
Commentaire de SOTRON Nicolas (nicolas_s) - mardi, 10 février 2009, 11:40 GMT+2
Il faudrait penser a faire en sorte que les templates non convertis fonctionnent quand même
Commentaire de GOZLAN Rémi (remig) - mardi, 10 février 2009, 12:29 GMT+2
AMELIORATION DE LA FONCTION :
dans la liste des produits rajouter "quantité" a coté de la cellule
Commentaire de SOTRON Nicolas (nicolas_s) - mercredi, 25 février 2009, 17:23 GMT+2
Remarques supplémentaires de Rémi :
Pour la fenêtre JS : Faire apparaitre le message suivant : "Stock minimum pour ce produit "+Var => Variable : lang_error_quant_min_not_reached
Quand quantite produit > quantité_stock : fenêtre js "Stock restant "+Var_stock sans laisser la possibilité de commander +.

Chargement...