Jump to content


  • Content count

  • Joined

  • Last visited

  • Days Won


Everything posted by ecartz

  1. ecartz

    PayPal App for osCommerce Online Merchant

    Some store owners are experiencing a problem where PayPal is not sending the orders back to the store. The IPN is failing. As a troubleshooting step, get the latest version of the ext/modules/payment/paypal/paypal.com.crt file and replace the version on your store with it. See if things work after doing that. The easiest way to get that file is to download the current version of Phoenix, either from the Products page or https://github.com/gburton/CE-Phoenix/archive/master.zip and extract the file from it. I believe that file has been required for PayPal. So your store should have it. If for some reason you are trying to install PayPal on an older store, consider getting the PayPal App from the Marketplace: https://apps.oscommerce.com/fZMiN&paypal-app The most recent version is older than the introduction of the file to Phoenix, so you may have to update the version of the file that comes with that. But the PayPal App version of the payment module does use that file. Note that PayPal with IPN uses multiple files. There will always be one in includes/modules/payment plus it has files in includes/apps and ext/modules/payment/paypal . If you don't have all those files, then you may need to install the PayPal App to get them.
  2. ecartz

    Paypal Standard Payments Failing

    Note that you might still have to update the crt file *after* installing the PayPal App. Because the most recent version of that App is older than the addition of the crt file to Frozen. But installing the App should get you a crt file to update.
  3. ecartz

    Paypal Standard Payments Failing

    Yes, that's what I see too. That file is also available at https://github.com/gburton/CE-Phoenix/blob/master/ext/modules/payment/paypal/paypal.com.crt So, new troubleshooting step for PayPal problems. Verify that one has the latest version of that file.
  4. ecartz

    Paypal Standard Payments Failing

    Do we need to add that file to core? What's currently in the release (yet to be made): https://github.com/gburton/CE-Phoenix/blob/
  5. That's difficult for FILENAMEs and TABLEs. Because it requires rewriting huge amounts of core code. Basically every tep_href_link and tep_db_query line. I would point out that those example uses are easier to do via mod_rewrite and a modification to tep_href_link rather than manually replacing hard coded values with FILENAMEs. I.e. I don't think the solution is to reverse the change so much as to move forward with other changes.
  6. Well, that's not going to work. Beyond that, it would be a lot easier if we had some idea why you think that there's anything wrong with that code. Is it giving an error? Showing an incorrect price? Not showing at all? I'm pretty sure there is at least one person using the FedEx App from the Marketplace on Phoenix, so you might find it easier to get the instructions to fix that from the support thread for it.
  7. ecartz

    const variable

    You can only use const in global or class context, not inside a function. So if you have something like function do_stuff() { const WHATEVER = 'whatever'; } you'll get an error. You also can only do const with things that can be done at compile time. So function do_stuff() { return 'whatever'; } const WHATEVER = do_stuff(); for anything that needs to be calculated at run time. The define is done at run time, so it doesn't care about that.
  8. If this is a test installation, just add print_r(array($products[$i][$option], $i, $option, $attribute_values, $languages_id)); right after the last track_stock line. If in production, figure out the customer ID of your test user and add something like if (1 == $customer_id) { print_r(array($products[$i][$option], $i, $option, $attribute_values, $languages_id)); } replace 1 with the appropriate value. You can find the customer ID in admin/customers.php or by looking it up in the database. It's often easiest to do a view source to look at the debugging output, since the HTML display eats white space. You may have to install developer tools to get a view source option. In admin > Configuration > Logging, you could turn on the option to log database queries. That would tell you exactly what values are used in the query so that you can repeat it in phpMyAdmin.
  9. The kgtee version is PHP 7 compatible. The attributes would be set in includes/classes/order.php from values that it would try to load based on information from includes/classes/shopping_cart.php
  10. In Phoenix or later (e.g., remove any lines that say require or include includes/classes/wishlist.php
  11. ecartz

    Upgrading to the latest version

    PM @burt to be added to the Phoenix Club. It's possible that he just hasn't had time to post the upgrade instructions in the Bootstrap forum. Or he may have forgotten. That's a reasonable question to ask him.
  12. The branch is currently in testing on GitHub.

  13. of the Community Edition (Phoenix) is available on the Downloads page. 

    The SQL for the upgrade is

     /* Update to existing installations adjusting VARCHARs to 255 in length */
    ALTER TABLE categories
    CHANGE COLUMN categories_image categories_image VARCHAR(255) NOT NULL;
    ALTER TABLE categories_description
    CHANGE COLUMN categories_name categories_name  VARCHAR(255) NOT NULL,
    CHANGE COLUMN categories_seo_keywords categories_seo_keywords VARCHAR(255) NOT NULL,
    CHANGE COLUMN categories_seo_title categories_seo_title  VARCHAR(255) NOT NULL;
    ALTER TABLE manufacturers
    CHANGE COLUMN manufacturers_name manufacturers_name VARCHAR(255) NOT NULL,
    CHANGE COLUMN manufacturers_image manufacturers_image VARCHAR(255);
    ALTER TABLE manufacturers_info
    CHANGE COLUMN manufacturers_seo_keywords manufacturers_seo_keywords VARCHAR(255)  NULL,
    CHANGE COLUMN manufacturers_seo_title manufacturers_seo_title VARCHAR(255) NULL;
    ALTER TABLE orders_products
    CHANGE COLUMN products_model products_model VARCHAR(255),
    CHANGE COLUMN products_name products_name VARCHAR(255) NOT NULL;
    ALTER TABLE orders_products_attributes
    CHANGE COLUMN products_options products_options VARCHAR(255) NOT NULL,
    CHANGE COLUMN products_options_values products_options_values VARCHAR(255) NOT NULL;
    ALTER TABLE products
    CHANGE COLUMN products_model products_model VARCHAR(255),
    CHANGE COLUMN products_image products_image VARCHAR(255);
    ALTER TABLE products_description
    CHANGE COLUMN products_name products_name VARCHAR(255) NOT NULL DEFAULT '',
    CHANGE COLUMN products_seo_keywords products_seo_keywords VARCHAR(255) NULL ,
    CHANGE COLUMN products_seo_title products_seo_title VARCHAR(255) NULL ;
    ALTER TABLE products_images
    CHANGE COLUMN image image VARCHAR(255);
    ALTER TABLE products_options
    CHANGE COLUMN products_options_name products_options_name VARCHAR(255) NOT NULL DEFAULT '';
    ALTER TABLE products_options_values
    CHANGE COLUMN products_options_values_name products_options_values_name VARCHAR(255) NOT NULL DEFAULT ''; 

    1. valquiria23


      Beautiful!! But is not equal to ??

      What are the innovations in these versions? 

  14. Build is available on GitHub.

    1. valquiria23


      Beautiful!! But is not equal to ??

  15. Phoenix uses Bootstrap. You use the user.css file to override the Bootstrap settings. I would not advise trying to read the Bootstrap CSS files, as they contain more than is used in Phoenix. If you use right click in your browser and select Inspect Element, you can see what the existing settings are so that you can start thinking about overriding them. It's also possible to replace the Bootstrap CSS in includes/hooks/shop/siteWide/Bootstrap.php with one of the ones from https://cdnjs.com/libraries/bootswatch. Remember to replace the whole tag so as not to break the SRI. "Copy Link Tag" from the Copy dropdown will give you the correct replacement.
  16. ecartz

    AJAX Attribute Manager support

    You don't have to. That query will already return everything in the products table, including products_weight. Just ignore the instruction to modify that query and proceed.
  17. Intentional. You can add products to the shopping cart before logging in. Logging in merges your current carts. On someone's first visit to the site, the intended flow is 1. Browse and find products that you want to buy. 2. Add them to the cart. 3. Click the check out button. 4. Create an account. 5. Pick checkout options. 6. Confirm options and check out. It would be possible to add a message on that page that says something like "You are currently not logged in. If you would like to see saved items, please log in."
  18. ecartz

    CE Sub categories

    Content module for index_nested (which shows subcategories). Make a copy of cm_ip_product_listing.php and put it in includes/modules/content/index_nested. Adjust file and class names and constant keys to match.
  19. Making that field VARCHAR(255) is reasonable. You can also change 'products_options_values' => $attributes_values['products_options_values_name'], to 'products_options_values' => substr($attributes_values['products_options_values_name'], 0, 255), in checkout_process.php. Change the 255 to whatever you want the maximum length to be (255 is the maximum length for a MySQL VARCHAR column to have a single byte length). You can use mb_substr instead of substr if your PHP includes it (might be necessary if your site uses non-Latin characters). Or change the MySQL settings to not throw an error (so it truncates and warns instead). Sorry, I said version, but it looks like a settings issue instead. The version may have changed the default setting. I'm not up to date on the version differences at the moment. My main contribution here is to point out that column auto-truncating is a MySQL thing rather than a PHP thing. So mucking around with PHP versions or settings is unlikely to change things. MySQL settings might. And of course you can work around the issue by changing PHP code not to pass values that MySQL will find to be too long. You would do the substr before any tep_db_input (tep_db_perform will automatically do the tep_db_input later) and preferably before tep_db_prepare_input. E.g. $value = 'Whatever'; $shortened = substr($value, 0, 255); $prepared = tep_db_prepare_input($shortened); $input = tep_db_input($prepared); or tep_db_input(tep_db_prepare_input(substr($value, 0, 255))) It is (security) critical to do the tep_db_input last (which places it first if you do all of them in the same statement).
  20. Columns not getting truncated is a problem with the MySQL version, not PHP.
  21. ecartz

    internal server error

    If this is the .htpasswd_oscommerce file in the admin directory, just use an FTP program to back up and delete (on the server) the file. But download it first, before deleting. If you still have problems, remove the .htaccess file from the admin directory. Then put the files back with the proper values. It may be getting time to get help from your host to password protect the directory properly.
  22. ecartz

    Import CSV?

    Not more automatically than Easy Populate does. Note that you have to change the columns to match what Easy Populate expects. Otherwise it has no way of knowing that the SKU column should go in products_model. While it is possible to import using phpMyAdmin, realize that it won't automatically associate products name (language specific, in the products_description table) with model (not language specific, in the products table). Easy Populate does know about that and will make those associations automatically. Same thing with category name (language specific, in the categories description table, associated through categories and products_to_categories to products).
  23. ecartz

    shop and norton safe web

    According to https://community.norton.com/en/forums/stop-scam-insight-personal-information-risk-messages that's just something that they say about all new sites that have login. There are instructions at https://safeweb.norton.com/help/site_owners for changing your site's rating. Hint: they would like you to pay them money. Failing that, there is a free process that will eventually get the notice off your site. Attracting large numbers of Norton users to your site will apparently make that happen faster. This is a Norton thing, so you may get better suggestions from the Norton forums. This doesn't seem to be related to actual functionality except that your site collects personal information like login, email, and address. There is no good way to stop doing that with a web store (short of moving to a common platform like Amazon.com and using their warehouses). As a message, it is a bit misleading. You are in almost as much risk when you purchase from a third party merchant on Amazon (still shares your name and address if you don't use their warehouses).
  24. ecartz

    Products Image Verify

    Try replacing every instance of $HTTP_GET_VARS with $_GET I.e. <?php require 'includes/application_top.php'; if (!function_exists('file_put_contents')) { function file_put_contents($filename, $data, $file_append = false) { $fp = fopen($filename, ($file_append ? 'a+' : 'w+')); if (!$fp) { trigger_error('file_put_contents cannot write in file.', E_USER_ERROR); return; } fputs($fp, $data); fclose($fp); } } require 'includes/template_top.php'; ?> <!-- body_text //--> <table border="0" width="100%" cellspacing="0" cellpadding="2"> <tr> <td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td class="pageHeading"><?php echo HEADING_TITLE; ?></td> <td class="pageHeading" align="right"><?php echo tep_draw_separator('pixel_trans.gif', HEADING_IMAGE_WIDTH, HEADING_IMAGE_HEIGHT); ?></td> </tr> </table></td> </tr> <tr> <td><table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2"> <tr class="dataTableHeadingRow"> <td class="dataTableHeadingContent"><?php echo TABLE_HEADING_PRODUCTS; ?></td> <td class="dataTableHeadingContent" align="left"><?php echo TABLE_HEADING_IMAGE_SIZE; ?></td> <td class="dataTableHeadingContent" align="right"><?php echo TABLE_HEADING_ACTION; ?>&nbsp;</td> </tr> <?php if ($sID !="" && file_exists(DIR_FS_CACHE . 'image_verify.cache')) { $fd = fopen (DIR_FS_CACHE . 'image_verify.cache', "r"); $iv_cache_contents = fread ($fd,filesize (DIR_FS_CACHE . 'image_verify.cache')); fclose ($fd); $verify_query_raw = "select p.products_id, p.products_image, pd.products_name from products p, products_description pd where p.products_id = pd.products_id and (" . $iv_cache_contents .") order by pd.products_name"; } else { if (file_exists(DIR_FS_CACHE . 'image_verify.cache')) { unlink(DIR_FS_CACHE . 'image_verify.cache'); } $verify_query_raw = "select p.products_id, p.products_image, pd.products_name from products p, products_description pd where p.products_id = pd.products_id order by pd.products_name"; } $verify_query = tep_db_query($verify_query_raw); while ($verify = tep_db_fetch_array($verify_query)) { if ( !isset($sInfo) && (!isset($_GET['sID']) || ($_GET['sID'] == $verify['products_id'])) ) { $sInfo = new objectInfo($verify); } //Checks Status of all 3 image sizes to make sure it is not blank, null or if file exists so we only print out products with missing images only. $image_status = 0; if ($verify['products_image'] != "" && $verify['products_image'] != "NULL") { if (file_exists(DIR_FS_CATALOG . 'images/' . $verify['products_image'])) { $image_status = 1; } else { $image_status = 0; } } else { $image_status = 2; } if ($image_status != 1) { if (file_exists(DIR_FS_CACHE . 'image_verify.cache')) { file_put_contents(DIR_FS_CACHE . 'image_verify.cache', " or pd.products_id = " . $verify['products_id'], 'append.php'); } else { file_put_contents(DIR_FS_CACHE . 'image_verify.cache', "pd.products_id = " . $verify['products_id']); } } if ( (is_object($sInfo ?? null)) && ($verify['products_id'] == $sInfo->products_id) && ($image_status != 1)) { echo ' <tr class="dataTableRowSelected" onmouseover="this.style.cursor=\'hand\'" onclick="document.location.href=\'' . tep_href_link('image_verify.php', '&sID=' . $sInfo->products_id) . '\'">' . "\n"; } else { echo ' <tr class="dataTableRow" onmouseover="this.className=\'dataTableRowOver\';this.style.cursor=\'hand\'" onmouseout="this.className=\'dataTableRow\'" onclick="document.location.href=\'' . tep_href_link('image_verify.php', '&sID=' . $verify['products_id']) . '\'">' . "\n"; } if ($image_status != 1) { ?> <td class="dataTableContent"><?php echo $verify['products_name']; ?></td> <td class="dataTableContent" align="left"><?php } switch ($image_status) { case 0: echo tep_image('images/icons/ms_error.png', KEY_OK, 20, 20); break; case 2: echo tep_image('images/icons/ms_warning.png', KEY_ERROR, 20, 20); break; } if ($image_status != 1) { ?></td> <td class="dataTableContent" align="right"> <?php if ( (is_object($sInfo)) && ($verify['products_id'] == $sInfo->products_id) ) { echo tep_image('images/icon_arrow_right.gif', ''); } else { echo '<a href="' . tep_href_link('image_verify.php', 'page=' . $_GET['page'] . '&sID=' . $verify['products_id']) . '">' . tep_image('images/icon_info.gif', IMAGE_ICON_INFO) . '</a>'; } ?>&nbsp;</td> </tr> <?php } } ?> </table></td> <?php $heading = []; $contents = []; if ($sID =="") { $heading[] = ['text' => '<b><center>PLEASE CLICK ON PRODUCT ROW<BR>FOR MORE OPTIONS</center></b>']; } else { $heading[] = ['text' => '<b><center>' . $sInfo->products_name. '</center></b>']; } $contents[] = ['text' => '' . tep_image('images/pixel_black.gif', '', '100%', 3)]; $contents[] = [ 'align' => 'center', 'text' => '<a href="' . tep_href_link('categories.php', '&pID=' . $sInfo->products_id . '&action=new_product') . '">' . tep_image_button('button_edit.gif', IMAGE_EDIT) . '</a> <a href="' . tep_href_link('categories.php', '&pID=' . $sInfo->products_id . '&action=delete_product') . '">' . tep_image_button('button_delete.gif', IMAGE_DELETE) . '</a>', ]; $contents[] = ['text' => '' . tep_image('images/pixel_black.gif', '', '100%', 3)]; $contents[] = ['text' => '' . tep_image('images/icons/ms_error.png', '', 20, 20) . KEY_ERROR]; $contents[] = ['text' => '' . tep_image('images/icons/ms_warning.png', '', 20, 20) . KEY_NOT_USED]; $contents[] = ['text' => '' . tep_image('images/pixel_black.gif', '', '100%', 3)]; $contents[] = ['text' => DELETE_WARNING]; $contents[] = ['text' => '' . tep_image('images/pixel_black.gif', '', '100%', 3)]; $contents[] = ['text' => EDIT_WARNING]; $contents[] = ['text' => '' . tep_image('images/pixel_black.gif', '', '100%', 3)]; if ( (tep_not_null($heading)) && (tep_not_null($contents)) ) { echo ' <td width="25%" valign="top">' . "\n"; $box = new box(); echo $box->infoBox($heading, $contents); echo ' </td>' . "\n"; } ?> </tr> </table></td> </tr> </table></td> <!-- body_text_eof //--> </tr> </table> <!-- body_eof //--> </body> </html> <?php require 'includes/template_bottom.php'; ?> <?php require 'includes/application_bottom.php'; ?> Also changed the location of the cache file. The previous version required the admin directory to be writable, which should not be necessary.
  25. The products_description table has a multiple column key on products_id and language_id. PRIMARY KEY (products_id,language_id), So one row per combination. I.e. if English is 1 and German is 2, then you can have products_id 1/language_id 1 and products_id 1/language_id 2 but not a second 1/1. You could change other tables to have multiple column keys too or even remove the key entirely. But weird things can happen if the system is relying on the values being unique.