Jump to content



azpro

Member Since 11 Nov 2005
OFFLINE Last Active Yesterday, 20:43
-----

#1748169 Addons

Posted by azpro on 04 October 2016 - 19:23

Hi All!

 

As we all know .. the simple well-coded add-ons Gary @burt makes are worth lots-and-lots more than £3.50! Even if you don't use them - they are great learning stuff for coding standards.

 

So I strongly ask - especially shopowners who benefit from Gary's oSC BS work (like I do) - to step up and pledge at least 10-folds of £3.50.

 

Move the project Forward and spend a few dollars/pounds/euros!

 

Regards,

 

Arjan




#1740252 2.3.4 BS EDGE auto-update quantity in shopping_cart.php

Posted by azpro on 04 March 2016 - 11:52

@Tsimi

 

Tnx! I see what you mean .. needs some work :) ... If I find time I will ditch in and recode with Gary's approach ...

 

Don't hold your breath ... but I will post if/when I make progression ...

 

Regards!




#1740226 2.3.4 BS EDGE auto-update quantity in shopping_cart.php

Posted by azpro on 03 March 2016 - 16:32

@Tsimi Hi Lambros,

 

Video looks good! Could you share your code?

 

Regards!




#1739808 29 Days Of Code, Here It Goes Again

Posted by azpro on 24 February 2016 - 21:39

It's a bargain! Buy them all ...1 -  It will help your store .. 2 - If you are a coder (novice or expert) it will help you to understand and learn from the code Gary puts together ... 3 - Maybe most important .. it will keep the community going and development will improve.

 

Thank you Gary for the effort and well-coded super-simple addons!




#1728528 Need Help Re-Formating Product Info Page

Posted by azpro on 17 May 2015 - 17:09

@toyzonline

Take a look here ... https://github.com/g.../pull/113/files .. Read the code / try to understand / try it on your Own code / . ... Etc.etc


#1724936 Products sorting

Posted by azpro on 22 March 2015 - 10:53

@Tsimi

 

It probably has to do with (!preg_match('/^[1-8]$/', $HTTP_GET_VARS['sort'])) ... Probably before changing the code (as in untouched 2.3.4BS) anything above 8 would also not work ...

 

I will look in to it later ... Now on sunday visit to mother in law :D




#1724853 Products sorting

Posted by azpro on 20 March 2015 - 15:33

Could not edit anymore but in the last part ..

 

echo tep_draw_form('sort', tep_href_link(FILENAME_DEFAULT,tep_get_all_get_params(array('view')) ), 'get');

 

should be

 

echo tep_draw_form('sort', FILENAME_DEFAULT, 'get');




#1724850 Products sorting

Posted by azpro on 20 March 2015 - 14:59

Ok ... I allready did some chatting with Lambros about Product Sorting but I will start from scratch to make it clear for everyone..

 

Some background first. For me the sorting bits of code in index.php have always been messy. If you deep dive .. well then you can follow waht's going on. But I like selfexplanatory code.

 

First existing 2.3.4BS code in index.php

// create column list
$define_list = array('PRODUCT_LIST_MODEL' => PRODUCT_LIST_MODEL,
'PRODUCT_LIST_NAME' => PRODUCT_LIST_NAME,
'PRODUCT_LIST_MANUFACTURER' => PRODUCT_LIST_MANUFACTURER,
'PRODUCT_LIST_PRICE' => PRODUCT_LIST_PRICE,
'PRODUCT_LIST_QUANTITY' => PRODUCT_LIST_QUANTITY,
'PRODUCT_LIST_WEIGHT' => PRODUCT_LIST_WEIGHT,
'PRODUCT_LIST_IMAGE' => PRODUCT_LIST_IMAGE,
'PRODUCT_LIST_BUY_NOW' => PRODUCT_LIST_BUY_NOW);
asort($define_list);
$column_list = array();
reset($define_list);
while (list($key, $value) = each($define_list)) {
if ($value > 0) $column_list[] = $key;
}
$select_column_list = '';
for ($i=0, $n=sizeof($column_list); $i<$n; $i++) {
switch ($column_list[$i]) {
case 'PRODUCT_LIST_MODEL':
$select_column_list .= 'p.products_model, ';
break;
case 'PRODUCT_LIST_NAME':
$select_column_list .= 'pd.products_name, ';
break;
case 'PRODUCT_LIST_MANUFACTURER':
$select_column_list .= 'm.manufacturers_name, ';
break;
case 'PRODUCT_LIST_QUANTITY':
$select_column_list .= 'p.products_quantity, ';
break;
case 'PRODUCT_LIST_IMAGE':
$select_column_list .= 'p.products_image, ';
break;
case 'PRODUCT_LIST_WEIGHT':
$select_column_list .= 'p.products_weight, ';
break;
}
}

Remarks:

 - This piece of code ....... $define_list = array('PRODUCT_LIST_MODEL' => PRODUCT_LIST_MODEL,  ... etc .... What it does is .. it gets the value out of DB you set for this PRODUCT_LIST_MODEL  ....  list? I thougt column?  ^_^  ... Duhhh ... but we are sorting here? Why not call it  PRODUCT_SORT_MODEL etcetera .... And  $define_list .. I call it $define_sorting_list

 - What is a column list? We are sorting here? .. Then why not call it what it is? I call it sorting list! .. so I change $column_list to $sorting_list

 

Then existing 2.3.4BS code in   includes/modules/product_listing.php

for ($col=0, $n=sizeof($column_list); $col<$n; $col++) {
switch ($column_list[$col]) {
case 'PRODUCT_LIST_MODEL':
$lc_text = TABLE_HEADING_MODEL;
$lc_show_model = true;
break;
case 'PRODUCT_LIST_NAME':
$lc_text = TABLE_HEADING_PRODUCTS;
break;
case 'PRODUCT_LIST_MANUFACTURER':
$lc_text = TABLE_HEADING_MANUFACTURER;
$lc_show_manu = true;
break;
case 'PRODUCT_LIST_PRICE':
$lc_text = TABLE_HEADING_PRICE;
break;
case 'PRODUCT_LIST_QUANTITY':
$lc_text = TABLE_HEADING_QUANTITY;
$lc_show_qty = true;
break;
case 'PRODUCT_LIST_WEIGHT':
$lc_text = TABLE_HEADING_WEIGHT;
$lc_show_lbs = true;
break;
case 'PRODUCT_LIST_IMAGE':
$lc_text = TABLE_HEADING_IMAGE;
break;
case 'PRODUCT_LIST_BUY_NOW':
$lc_text = TABLE_HEADING_BUY_NOW;
break;
case 'PRODUCT_LIST_ID':
$lc_text = TABLE_HEADING_LATEST_ADDED;
break;
}

This piece of code is used for language defines - to put the text in the dropdown / heading. I will grab this piece of code and use it  earlier.

Because i will introduce a new file which will assemble the product sorter ... The new file is includes/modules/product_listing_sort.php and it looks like this:

  $Id: product_listing_sort.php
  osCommerce, Open Source E-Commerce Solutions
  http://www.oscommerce.com

  Copyright (c) 2010 osCommerce

  Released under the GNU General Public License

<?php

	// create sorting list 
		$define_sorting_list = array('PRODUCT_SORT_DEFAULT' => '0',      // HARD-CODED NUMBERS TO SIMPLIFY
					     'PRODUCT_SORT_RECOMMENDED' => '2',  // COULD OR SHOULD BE FROM DB
					     'PRODUCT_SORT_NEW' => '3',							 
					     'PRODUCT_SORT_MANUFACTURER' => '4', 
					     'PRODUCT_SORT_PRICE_LOWEST' => '5',
					     'PRODUCT_SORT_PRICE_HIGHEST' => '6',
					     'PRODUCT_SORT_MODEL' => '7',         // EG PRODUCT_LIST_MODEL
					     'PRODUCT_SORT_MOST_SOLD' => '8',
					     'PRODUCT_SORT_BEST_REVIEWED' => '9',
					     'PRODUCT_SORT_STOCK_STATUS' => '0'); // DO NOT SHOW IN MENU - SET VALUE TO 0 
		asort($define_sorting_list);
		$sorting_list = array();
		reset($define_sorting_list);

		### $sorting_list FOR SORTING IN index.php ETC
		while (list($key, $value) = each($define_sorting_list)) {
		  if ($value > 0) $sorting_list[] = $key;
		}


		  for ($i=0, $n=sizeof($sorting_list); $i<$n; $i++) {  // ADDS SORT NAME DEFINE
			switch ($sorting_list[$i]) {
			  case 'PRODUCT_SORT_DEFAULT':
				$text = TEXT_SORT_DEFAULT;
			  break;
			  case 'PRODUCT_SORT_RECOMMENDED':
				$text = TEXT_SORT_RECOMMENDED;
			  break;
			  case 'PRODUCT_SORT_NEW':
				$text = TEXT_SORT_NEW;
			  break;
			  case 'PRODUCT_SORT_MANUFACTURER':
				$text = TEXT_SORT_MANUFACTURER;
			  break;
			  case 'PRODUCT_SORT_PRICE_LOWEST':
				$text = TEXT_SORT_PRICE_LOWEST;
			  break;
			  case 'PRODUCT_SORT_PRICE_HIGHEST':
				$text = TEXT_SORT_PRICE_HIGHEST;
			  break;
			  case 'PRODUCT_SORT_MODEL':
				$text = TEXT_SORT_MODEL;
			  break;
			  case 'PRODUCT_SORT_MOST_SOLD':
				$text = TEXT_SORT_MOST_SOLD;
			  break;
			  case 'PRODUCT_SORT_BEST_REVIEWED':
				$text = TEXT_SORT_BEST_REVIEWED;
			  break;
			  case 'PRODUCT_SORT_STOCK_STATUS':
				$text = TEXT_SORT_STOCK_STATUS;
			  break;

			  default: 
				$text = '';
			  break;
			}
			### $products_sorter_array WILL BE USED IN PULL-DOWN
			$products_sorter_array[] = array('id' => $i,
							 'text' => $text);

		}

?>

Now in index.php we comment out and put in

// create column list
	// INTRODUCED NEW MODULE FOR SORTING SETUP
	//    $define_list = array('PRODUCT_LIST_MODEL' => PRODUCT_LIST_MODEL,
	//                         'PRODUCT_LIST_NAME' => PRODUCT_LIST_NAME,
	//                         'PRODUCT_LIST_MANUFACTURER' => PRODUCT_LIST_MANUFACTURER,
	//                         'PRODUCT_LIST_PRICE' => PRODUCT_LIST_PRICE,
	//                         'PRODUCT_LIST_QUANTITY' => PRODUCT_LIST_QUANTITY,
	//                         'PRODUCT_LIST_WEIGHT' => PRODUCT_LIST_WEIGHT,
	//                         'PRODUCT_LIST_IMAGE' => PRODUCT_LIST_IMAGE,
	//                         'PRODUCT_LIST_BUY_NOW' => PRODUCT_LIST_BUY_NOW);
	//
	//    asort($define_list);
	//
	//    $column_list = array();
	//    reset($define_list);
	//    while (list($key, $value) = each($define_list)) {
	//      if ($value > 0) $column_list[] = $key;
	//    }
	//
	//    $select_column_list = '';
	//
	//    for ($i=0, $n=sizeof($column_list); $i<$n; $i++) {
	//      switch ($column_list[$i]) {
	//        case 'PRODUCT_LIST_MODEL':
	//          $select_column_list .= 'p.products_model, ';
	//          break;
	//        case 'PRODUCT_LIST_NAME':
	//          $select_column_list .= 'pd.products_name, ';
	//          break;
	//        case 'PRODUCT_LIST_MANUFACTURER':
	//          $select_column_list .= 'm.manufacturers_name, ';
	//          break;
	//        case 'PRODUCT_LIST_QUANTITY':
	//          $select_column_list .= 'p.products_quantity, ';
	//          break;
	//        case 'PRODUCT_LIST_IMAGE':
	//          $select_column_list .= 'p.products_image_default, ';
	//          break;
	//        case 'PRODUCT_LIST_WEIGHT':
	//          $select_column_list .= 'p.products_weight, ';
	//          break;
	//      }
	//    }
	 ############# NEW DEFAULT SORTING PULLD-DOWN ##################
	 include(DIR_WS_MODULES . 'product_listing_sort.php'); 

To prevent this post from becoming to long - I will only show changes to the default query for products. The other queries should also be changed!

// We show them all
      // osC 2.3.4BS native query -- splittted in $select_str - $from_str - $where_str
      //$listing_sql = "select " . $select_column_list . " p.products_id, SUBSTRING_INDEX(pd.products_description, ' ', 20) as products_description, p.manufacturers_id,
 p.products_price, p.products_tax_class_id, IF(s.specials_status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.specials_status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";

        $select_str = "select p.products_id, p.products_model,  p.products_image, SUBSTRING_INDEX(pd.products_description, ' ', 20) as products_description, pd.products_name, p.manufacturers_id, p.products_price_basis, p.products_price, p.products_tax_class_id, IF(s.specials_status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.specials_status, s.specials_new_products_price, p.products_price) as final_price ";
	$from_str = "from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c ";
	$where_str = " where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";

Note I dropped $select_column_list from query and put in the fields we alway need in my opinion ... p.products_model, p.products_image. Furthermore I splitted the query for more felexibilty (but that is off-topic).

 

Now the piece off-code that looks if a sorting action was done by website visitor:

    if ( (!isset($HTTP_GET_VARS['sort'])) || (!preg_match('/^[1-8][ad]$/', $HTTP_GET_VARS['sort'])) || (substr($HTTP_GET_VARS['sort'], 0, 1) > sizeof($column_list)) ) {
      for ($i=0, $n=sizeof($column_list); $i<$n; $i++) {
        if ($column_list[$i] == 'PRODUCT_LIST_NAME') {
          $HTTP_GET_VARS['sort'] = $i+1 . 'a';
          $listing_sql .= " order by pd.products_name";
          break;
        }
      }
    } else {

I change it to:

	if ( (!isset($HTTP_GET_VARS['sort'])) || (!preg_match('/^[1-8]$/', $HTTP_GET_VARS['sort']))  || (substr($HTTP_GET_VARS['sort'], 0, 1) > sizeof($sorting_list)) ) {
      for ($i=0, $n=sizeof($sorting_list); $i<$n; $i++) {
        if ($sorting_list[$i] == 'PRODUCT_SORT_DEFAULT') {  // changed PRODUCT_LIST_NAME to PRODUCT_SORT_DEFAULT
           //$HTTP_GET_VARS['sort'] = $i+1 . 'a';
           $HTTP_GET_VARS['sort'] = 1;  // Sets default sort-order to 1
	   // $sort = 1; // Could also be
           //$listing_sql .= " order by pd.products_name";
	   $order_str .= " order by p.products_sort_order asc"; 
		 
          break;
        }
      }
    } 

What is does? It takes out the asc and desc postfix (eg 2a and 4d). Why? Because I think it is only relevant for price ..  In  oSC 2.3.4BS as it is there is only the + and - and you will have to click twice ... I kind of replace it in product_listing_sort.php with PRODUCT_SORT_PRICE_LOWEST and PRODUCT_SORT_PRICE_HIGHEST. So this is the important change here (!preg_match('/^[1-8][ad]$/', $HTTP_GET_VARS['sort'])) to (!preg_match('/^[1-8]$/', $HTTP_GET_VARS['sort']))

 

Now the next piece existing code after the } else {

    } else {
      $sort_col = substr($HTTP_GET_VARS['sort'], 0 , 1);
      $sort_order = substr($HTTP_GET_VARS['sort'], 1);

      switch ($column_list[$sort_col-1]) {
        case 'PRODUCT_LIST_MODEL':
          $listing_sql .= " order by p.products_model " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
          break;
        case 'PRODUCT_LIST_NAME':
          $listing_sql .= " order by pd.products_name " . ($sort_order == 'd' ? 'desc' : '');
          break;
        case 'PRODUCT_LIST_MANUFACTURER':
          $listing_sql .= " order by m.manufacturers_name " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
          break;
        case 'PRODUCT_LIST_QUANTITY':
          $listing_sql .= " order by p.products_quantity " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
          break;
        case 'PRODUCT_LIST_IMAGE':
          $listing_sql .= " order by pd.products_name";
          break;
        case 'PRODUCT_LIST_WEIGHT':
          $listing_sql .= " order by p.products_weight " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
          break;
        case 'PRODUCT_LIST_PRICE':
          $listing_sql .= " order by final_price " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
          break;
      }
    }

Will be changed to

    } else {

      $sort_col = substr($HTTP_GET_VARS['sort'], 0 , 1);
      $sort_order = substr($HTTP_GET_VARS['sort'], 1);

	  ################### To execute sorting we do not need the field value in the select of query
      //switch ($sorting_list[$sort_col-1]) {
      switch ($sorting_list[$sort_col]) {	  
//        case 'PRODUCT_LIST_MODEL':
//          $listing_sql .= " order by p.products_model " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
//          break;
//        case 'PRODUCT_LIST_NAME':
//          $listing_sql .= " order by pd.products_name " . ($sort_order == 'd' ? 'desc' : '');
//          break;
//        case 'PRODUCT_LIST_MANUFACTURER':
//          $listing_sql .= " order by m.manufacturers_name " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
//          break;
//        case 'PRODUCT_LIST_QUANTITY':
//          $listing_sql .= " order by p.products_quantity " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
//          break;
//        case 'PRODUCT_LIST_IMAGE':
//          $listing_sql .= " order by pd.products_name";
//          break;
//        case 'PRODUCT_LIST_WEIGHT':
//          $listing_sql .= " order by p.products_weight " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
//          break;
//        case 'PRODUCT_LIST_PRICE':
//          $listing_sql .= " order by final_price " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
//          break;
        case 'PRODUCT_SORT_DEFAULT'  :
          $order_str .= " order by p.products_sort_order , pd.products_name";
          break;
        case 'PRODUCT_SORT_RECOMMENDED'  :
          $order_str .= " order by p.products_sort_order , pd.products_name";
          break;
        case 'PRODUCT_SORT_NEW' :
          $order_str .= " order by p.products_date_added desc";
          break;
        case 'PRODUCT_SORT_MANUFACTURER' :
          $order_str .= " order by p.manufacturers_id asc";
          break;
        case 'PRODUCT_SORT_PRICE_LOWEST' :
         $order_str .= " order by final_price asc, pd.products_name";
          break;
        case 'PRODUCT_SORT_PRICE_HIGHEST' :
         $order_str .= " order by final_price desc, pd.products_name";
          break;
        case 'PRODUCT_SORT_MODEL'   :
          $order_str .= " order by p.products_model ";
          break;
        case 'PRODUCT_SORT_MOST_SOLD'   :
          $order_str .= " order by p.products_ordered desc ";
          break;
        case 'PRODUCT_SORT_BEST_REVIEWED'   :
          $order_str .= " order by pd.products_viewed desc ";
          break;
        case 'PRODUCT_SORT_STOCK_STATUS':
          $order_str .= " order by p.stock_status desc, pd.products_name";
          break;
		  
      }
    }
    // putting it all togehter for query used in product_listing.php
    $listing_sql = $select_str . $from_str . $where_str . $order_str;  


You can see THREE important changes:

- switch ($sorting_list[$sort_col-1]) {  to switch ($sorting_list[$sort_col]) .....

- EG  order by final_price " . ($sort_order == 'd' ? 'desc' : '') . " replaced by  order by final_price desc

- And now ... Assemble the query $listing_sql = $select_str . $from_str . $where_str . $order_str;

 

Now the existing code in includes/modules/product_listing.php

      <div class="btn-group btn-group-sm pull-right">
        <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
          <?php echo TEXT_SORT_BY; ?><span class="caret"></span>
        </button>

        <ul class="dropdown-menu text-left">
          <?php
          $lc_show_model = false;
          $lc_show_manu = false;
          $lc_show_qty = false;
          $lc_show_lbs = false;
          for ($col=0, $n=sizeof($sorting_list); $col<$n; $col++) {
            switch ($sorting_list[$col]) {
              case 'PRODUCT_SORT_MODEL':
              $lc_text = TABLE_HEADING_MODEL;
		          $lc_show_model = true;
              break;
              case 'PRODUCT_SORT_NAME':
              $lc_text = TABLE_HEADING_PRODUCTS;
              break;
              case 'PRODUCT_LIST_MANUFACTURER':
              $lc_text = TABLE_HEADING_MANUFACTURER;
		          $lc_show_manu = true;
              break;
              case 'PRODUCT_LIST_PRICE':
              $lc_text = TABLE_HEADING_PRICE;
              break;
              case 'PRODUCT_LIST_QUANTITY':
              $lc_text = TABLE_HEADING_QUANTITY;
              $lc_show_qty = true;
              break;
              case 'PRODUCT_LIST_WEIGHT':
              $lc_text = TABLE_HEADING_WEIGHT;
              $lc_show_lbs = true;
              break;
              case 'PRODUCT_LIST_IMAGE':
              $lc_text = TABLE_HEADING_IMAGE;
              break;
              case 'PRODUCT_LIST_BUY_NOW':
              $lc_text = TABLE_HEADING_BUY_NOW;
              break;
              case 'PRODUCT_LIST_ID':
              $lc_text = TABLE_HEADING_LATEST_ADDED;
              break;
            }

            if ( ($sorting_list[$col] != 'PRODUCT_LIST_BUY_NOW') && ($sorting_list[$col] != 'PRODUCT_LIST_IMAGE') ) {
              $lc_text = tep_create_sort_heading($HTTP_GET_VARS['sort'], $col+1, $lc_text);
	            echo '        <li>' . $lc_text . '</li>';
            }
          }
		      ?>
        </ul>
      </div>

I get rid of the button group AND tep_create_sort_heading($HTTP_GET_VARS['sort'], $col+1, $lc_text) ... In my opinion this is a pulldown menu - it acts as pull-down menu ...SO use a pull-down menu ;)

<div class="col-sm-3 pull-right">
  <?php
  echo tep_draw_form('sort', tep_href_link(FILENAME_DEFAULT,tep_get_all_get_params(array('view')) ), 'get');		
  echo tep_draw_pull_down_menu('sort', $products_sorter_array, $sort, 'onchange="this.form.submit()"');
  echo tep_hide_session_id() . '</form>';
  ?>
</div>

This will put in the pull-down menu based on $products_sorter_array we assembled in includes/modules/ product_listing_sort.php.

 

Remember .. these changes will break all files where product_listing.php is used eg. specials.php .. So all of them need these changes.

 

Hop this helps!




#1724703 Shop owners - what do you want in the core of future osC releases?

Posted by azpro on 18 March 2015 - 22:10

For future options we would like to see in the core Osc I would say make it Multi-Shop ready. Preferably an index.php starting the application - not being the app itself. In this way you can use one source of code to support multiple shops (this is how Magento works).

 

But more important - keep the code clean and tight as it is in 2.3.4.BS. Better to focus on and upgrade the add ons section. The add ons section should have a kind of approval system for well-coded add ons. The features required by many shopowners could off course be coded by development team and served as certified add-ons. I would be more then willing to pay for well-coded add-ons!

 

So keep the core small and simple - Just like Burt is doing right now with 2.3.4.BS.