Jump to content


  • Content count

  • Joined

  • Last visited


Profile Information

  • Real Name
    JM Ivler
  • Gender
  • Location
    Los Alamitos, CA
  • Interests
    Knowing what does and doesn't work in my store.
  • Website

Recent Profile Visitors

9,655 profile views
  1. Met00

    Payflow Pro

    Payflow pro problem. Even after I change the server from test-payflow.verisign.com to payflowpro.paypal.com transactions are still going through as test. This leads to them being returned with the error_message=Credit+Card+Error%21+Please+try+again since you are trying to do a live transaction via the test server. In the payflowpro paypal manager the transactions are still showing up in "test" not "live" Is there a known problem solution that I couldn't locate on the forums to resolve this issue? Thank you.
  2. 1) added field to database table orders_status_history called custhide int(1) with a default value of 0 2) modified the code to get and display in account_history_info.php to: $statuses_query = tep_db_query("select os.orders_status_name, osh.date_added, osh.comments, osh.custhide from " . TABLE_ORDERS_STATUS . " os, " . TABLE_ORDERS_STATUS_HISTORY . " osh where osh.orders_id = '" . (int)$HTTP_GET_VARS['order_id'] . "' and osh.orders_status_id = os.orders_status_id and os.language_id = '" . (int)$languages_id . "' order by osh.date_added"); while ($statuses = tep_db_fetch_array($statuses_query)) { if ($statuses['custhide'] != 1) { echo ' <tr>' . "\n" . ' <td class="main" valign="top" width="70">' . tep_date_short($statuses['date_added']) . '</td>' . "\n" . ' <td class="main" valign="top" width="70">' . $statuses['orders_status_name'] . '</td>' . "\n" . ' <td class="main" valign="top">' . (empty($statuses['comments']) ? ' ' : nl2br(tep_output_string_protected($statuses['comments']))) . '</td>' . "\n" . ' </tr>' . "\n"; } } 3) modified the following in the admin/orders.php case 'update_order': $oID = tep_db_prepare_input($HTTP_GET_VARS['oID']); $status = tep_db_prepare_input($HTTP_POST_VARS['status']); $comments = tep_db_prepare_input($HTTP_POST_VARS['comments']); // added hidden comments from customer $custhide = 0; if ($custhide == 'on') $custhide = 1; $order_updated = false; later in the update the insert to the db is changed to: tep_db_query("insert into " . TABLE_ORDERS_STATUS_HISTORY . " (orders_id, orders_status_id, date_added, customer_notified, comments, custhide) values ('" . (int)$oID . "', '" . tep_db_input($status) . "', now(), '" . tep_db_input($customer_notified) . "', '" . tep_db_input($comments) . "', '" . tep_db_input($custhide) . "')"); later in the code, when I display the form to the admin I have to make changes that show when a comment was hidden... so first I have to change the SQL to get the flag and display it properly (I display hidden comments in green) $orders_history_query = tep_db_query("select orders_status_id, date_added, customer_notified, custhide, comments from " . TABLE_ORDERS_STATUS_HISTORY . " where orders_id = '" . tep_db_input($oID) . "' order by date_added"); if (tep_db_num_rows($orders_history_query)) { while ($orders_history = tep_db_fetch_array($orders_history_query)) { echo ' <tr>' . "\n" . ' <td class="smallText" align="center">' . tep_datetime_short($orders_history['date_added']) . '</td>' . "\n" . ' <td class="smallText" align="center">'; if ($orders_history['customer_notified'] == '1') { echo tep_image(DIR_WS_ICONS . 'tick.gif', ICON_TICK) . "</td>\n"; } else { echo tep_image(DIR_WS_ICONS . 'cross.gif', ICON_CROSS) . "</td>\n"; } echo ' <td class="smallText">' . $orders_status_array[$orders_history['orders_status_id']] . '</td>'; if ($orders_history['custhide'] == '1') { echo ' <td class="smallText"><font color=green>' . nl2br(tep_db_output($orders_history['comments'])) . ' </font></td>'; } else { echo ' <td class="smallText">' . nl2br(tep_db_output($orders_history['comments'])) . ' </td>'; } ' </tr>' . "\n"; } Then I have to add the checkbox to hide the comment (note: the default is to send comments to customers, a cleaner way would be to set this to a radio that says if you don't send the comment it's hidden... but this is a fast hack, so you have to uncheck one and check the other). <tr> <td class="main"><b><?php echo ENTRY_NOTIFY_CUSTOMER; ?></b> <?php echo tep_draw_checkbox_field('notify', '', true); ?></td> <td class="main"><b><?php echo ENTRY_NOTIFY_COMMENTS; ?></b> <?php echo tep_draw_checkbox_field('notify_comments', '', true); ?></td> <td class="main"><b>Hide Comment: </b> <?php echo tep_draw_checkbox_field('custhide', '', false); ?></td> </tr> and there you have it, a quick kluge that will allow you to enter comments and set them not seen by the customer. If I was really doing it right, I would allow you to pick a date as well so you could "calendar" a comment. Then I would add a calendar function that would allow you to see all comments calendared for a specific date or date range and view those orders. But I said 5 minutes so I tried to do it in 5 minutes... it took 7 with testing...
  3. geeze, add the freaking field to osh called custhide with a 1 or a 0 default = 0. add a radio button to the admin orders.php that allows you to set it to a 1 when you add a comment (Hidden Comment: yes 0 no X) and shows (hidden comment) in the display of orders in a different font colour in the admin display. Then modify that one select statement to only select comments where osh.custhide = '0'. Then it's nice and clean and that took all of 5 minutes. This isn't rocket science.
  4. ship in cart is the module. It's not hard to install. It has some limitations (shipping quotes by multiple vendors based on different criteria - for instance, UPS in the continental US, USPS for everything else). http://www.oscommerce.com/community/contri...ch,ship+in+cart
  5. Made the changes in our baseline system as defined in the contribution. International is now functioning again. The funny/sad part is that my current live client didn't see it because they do no international shipping. If you follow the directions (and ignore the first SQL fix) the module will work. Thanks to those that got the fix out so quickly.
  6. Met00

    Ajax Buy Now

    I'm not saying that it shoudn't I just question the wisdom. I like bringing people to the cart, my partner prefers not to. The only thing "saved" is a page refresh if you are not going to the cart. Since a page refresh will refresh a number of other components on the page (specials, also purchased <modified version that picks up all the also purchased and does a random display>, cross-sell <modified, as per the also purchased>, etc.) which would be lost by using ajax, I don't see the upside. But that's just me. :-)
  7. Met00

    Ajax Buy Now

    where are you adding ajax? In the cart there should be "add to cart" buttons (and if you made the mods, that should be able to pass a quantity). ajax buy now should ONLY affect the "buy now" buttons, which show up in product_listing and product_listing_col from includes/modules calls. product_info.php should NOT be affected by these unless you are displaying "buy now" buttons there, and I would recomend that if you are, you change them to "add to cart" buttons that pass in the quantity as well. This method of installing ajax keeps the site very clean.
  8. Met00

    All Products

    We took allprods.php and modified it a tad for better SEO 1) we limitted the amount of items per page by alpha as Google doesn't like long link lists 2) we add images with links so google knows that there is a link to an image, not just textual links 3) we added a modifier that shows a subset of all items as a table list, and includes the text from the description (first 250 characters) of the item This modifier can be set from 0-N and allows us to "shorten" the pages display as google limits what they will index on the page. The balance in a tabled link list of product names only 4) Between the first and second table we display one of five random text blocks that contains site appropriate text and keywords. These text blocks can contain links (for instance, one can list some of the more popular manufacturers and link to the manufacturer listing page). Between these techniques the allprods.php page becomes more than a page for listing all the products, but it becomes a part of the SEO (there are a few more things we did, but those four basic ones will help with SEO). below is the alpha header <tr><td class=main align=center> <a href=allprods.php?alpha=a>A</a> | <a href=allprods.php?alpha=b>B</a> | <a href=allprods.php?alpha=c>C</a> | <a href=allprods.php?alpha=d>D</a> | <a href=allprods.php?alpha=e>E</a> | <a href=allprods.php?alpha=f>F</a> | <a href=allprods.php?alpha=g>G</a> | <a href=allprods.php?alpha=h>H</a> | <a href=allprods.php?alpha=i>I</a> | <a href=allprods.php?alpha=j>J</a> | <a href=allprods.php?alpha=k>K</a> | <a href=allprods.php?alpha=l>L</a> | <a href=allprods.php?alpha=m>M</a> | <a href=allprods.php?alpha=n>N</a> | <a href=allprods.php?alpha=o>O</a> | <a href=allprods.php?alpha=p>P</a> | <a href=allprods.php?alpha=q>Q</a> | <a href=allprods.php?alpha=r>R</a> | <a href=allprods.php?alpha=s>S</a> | <a href=allprods.php?alpha=t>T</a> | <a href=allprods.php?alpha=u>U</a> | <a href=allprods.php?alpha=v>V</a> | <a href=allprods.php?alpha=w>W</a> | <a href=allprods.php?alpha=x>X</a> | <a href=allprods.php?alpha=y>Y</a> | <a href=allprods.php?alpha=z>Z</a> <br> <a href=allprods.php?alpha=1>1</a> | <a href=allprods.php?alpha=2>2</a> | <a href=allprods.php?alpha=3>3</a> | <a href=allprods.php?alpha=4>4</a> | <a href=allprods.php?alpha=5>5</a> | <a href=allprods.php?alpha=6>6</a> | <a href=allprods.php?alpha=7>7</a> | <a href=allprods.php?alpha=8>8</a> | <a href=allprods.php?alpha=9>9</a> | <a href=allprods.php?alpha=0>0</a> | <a href=allprods.php>LIST ALL PRODUCTS</a> </td></tr> Below is the alpha query mods // added alpha page selections to query if (!is_null($_GET['alpha'])) $addregex = "pd.products_name REGEXP '^[".s trtoupper($_GET['alpha'])."!".strtolower($_GET['alpha'])."].*$' and "; // added alpha page selections to query as well as picking up the descriptions // and not showing hidden categories items $products_query = tep_db_query("select p.products_id, p.products_model ,p d.products_name, pd.products_description, p.products_image, p.products_price, p. products_tax_class_id, p.products_date_added, m.manufacturers_name from " . TABL E_PRODUCTS . " p , " . TABLE_CATEGORIES . " c, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufa cturers_id left join " . TABLE_PRODUCTS_DESCRIPTION . " pd on p.products_id = pd .products_id and pd.language_id = '" . (int)$languages_id . "' left join " . TAB LE_SPECIALS . " s on p.products_id = s.products_id where ".$addregex." p.product s_id = p2c.products_id and c.categories_id = p2c.categories_id and c.cshow > '0' and products_status = '1' order by pd.products_name"); (yes, we have instituted a simple hidden categories capability and c.cshow > '0' which you can just drop out if you don't want to use the feature. This allows us to use a mod we created called "specials in cart" that allows us to craete specials and put them in the hidden category, and when someone orders something that we have attached to the special, it adds a notice in the shopping cart letting tem know that they can add the special item to the cart, but they can't get to the items in that category via any other method than when it is presented to them in their cart... for instance, a store doesn't sell gift baskets, but when you order from the "soap" category and your total order is over $50.00 you are offered a free gift basket... that sort of thing. Anyway, just remove that and the balance of te query should on most stores).
  9. Met00

    All Products

    you mean like: http://www.h2opoolproducts.com/allprods.php
  10. Easy Populate 2.76 Old server: Server OS: Linux Database: MySQL 3.23.58 Server Date: 05/05/2006 15:40:14 Datebase Date: 05/05/2006 18:40:14 HTTP Server: Apache/2.0.53 (Fedora) PHP Version: 4.3.11 (Zend: 1.3.0) New server: Server OS: Linux 2.6.16-rc6-060413b Database: MySQL 4.1.16 Server Date: 05/05/2006 08:39:36 Datebase Date: 05/05/2006 08:39:36 Server Up Time: 08:39:36 up 14:28, 1 user, load average: 0.01, 0.03, 0.00 HTTP Server: Apache/2.0.54 (Fedora) PHP Version: 5.0.4 (Zend: 2.0.4-dev) Easypopulate uploads the file fine to the old server. Easypopulate only uploads the FIRST line to the new server. Additional Information: The same file, when uploaded to the old and new servers using exactly the same easypopulate.php FAILS to upload to the new server and uploads with no problem to the old server. Both PHP and MySQL were updated on the new server. There have been no other issues on the new server with the stores operation (at least none noticed to date). My gut is telling me that this is a simple fix, and that it has something to do with the "walk" function. I also believe that somewhere in this topic there may even be a reply/post that covers the fix, but after using every "search" I could think of (+easypopulate +"mysql 4.1", etc.) I'm at a loss, so if anyone can provide a pointer to te fix that most likely has been published somewhere where the forum search can reach, it would be appreciated. Thank you.
  11. Met00

    Recover Cart Sales

    Why this is a BAD idea... 1) a number of people create accounts to get shipping costs and totals (for those sites that don't run shipping in cart modules). So you get accounts created with e-mail addresses like xxx@xxx.com - do you really want to send them an e-mail? 2) you have loss leaders in the store, the person has 1 item in their cart and it's a loss leader. Do you really want to send them an e-mail? 3) you have a cart with a great deal in it, and you want to add a PS message to personalize the e-mail and get them back to the store If I can think of at least three reasons why this shouldn't be automatted, then I'm sure there are 10 or 20 that releate to any shops personal set up beyond these three. It's not like running this every few days takes all that much time. I do it nightly (I have found that after three days the sale is a gonner even with a reminder, they bought elsewhere). It takes me 2 minutes. I have a 15% recovery rate. It's the lowest amount of time I spend for the greatest amount of sales. YMMV
  12. you might also consider using DHTML instead of a popup. The DHTML "table" can be set hidden (use CCS) and when they click the link the DHTML opens up IN the page. This has the added benefit of loading the data on the page where it can be indexed by google and other engines. (also, after talking with any number of users, I have been told that popups are ANNOYING. A look at my sites stats show that people do use the "view larger image", but after talking to a number of customers I plan on changing that from a popup to a DHTML layer that displays OVER the page in the browser. Less bandwidth used, faster loading, no additional instances of the browser have to be opened and closed...)
  13. Met00

    Ajax Buy Now

    1) the latest version works well. 2) changing the check after adding to a nice large visual is a good idea. 3) the latest version does NOT degrade well. ie: anyone using an earlier version of NS (7.2 or earlier) the buy now is disabled. Now that may only be 5% of your users, but that's still a large number of potential lost sales. I will most likely be writting a wrapper to decided which buy now button to post based in client version. If I do I'll post the changes and instructions here. overall, it is a very nice piece of work.
  14. Met00

    Friends Discount

    look at loyalty discount for some of the solution you seek.
  15. Met00

    Ajax Buy Now

    on the reference site (http://www.netso.ru) the /includes/woutreload.js contains: function Dump(d,l) { if (l == null) l = 1; var s = ''; if (typeof(d) == "object") { s += typeof(d) + " {\n"; for (var k in d) { for (var i=0; i<l; i++) s += " "; s += k+": " + Dump(d[k],l+1); } for (var i=0; i<l-1; i++) s += " "; s += "}\n" } else { s += "" + d + "\n"; } return s; } function getBounds(element) { var left = element.offsetLeft; var top = element.offsetTop; for (var parent = element.offsetParent; parent; parent = parent.offsetParent) { left += parent.offsetLeft; top += parent.offsetTop; } return {left: left, top: top, width: element.offsetWidth, height: element.offsetHeight}; } array_Obj=[]; function fly (obj) { // ?????? "??? ?????" with (this) { center_target_left = center_target_top = 0; finish_fly = null; fly_div = document.getElementById('flyDiv'); fly_div.style.display = 'none'; fly_div.innerHTML = obj.innerHTML; bounds_FLY = getBounds(obj); fly_div.style.width = bounds_FLY.width + 'px'; fly_div.style.height = bounds_FLY.height + 'px'; } } fly.prototype.target = function (obj_targ) { // ?????? "???? ??????" var bounds_target = getBounds(obj_targ); this.center_target_left = bounds_target.left + bounds_target.width/2; this.center_target_top = bounds_target.top + bounds_target.height/2; } fly.prototype.calc_way = function ( num_step, time_fly ) { //???-?? ?????, ????? ???????? this.num_step = num_step; this.period = Math.ceil( time_fly / num_step ); } fly.prototype.fly_now = function () { //????? ???? if (!this.step) { this.step = 1; this.id = array_Obj.length; array_Obj[this.id]=this; } with (this) { if ( step > num_step ) { with (fly_div.style) { display = 'none'; top = left = 0; } if (finish_fly) finish_fly(); step = 0; delete array_Obj[id]; return; } fly_div.style.top = bounds_FLY.top - Math.ceil ( ( bounds_FLY.top - (center_target_top - bounds_FLY.height/2))/num_step * step ); + 'px'; fly_div.style.left = bounds_FLY.left + Math.ceil ( ((center_target_left - bounds_FLY.width/2) - bounds_FLY.left)/num_step * step ) + 'px'; if( step == 1 ) { fly_div.style.display = ''; } step++; } timerID = setTimeout( "array_Obj[" + this.id + "].fly_now()", this.period); } This is the absolutly cool flying image code verses the "loading" code that is included in the code in the contribution. Note the difference in the doBuyGetNow Cool code: function doBuyNowGet(param, pId) { document.getElementById('loading_'+pId).style.visibility = "visible"; var reqAddCart = new Subsys_JsHttpRequest_Js(); reqAddCart.onreadystatechange = function() { if (reqAddCart.readyState == 4) { var BuyNowFly = new fly( document.getElementById('fly_'+pId) ); BuyNowFly.target( document.getElementById('divShoppingCard') ); BuyNowFly.calc_way( 15, 50 ); BuyNowFly.finish_fly = function() { document.getElementById('divShoppingCard').innerHTML = '<table width="100%">'+(reqAddCart.responseText||'')+'</table>'; } document.getElementById('loading_'+pId).style.visibility = "hidden"; BuyNowFly.fly_now(); } } reqAddCart.caching = false; reqAddCart.open('GET', 'ajax_shopping_cart.php?'+param, true); reqAddCart.send(null); } contrib code function doBuyNowGet( link ) { showLoading(); var reqAddCart = new Subsys_JsHttpRequest_Js(); reqAddCart.onreadystatechange = function() { if (reqAddCart.readyState == 4) { if (reqAddCart.responseJS) { document.location.href = reqAddCart.responseJS.ajax_redirect; return; } else { document.getElementById('divShoppingCard').innerHTML = '<table border="0" width="100%" cellspacing="0" cellpadding="2">'+(reqAddCart.responseText||'')+'</table>'; hideLoading(); if ( SHOW_ADDED ) { showOk(); timerID = setTimeout( "addHandler(document, \'mousemove\', hideOk)", 500); } } } } reqAddCart.caching = false; reqAddCart.open('GET', link, true); reqAddCart.send(null); } I have attempted to swap the two functions out, but you can see that when calling the functions there are different parameters passed in. This can be seen in the difference in the calls to the function as well cool call <td align="right" class="productListing-data" style="white-space: nowrap;"><a href="http://www.netso.ru/product_info.php?cPath=1_68&sort=3a&action=buy_now&products_id=1186" onclick="doBuyNowGet('cPath=1_68&sort=3a&action=buy_now&products_id=1186', 1186); return false;"><img src="images/loading.gif" border="0" alt="" width="16" height="22" align="absmiddle" id="loading_1186" style="visibility: hidden;"><b>положить в корзину Alpine CDE-9846R</b></a> </td> contrib call <td align="center" class="productListing-data"> <a href="http://osctb.biasolutions.com/product_info.php?cPath=1&products_id=1"><img src="imagemagic.php?img=images/CTU3030_big.gif&w=100&h=195&page=" width="100" height="195" border="0" alt="Yacker Tracker - on BIA" title="Yacker Tracker - on BIA"></a> <br> <a href="http://osctb.biasolutions.com/product_info.php?cPath=1&products_id=1">Yacker Tracker - on BIA</a> <br> $34.99 <br><a href="http://osctb.biasolutions.com/index.php?cPath=1&sort=2a&action=buy_now&products_id=1" onclick="doBuyNowGet('http://osctb.biasolutions.com/ajax_shopping_cart.php?cPath=1&sort=2a&action=buy_now&products_id=1'); return false;"><img src="includes/languages/english/images/buttons/button_buy_now.gif" border="0" alt="Buy Now" title="Buy Now"></a> </td> Okay, I am not a javascript programmer in any way shape or form, so I'm looking for a little help here in integrating the "cool" image transfer over to the contrib as it is one heck of a nice way to indicate the product is placed in the cart. When I have attempted to hack at the contrib code to implement the "cool code" I break the application so that it pushes the page to the shopping cart display rather than just moving the item to the shopping cart.