Forums / Templates, Stylesheets, Page Layout / Notifier Class - attempt

Notifier Class - attempt

Locked

Started by quentinjs on 8 Oct 2006, 6:42 PM · Views: 6,222

Results 1 to 20 of 21
This thread is locked. New replies are disabled.
8 Oct 2006, 6:42 PM
#1
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Notifier Class - attempt

  1. Will this work? I'm trying to audit all products viewed.
  2. What needs to be changed?
  3. Should a notifier forum be created?
<?php /* * 1. in table includes\database_tables.php, add the line * define('TABLE_PRODUCTS_DESCRIPTION', DB_PREFIX . 'products_viewed'); * * 2. Create table, if your using a db_prefix, make sure you prefix the table name with it. * CREATE TABLE products_viewed( products_id Int, language_id Int, viewed_date Date, products_viewed int ) * * 4. In includes/autoloaders create file called config.tgi_productsviewed.php containing * NOTE: does the # 91 really matter? what if another 91 exists? <?php $autoLoadConfig[91][] = array('autoType'=>'class', 'loadFile'=>'observers/class.freeProduct.php'); $autoLoadConfig[91][] = array('autoType'=>'classInstantiate', 'className'=>'tgi_productsviewed', 'objectName'=>'tgi_productsviewed'); ?>

/**

  • Observer class used to track products viewed on a daily basis.
  • great for seasonal marketing planning and active marketing analysis.

/
class tgi_productsviewed extends base {
/
*

  • an array of ids of products to not track.
  • @var array
    */
    var $IgnoreArray = array(-1, -2); // Just place holders so something exists for demo purposes.
/**
  • constructor method

  • Attaches our class to the $_GET['products_id'] and $_SESSION['languages_id'] and watches for 1 notifier event.
    /
    function tgi_productsviewed() {
    // $_SESSION['cart']->attach($this, array('NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_GENERAL_INFO'));
    global $zco_notifier;
    $zco_notifier->attach($this, array('NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_GENERAL_INFO'));
    }
    /
    *

  • Update Method

  • Called by observed class when any of our notifiable events occur.

  • We check to see if we have an entry for today for this item, if we don't then we create one,

  • otherwise that item is incremented.

  • @param object $class

  • @param string $eventID
    */
    function update(&$class, $eventID) {
    // get the current date
    $sql = "select curdate() as now";
    $res = $db->Execute($sql);
    $now = $res->fields['now'];

    $now = getdate(); // just in case the date changes
    // first see if we have a matching product entry.
    $sql = "select count(*) as total
    from " . TABLE_PRODUCTS . " p, " .
    TABLE_PRODUCTS_DESCRIPTION . " pd
    where p.products_status = '1'
    and p.products_id = '" . (int)$_GET['products_id'] . "'
    and pd.products_id = p.products_id
    and pd.language_id = '" . (int)$_SESSION['languages_id'] . "'";

    $res = $db->Execute($sql);

    if ( $res->fields['total'] >= 1 ) {
    // see if a table entry exists

    $sql = "select count(*) as total
    from " . TABLE_PRODUCTS_VIEWED . " p, " .
    and p.products_id = '" . (int)$_GET['products_id'] . "'
    and p.language_id = '" . (int)$_SESSION['languages_id'] . "'";
    and p.viewed_date = '" . $now . "'";

    $res = $db->Execute($sql);

    if ( $res->fields['total'] >= 1 ) {

    $sql = "update " . TABLE_PRODUCTS_VIEWED . "
    set products_viewed = products_viewed+1
    where products_id = '" . (int)$_GET['products_id'] . "'
    and language_id = '" . (int)$_SESSION['languages_id'] . "'"
    and p.viewed_date = '" . $now . "'";

    $res = $db->Execute($sql);
    } else { /* create new entry */

    $sql = "insert into " . TABLE_PRODUCTS_VIEWED . "
    (products_viewed, products_id, language_id, viewed_date) values (
    1, '" . (int)$_GET['products_id'] . "', '" . (int)$_SESSION['languages_id'] . "',"
    '" . $now . "')";
    $res = $db->Execute($sql);

    }
    }
    }
    ?>

8 Oct 2006, 6:56 PM
#2
swguy avatar

swguy

Administrator

Join Date:
Feb 2006
Location:
Tampa Bay, Florida
Posts:
10,750
Plugin Contributions:
56

Re: Notifier Class - attempt

Before you go further with this, did you look at Admin->Reports->Products Viewed?

That Software Guy. My Store: Zen Cart Support
Available for hire - See my ad in Services
Plugin Moderator, Documentation Curator, Chief Cook and Bottle-Washer.
Do you benefit from Zen Cart? Then please support the project.

8 Oct 2006, 7:10 PM
#3
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Re: Notifier Class - attempt

That is the reason for this class, as the products viewed currently just accrues totals, I want to create detailed reports from the data. Reports will be the next phase once the data exists.

Right now I have a library of reports created for ZenCart, but its not in line with the ZenCart way currently. That will also be refactored as I do this reporting tool.

8 Oct 2006, 8:08 PM
#4
drbyte avatar

drbyte

Sensei

Join Date:
Jan 2004
Posts:
63,511
Plugin Contributions:
176

Re: Notifier Class - attempt

A few thoughts and feedback:

  1. The new table you mentioned ... should be TABLE_PRODUCTS_VIEWED, not DESCRIPTION

  2. No need to edit the core "/includes/database_tables.php" file. Simply add a new file, like this: /includes/extra_datafiles/tables_products_viewed.php and insert the define statement in that file, even if that's all the file contains (with php wrapper tags of course).

  3. Your question #4 about whether "91" matters and what if it's a duplicate? Duplicates just mean they will both be processed together, after 90 and before 92. Entries are processed in the order of the array sequence. Duplicates are processed in the order in which they are added.

  4. The only difference in functionality which I see in the code you posted vs the Zen Cart core is the "potential" to exclude certain products from being tracked. Granted, you probably have more "in mind" than what you've shared here thus far. I'm just thinking that if the tracked data is no different than the core, why is there a need for this additional infrastructure? Just a thought. I'm sure you have a reason, and it's likely related to the bigger picture that you're working with.

Hope that helps :D

.
Zen Cart - putting the dream of business ownership within reach of anyone!
Donate to: DrByte directly or to the Zen Cart team as a whole

Remember: Any code suggestions you see here are merely suggestions. You assume full responsibility for your use of any such suggestions, including any impact ANY alterations you make to your site may have on your PCI compliance.
Furthermore, any advice you see here about PCI matters is merely an opinion, and should not be relied upon as "official". Official PCI information should be obtained from the PCI Security Council directly or from one of their authorized Assessors.

9 Oct 2006, 7:35 AM
#5
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Re: Notifier Class - attempt

Your question #4 is a good one. Here is my vision.....

I look at my products viewed and it tells me 500 people have viewed bike hoists, and 400 have viewed epoxy, which is great.... what if I now add 10 new products, and want to know what people are now viewing this week, it will take a year before those products even get enough hits to count. What if I start 5 sales, which products are people now looking at.... or what do people look for in thhe spring vs fall, should I be promoting products at different times of thhe year.....its really for marketing, if I tweek a category name, or make some change, how can I see if that has helped to make it a better experience for the potential customer.

Now the other way of doing this is to schedule an even that does a copy of the viewed data every night, but that isn't the zen way ;-) Now the BIG difference is my method tracks on a daily basis, which is much more granular then the current zen approach.

Does my explanation make sense and is it a worth while task or am I off my rocker and should devote my energy to a different problem, like shipping.....

and thanks for the tips, I'll add them to my notifier attempt. I'm glad that the basics are good.

9 Oct 2006, 7:55 AM
#6
drbyte avatar

drbyte

Sensei

Join Date:
Jan 2004
Posts:
63,511
Plugin Contributions:
176

Re: Notifier Class - attempt

ack! I totally missed the "date" portion of that. Glazed right over it.

Yes -- excellent idea. Handy method to track the statistics in a way that helps you use the data for marketing and product-mgmt purposes.

I musta missed that when my brain hiccupped because it didn't see a step #3 in your post and was trying to reconcile that vs what it had read earlier. Or, that's my excuse anyway :D

.
Zen Cart - putting the dream of business ownership within reach of anyone!
Donate to: DrByte directly or to the Zen Cart team as a whole

Remember: Any code suggestions you see here are merely suggestions. You assume full responsibility for your use of any such suggestions, including any impact ANY alterations you make to your site may have on your PCI compliance.
Furthermore, any advice you see here about PCI matters is merely an opinion, and should not be relied upon as "official". Official PCI information should be obtained from the PCI Security Council directly or from one of their authorized Assessors.

9 Oct 2006, 8:00 AM
#7
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Re: Notifier Class - attempt

whew, as with 2 people basically asking if I had missed the boat, I was wondering if I set sail without taking along an anchor.... good to see I didn't.

What I'd like to do is some form of graphical report next with this, which is something new for me, but I'm sure someone has done something I can piggy back on. Need to get this class notifier working first though. There is nothing like working on a project at 2am in the morning.

When I get my notifer working I'll post thhe whole set up here as well, so others have a road map they can use to make theres as well. (unless there is a better place I should be doing that).

9 Oct 2006, 8:06 AM
#8
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Re: Notifier Class - attempt

Questions:

  1. after adding the class and auto_loader, does it just immediately start working, or does php or something else need to be restarted?
  2. What is the easiest way to tell if the class is working... is there a way of logging?
  3. How can we tell what notifiers are in zencart and what notifiers are active, and there should be a way in the admin system to see these and activate or turn them off. (nice future tool).
9 Oct 2006, 8:57 AM
#9
drbyte avatar

drbyte

Sensei

Join Date:
Jan 2004
Posts:
63,511
Plugin Contributions:
176

Re: Notifier Class - attempt

quentinjs:

Questions:

  1. after adding the class and auto_loader, does it just immediately start working, or does php or something else need to be restarted?
  2. What is the easiest way to tell if the class is working... is there a way of logging?
  3. How can we tell what notifiers are in zencart and what notifiers are active, and there should be a way in the admin system to see these and activate or turn them off. (nice future tool).
  1. Once they're in, they're active. ie: if they get loaded by the autoloader system, they will function immediately.
  2. If there are no errors, you know they're not crashing. Logging is a little more challenging. You could have it write to a file or send you an email, using normal methods for such activity.
  3. What notifiers are installed? There is no report on that at present.
  4. Which notifiers are active? No indicators.
  5. Enable/disable via admin. Some configuration switches could be added for this. I suggest a naming convention of NOTIFIER_ENABLE_STATUS_XXXXXXXXXX

.
Zen Cart - putting the dream of business ownership within reach of anyone!
Donate to: DrByte directly or to the Zen Cart team as a whole

Remember: Any code suggestions you see here are merely suggestions. You assume full responsibility for your use of any such suggestions, including any impact ANY alterations you make to your site may have on your PCI compliance.
Furthermore, any advice you see here about PCI matters is merely an opinion, and should not be relied upon as "official". Official PCI information should be obtained from the PCI Security Council directly or from one of their authorized Assessors.

9 Oct 2006, 9:13 AM
#10
paulm avatar

paulm

Totally Zenned

Join Date:
Nov 2003
Posts:
1,878
Plugin Contributions:
5

Re: Notifier Class - attempt

DrByte:

  1. Which notifiers are active? No indicators.That reminds me I need to upload the new version of the Superglobals viewer :-)

Would having a live list like this help?:
(of course with much better layout instead)

autoLoadConfig (array)

* 0 (array)
      o 0 (array)
            + autoType (string) => class
            + loadFile (string) => class.base.php
      o 1 (array)
            + autoType (string) => class
            + loadFile (string) => class.notifier.php
      o 2 (array)
            + autoType (string) => classInstantiate
            + className (string) => notifier
            + objectName (string) => zco_notifier
      o 3 (array)
            + autoType (string) => class
            + loadFile (string) => class.phpmailer.php
      o 4 (array)
            + autoType (string) => class
            + loadFile (string) => class.smtp.php
      o 5 (array)
            + autoType (string) => class
            + loadFile (string) => boxes.php
      o 6 (array)
            + autoType (string) => class
            + loadFile (string) => category_tree.php
      o 7 (array)
            + autoType (string) => class
            + loadFile (string) => template_func.php

<snip>skipped a lot here to shorten the post</snip>

* 160 (array)
      o 0 (array)
            + autoType (string) => classInstantiate
            + className (string) => breadcrumb
            + objectName (string) => breadcrumb
      o 1 (array)
            + autoType (string) => init_script
            + loadFile (string) => init_category_path.php
* 170 (array)
      o 0 (array)
            + autoType (string) => init_script
            + loadFile (string) => init_add_crumbs.php
* 180 (array)
      o 0 (array)
            + autoType (string) => init_script
            + loadFile (string) => init_header.php
9 Oct 2006, 4:40 PM
#11
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Re: Notifier Class - attempt

I'd think it would be a reat additional tool esp for configuration. Oh, my observer now doesn't crash my site, but as far as I know its not being triggered.

9 Oct 2006, 4:56 PM
#12
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Re: Notifier Class - attempt

I don't think my observer is firing / working, no idea at what pointits failing, but I added logging as the first statement of the update and viewing the log shows nothing.

below is the code I'm running. note: I created a table called q_log for logging.

<?php /* * 1. Create file /includes/extra_datafiles/tables_products_viewed.php <?php define('TABLE_PRODUCTS_VIEWED', DB_PREFIX . 'products_viewed'); ?>
    1. Create table, if your using a db_prefix, make sure you prefix the table name with it.
  • CREATE TABLE products_viewed(
    products_id Int,
    language_id Int,
    viewed_date Date,
    products_viewed int
    )

    ALTER TABLE products_viewed ADD PRIMARY KEY ( products_id )

    1. In includes/auto_loaders create file called config.tgi_productsviewed.php containing

      • NOTE: 91 just tells the order this should be loaded compared to other loaded objects.
      • not sure if there is a tool in admin to report what has been loaded. A notifier reporting tool would be a tool to help with managing these notifiers.
      • if another # 91 exists, this one will be loaded after it
      <?php $autoLoadConfig[91][] = array('autoType'=>'class', 'loadFile'=>'observers/class.tgi_productsviewed.php'); $autoLoadConfig[91][] = array('autoType'=>'classInstantiate', 'className'=>'tgi_productsviewed', 'objectName'=>'tgi_productsviewed'); ?>
    1. Main observer class - create as file includes/classes/observers/class.tgi_productsviewed.php
<?php /** * Observer class used to track products viewed on a daily basis. * great for seasonal marketing planning and active marketing analysis. * */ class tgi_productsviewed extends base { /** * an array of ids of products to not track. * * @var array */ //var $IgnoreArray = array(-1, -2); // Just place holders so something exists for demo purposes. /** * constructor method * * Attaches our class to the $_GET['products_id'] and $_SESSION['languages_id'] and watches for 1 notifier event. */ function tgi_productsviewed() { global $zco_notifier; $zco_notifier->attach($this, array('NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_GENERAL_INFO')); } /** * Update Method * * Called by observed class when any of our notifiable events occur. * * We check to see if we have an entry for today for this item, if we don't then we create one, * otherwise that item is incremented. * * @param object $class * @param string $eventID */ function update(&$class, $eventID) { $sql = "insert into q_msg (msg) values('tgi_productsviewed.start')"; $res = $db->Execute($sql); $product_id = (int)$_GET['products_id']; $language_id = (int)$_SESSION['languages_id']; // // see if we should ignore the product // foreach ($this->ignorearray as $item) // if ($product_id == $item) return; // get the current date $sql = "select curdate() as now"; $res = $db->Execute($sql); $now = $res->fields['now']; // first see if we have a matching product entry. $sql = "select count(*) as total from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and pd.products_id = p.products_id and p.products_id = '" . $product_id . "' and pd.language_id = '" . $languages_id . "'"; $res = $db->Execute($sql); if ( $res->fields['total'] >= 1 ) { // see if a table entry exists $sql = "select count(*) as total from " . TABLE_PRODUCTS_VIEWED . " p, and p.products_id = '" . $product_id . "' and p.language_id = '" . $languages_id . "' and p.viewed_date = '" . $now . "'"; echo "hi"; $res = $db->Execute($sql); if ( $res->fields['total'] >= 1 ) { $sql = "update " . TABLE_PRODUCTS_VIEWED . " set products_viewed = products_viewed + 1 where products_id = '" . $products_id . "' and language_id = '" . $languages_id . "' and p.viewed_date = '" . $now . "'"; $res = $db->Execute($sql); } else { /* create new entry */ $sql = "insert into " . TABLE_PRODUCTS_VIEWED . " (products_viewed, products_id, language_id, viewed_date) values ( 1, '" . $products_id . "', '" . $languages_id . "', '" . $now . "')"; $res = $db->Execute($sql); } } } } ?>
9 Oct 2006, 8:31 PM
#13
wilt avatar

wilt

Oji-san

Join Date:
Jun 2003
Location:
Newcastle UK
Posts:
1,940
Plugin Contributions:
3

Re: Notifier Class - attempt

k, in terms of bugtesting to see if your notifier is working, the first place to start is your custom classes constructor

function tgi_productsviewed() {
global $zco_notifier;
$zco_notifier->attach($this, array('NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_GE NERAL_INFO'));
}

change to this

function tgi_productsviewed() {
global $zco_notifier;
die('here');
$zco_notifier->attach($this, array('NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_GE NERAL_INFO'));
}

this should show if your autoloader settings are correct. If your script does not die immediatley, then your autoloader code is incorrect.

If that works revert your code.
Next we need to check that the notifier is firing correctly on NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_GE NERAL_INFO

(Note : a small point, but the notifier string you posted has a space between _GE and NERAL, this is most likely just a forum line-length thing, but needs to be noted if copy/pasting)
then for your update class, put this in temporarily

  function update(&$class, $eventID) {
die('here');
  }

again this should produce an output when you browse to the page contining your notifier,
On your code in general, one thing that JUMPS out imediatley is this

function update(&$class, $eventID) {
$sql = "insert into q_msg (msg) values('tgi_productsviewed.start')";
$res = $db->Execute($sql);

you are calling the $db class outside of the global scope, so within your function you need to do

function update(&$class, $eventID) {
  global $db;

HTH

9 Oct 2006, 9:08 PM
#14
wilt avatar

wilt

Oji-san

Join Date:
Jun 2003
Location:
Newcastle UK
Posts:
1,940
Plugin Contributions:
3

Re: Notifier Class - attempt

I'm not sure now any admin functionality for notifiers would help. For sure there are similar systems that require registration of notifiers, and hence the ability to view notifiers/descriptions. At the moment I see this as overkill and better served with some good documentation.

ZC 1.4 will hugely expand on the notifiers available, and these will be well documented in installation docs.

Similarly I can;t see the reason to have a enable/disable notifier, The code as it is has a very lightweight affect. You don;t define a notifier handler, and no extra code is run, no need to enable/disable.

ZC 1.4 in fact uses notifiers to do sql logging/error handling. I'm also working on using notifiers to do standard error handling, and to provided a unified logging/debugging interface for general code.

Any other ideas are always welcome.

10 Oct 2006, 4:58 AM
#15
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Re: Notifier Class - attempt

wilt:

function tgi_productsviewed() {
global $zco_notifier;
die('here');
$zco_notifier->attach($this, array('NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_GE NERAL_INFO'));
}

> 
> ```php
  function update(&$class, $eventID) {
die('here');
}

The first one worked and the message displayed. In the second case nothing happened. Also in my code there is no space in GE NERAL :-) so thats good. Any other ideas? So the class is being loaded.... just not being configured to fire correctly, or something in the core code is wrong... although I doubt that currently.

11 Oct 2006, 3:23 AM
#16
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Re: Notifier Class - attempt

Any idea why the observer is not doing its job? Anyone else able to make this observer work? Doesn't have to do anything other then "die(...)"

I'd like to move on with my reporting module but data would be a good start.

11 Oct 2006, 7:54 AM
#17
paulm avatar

paulm

Totally Zenned

Join Date:
Nov 2003
Posts:
1,878
Plugin Contributions:
5

Re: Notifier Class - attempt

I tried to follow the thread, and I also followed the instructions in the wiki, but I got the same problem as you quentinjs.

Trying to implement this example (on 1.3.5):

 <?php
 class myObserver extends base {
   function myObserver() {
     $this->attach('NOTIFIER_CART_ADD_CART_END');
   }
...
 }

Or this:

 class myObserver extends base {
   function myObserver() {
     global $zco_notifier;
     $zco_notifier->attach($this, array('NOTIFY_HEADER_END_CHECKOUT_CONFIRMATION'));
   }
```Does not seem to trigger the update function.
(in the session vars I see a PHP incomplete class error poping up after the NOTIFY "activation")


While this does trigger it (in my case):

$_SESSION['cart']->attach($this, array('NOTIFIER_CART_ADD_CART_END', 'NOTIFIER_CART_REMOVE_END'));

12 Oct 2006, 3:29 PM
#18
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Re: Notifier Class - attempt

I am still totally stuck on this OBS.

I see no usage of this form in zencart, and I strongly believe this "feature" is currently not working as designed. If one of the core Zen group can confirm this for me it would be great. Or tell me I did something wrong so I can move on would also be good. Who was it that built the observer/notifyer system?

My zen time is as always is limited. I do want to build a few features to contribute back to the community, but I don't want to waste those 2-3 hours a week hunting in core code.... sadly many things take precedence to that.

12 Oct 2006, 7:46 PM
#19
paulm avatar

paulm

Totally Zenned

Join Date:
Nov 2003
Posts:
1,878
Plugin Contributions:
5

Re: Notifier Class - attempt

Hi Quentin,

I just gave it another shot and it seems to work after all :-)

Please ignore my previous post. I don't know what I was thinking but, reading it back now, it appears to make not much sense.

Are you sure you want it to trigger on NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_GENERAL_INFO ? Because when I try it with NOTIFY_PRODUCT_TYPE_VARS_START_PRODUCT_INFO for example the update is executed when I vist a "normal" product page. When using NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_GENERAL_INFO it's updated when viewing Document General Type.

I am not sure if NOTIFY_PRODUCT_TYPE_VARS_START_PRODUCT_INFO really is the one you need in this case, but it does execute the update function.

17 Oct 2006, 6:44 AM
#20
quentinjs avatar

quentinjs

Zen Follower

Join Date:
Mar 2004
Location:
Calgary, Alberta
Posts:
289
Plugin Contributions:
0

Re: Notifier Class - attempt

Thanks! That was the problem! I hope the keeper of the notification tags documents them a little bit.

Once I get the report generator completed and integrated into ZenCart I'll make a couple postings. One as an example of a notification and a download for the entire "module" Now that this has been solved, the next part should be a piece of cake! (ya right) but atleast I can get progress now.

version 1 will be a report tool that is very manual to create the reports, once i have a working example, I hope someone will step up and help me to build a UI around it.

Night all.