Jump to content


  • Content count

  • Joined

  • Last visited

  • Days Won


Posts posted by Demitry

  1. Quote

    There's really no reason to have it that I can see. It just adds another step in managing the product.

    For the most part I agree, but I have custom image code that is not part of osC and it creates folders inside the catalog/image folder and uploads images to that folder. So, I have to figure out how to integrate that code with insert product and update product instead of using it for preview. Or keep the preview and possibly use localStorage for those fields.

    I'll figure something out, thanks.

  2. yeah, mine is the same. see below:

      } elseif ($action == 'new_product_preview') {
        if (tep_not_null($_POST)) {
          $pInfo = new objectInfo($_POST);
          $products_name = $_POST['products_name'];
          $products_description = $_POST['products_description'];
          $products_url = $_POST['products_url'];
    // BOF: Header Tags SEO
          $products_head_title_tag = $_POST['products_head_title_tag'];
          $products_head_title_tag_alt = $_POST['products_head_title_tag_alt'];
          $products_head_title_tag_url = $_POST['products_head_title_tag_url'];
          $products_head_desc_tag = $_POST['products_head_desc_tag'];
          $products_head_keywords_tag = $_POST['products_head_keywords_tag'];
          $products_head_breadcrumb_text = $_POST['products_head_breadcrumb_text'];
          $products_head_listing_text = $_POST['products_head_listing_text'];
          $products_head_sub_text = $_POST['products_head_sub_text'];
          $products_head_additional_words = $_POST['products_head_additional_words'];
    // EOF: Header Tags SEO


    I also thought that it might be in this block which is a bit further down for the preview page. Here I have one of the deprecated each() functions updated, but it makes no difference either way in terms of the issue at hand.

          //while (list($key, $value) = each($_POST)) {
          foreach($_POST as $key => $value) {
            if (!is_array($_POST[$key])) {
              echo tep_draw_hidden_field($key, htmlspecialchars(stripslashes($value)));
          $languages = tep_get_languages();
          for ($i = 0, $n = sizeof($languages); $i < $n; $i++) {
            echo tep_draw_hidden_field('products_name[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_name[$languages[$i]['id']])));
            echo tep_draw_hidden_field('products_description[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_description[$languages[$i]['id']])));
          // BOF: Header Tags SEO
            echo tep_draw_hidden_field('products_head_title_tag[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_head_title_tag[$languages[$i]['id']])));
            echo tep_draw_hidden_field('products_head_title_tag_alt[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_head_title_tag_alt[$languages[$i]['id']])));
            echo tep_draw_hidden_field('products_head_title_tag_url[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_head_title_tag_url[$languages[$i]['id']])));
            echo tep_draw_hidden_field('products_head_desc_tag[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_head_desc_tag[$languages[$i]['id']])));
            echo tep_draw_hidden_field('products_head_keywords_tag[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_head_keywords_tag[$languages[$i]['id']])));
            echo tep_draw_hidden_field('products_head_breadcrumb_text[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_head_breadcrumb_text[$languages[$i]['id']])));
            echo tep_draw_hidden_field('products_head_listing_text[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_head_listing_text[$languages[$i]['id']])));
            echo tep_draw_hidden_field('products_head_sub_text[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_head_sub_text[$languages[$i]['id']])));
            echo tep_draw_hidden_field('products_head_additional_words[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_head_additional_words[$languages[$i]['id']])));
          // EOF: Header Tags SEO
            echo tep_draw_hidden_field('products_url[' . $languages[$i]['id'] . ']', htmlspecialchars(stripslashes($products_url[$languages[$i]['id']])));


    So,.. what I did was to replace the categories.php file with the one from the less than 2.3 version. And after replacing all the directory and filename definitions for a basic test run, I went through to the preview page and then clicked the Back button and the result was the same -- all of the fields for the header_tags_seo.php module were empty.

    I tried doing the same thing by swapping out the header_tags_seo.php module, which is where all the HT fields are coming up empty, with no change. I cannot seem to pin point it. Maybe it's something else that PHP7.2 doesn't like.


  3. Thanks Jack,

    I looked at that a number of times, but there is not much difference between the new BS Edge categories.php file, my older MS2.2 file and the Use_if_version_lessthan_2.3 folder file in regards to this section. The product preview code is the same (except for the custom images code I have). The issue is with keeping the text content value in the HT SEO fields when going back from the preview via the back button. That back button has a parameter of name="edit" ..I could not find anything related to that. So, could that be it? or is that parameter not utilized?


  4. @Jack_mcs

    hi Jack,

    Question for you,.. I had to combine some code from my old MS2.2 admin/categories.php file and the new BS Edge version (on PHP 7.2). In doing this I came across a problem where some of the custom code I had did not work without the page preview option.

    So, the problem is with the Back button on that preview page. When I go back to the categories.php product update page, all fields contain their related data except the product name and all of the fields for the header tags. Those fields are all empty.

    I’ve been trying to find where this issue is located, but with no luck. My old MS2.2 site does not have this problem.

    I even changed all instances of the deprecated each() function in the BS Edge version and still cannot get those HT SEO fields to display any content when going back to the product update page from the preview. Any idea of what it can be or where I should look?


  5. @Jack_mcs

    hi Jack,

    I did a site search to find all instances of mysql_ to update them to mysqli_ where possible. I found 2 instances of mysql_error() in the following file, which I believe should be mysqli_error(). Though I don't know if it makes any difference. This is for BS Edge on PHP 7.2


    Please let me know if these should be changed to mysqli_error() for the version I am running. Thanks.

  6. @Jack_mcs

    hi Jack,

    Question for you about the purpose of the "currently viewing" link. I noticed that BS Edge product_info.php page has this same link for the product title and both, the "currently viewing" link and that product page title link reload the same page.

    This is confusing for the user, and for bots it sends them into a loop. That's something search engines don't like too much on either front. They already have this issue with the logo image link on the home page. Is there another purpose for these two links that I am not aware of?


  7. @Jack_mcs

    hi Jack,

    In this file there is a style tag inside of an inline style tag for the Additional Words field.


    And I rewrote that file for better formatting of the titles and fields. I used a table structure because the divs were messed up and frankly, it was easier to do it this way. File is attached and below is a screenshot of how it is formatted now.



  8. more....

    These files have no changes in them.





    /Use_if_version_BootStrap/catalog_only_new_files/admin/header_tags_seo_popup_help.php - just calls the application_top file with no other code content.

    /Use_if_version_BootStrap/catalog/index.php - (int)$HTTP_GET_VARS['manufacturers_id'] should be (int)$ _GET ['manufacturers_id']

    /Use_if_version_BootStrap/catalog/product_info.php - echo "<a name=\"\$header_tags_array['title']\"></a>"; has an extra back-slash before the variable and really should be: echo '<a name="' . $header_tags_array['title'] . '"></a>';

    /Use_if_version_BootStrap/catalog_only_new_files/admin/includes/functions/header_tags.php - font-size:10ps; should be font-size:10px; (2 instances – lines 213 and 214)




  9. Also, in the /includes/header_tags.php file, you can combine the noodp and noydir meta tags into one. This should also reduce the related database configuration by one setting.

    So, ..from this:

    if ($defaultTags['meta_noodp'])     echo '<meta name="robots" content="noodp" />' . "\n";
    if ($defaultTags['meta_noydir'])    echo '<meta name="slurp" content="noydir" />' . "\n";

    to this:

    if ($defaultTags['meta_noodp'])     echo '<meta name="robots" content="noodp,noydir" />' . "\n";

    Reference article:  https://www.seoworkers.com/seo-articles-tutorials/using-noodp-and-noydir.html



  10. @Jack_mcs

    more on this addon…



    In this file there is code calling for the /ext/javascript/plusone.js file. After doing a site search, this is the only place where this file is called. So,.. that plusone.js file can be removed and the call replaced with the following for a cached copy of it from Google.

    echo '<script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>';

    Though better yet,… you could remove that code block along with the database install code for Google Plus because Google Plus is no longer in existence.

  11. @Jack_mcs

    hi Jack,

    I’m installing this addon for BS Edge and going through all the files. Here are some issues I found.

    This file has no changes in it.



    These files need a class constructor function __construct():


    /Use_if_version_BootStrap/catalog_only_new_files/includes/modules/content/product_info/ cm_pi_headertags_seo.php






    These folders are empty:




    I’m not finished reviewing all the code for the version I am installing in the package folder Use_if_version_BootStrap, and I’ll let you know if I find anything else.


  12. @Jack_mcs

    hi Jack,

    Just a suggestion to reduce the size of this addon. I think you can safely remove any and all references to osC versions that are below version 2.3 because…:

    1) Anyone who currently has an osC version below 2.3, has already installed this HTSEO addon

    2) Anyone who chooses osC for a new install, will not install an old version below 2.3

  13. Quote

    I can't see why you want both parameters - surely it's one or the other?

    Thanks John, I had not thought of that. I figured it needed both and it works with both. I'll take a look and try restructuring the file to use one parameter (products_id) for all reviews and the reviews_id for the single review. The easiest way is probably to just scrap the split file and leave it as it was and then add in the product_reviews_info.php file. The SEO URLs code is already set up for it in the class file.

  14. @Jack_mcs

    hi Jack,

    I modified my product_reviews.php file in my BS Edge install to also display individual reviews,.. same as product_reviews_info.php file did in the older osC versions, before it was dropped for whatever reason.

    The htaccess rewrite rules for the product_reviews.php file does not recognize any query in the url beyond products_id. Therefore, an individual review in that file with a url like this:


    …will ignore the last part and return the same product_reviews.php page showing all of the reviews for that product.

    I tried finding a solution using an htaccess RewriteRule and cannot seem to get one to work properly. I’m doing this with the assumption that I don’t need to add code in the seo.class.php class file, though I may be wrong on that.

    Do you or anyone else here know how to structure that RewriteRule for it to read the second part of that url query string?

  15. I think an easy way to get around bot creation of fake accounts or abuse of Tell A Friend page is to add in a script that requires the user to approve the account or email-send action via a button sent to their email. This is an added step, but you could spin it as it is designed to protect them (the customer). And a hacker or spammer is not going to use their own email account.

    This would not work for the Contact Us page, but if set up right, it will only execute the final account-submit or email-send action upon a human approval from the account of the email they used.

    It would likely require some A/B testing to see if an added step like this would have a significant negative impact on new account creations and Tell A Friend emails sent via real customers.


  16. hi Rainer,

    This is a small modification to this addon for anyone who wants to use it,.. and if you see value in it, you could add it to an update release.

    The mod is designed to only show the “See More” button if the number of recently viewed products exceeds the content limit of recently viewed products for each module.

    For example: if a customer viewed 4 or less products and the content limit is set to 4 recently viewed products, then it does not makes sense to have them see and click on a "See More" button that takes them to a Recently Viewed Products page containing the same 4 or less products that were listed on whatever page they were on.

    So, here are the changes and I’m only going to use the product_info page Recently Viewed module in this sample. This works in BS Edge.


    1)      FIND this code:

            // Set up the product data string in order by $recently_viewed_array
            if ($num_products > 0) { // Show only if we still have products in the array

    ADD just ABOVE it:

            // this will show/hide the "See More" button
            $rv_btn = 'style="display:none;"';
            $rv_number_viewed = substr_count($recently_viewed_string, ",") + 1; 
            if ($rv_number_viewed > MODULE_CONTENT_INDEX_RECENTLY_VIEWED_CONTENT_LIMIT) {
                $rv_btn = 'style="display:inline;"';


    2)      FIND this code:

            	$recently_viewed_content .= '<h3 class="h3"><span itemprop="name">' . MODULE_CONTENT_INDEX_RECENTLY_VIEWED_TITLE . '</span>' . ((MODULE_CONTENT_INDEX_RECENTLY_VIEWED_SHOW_MORE_BUTTON == 'True')? '  <a href="' . tep_href_link('recently_viewed.php') . '" class="btn btn-default btn-sm">' . MODULE_CONTENT_INDEX_RECENTLY_VIEWED_IMAGE_BUTTON_SEE_MORE . '  <span class="fa fa-angle-right"></span></a>' : '' ) . '</h3>';

    REPLACE it with this:

            	$recently_viewed_content .= '<h3><span itemprop="name">' . MODULE_CONTENT_INDEX_RECENTLY_VIEWED_TITLE . '</span>' . ((MODULE_CONTENT_INDEX_RECENTLY_VIEWED_SHOW_MORE_BUTTON == 'True')? '&nbsp;&nbsp;<span ' . $rv_btn . '>' . tep_draw_button(MODULE_CONTENT_INDEX_RECENTLY_VIEWED_IMAGE_BUTTON_SEE_MORE, 'glyphicon glyphicon-triangle-right', tep_href_link('recently_viewed.php'), 'primary', null, 'btn-default btn-sm') . '</span>':'') . '</h3>';


  17. @Tsimi

    ...you put the "bro" in Lambros


    yeah man, ..that's exactly what I was trying to achieve and I'm not very good with SQL. Thank you for the help. I just tested this mod and it works as it should. If you want, you can add it to the next update release.

    Ok, so here is the complete mod to only show the "See More" button when the number of Featured Products exceeds the content limit set in admin for the particular module.

    I'm just going to use the index module for this sample, and this is for BS Edge. I'm not sure if there is a difference with other versions.


    1)      FIND this code:

            if (tep_db_num_rows($featured_products_query) > 0) { // Show only if we still have products in the array

    ADD just ABOVE it:

            // this will show/hide the "See More" button
            $fp_count_query = tep_db_query("select count(*) as total from featured WHERE status = '1'");
            $fp_count = tep_db_fetch_array($fp_count_query);
            $fp_btn = 'style="display:none;"';
            if ($fp_count['total'] > MODULE_CONTENT_INDEX_FEATURED_PRODUCTS_CONTENT_LIMIT) {
                $fp_btn = 'style="display:inline;"';


    2)      FIND this code:

                $featured_products_content = '<h3>' . ($cat_name != '' ? sprintf(MODULE_CONTENT_INDEX_FEATURED_PRODUCTS_CATEGORY_TITLE, $cat_name) : MODULE_CONTENT_INDEX_FEATURED_PRODUCTS_TITLE . ((MODULE_CONTENT_INDEX_FEATURED_PRODUCTS_SHOW_BUTTON == 'True')? '  ' . tep_draw_button(MODULE_CONTENT_INDEX_FEATURED_PRODUCTS_IMAGE_BUTTON_SEE_MORE, 'glyphicon glyphicon-triangle-right', tep_href_link('featured_products.php'), 'primary', null, 'btn-default btn-sm'):'')) . '</h3>';

    REPLACE it with this:

                $featured_products_content = '<h3>' . ($cat_name != '' ? sprintf(MODULE_CONTENT_INDEX_FEATURED_PRODUCTS_CATEGORY_TITLE, $cat_name) : MODULE_CONTENT_INDEX_FEATURED_PRODUCTS_TITLE . ((MODULE_CONTENT_INDEX_FEATURED_PRODUCTS_SHOW_BUTTON == 'True')? '&nbsp;&nbsp;<span ' . $fp_btn . '>' . tep_draw_button(MODULE_CONTENT_INDEX_FEATURED_PRODUCTS_IMAGE_BUTTON_SEE_MORE, 'glyphicon glyphicon-triangle-right', tep_href_link('featured_products.php'), 'primary', null, 'btn-default btn-sm') . '</span>':'')) . '</h3>';



  18. @Tsimi

    hi Lambros,

    I'm trying to add a modification to the modules for this addon, where the "See More" button does not display unless there are more featured products listed than are limited to display at any one time. ..because there is no point is sending the customer to the featured products page if they are seeing all of the featured products on whatever page they are on.

    The problem I'm having is getting the total number of featured products (for lets say, the index page module). It's probably right in front of me, I'm just missing that piece. For example: I condition to display that "See More" button only when the total number of featured products is > MODULE_CONTENT_INDEX_FEATURED_PRODUCTS_CONTENT_LIMIT.

    I wanted to use tep_db_num_rows($featured_products_query), but that is set in the $query to always equal the content limit setting.

    I really appreciate any help on this. And it could be a good feature for an update. I'll gladly share it here once I get that mod working properly.


  19. I know that this is an old thread, however, because I recently solved this problem, I will share it here for anyone who is looking for the solution.

    The problem is that the variable $products_id is not defined.

    So,.... find this code at the top of product_reviews_write.php page, around line 31:

      if (!tep_db_num_rows($product_info_query)) {
          tep_redirect(tep_href_link('product_reviews.php', tep_get_all_get_params(array('action'))));
      } else {
          $product_info = tep_db_fetch_array($product_info_query);

    and replace it with this:

      if (!tep_db_num_rows($product_info_query)) {
          tep_redirect(tep_href_link('product_reviews.php', tep_get_all_get_params(array('action'))));
      } else {
          $product_info = tep_db_fetch_array($product_info_query);
          $products_id = $product_info['products_id'];


    This should make the error validation work properly. It did for me.