Rhapsody Posted September 25, 2012 Posted September 25, 2012 (edited) Working on 1.4.9.0! (without Ajax Cart) It is working for 1.4.9.0 without the Ajax cart. I have created two product.tpl files that work. One is for the old stock Prestashop theme. The other is for the new Prestashop 1.5 compatible theme available for download at this link: http://addons.presta...emplate-15.html The product.tpl files move the text boxes up from the bottom and eliminate the "Save" button when used with the CartController override. The override/controller/CartController.php file I used was the one that Ben23 created in post #95 above. Rename the files attached in the zip file to product.tpl and use the one applicable for the stock theme you use. They are named for the "old" and "new" Prestashop themes. Remember to open the blockcart module in the BO and use configure to turn off the ajax cart. All that is needed now is for someone to help debug the ajax-cart.js file so the Ajax cart can be enabled again. For Ajax debug, the old theme uses the blockcart module. If you install the new Prestashop theme there is a module called blockcart2. product.tpl.zip Edited September 25, 2012 by Rhapsody (see edit history) Share this post Link to post Share on other sites More sharing options...
rjgout Posted October 8, 2012 Posted October 8, 2012 It this option also available for prestashop 1.5? Share this post Link to post Share on other sites More sharing options...
adameriksson Posted October 12, 2012 Posted October 12, 2012 Working on 1.4.9.0! (without Ajax Cart) It is working for 1.4.9.0 without the Ajax cart. I have created two product.tpl files that work. One is for the old stock Prestashop theme. The other is for the new Prestashop 1.5 compatible theme available for download at this link: http://addons.presta...emplate-15.html The product.tpl files move the text boxes up from the bottom and eliminate the "Save" button when used with the CartController override. The override/controller/CartController.php file I used was the one that Ben23 created in post #95 above. Rename the files attached in the zip file to product.tpl and use the one applicable for the stock theme you use. They are named for the "old" and "new" Prestashop themes. Remember to open the blockcart module in the BO and use configure to turn off the ajax cart. All that is needed now is for someone to help debug the ajax-cart.js file so the Ajax cart can be enabled again. For Ajax debug, the old theme uses the blockcart module. If you install the new Prestashop theme there is a module called blockcart2. I copied your code from "<!-- Customizable products --> {if $product->customizable}" to "</form> {* Rhapsody moved custo..." I also use Ben23's cartcontroller. But my store keeps saying that I need to save the customization. It doesnt add to cart... why? Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted October 12, 2012 Posted October 12, 2012 I copied your code from "<!-- Customizable products --> {if $product->customizable}" to "</form> {* Rhapsody moved custo..." I also use Ben23's cartcontroller. But my store keeps saying that I need to save the customization. It doesnt add to cart... why? 1. What version of ps are you using? 2. What Theme are you using? 3. What directory did you copy Ben23's CartController.php file to? 4. Did you turn off the Ajax cart in the blockcart module? 5. Did you set in the BO performance section Force Compile to Yes and Cache to No in order to recompile your modified template? Share this post Link to post Share on other sites More sharing options...
adameriksson Posted October 12, 2012 Posted October 12, 2012 (edited) 1. What version of ps are you using? 2. What Theme are you using? 3. What directory did you copy Ben23's CartController.php file to? 4. Did you turn off the Ajax cart in the blockcart module? 5. Did you set in the BO performance section Force Compile to Yes and Cache to No in order to recompile your modified template? 1. 1.4.9 2. A Theme from template monster. 3. /override/controllers 4. Yes I did 5. Yes, I see the update. And the save button is gone, but it dont work.. The weird thing is that the popup that says "please fill in required fields and save customization" is gone. I'm now being transfered to cart.php, and there I get a warning saying I must fill the mandatory fields and press save beforde adding to cart. I then press back and fill in the two textfields, press save, then i can add to cart. --EDIT-- Now I dont have the textfields mandatory. But I still need to press save to add the texts to the product. Do I need to modify ajax-cart.js ? as mentioned in this thread before Edited October 12, 2012 by adameriksson (see edit history) Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted October 12, 2012 Posted October 12, 2012 (edited) ..... The weird thing is that the popup that says "please fill in required fields and save customization" is gone. I'm now being transfered to cart.php, and there I get a warning saying I must fill the mandatory fields and press save before adding to cart. I then press back and fill in the two textfields, press save, then i can add to cart. The problem may be the theme from Template Monster. Is it based on the old or new PS theme? Try the stock PS theme with the mod and see if it works. If so, the problem is with your theme. If not, more troubleshooting to do. I think it is related to your theme, because when you press back you mention seeing the save button. I believe the save button should be gone completely with the modified tpl file Edit: Post your modified product.tpl file and I will try it on one of my installations. Edited October 12, 2012 by Rhapsody (see edit history) Share this post Link to post Share on other sites More sharing options...
adameriksson Posted October 12, 2012 Posted October 12, 2012 (edited) The problem may be the theme from Template Monster. Is it based on the old or new PS theme? Try the stock PS theme with the mod and see if it works. If so, the problem is with your theme. If not, more troubleshooting to do. I think it is related to your theme, because when you press back you mention seeing the save button. I believe the save button should be gone completely with the modified tpl file Edit: Post your modified product.tpl file and I will try it on one of my installations. Sorry, of course I dont see the save button. It was with my own code, sorry. I have your product.tpl code now (only the "Customizable products" part). I paste the whole product.tpl code here {include file="$tpl_dir./errors.tpl"} {if $errors|@count == 0} <script type="text/javascript"> // <![CDATA[ // PrestaShop internal settings var currencySign = '{$currencySign|html_entity_decode:2:"UTF-8"}'; var currencyRate = '{$currencyRate|floatval}'; var currencyFormat = '{$currencyFormat|intval}'; var currencyBlank = '{$currencyBlank|intval}'; var taxRate = {$tax_rate|floatval}; var jqZoomEnabled = {if $jqZoomEnabled}true{else}false{/if}; //JS Hook var oosHookJsCodeFunctions = new Array(); // Parameters var id_product = '{$product->id|intval}'; var productHasAttributes = {if isset($groups)}true{else}false{/if}; var quantitiesDisplayAllowed = {if $display_qties == 1}true{else}false{/if}; var quantityAvailable = {if $display_qties == 1 && $product->quantity}{$product->quantity}{else}0{/if}; var allowBuyWhenOutOfStock = {if $allow_oosp == 1}true{else}false{/if}; var availableNowValue = '{$product->available_now|escape:'quotes':'UTF-8'}'; var availableLaterValue = '{$product->available_later|escape:'quotes':'UTF-8'}'; var productPriceTaxExcluded = {$product->getPriceWithoutReduct(true)|default:'null'} - {$product->ecotax}; var reduction_percent = {if $product->specificPrice AND $product->specificPrice.reduction AND $product->specificPrice.reduction_type == 'percentage'}{$product->specificPrice.reduction*100}{else}0{/if}; var reduction_price = {if $product->specificPrice AND $product->specificPrice.reduction AND $product->specificPrice.reduction_type == 'amount'}{$product->specificPrice.reduction}{else}0{/if}; var specific_price = {if $product->specificPrice AND $product->specificPrice.price}{$product->specificPrice.price}{else}0{/if}; var specific_currency = {if $product->specificPrice AND $product->specificPrice.id_currency}true{else}false{/if}; var group_reduction = '{$group_reduction}'; var default_eco_tax = {$product->ecotax}; var ecotaxTax_rate = {$ecotaxTax_rate}; var currentDate = '{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}'; var maxQuantityToAllowDisplayOfLastQuantityMessage = {$last_qties}; var noTaxForThisProduct = {if $no_tax == 1}true{else}false{/if}; var displayPrice = {$priceDisplay}; var productReference = '{$product->reference|escape:'htmlall':'UTF-8'}'; var productAvailableForOrder = {if (isset($restricted_country_mode) AND $restricted_country_mode) OR $PS_CATALOG_MODE}'0'{else}'{$product->available_for_order}'{/if}; var productShowPrice = '{if !$PS_CATALOG_MODE}{$product->show_price}{else}0{/if}'; var productUnitPriceRatio = '{$product->unit_price_ratio}'; var idDefaultImage = {if isset($cover.id_image_only)}{$cover.id_image_only}{else}0{/if}; {* var ipa_default = {if isset($ipa_default)}{$ipa_default}{/if}; *} // Customizable field var img_ps_dir = '{$img_ps_dir}'; var customizationFields = new Array(); {assign var='imgIndex' value=0} {assign var='textFieldIndex' value=0} {foreach from=$customizationFields item='field' name='customizationFields'} {assign var="key" value="pictures_`$product->id`_`$field.id_customization_field`"} customizationFields[{$smarty.foreach.customizationFields.index|intval}] = new Array(); customizationFields[{$smarty.foreach.customizationFields.index|intval}][0] = '{if $field.type|intval == 0}img{$imgIndex++}{else}textField{$textFieldIndex++}{/if}'; customizationFields[{$smarty.foreach.customizationFields.index|intval}][1] = {if $field.type|intval == 0 && isset($pictures.$key) && $pictures.$key}2{else}{$field.required|intval}{/if}; {/foreach} // Images var img_prod_dir = '{$img_prod_dir}'; var combinationImages = new Array(); {if isset($combinationImages)} {foreach from=$combinationImages item='combination' key='combinationId' name='f_combinationImages'} combinationImages[{$combinationId}] = new Array(); {foreach from=$combination item='image' name='f_combinationImage'} combinationImages[{$combinationId}][{$smarty.foreach.f_combinationImage.index}] = {$image.id_image|intval}; {/foreach} {/foreach} {/if} combinationImages[0] = new Array(); {if isset($images)} {foreach from=$images item='image' name='f_defaultImages'} combinationImages[0][{$smarty.foreach.f_defaultImages.index}] = {$image.id_image}; {/foreach} {/if} // Translations var doesntExist = '{l s='The product does not exist in this model. Please choose another.' js=1}'; var doesntExistNoMore = '{l s='This product is no longer in stock' js=1}'; var doesntExistNoMoreBut = '{l s='with those attributes but is available with others' js=1}'; var uploading_in_progress = '{l s='Uploading in progress, please wait...' js=1}'; var fieldRequired = '{l s='Please fill in all required fields, then save the customization.' js=1}'; {if isset($groups)} // Combinations {foreach from=$combinations key=idCombination item=combination} addCombination({$idCombination|intval}, new Array({$combination.list}), {$combination.quantity}, {$combination.price}, {$combination.ecotax}, {$combination.id_image}, '{$combination.reference|addslashes}', {$combination.unit_impact}, {$combination.minimal_quantity}); {/foreach} // Colors {if $colors|@count > 0} {if $product->id_color_default}var id_color_default = {$product->id_color_default|intval};{/if} {/if} {/if} //]]> </script> {include file="$tpl_dir./breadcrumb.tpl"} {if isset($confirmation) && $confirmation} <p class="confirmation"> {$confirmation} </p> {/if} <div id="primary_block" class="clearfix"> {if isset($adminActionDisplay) && $adminActionDisplay} <div id="admin-action"> <p>{l s='This product is not visible to your customers.'} <input type="hidden" id="admin-action-product-id" value="{$product->id}" /> <input type="submit" value="{l s='Publish'}" class="exclusive" onclick="submitPublishProduct('{$base_dir}{$smarty.get.ad}', 0)"/> <input type="submit" value="{l s='Back'}" class="exclusive" onclick="submitPublishProduct('{$base_dir}{$smarty.get.ad}', 1)"/> </p> <div class="clear" ></div> <p id="admin-action-result"></p> </p> </div> {/if} {* left column *} <div id="pb-right-column"> {* product img *} <div id="image-block" class="bordercolor"> {if $have_image} <img src="{$link->getImageLink($product->link_rewrite, $cover.id_image, 'large')}" {if $jqZoomEnabled}class="jqzoom" alt="{$link->getImageLink($product->link_rewrite, $cover.id_image, 'thickbox')}"{else} title="{$product->name|escape:'htmlall':'UTF-8'}" alt="{$product->name|escape:'htmlall':'UTF-8'}" {/if} id="bigpic" width="{$largeSize.width}" height="{$largeSize.height}" /> {else} <img src="{$img_prod_dir}{$lang_iso}-default-large.jpg" id="bigpic" alt="" title="{$cover.legend|escape:'htmlall':'UTF-8'}" width="{$largeSize.width}" height="{$largeSize.height}" /> {/if} </div> {if isset($images) && count($images) > 0} {* thumbnails *} <div id="views_block" {if isset($images) && count($images) < 2}class="hidden"{/if}> {if isset($images) && count($images) > 3}<a id="view_scroll_left" class="hidden" title="{l s='Other views'}" href="javascript:{ldelim}{rdelim}">{l s='Previous'}</a>{/if} <div id="thumbs_list"> <ul id="thumbs_list_frame"> {if isset($images)} {foreach from=$images item=image name=thumbnails} {assign var=imageIds value="`$product->id`-`$image.id_image`"} <li id="thumbnail_{$image.id_image}" class="{if $smarty.foreach.thumbnails.last}thumb_last{/if}"> <a href="{$link->getImageLink($product->link_rewrite, $imageIds, 'thickbox')}" rel="other-views" class="thickbox bordercolor {if (isset($image.cover) AND $image.cover == 1) OR (!isset($image.cover) AND $smarty.foreach.thumbnails.first)}shown{/if}" title="{$image.legend|htmlspecialchars}"> <img id="thumb_{$image.id_image}" src="{$link->getImageLink($product->link_rewrite, $imageIds, 'medium')}" alt="{$image.legend|htmlspecialchars}" height="{$mediumSize.height}" width="{$mediumSize.width}" /> </a> </li> {/foreach} {/if} </ul> </div> {if isset($images) && count($images) > 3}<a id="view_scroll_right" title="{l s='Other views'}" href="javascript:{ldelim}{rdelim}">{l s='Next'}</a>{/if} </div> {/if} {if isset($images) && count($images) > 1}<span id="wrapResetImages" style="display:none;"><div><a id="resetImages" href="{$link->getProductLink($product)}" onclick="$('span#wrapResetImages').hide('slow');return (false);">{l s='Display all pictures'}</a></div></span>{/if} {* usefull links *} <ul id="usefull_link_block" class="bordercolor"> {if $HOOK_EXTRA_LEFT}{$HOOK_EXTRA_LEFT}{/if} <li class="print"><a href="javascript:print();">{l s='Print'}</a></li> {if $have_image && !$jqZoomEnabled} <li class="view-size"><span id="view_full_size" class="span_link">{l s='View full size'}</span></li> {/if} </ul> {* social icons *} <div class="share bordercolor"><!-- AddThis Button BEGIN --> <div class="addthis_toolbox addthis_default_style "> <a class="addthis_button_facebook_like" fb:like:layout="button_count"></a> <a class="addthis_button_tweet"></a> <a class="addthis_button_google_plusone" g:plusone:size="medium"></a> <a class="addthis_counter addthis_pill_style"></a> </div> <script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid=ra-4f419f410efe76d3"></script> </div> </div> {* right column *} <div id="pb-left-column"> <h1>{$product->name|escape:'htmlall':'UTF-8'}</h1> {if ($product->show_price AND !isset($restricted_country_mode)) OR isset($groups) OR $product->reference OR (isset($HOOK_PRODUCT_ACTIONS) && $HOOK_PRODUCT_ACTIONS)} <form id="buy_block" class="bordercolor" {if $PS_CATALOG_MODE AND !isset($groups) AND $product->quantity > 0}class="hidden"{/if} action="{$link->getPageLink('cart.php')}" method="post"> {* hidden datas *} <p class="hidden"> <input type="hidden" name="token" value="{$static_token}" /> <input type="hidden" name="id_product" value="{$product->id|intval}" id="product_page_product_id" /> <input type="hidden" name="add" value="1" /> <input type="hidden" name="id_product_attribute" id="idCombination" value="" /> </p> {if $product->show_price AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE} <div class="price bordercolor"> {if !$priceDisplay || $priceDisplay == 2}{assign var='productPrice' value=$product->getPrice(true, $smarty.const.NULL, 2)}{assign var='productPriceWithoutRedution' value=$product->getPriceWithoutReduct(false, $smarty.const.NULL)}{elseif $priceDisplay == 1}{assign var='productPrice' value=$product->getPrice(false, $smarty.const.NULL, 2)}{assign var='productPriceWithoutRedution' value=$product->getPriceWithoutReduct(true, $smarty.const.NULL)}{/if} {* price *} <span class="our_price_display"> {if $priceDisplay >= 0 && $priceDisplay <= 2} <span id="our_price_display" class="price">{convertPrice price=$productPrice}</span> {if $tax_enabled && ((isset($display_tax_label) && $display_tax_label == 1) OR !isset($display_tax_label))} <span class="our_price_display_tax">{if $priceDisplay == 1}{l s='tax excl.'}{else}{l s='tax incl.'}{/if}</span> {/if} {/if} </span> {* tax excl *} {if $priceDisplay == 2} <span id="pretaxe_price"><span id="pretaxe_price_display">{convertPrice price=$product->getPrice(false, $smarty.const.NULL, 2)}</span> {l s='tax excl.'}</span> {/if} {* add to cart btn *} <p id="add_to_cart" {if (!$allow_oosp && $product->quantity <= 0) OR !$product->available_for_order OR (isset($restricted_country_mode) AND $restricted_country_mode) OR $PS_CATALOG_MODE} style="display:none;"{/if}> <a class="exclusive" href="javascript:document.getElementById('add2cartbtn').click();">{l s='Add to cart'}</a> <input id="add2cartbtn" type="submit" name="Submit" value="{l s='Add to cart'}" /> </p> {* quantity wanted *} <p id="quantity_wanted_p"{if (!$allow_oosp && $product->quantity == 0) OR $virtual OR !$product->available_for_order OR $PS_CATALOG_MODE} style="display: none;"{/if}> <input type="text" name="qty" id="quantity_wanted" class="text" value="{if isset($quantityBackup)}{$quantityBackup|intval}{else}{if $product->minimal_quantity > 1}{$product->minimal_quantity}{else}1{/if}{/if}" size="2" maxlength="3" {if $product->minimal_quantity > 1}onkeyup="checkMinimalQuantity({$product->minimal_quantity});"{/if} /> <label>{l s='Quantity :'}</label> </p> </div> {* minimal quantity wanted *} <p id="minimal_quantity_wanted_p" class="bordercolor"{if $product->minimal_quantity <= 1 OR !$product->available_for_order OR $PS_CATALOG_MODE} style="display:none;"{/if}>{l s='You must add '}<b id="minimal_quantity_label">{$product->minimal_quantity}</b>{l s=' as a minimum quantity to buy this product.'}</p> {if $product->minimal_quantity > 1}<script type="text/javascript">checkMinimalQuantity();</script>{/if} {/if} <div class="other_options bordercolor"> {if $product->show_price AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE} <div id="other_prices"> {if $product->specificPrice AND $product->specificPrice.reduction} {* old price *} <p id="old_price"> {if $priceDisplay >= 0 && $priceDisplay <= 2} {if $productPriceWithoutRedution > $productPrice} <span id="old_price_display">{convertPrice price=$productPriceWithoutRedution}</span> {if $tax_enabled}{if $priceDisplay == 1}{l s='tax excl.'}{else}{l s='tax incl.'}{/if}{/if} {/if} {/if} </p> {/if} {* reduction percent *} {if $product->specificPrice AND $product->specificPrice.reduction_type == 'percentage'} <p id="reduction_percent">{l s='(price reduced by'} <span id="reduction_percent_display">{$product->specificPrice.reduction*100}</span> %{l s=')'}</p> {/if} {* pack price *} {if $packItems|@count} <p class="pack_price">{l s='instead of'} <span style="text-decoration: line-through;">{convertPrice price=$product->getNoPackPrice()}</span></p> {/if} {* price ecotax *} {if $product->ecotax != 0} <p class="price-ecotax">{l s='include'} <span id="ecotax_price_display">{if $priceDisplay == 2}{$ecotax_tax_exc|convertAndFormatPrice}{else}{$ecotax_tax_inc|convertAndFormatPrice}{/if}</span> {l s='for green tax'} {if $product->specificPrice AND $product->specificPrice.reduction}<br />{l s='(not impacted by the discount)'}{/if} </p> {/if} {* unit price *} {if !empty($product->unity) && $product->unit_price_ratio > 0.000000} {math equation="pprice / punit_price" pprice=$productPrice punit_price=$product->unit_price_ratio assign=unit_price} <p class="unit-price"><span id="unit_price_display" class="price">{convertPrice price=$unit_price}</span> {l s='per'} {$product->unity|escape:'htmlall':'UTF-8'}</p> {/if} {* online only *} {if $product->online_only}<p class="online_only">{l s='Online only'}!</p>{/if} {* number of item in stock *} {if ($display_qties == 1 && !$PS_CATALOG_MODE && $product->available_for_order)} <p id="pQuantityAvailable" {if $product->quantity <= 0} style="display:none;"{/if} > <span id="quantityAvailable">{$product->quantity|intval}</span> <span {if $product->quantity > 1} style="display:none;"{/if} id="quantityAvailableTxt">{l s='item in stock'}</span> <span {if $product->quantity == 1} style="display:none;"{/if} id="quantityAvailableTxtMultiple">{l s='items in stock'}</span> </p> {/if} {* last quantities *} <p id="last_quantities"{if ($product->quantity > $last_qties OR $product->quantity <= 0) OR $allow_oosp OR !$product->available_for_order OR $PS_CATALOG_MODE} style="display:none;"{/if} >{l s='Warning: Last items in stock!'}</p> {* product reference *} <p id="product_reference" {if isset($groups) OR !$product->reference}style="display:none;"{/if}><label for="product_reference">{l s='Reference :'} </label><span class="editable">{$product->reference|escape:'htmlall':'UTF-8'}</span></p> {* availability *} <p id="availability_statut"{if ($product->quantity <= 0 && !$product->available_later && $allow_oosp) OR ($product->quantity > 0 && !$product->available_now) OR !$product->available_for_order OR $PS_CATALOG_MODE} style="display:none;"{/if}> <span id="availability_label">{l s='Availability:'}</span> <span id="availability_value"{if $product->quantity <= 0} class="warning_inline"{/if}> {if $product->quantity <= 0}{if $allow_oosp}{$product->available_later}{else}{l s='This product is no longer in stock'}{/if}{else}{$product->available_now}{/if} </span> </p> </div> {*close if for show price*} {/if} <div id="attributes"> {* ON SALE *} {if $product->on_sale}<span class="on_sale">{l s='On sale!'}</span>{elseif $product->specificPrice AND $product->specificPrice.reduction AND $productPriceWithoutRedution > $productPrice}<span class="discount">{l s='Reduced price!'}</span>{/if} <div class="clearblock"></div> {* attributes *} {if isset($groups)} {foreach from=$groups key=id_attribute_group item=group} {if $group.attributes|@count} <p> {assign var="groupName" value="group_$id_attribute_group"} <select name="{$groupName}" id="group_{$id_attribute_group|intval}" onchange="javascript:findCombination();{if $colors|@count > 0}$('#wrapResetImages').show('slow');{/if};"> {foreach from=$group.attributes key=id_attribute item=group_attribute} <option value="{$id_attribute|intval}"{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $id_attribute) || $group.default == $id_attribute} selected="selected"{/if} title="{$group_attribute|escape:'htmlall':'UTF-8'}">{$group_attribute|escape:'htmlall':'UTF-8'}</option> {/foreach} </select> <label for="group_{$id_attribute_group|intval}">{$group.name|escape:'htmlall':'UTF-8'}:</label> </p> {/if} {/foreach} {/if} </div> <div class="clearblock"></div> </div> {* short descriptions *} {if $product->description_short} <div id="short_description_block" class="bordercolor" style="display:none;"> {if $product->description_short} <div id="short_description_content" class="rte align_justify">{$product->description_short}</div> {/if} {if $product->description} <p class="buttons_bottom_block"><a href="javascript:{ldelim}{rdelim}" class="button">{l s='More details'}</a></p> {/if} </div> {/if} {* pack content *} {if $packItems|@count > 0} <div class="pack_content bordercolor bgcolor"> <h3>{l s='Pack content'}</h3> <ul> {foreach from=$packItems item=packItem} <li> {$packItem.pack_quantity} x <a href="{$link->getProductLink($packItem.id_product, $packItem.link_rewrite, $packItem.category)}">{$packItem.name|escape:'htmlall':'UTF-8'}</a> <p>{$packItem.description_short|truncate:100:'...'}</p> </li> {/foreach} </ul> </div> {/if} {* Out of stock hook *} {if !$allow_oosp} <p id="oosHook"{if $product->quantity > 0} style="display: none;"{/if}>{$HOOK_PRODUCT_OOS}</p> {/if} {* colors *} {if isset($colors) && $colors} <div id="color_picker" class="bgcolor bordercolor"> <h3>{l s='Pick a color:' js=1}</h3> <ul id="color_to_pick_list"> {foreach from=$colors key='id_attribute' item='color'} <li><a id="color_{$id_attribute|intval}" class="color_pick" style="background:{$color.value};" onclick="updateColorSelect({$id_attribute|intval});$('#wrapResetImages').show('slow');" title="{$color.name}">{if file_exists($col_img_dir|cat:$id_attribute|cat:'.jpg')}<img src="{$img_col_dir}{$id_attribute}.jpg" alt="{$color.name}" width="20" height="20" />{/if}</a></li> {/foreach} </ul> </div> {/if} {if isset($HOOK_PRODUCT_ACTIONS) && $HOOK_PRODUCT_ACTIONS}{$HOOK_PRODUCT_ACTIONS}{/if} <div class="clearblock"></div> </form> {/if} <!-- Rhapsody moved customizable fields in this section --> <!-- Customizable products --> {if $product->customizable} <ul class="idTabs"> <li><a style="cursor: pointer">{l s='Product customization'}</a></li> </ul> <div class="customization_block"> {* Rhapsody comment out this section <form method="post" action="{$customizationFormTarget}" enctype="multipart/form-data" id="customizationForm"> <p> <img src="{$img_dir}icon/infos.gif" alt="Informations" /> {l s='After saving your customized product, remember to add it to your cart.'} {if $product->uploadable_files}<br />{l s='Allowed file formats are: GIF, JPG, PNG'}{/if} </p> Rhapsody Commented out *} {if $product->uploadable_files|intval} <h2>{l s='Pictures'}</h2> <ul id="uploadable_files"> {counter start=0 assign='customizationField'} {foreach from=$customizationFields item='field' name='customizationFields'} {if $field.type == 0} <li class="customizationUploadLine{if $field.required} required{/if}">{assign var='key' value='pictures_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field} {if isset($pictures.$key)}<div class="customizationUploadBrowse"> <img src="{$pic_dir}{$pictures.$key}_small" alt="" /> <a href="{$link->getProductDeletePictureLink($product, $field.id_customization_field)}" title="{l s='Delete'}" > <img src="{$img_dir}icon/delete.gif" alt="{l s='Delete'}" class="customization_delete_icon" width="11" height="13" /> </a> </div>{/if} <div class="customizationUploadBrowse"><input type="file" name="file{$field.id_customization_field}" id="img{$customizationField}" class="customization_block_input {if isset($pictures.$key)}filled{/if}" />{if $field.required}<sup>*</sup>{/if} <div class="customizationUploadBrowseDescription">{if !empty($field.name)}{$field.name}{else}{l s='Please select an image file from your hard drive'}{/if}</div></div> </li> {counter} {/if} {/foreach} </ul> {/if} <div class="clear"></div> {if $product->text_fields|intval} <h2>{l s='Texts'}</h2> <ul id="text_fields"> {counter start=0 assign='customizationField'} {foreach from=$customizationFields item='field' name='customizationFields'} {if $field.type == 1} <li class="customizationUploadLine{if $field.required} required{/if}">{assign var='key' value='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field} {if !empty($field.name)}{$field.name}{/if}{if $field.required}<sup>*</sup>{/if}<textarea type="text" name="textField{$field.id_customization_field}" id="textField{$customizationField}" rows="1" cols="40" class="customization_block_input" />{if isset($textFields.$key)}{$textFields.$key|stripslashes}{/if}</textarea> </li> {counter} {/if} {/foreach} </ul> {/if} <p style="clear: left;" id="customizedDatas"> <input type="hidden" name="ipa_customization" id="ipa_customization" value="{$ipa_customization}" /> <input type="hidden" name="quantityBackup" id="quantityBackup" value="" /> <input type="hidden" name="submitCustomizedDatas" value="1" /> <p class="clear required"><sup>*</sup> {l s='required fields'}</p> {* Rhapsody hid save button in next line <input type="button" class="button" value="{l s='Save'}" onclick="javascript:saveCustomization()" /> * * * * end of comment *} <span id="ajax-loader" style="display:none"><img src="{$img_ps_dir}loader.gif" alt="loader" /></span> </p> </form> </div> {/if} {* Rhapsody moved customization block above *} </form> {* Rhapsody moved customization block above - need to capture the /form also *} {if $HOOK_EXTRA_RIGHT}{$HOOK_EXTRA_RIGHT}{/if} </div> </div> {* quantity discount *} {if $quantity_discounts} <div id="quantityDiscount" class="bgcolor bordercolor"> <h3>{l s='Quantity discount'}</h3> <table> <tr> {foreach from=$quantity_discounts item='quantity_discount' name='quantity_discounts'} <th class="bordercolor">{$quantity_discount.quantity|intval} {if $quantity_discount.quantity|intval > 1} {l s='quantities'} {else} {l s='quantity'} {/if} </th> {/foreach} </tr> <tr> {foreach from=$quantity_discounts item='quantity_discount' name='quantity_discounts'} <td> {if $quantity_discount.price != 0 OR $quantity_discount.reduction_type == 'amount'} -{convertPrice price=$quantity_discount.real_value|floatval} {else} -{$quantity_discount.real_value|floatval}% {/if} </td> {/foreach} </tr> </table> </div> {/if} {* description and features *} {if $product->description || $features || $accessories || $HOOK_PRODUCT_TAB || $attachments} <div id="more_info_block" class="clear"> <ul id="more_info_tabs" class="idTabs idTabsShort"> {if $product->description}<li><a id="more_info_tab_more_info" href="#idTab1">{l s='More info'}</a></li>{/if} {if $features}<li><a id="more_info_tab_data_sheet" href="#idTab2">{l s='Data sheet'}</a></li>{/if} {if $attachments}<li><a id="more_info_tab_attachments" href="#idTab9">{l s='Download'}</a></li>{/if} {if isset($accessories) AND $accessories}<li><a href="#idTab4">{l s='Accessories'}</a></li>{/if} {$HOOK_PRODUCT_TAB} </ul> <div id="more_info_sheets" class="bgcolor bordercolor"> {if $product->description} {* full description *} <div id="idTab1"><div>{$product->description}</div></div> {/if} {if $features} {* product's features *} <ul id="idTab2" class="bullet"> {foreach from=$features item=feature} <li><span>{$feature.name|escape:'htmlall':'UTF-8'}</span> {$feature.value|escape:'htmlall':'UTF-8'}</li> {/foreach} </ul> {/if} {if $attachments} {* product's attachments *} <ul id="idTab9" class="bullet"> {foreach from=$attachments item=attachment} <li><a href="{$link->getPageLink('attachment.php', true)}?id_attachment={$attachment.id_attachment}">{$attachment.name|escape:'htmlall':'UTF-8'}</a><br />{$attachment.description|escape:'htmlall':'UTF-8'}</li> {/foreach} </ul> {/if} {if isset($accessories) AND $accessories} {* accessories *} <ul id="idTab4"> {foreach from=$accessories item=accessory name=accessories_list} {assign var='accessoryLink' value=$link->getProductLink($accessory.id_product, $accessory.link_rewrite, $accessory.category)} <li class="bordercolor ajax_block_product {if $smarty.foreach.accessories_list.first}first_item{elseif $smarty.foreach.accessories_list.last}last_item{else}item{/if} product_accessories_description"> <div class="accessories_desc"> <a class="accessory_image product_img_link bordercolor" href="{$accessoryLink|escape:'htmlall':'UTF-8'}" title="{$accessory.legend|escape:'htmlall':'UTF-8'}"><img src="{$link->getImageLink($accessory.link_rewrite, $accessory.id_image, 'medium')}" alt="{$accessory.legend|escape:'htmlall':'UTF-8'}" /></a> <h5><a class="product_link" href="{$accessoryLink|escape:'htmlall':'UTF-8'}">{$accessory.name|truncate:22:'...':true|escape:'htmlall':'UTF-8'}</a></h5> <a class="product_descr" href="{$accessoryLink|escape:'htmlall':'UTF-8'}" title="{l s='More'}">{$accessory.description_short|strip_tags|truncate:70:'...'}</a> </div> <div class="accessories_price bordercolor"> {if $accessory.show_price AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE}<span class="price">{if $priceDisplay != 1}{displayWtPrice p=$accessory.price}{else}{displayWtPrice p=$accessory.price_tax_exc}{/if}</span>{/if} {if ($accessory.allow_oosp || $accessory.quantity > 0) AND $accessory.available_for_order AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE} <a class="exclusive button ajax_add_to_cart_button" href="{$link->getPageLink('cart.php')}?qty=1&id_product={$accessory.id_product|intval}&token={$static_token}&add" rel="ajax_id_product_{$accessory.id_product|intval}" title="{l s='Add to cart'}">{l s='Add to cart'}</a> {else} <span class="exclusive">{l s='Add to cart'}</span> {/if} </div> </li> {/foreach} </ul> {/if} {$HOOK_PRODUCT_TAB_CONTENT} </div> </div> {/if} {$HOOK_PRODUCT_FOOTER} {* pack items list *} {if $packItems|@count > 0} <div id="pack_product_list"> <h2>{l s='Pack content'}</h2> {include file="$tpl_dir./product-list-pack.tpl" products=$packItems} </div> {/if} {/if} The template Is built for 1.4.8, but I use it with 1.4.9. Everything else is working so... Edited October 12, 2012 by adameriksson (see edit history) Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted October 12, 2012 Posted October 12, 2012 I have confirmed the problem is with your product.tpl file when I try it with a stock ps theme on one of my 1.4.9.0 test installations. With your file I get the message. There is 1 error : Please fill in all required fields, then save the customization. Try using the product.tpl file I modified from the old template in your theme and see if it works, then go from there for any other mods. A good tool to use to compare the files and make the changes is called WinMerge. Share this post Link to post Share on other sites More sharing options...
adameriksson Posted October 12, 2012 Posted October 12, 2012 I have confirmed the problem is with your product.tpl file when I try it with a stock ps theme on one of my 1.4.9.0 test installations. With your file I get the message. There is 1 error : Please fill in all required fields, then save the customization. Try using the product.tpl file I modified from the old template in your theme and see if it works, then go from there for any other mods. A good tool to use to compare the files and make the changes is called WinMerge. Okey, Thanks for your help! The sad thing is when i Use your code, everyting looks weird, I dont even see a add to cart button.. Well, I think I'm stuck with the save button then, If I'm not able to modify your tpl file to have it look like my themes tpl Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted October 12, 2012 Posted October 12, 2012 No problem. Seriously - create another theme folder and make changes to the stock PS theme which should be as easy as copying the product.tpl file that I posted. Once that works, use WinMerge to compare those files with your theme and that should help you find where / why there are differences. Share this post Link to post Share on other sites More sharing options...
adameriksson Posted October 12, 2012 Posted October 12, 2012 No problem. Seriously - create another theme folder and make changes to the stock PS theme which should be as easy as copying the product.tpl file that I posted. Once that works, use WinMerge to compare those files with your theme and that should help you find where / why there are differences. That's a good idea. I just duplicated standard theme, overvrited the product.tpl file with yours. I have the modified controller file. But it doesnt work anyway, the text isn't in the cart. Maybe it is something with my templatemonster modules... Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted October 12, 2012 Posted October 12, 2012 does Template Monster modify the blockcart module? Share this post Link to post Share on other sites More sharing options...
adameriksson Posted October 12, 2012 Posted October 12, 2012 (edited) does Template Monster modify the blockcart module? Yeah The do, they have a modified ajax-cart.js. But I dont use their file yet. I don't know what it does. Do you think it would work better if I use it? I see now that I also have "blockcart-json.tpl" and "blockcart.tpl" in my themes/modules folder. So templatemonster have modified the cart module... I did a comparison, looks like they only have customized it for design purpose, they have not changed core functions Edited October 12, 2012 by adameriksson (see edit history) Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted October 13, 2012 Posted October 13, 2012 Yeah The do, they have a modified ajax-cart.js. But I dont use their file yet. I don't know what it does. Do you think it would work better if I use it? I see now that I also have "blockcart-json.tpl" and "blockcart.tpl" in my themes/modules folder. So templatemonster have modified the cart module... I did a comparison, looks like they only have customized it for design purpose, they have not changed core functions I moved some code around in your monster template file and got it to work, but am not sure if it formats correctly since I don't have your entire theme. Try the attached file and unzip it to product.tpl product.zip Share this post Link to post Share on other sites More sharing options...
adameriksson Posted October 13, 2012 Posted October 13, 2012 I moved some code around in your monster template file and got it to work, but am not sure if it formats correctly since I don't have your entire theme. Try the attached file and unzip it to product.tpl IT WORKS!!!!!! Thank you so much, you are the best! May I ask you what U think was the problem in the code? Was it the position of some code, or did you modify something else? Thank so much, I'm so glad! Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted October 13, 2012 Posted October 13, 2012 It was the position of code. You can use WinMerge and compare what you posted with what I changed. Share this post Link to post Share on other sites More sharing options...
franmille Posted November 22, 2012 Posted November 22, 2012 (edited) Hi everybody, Thanks for this solution, works perfectly. I would like it to work well with file fields, you can help me? Regards edit: I use the Prestashop version 1.4.9, with the Prestashop_new theme. And I've gotten it to work with ajax cart, deleting the code between "//for every 'add' buttons..." and "//for 'delete' buttons in the cart block.." in the ajax-cart.js theme's file. Edited November 22, 2012 by franmille (see edit history) Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted November 22, 2012 Posted November 22, 2012 @franmille - would you please post your ajax-cart.js file so I can try it? Share this post Link to post Share on other sites More sharing options...
cagrie Posted November 25, 2012 Posted November 25, 2012 this is one of the issues that makes me wanna move to opencart. what were the developers thinking by making a separate save button when it is totally unecessary? Share this post Link to post Share on other sites More sharing options...
cagrie Posted November 25, 2012 Posted November 25, 2012 (edited) when I do all the said, the customization is saved but the attributes aren't. when the line <input type="hidden" name="submitCustomizedDatas" value="1" /> is in the product.tpl, the customization is saved but the attributes arent. if it is not, the attributes are saved but the customizations arent. I'm on ps 1.4.8.2 pulling my hair here... Edited November 25, 2012 by cagrie (see edit history) Share this post Link to post Share on other sites More sharing options...
franmille Posted November 26, 2012 Posted November 26, 2012 (edited) @Rhapsody here is my ajax-cart.js, I can´t upload it... Edited November 26, 2012 by franmille (see edit history) Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted November 28, 2012 Posted November 28, 2012 @franmille - thanks for the link. I am unable to get the Ajax cart to work with my mods. Share this post Link to post Share on other sites More sharing options...
shamun Posted January 1, 2013 Posted January 1, 2013 Anybody got a working controller and tpl for 1.5? I tried the one provided for 1.4.9 and no go. Share this post Link to post Share on other sites More sharing options...
shamun Posted January 2, 2013 Posted January 2, 2013 Figured out a way to do it granted it's not the correct way and I'm on too short of a deadline to make it clean. Also, only for text fields. I didn't need image upload so I didnt even try with that. See attached. Tested on 1.5.2. Put the file in /overrides/controllers/front/ Requires .tpl modifcation that is fairly straightforward: Remove the save button and put the following code in the form which submits to the cart: {if $product->text_fields|intval} {counter start=0 assign='customizationField'} {foreach from=$customizationFields item='field' name='customizationFields'} {if $field.type == 1} <label for ="textField{$customizationField}">{assign var='key' value='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field} {if !empty($field.name)}{$field.name}{/if}{if $field.required}<sup>*</sup>{/if}</label> <textarea type="text" name="textField{$field.id_customization_field}" id="textField{$customizationField}" rows="1" cols="40" class="customization_block_input" />{if isset($textFields.$key)}{$textFields.$key|stripslashes}{/if}</textarea> {counter} {/if} {/foreach} {/if} <input type="hidden" name="quantityBackup" id="quantityBackup" value="" /> <input type="hidden" name="submitCustomizedDatas" value="1" /> Of course all you really need are the inputs. The code is stolen from the other customization area on the page and minified a little. Nothing changed. Be sure to remove the customization form as well. CartController.php 1 Share this post Link to post Share on other sites More sharing options...
naeems Posted January 4, 2013 Posted January 4, 2013 Figured out a way to do it granted it's not the correct way and I'm on too short of a deadline to make it clean. Also, only for text fields. I didn't need image upload so I didnt even try with that. See attached. Tested on 1.5.2. Put the file in /overrides/controllers/front/ Requires .tpl modifcation that is fairly straightforward: Remove the save button and put the following code in the form which submits to the cart: {if $product->text_fields|intval} {counter start=0 assign='customizationField'} {foreach from=$customizationFields item='field' name='customizationFields'} {if $field.type == 1} <label for ="textField{$customizationField}">{assign var='key' value='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field} {if !empty($field.name)}{$field.name}{/if}{if $field.required}<sup>*</sup>{/if}</label> <textarea type="text" name="textField{$field.id_customization_field}" id="textField{$customizationField}" rows="1" cols="40" class="customization_block_input" />{if isset($textFields.$key)}{$textFields.$key|stripslashes}{/if}</textarea> {counter} {/if} {/foreach} {/if} <input type="hidden" name="quantityBackup" id="quantityBackup" value="" /> <input type="hidden" name="submitCustomizedDatas" value="1" /> Of course all you really need are the inputs. The code is stolen from the other customization area on the page and minified a little. Nothing changed. Be sure to remove the customization form as well. I tried on my PS 1.5.2 but no luck. Can you help me out, did you change some else as well or just change the CartController.php file. I mean did you make changes ajax-cart.js too. Regards, Naeem Share this post Link to post Share on other sites More sharing options...
shamun Posted January 4, 2013 Posted January 4, 2013 Forgot to mention, I didn't do it for ajax cart. Only non-ajax. Share this post Link to post Share on other sites More sharing options...
Lufox Posted January 8, 2013 Posted January 8, 2013 This worked great on 1.5.3.1 How do I make it compatible with ajax cart? Figured out a way to do it granted it's not the correct way and I'm on too short of a deadline to make it clean. Also, only for text fields. I didn't need image upload so I didnt even try with that. See attached. Tested on 1.5.2. Put the file in /overrides/controllers/front/ Requires .tpl modifcation that is fairly straightforward: Remove the save button and put the following code in the form which submits to the cart: {if $product->text_fields|intval} {counter start=0 assign='customizationField'} {foreach from=$customizationFields item='field' name='customizationFields'} {if $field.type == 1} <label for ="textField{$customizationField}">{assign var='key' value='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field} {if !empty($field.name)}{$field.name}{/if}{if $field.required}<sup>*</sup>{/if}</label> <textarea type="text" name="textField{$field.id_customization_field}" id="textField{$customizationField}" rows="1" cols="40" class="customization_block_input" />{if isset($textFields.$key)}{$textFields.$key|stripslashes}{/if}</textarea> {counter} {/if} {/foreach} {/if} <input type="hidden" name="quantityBackup" id="quantityBackup" value="" /> <input type="hidden" name="submitCustomizedDatas" value="1" /> Of course all you really need are the inputs. The code is stolen from the other customization area on the page and minified a little. Nothing changed. Be sure to remove the customization form as well. Share this post Link to post Share on other sites More sharing options...
monxu Posted February 6, 2013 Posted February 6, 2013 I'm using 1.4.9 with module Visible customization (http://catalogo-onlinersi.net/en/add-ons-prestashop-modules/341-visible-customization.html), i removed the button save butt not work. without this module is work fine, but i need this module because i change some options. Share this post Link to post Share on other sites More sharing options...
Daxidov Posted February 11, 2013 Posted February 11, 2013 Hi, Im using prestashop 1.3.0.10 with wallcraft template and Im looking for something like this but I want to have "reqiured" option avaliable and picture upload. Is it avaliable? It would be perfect if it would be on ajax. Thanks.. Share this post Link to post Share on other sites More sharing options...
cagrie Posted February 27, 2013 Posted February 27, 2013 Has anyone got this working on 1.4.x just curious... Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted February 27, 2013 Posted February 27, 2013 Has anyone got this working on 1.4.x just curious... Yes - see this post. It is now working on 3 shops I upgraded to 1.4.10.0 Share this post Link to post Share on other sites More sharing options...
dOnkSkie Posted March 9, 2013 Posted March 9, 2013 (edited) Hi Everyone, Sorry, had to edit my post. I think I have it working using shamun's CartController.php in Prestashop 1.5.2 with the default theme. I moved the entire <!-- Customizable products --> content to where the add to cart button is. Removed the Save button and added onclick="javascript:saveCustomization()" to the add to cart input button. It works and just need some CSS adjustments. But, I'm not quite sure if it won't affect other modules or features. Anyway, I achieved my goal in removing the save button and make sure the input data will display after clicking the add to cart button. Thank you all! To Rhapsody and shamun, very useful post Edited March 9, 2013 by dOnkSkie (see edit history) Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted March 12, 2013 Posted March 12, 2013 Working 1.5.3.1 Mod to remove save button! (without Ajax Cart) The Zip file attached includes what is needed to modify the basic "default" theme on Prestashop 1.5.3.1 to eliminate the save button so you can add to cart directly. Thanks to shamun who got this to work on version 1.5.2 in post #124 above, the CartController.php override file has been updated with 1.5.3.1 code. 1. Put the CartController.php file in the override/controllers/front directory 2. Put the product.tpl file in your default theme directory (or the theme directory you created from the default theme). 3. In the BO under modules, set the Cart block configuration to deactivate the Ajax cart 4. In the BO on the Advnaced Parameters menu, select performance, Turn off the smarty cache and compile templates, then try it in the front office. It should work. Then reenable the smarty cache and turn compile off in the BO. If anyone is able to accomplish the following that is NOT incorporated in this mod, please post in this thread: 1. update to include uploading of files & images 2. Get the Ajax cart working with this mod 1.5.3.1 Mod to eliminate svae button.zip 3 Share this post Link to post Share on other sites More sharing options...
FranciscoVillen Posted March 18, 2013 Posted March 18, 2013 Hello Rhapsody, thanks for your time. It seems to be working but I have a problem: With the new files (product.tpl and CartController.php in the override), the button to remove products in the cart redirect to the homepage and the product isn't removed from the cart. I'm using prestashop 1.5 and the theme "Free Template PS001" from http://www.uhupage.com/ where could it be the problem? any idea about solving this? Thanks. Share this post Link to post Share on other sites More sharing options...
FranciscoVillen Posted April 2, 2013 Posted April 2, 2013 It seems the problem occurs when Ajax is deactivated but I need it to this solution to remove the save button. Share this post Link to post Share on other sites More sharing options...
FranciscoVillen Posted April 9, 2013 Posted April 9, 2013 (edited) Finally, I have decided to change to the default theme of Prestashop 1.5 Using a 1.4 theme in prestashop 1.5 is a bad idea. The problem seems to me solved. Edited April 9, 2013 by FranciscoVillen (see edit history) Share this post Link to post Share on other sites More sharing options...
defuzed Posted April 15, 2013 Posted April 15, 2013 hey, many thanks to all the contributors, was really stuck on this one ... i managed to extend rhapsodys working 1.5 mod to also work with files, was actually pretty simple. Just add the following in overrides/controllers/front/CartCOntroller.php $this->pictureUpload($product); below $this->textRecord($product); and add the slightly modified pictureUpload function from the productscontroller protected function pictureUpload($product) { if (!$field_ids = $product->getCustomizationFieldIds()) return false; $authorized_file_fields = array(); foreach ($field_ids as $field_id) if ($field_id['type'] == Product::CUSTOMIZE_FILE) $authorized_file_fields[(int)$field_id['id_customization_field']] = 'file'.(int)$field_id['id_customization_field']; $indexes = array_flip($authorized_file_fields); foreach ($_FILES as $field_name => $file) if (in_array($field_name, $authorized_file_fields) && isset($file['tmp_name']) && !empty($file['tmp_name'])) { $file_name = md5(uniqid(rand(), true)); if ($error = ImageManager::validateUpload($file, (int)Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE'))) $this->errors[] = $error; $product_picture_width = (int)Configuration::get('PS_PRODUCT_PICTURE_WIDTH'); $product_picture_height = (int)Configuration::get('PS_PRODUCT_PICTURE_HEIGHT'); $tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS'); if ($error || (!$tmp_name || !move_uploaded_file($file['tmp_name'], $tmp_name))) return false; /* Original file */ if (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_.$file_name)) $this->errors[] = Tools::displayError('An error occurred during the image upload process.'); /* A smaller one */ elseif (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_.$file_name.'_small', $product_picture_width, $product_picture_height)) $this->errors[] = Tools::displayError('An error occurred during the image upload process.'); elseif (!chmod(_PS_UPLOAD_DIR_.$file_name, 0777) || !chmod(_PS_UPLOAD_DIR_.$file_name.'_small', 0777)) $this->errors[] = Tools::displayError('An error occurred during the image upload process.'); else $this->context->cart->addPictureToProduct($product->id, $indexes[$field_name], Product::CUSTOMIZE_FILE, $file_name); unlink($tmp_name); } return true; } then all you have to do id add enctype="multipart/form-data" to the add-to-cart form in product.tpl Pretty easy to figure out, still hope it helps someone maybe. Am still trying to get this to work with the ajax-cart, no luck so far. Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted April 16, 2013 Posted April 16, 2013 (edited) defused - thanks for the update. Can you post some more specifics on where in the product.tpl file you added; enctype="multipart/form-data" Edited December 3, 2013 by Rhapsody (see edit history) Share this post Link to post Share on other sites More sharing options...
defuzed Posted April 16, 2013 Posted April 16, 2013 oh, right i should've been more specific. The enctype snippet needs to be in the "buy-block" form so: <form id="buy_block" {if $PS_CATALOG_MODE AND !isset($groups) AND $product->quantity > 0}class="hidden"{/if} action="{$link->getPageLink('cart')}" method="post" enctype="multipart/form-data"> let me know if this works Share this post Link to post Share on other sites More sharing options...
Rhapsody Posted April 17, 2013 Posted April 17, 2013 defuzed - - thanks! that works great. 1 Share this post Link to post Share on other sites More sharing options...
huduyudesign Posted June 9, 2013 Posted June 9, 2013 Using Rhapsody's method for 1.5.3.1 can anyone help me move some things around? I'd like to move attributes, customizations & add to cart to resemble this http://adogstore.com/index.php?id_product=49&controller=product&id_lang=1 but when I try it stops saving the entered customization. Share this post Link to post Share on other sites More sharing options...
defuzed Posted June 10, 2013 Posted June 10, 2013 @huduydesign : I guess you figured it out? When i enter customizations, they are being saved to the cart. Or do you want to move the customizations out of the tab region? To achieve that you need to keep the form itself intact and move it around as a whole. You can switch around the individual parts to your liking but you need to keep all inputs and the submit (add to cart in this case) in the form. Share this post Link to post Share on other sites More sharing options...
huduyudesign Posted June 10, 2013 Posted June 10, 2013 Defuzed I did finally get it to work but not using Rhapsody's method but one in post #132. Rhapsody's method I could not find right combinations to make it work so resorted to using the "save" function in the add to cart function, ajax off & the one cart file from Rhapsody's download is in there, not sure it's doing anything. This is same set up I used earlier but stopped it stopped working, possibly because I had ajax on or something went wacko when moving to VPS hosting. Hoping it continues to work. Share this post Link to post Share on other sites More sharing options...
projects Posted July 1, 2013 Posted July 1, 2013 Has anyone been able to get this working with ajax? Share this post Link to post Share on other sites More sharing options...
aaronjpitts Posted July 11, 2013 Posted July 11, 2013 Could anyone please update Rhapsody's code so that the respective files are updated for the latest version of prestashop? Thanks Share this post Link to post Share on other sites More sharing options...
defuzed Posted July 12, 2013 Posted July 12, 2013 aaronjpitts, have you tried using rhapsody's code in 1.5.4.1? I'm using my modified version (with file-upload) and i didn't have to change anything when upgrading to 1.5.4.1 ( i don't think that update changed anything in the relevant files). Share this post Link to post Share on other sites More sharing options...
Nishith Nesdiya Posted July 17, 2013 Posted July 17, 2013 yes friends try this... add : function(idProduct, idCombination,addedFromProductPage, callerElement, quantity, whishlist){ if (addedFromProductPage) { $('#add_to_cart input').attr('disabled', true).removeClass('exclusive').addClass('exclusive_disabled'); $('.filled').removeClass('filled'); } else $(callerElement).attr('disabled', true); if ($('#cart_block_list').hasClass('collapsed')) this.expand(); var formData = $('#customizationForm').serialize(); $.ajax({ url: $('#customizationForm').attr('action'), type: 'POST', data: formData, async: false, success: function (data) { $.ajax({ type: 'POST', url: baseUri, async: true, cache: false, dataType : "json", data: 'controller=cart&add=1&ajax=true&qty=' + ((quantity && quantity != null) ? quantity : '1') + '&id_product=' + idProduct + '&token=' + static_token + ( (parseInt(idCombination) && idCombination != null) ? '&ipa=' + parseInt(idCombination): ''), success: function(jsonData,textStatus,jqXHR) { // add appliance to whishlist module if (whishlist && !jsonData.errors) WishlistAddProductCart(whishlist[0], idProduct, idCombination, whishlist[1]); // add the picture to the cart var $element = $(callerElement).parent().parent().find('a.product_image img,a.product_img_link img'); if (!$element.length) $element = $('#bigpic'); var $picture = $element.clone(); var pictureOffsetOriginal = $element.offset(); if ($picture.size()) $picture.css({'position': 'absolute', 'top': pictureOffsetOriginal.top, 'left': pictureOffsetOriginal.left}); var pictureOffset = $picture.offset(); if ($('#cart_block').offset().top && $('#cart_block').offset().left) var cartBlockOffset = $('#cart_block').offset(); else var cartBlockOffset = $('#shopping_cart').offset(); // Check if the block cart is activated for the animation if (cartBlockOffset != undefined && $picture.size()) { $picture.appendTo('body'); $picture.css({ 'position': 'absolute', 'top': $picture.css('top'), 'left': $picture.css('left'), 'z-index': 4242 }) .animate({ 'width': $element.attr('width')*0.66, 'height': $element.attr('height')*0.66, 'opacity': 0.2, 'top': cartBlockOffset.top + 30, 'left': cartBlockOffset.left + 15 }, 1000) .fadeOut(100, function() { ajaxCart.updateCartInformation(jsonData, addedFromProductPage); }); } else ajaxCart.updateCartInformation(jsonData, addedFromProductPage); }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("Impossible to add the product to the cart.\n\ntextStatus: '" + textStatus + "'\nerrorThrown: '" + errorThrown + "'\nresponseText:\n" + XMLHttpRequest.responseText); //reactive the button when adding has finished if (addedFromProductPage) $('#add_to_cart input').removeAttr('disabled').addClass('exclusive').removeClass('exclusive_disabled'); else $(callerElement).removeAttr('disabled'); } }); } }); it is work for me.. 5 Share this post Link to post Share on other sites More sharing options...
Recommended Posts