Hi everyone,
I've updated the Shopping List add-on for the latest Responsive HTML template to include price change information for watched products and the number of items in the shopping list in brackets alongside the link in the main menu.
Shopping list items view showing price change details:
Installation
Download and extract ShoppingList.zip to a temporary folder on your local computer.
Archive contains new files:
shoppingList.php
html/shoppingListItems.php...and replacement files (15/09A distribution)
html/menu.php (adds "Shopping List (x)" menu item)
html/product.php (adds "Add to Shopping List" function to main product page)- For a modified existing Price Tapestry installation, upload the new files only and see the notes in the follow up to this post regarding menu entry and "Add to Shopping List" functionality.
Post Installation
- html/shoppingListItems.php contains some inline CSS at the very top of the script - this can be removed from here and merged with html/default.css.
- Translations for the following can be added to includes/translate.php as required:
"My Shopping List"
"Add to Shopping List"
"This item is in your Shopping List"
"now from"
"no price change"
"Item"
"Items"
"Remove"
"Remove All"
Enjoy!
Cheers,
David
--
PriceTapestry.com
Hi David,
I have implemented this on the product page.
Would it be possible to adapt shopping list to use on the results page so that users could select products via a button/tick box/text and save for later?
BR
Richard
Hello Richard,
Sure - Add to / In Shopping List links can be added to search results - firstly, add the following PHP section to the very top of html/searchresults.php:
<?php
$shoppingListCookie = "shoppingList".bin2hex($config_baseHREF);
$shoppingList = (isset($_COOKIE[$shoppingListCookie])?unserialize($_COOKIE[$shoppingListCookie]):array());
?>
And then within the loop, at the point you wish to display the link (e.g. below the More Information / Compare Prices button, use:
<?php
if (isset($shoppingList[$product["name"]]))
{
print "<br /><a href='".tapestry_shoppingListHREF()."'><i class='fi-check'></i> ".translate("In Shopping List")."</a>";
}
else
{
print "<br /><a href='".tapestry_shoppingListHREF()."?add=".urlencode($product["name"])."'><i class='fi-shopping-cart'></i> ".translate("Add to Shopping List")."</a>";
}
?>
If you'd prefer to have shoppingList.php redirect back to the page from where "Add to Shopping List" was clicked, look for the following code at line 54:
header("Location: ".$config_baseHREF."shoppingList.php");
...and REPLACE with:
header("Location: ".$_SERVER["HTTP_REFERER"]);
Cheers,
David.
--
PriceTapestry.com
Hi David,
I'm having caching issues with this. If I add a product to the Shopping List, it updates the header when on the actual Shopping List page to '1' or whatever, but when navigating back to a different page, the count is back to '0'. Any ideas how I can force a refresh on this?
Cheers.
Keeop
Hello Keeop,
I'll look into this further - depending on the caching headers that you're sending for main pages "Back" functionality can be implemented by the browser without any network activity at all - in which case, if you would be happy to use the redirect back to referrer as described at the end of this post above, that may force a reload, but again does depend on the caching headers being sent but that might an option..
Cheers,
David.
--
PriceTapestry.com
Hi David,
I've implemented that and also moved the 'getcookie' bit to the header so it should always re-run it. It's definitely writing to the cookie straight away as I can see that. Just not reading it back in. This is on a sub-domain, so don't know if that effects cookies? I've disabled caching for that site although haven't explicitly set 'no-cache'. I'll do that and check the headers.
Cheers.
Keeop
Yep, caching on my proxy/reverse proxy server! Very strange though as I use cookies on my other sites, using the same PHP methods, but they update fine. Bizarre. I'll have to copy the headers I'm using from one of those on to this site as I expect that will sort it then.
Cheers.
Keeop
Hi David
Its wonderful additional Change
Thanks for adding such functionality in PT
Hi David
Made all changes but can't seem to get page to load it keeps coming up with 404 error page.
Can you assist please.
Thank You
Annette
Hello Annette,
As the majority of web servers are Linux based that means that filenames are case sensitive, so if you could double check that all of your links to shoppingList.php use the "camelCase" in the name that should be all it is - if still no joy, if you could let me know the installation URL (I'll remove before publishing your reply) I'll check it out further for you...
Cheers,
David.
--
PriceTapestry.com
Hi David
Have two installations both are same one is at {link saved}
For some reason it no adding the comparison to link for shopping list.
Thank you
Annette
Hello Annette,
I spotted the problem - my apologies, the instructions above for creating a menu link to the Shopping List (and in the download replacement html/menu.php) were hard coded to a top level installation and not using $config_baseHREF. In the code you have added to html/menu.php, where you have:
<a href='/shoppingList.php'>
...REPLACE with;
<a href='<?php print $config_baseHREF; ?>shoppingList.php'>
Corrected above, and in the download.
Cheers,
David.
--
PriceTapestry.com
Hi David,
I have noticed that if a product no longer exists in the database but is within a shopping list, the list shows the current price (£zero), the old price and a link for more information to a non existent page. There is no product name or description.
Is it possible to store product name & description in cookie and state that product is no longer available?
Best regards
Richard
Hello Richard,
Thanks for pointing this out, I have updated the Shopping List add on to show products not currently available in a separate list, with an "Item not currently available." message and remove link. All text translatable through includes/translate.php as normal.
I haven't included the description but you can add this easily if you want, firstly in shoppingList.php look for the following code at line 47:
$item["price"] = $rows[0]["price"];
...and REPLACE with:
$item["price"] = $rows[0]["price"];
$item["description"] = tapestry_substr($rows[0]["description"]["description"],250,"...");
And then in html/shoppingListItems.php, look for the following code at line 139:
<p><?php print translate("Item not currently available."); ?></p>
...and REPLACE with:
<?php if ($product["description"]): ?>
<p><?php print $product["description"]; ?></p>
<?php endif; ?>
<p><?php print translate("Item not currently available."); ?></p>
Note that the above saves the tapestry_substr() truncated version of the description which will keep the size of the cookie down - synchronise the length used with the truncated length of current product descriptions in html/shoppingListItems.php at line 83...
Hope this helps!
Cheers,
David.
--
PriceTapestry.com
Thanks David,
Neat solution.
One small thing, in html/shoppinglistitems.php I moved <?php endforeach; ?>
from row 151 to 154 so that it was after the final </div>
Best regards
Richard
Hi Richard,
Thanks - I checked the balancing, it was actually the closing </div>
matching <div class='row pt_sr_each'>
that was missing ( should have been on the line before <?php endforeach; ?>
) so you may need to correct that on your site to ensure valid markup - corrected in the download.
Cheers,
David.
--
PriceTapestry.com
Hi David,
This is a useful add-on you've come up with! Can you tell me if this will work for Wordpress installs and if so how you would integrate this? Thanks.
Hello Allan,
I am currently working towards the next update to PriceTapestry.org for WordPress (more info and beta registration link here) and it is my intention to include Shopping List (as well as Auto-complete) in that version - hoping to release towards the beginning of next month...
Cheers,
David.
--
PriceTapestry.com
Hi David!
I have noticed that I can "only" save about 16 items. My cookie is about 3906 bytes and I think, is the maximum size allowed.
Do you have any workaround? Maybe creating another cookie or with localStorage?
Regards!
Hi,
I'll review this after the next update, local storage might be a little tricky as the shopping list data needs to be processed server-side in order to generate the price deltas etc., however in the mean time it's no problem to set a limit and show an alert box if the shopping list becomes full. I'll add this code to limit to 10 items in the download, but to add to an existing installation, edit shoppingList.php and look for the following code at line 37:
if (isset($_GET["add"]))
...and REPLACE with:
if (isset($_GET["add"]) && (count($shoppingList) >= 10))
{
$shoppingListFull = TRUE;
}
elseif (isset($_GET["add"]))
And then the following code at line 120:
require("html/shoppingListItems.php");
...and REPLACE with:
require("html/shoppingListItems.php");
if (isset($shoppingListFull))
{
print "<script>alert('Sorry, your Shopping List is full.');</script>";
}
Cheers,
David.
--
PriceTapestry.com
This may also help reduce the amount of info saved. Don't think a shopper needs the full description here. In html > shoppingListItems.php I reduced the number of characters from 250 to 100, around line 83:
print tapestry_substr($product["description"],100,"...");
Thanks for that - unfortunately description isn't actually part of the cookie data (just product name and price at time of adding in order to show the delta). I will look at a standalone JavaScript / Local Storage version after the next update releases.
Cheers,
David.
--
PriceTapestry.com
I noticed the shopping list saves the original price. Is there any way to add the sale price if it exists?
Hi,
To add your custom field `sale_price` in the stored record, edit shoppinglist.php and where you have the following code around line 47:
$item["price"] = $rows[0]["price"];
...REPLACE with:
$item["price"] = $rows[0]["price"];
$item["sale_price"] = $rows[0]["sale_price"];
Then to have your html/shoppingListItems.php work out the price change and delta graphic based on previous and current sale_price; look for the following code at line 44:
if ($product["price"] == $shoppingListItem["price"])
...and REPLACE with:
if ($product["sale_price"]!="0.00") $product["price"] = $product["sale_price"];
if ($shoppingListItem["sale_price"]!="0.00") $shoppingListItem["price"] = $shoppingListItem["sale_price"];
if ($product["price"] == $shoppingListItem["price"])
Hope this helps! If you're not sure about the display side of things with price, sale price and the price change all involved if you could email me your latest html/searchresults.php and html/shoppingListItems.php I'll check if out further with you...
Cheers,
David.
--
PriceTapestry.com
Hi David,
What is the price change in the shopping list showing? The change in price vs. previous import or change in price vs. when the product added to the shopping list?
Kind regards,
IG
Hello IG,
It's the change in price since added to the shopping list.
Cheers,
David.
--
PriceTapestry.com
For an existing / modified installation:
- To add menu entry "Shopping List (x)" use the following code within your main menu as required:
<?php
$shoppingListCookie = "shoppingList".bin2hex($config_baseHREF);
$shoppingListCount = (isset($_COOKIE[$shoppingListCookie])?count(unserialize($_COOKIE[$shoppingListCookie])):"0");
?>
<li>
<a href='<?php print $config_baseHREF; ?>shoppingList.php'>
<i class='fi-shopping-cart'></i>
<?php print translate("My Shopping List"); ?> (<?php print $shoppingListCount; ?>)
</a>
</li>
- To add "Add to Shopping List" functionality, use the following code within html/product.php as required:
Look for the following code at line 58 of html/product.php:
<?php if (isset($product_main["extraHTML"])) print $product_main["extraHTML"]; ?>
...and REPLACE with:
<?php
$shoppingListCookie = "shoppingList".bin2hex($config_baseHREF);
$product_shoppingList = (isset($_COOKIE[$shoppingListCookie])?unserialize($_COOKIE[$shoppingListCookie]):array());
if (isset($product_shoppingList[$product_main["name"]]))
{
$product_shoppingListHTML = "<a href='".$config_baseHREF."shoppingList.php'><i class='fi-check'></i> ".translate("This item is in your Shopping List")."</a>";
}
else
{
$product_shoppingListHTML = "<a href='".$config_baseHREF."shoppingList.php?add=".urlencode($product_main["name"])."'><i class='fi-shopping-cart'></i> ".translate("Add to Shopping List")."</a>";
}
?>
<p><?php print $product_shoppingListHTML; ?></p>
<?php if (isset($product_main["extraHTML"])) print $product_main["extraHTML"]; ?>
Cheers,
David.
--
PriceTapestry.com