Thursday, 20 September 2012

How to add multiple product fields in zen cart


Hi this tutorial teach you how to add multiple product fields on zen cart.


Any changes to existing code or completely new code are shown in red (watch out for , too).

So lets gets started...
  1. Create a new table to hold your additional fields and give it a name i.e.products_extra_stuff and add the products_id field (so we can relate our new table to the existing products table) and whatever fields you wish to add i.e. products_colour
  2. Open includes/database_tables.php and add your new table to the list of definitions i.e.define('TABLE_PRODUCTS_EXTRA_STUFF', DB_PREFIX . 'products_extra_stuff');
  3. Open admin/includes/modules/product/preview_info.php and change the following lines:

    (line 26 for me)
    p.products_sort_order, pdex.products_colour
    from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_EXTRA_STUFF . " pdex
    where p.products_id = pd.products_id and p.products_id = pdex.products_id
  4. Open admin/includes/modules/product/collect_info.php and change the following lines :

    (line 12 for me)
    $parameters = array('products_name' => '',
    'products_description' => '',

    'master_categories_id' => '',
    'products_colour' => ''

    );

    (now line 60 for me after the above edit)
    p.products_price_sorter, p.master_categories_id, pdex.products_colour
    from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " .
    TABLE_PRODUCTS_EXTRA_STUFF . " pdex

    where p.products_id = '" . (int)$_GET['pID'] . "'
    and p.products_id = pd.products_id and p.products_id = pdex.products_id
  5. In the same file (collect_info.php) insert your form fields to collect your new data along with the rest:

    (line 305 for me as I wanted to insert just below product name)
    <!-- BOF - Additional field added -->
    <tr>
    <td class="main"><?php echo 'Colour '; ?></td>
    <td class="main"><?php echo zen_draw_separator('pixel_trans.gif', '24', '13') . '&nbsp;' .
    zen_draw_input_field('products_colour', $pInfo->products_colour, zen_set_field_length(TABLE_PRODUCTS_EXTRA_STUFF, 'products_colour')); ?></td>
    </tr>
    <!-- EOF - Additional field added -->
  6. Open admin/includes/modules/update_product.php and add the following lines to process both new products and the editing of existing ones:

    (line 153 for me)
    ////////////// MY ADDED FIELDS ////////////////////
    $sql_data_array = array('products_colour' => zen_db_prepare_input($_POST['products_colour']));

    if ($action == 'insert_product') {
    $insert_sql_data = array('products_id' => $products_id);

    $sql_data_array = array_merge($sql_data_array, $insert_sql_data);

    zen_db_perform(TABLE_PRODUCTS_EXTRA_STUFF, $sql_data_array);
    } elseif ($action == 'update_product') {
    zen_db_perform(TABLE_PRODUCTS_EXTRA_STUFF, $sql_data_array, 'update', "products_id = '" . (int)$products_id . "'");
    }
    /////////////////////////////////////////////
  7. In order to make the data from your new field(s) available to add to the product page openinludes/modules/pages/product_info/main_template_vars.php and change the following lines:

    (line 55 for me)
    p.products_discount_type, p.products_discount_type_from, p.products_sort_order,
    p.products_price_sorter, pdex.products_colour
    from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_EXTRA_STUFF . " pdex
    where p.products_status = '1'
    and p.products_id = '" . (int)$_GET['products_id'] . "'
    and pd.products_id = p.products_id and p.products_id = pdex.products_id

    (line 101 for me amongst products name, model and description)
    $products_colour = $product_info->fields['products_colour'];
  8. To display the data from your new field(s) openincludes/templates/YOUR_TEMPLATE/templates/tpl_product_info_display.php and add something similar to the following:

    (place wherever you wish your new field to be displayed)
    <!--bof Product Colour -->
    <?php
    if ($products_colour != '') {
    ?>
    <div id="productColour" class="productGeneral"><strong>Colour: </strong><?php echo $products_colour; ?></div>
    <?php
    }
    ?>
    <!--eof Product Colour -->
  9. We also need to ensure the extra fields are deleted from the products_extra_stuff table when we delete a product. Open admin/includes/functions/general.php and search for 'function zen_remove_product' (line 1203 for me)
  10. At the end of that function and just after the following code:

    $db->Execute("delete from " .
    TABLE_PRODUCTS_DISCOUNT_QUANTITY . "
    where products_id = '" . (int)$product_id . "'");

    (line 1276 for me)

    Add the following on a new line:

    $db->Execute("delete from " . TABLE_PRODUCTS_EXTRA_STUFF . "
    where products_id = '" . (int)$product_id . "'");


    Make sure you add this before the closing '}' of the function (line 1279 for me before the edit).
  11. And finally, if you already have products in your products table, we need to create a matching record for each in the new table. If you miss this step you will find that when you edit existing products and add a value to your new field, it won't be saved! You can only skip this step if you don't have any products in your products table yet i.e. a new installation.

    In phpmyadmin or mysql command line, enter one of the following queries:

    For a default value:
    INSERT products_extra_stuff (products_id, products_colour) SELECT products_id, 'your default value here' FROM products

    For no default value:
    INSERT products_extra_stuff (products_id, products_colour) SELECT products_id, '' FROM products


1 comments: