Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

Updated: User Tracking with Admin 1.0


Druide

Recommended Posts

Complete version of this WONDERFULL modification with an integrated ADMIN area to set:

 

- User Tracking on/off

- User Tracking (exclude this IP-Address)

- User Tracking (Session # Limit per 24 hour)

 

the above was before hardcoded in the files (not very functional but a good start)

 

This is my second modification of an existing modification.

 

I hope you like it

 

[email protected]

A life shop / bussiness !!!

Robert

 

We all need to learn it once, how hard it may seem when you look at it, also you will master it someday ;)

Link to comment
Share on other sites

Very nice and great work.

 

Had to combine and compare old and new readme files.

 

For the boxes i moved it from Tools to Customers by putting this in admin/includes/boxes/customers.php

 

'<a href="' . tep_href_link(FILENAME_USER_TRACKING, '', 'NONSSL') . '" class="menuBoxContentLink">' . BOX_CUSTOMERS_USER_TRACKING . '</a><br>' .

 

One problem with the footer insert code in the new readme:

 

== start =========================== 

Add to catalog/includes/footer.php (at the bottom):



 require(DIR_WS_FUNCTIONS . 'user_tracking.php');

if ( CONFIG_USER_TRACKING == 'true') { tep_update_user_tracking(); }

== end ===========================

 

I keep gettin errors with this so im using the old style:

 

<?php

 require(DIR_WS_FUNCTIONS . 'user_tracking.php');

 tep_update_user_tracking();                        

?>

 

Theres also a "," comma missin from the sql:

 

  last_page_url varchar(64) NOT NULL default ''

should be:

  last_page_url varchar(64) NOT NULL default '',

 

Complete look not including the new inserts:

CREATE TABLE user_tracking (

 customer_id int(11) default NULL,

 click_id int(11) default NULL,

 full_name varchar(64) NOT NULL default '',

 session_id varchar(128) NOT NULL default '',

 ip_address varchar(15) NOT NULL default '',

 time_entry varchar(14) NOT NULL default '',

 time_last_click varchar(14) NOT NULL default '',

 last_page_url varchar(64) NOT NULL default '',

 page_desc varchar(64) NOT NULL default ''

) TYPE=MyISAM;

 

I beleive this will end the mysql errors.

Link to comment
Share on other sites

I believe that is why they created BUGS....lol

 

As always together we are STRONG !

 

I have made too many modifications to remember what i did exactly.

 

To all newbee's:

be smart and keep records of ALL your modifications !!!

 

BACKUP BACKUP BACKUP

Robert

 

We all need to learn it once, how hard it may seem when you look at it, also you will master it someday ;)

Link to comment
Share on other sites

Updated the footer:

 

<?php 

 require(DIR_WS_FUNCTIONS . 'user_tracking.php'); 

 tep_update_user_tracking();                        

?>

 

To:

<?php

 require(DIR_WS_FUNCTIONS . 'user_tracking.php');

 if ( CONFIG_USER_TRACKING == 'true') { tep_update_user_tracking(); }                        

?>

Link to comment
Share on other sites

this contrib is a good idea, bur for sure very buggy ;)

 

now it runs, but only 1 thing i cant?t understand: in the admin there is in the user tracking box a link to FILENAME_VISITORS. can?t find any visitors-file?!

WAR is not the answer!

Link to comment
Share on other sites

Love this contrib.

 

Any reason why I would get this

1064 - You have an error in your SQL syntax near '' . TABLE_USER_TRACKING . ' WHERE session_id = 'e303714b1b5e14afde6676f7d248996a' at line 1



DELETE FROM ' . TABLE_USER_TRACKING . ' WHERE session_id = 'e303714b1b5e14afde6676f7d248996a'



[TEP STOP]

When trying to delete a session?

Link to comment
Share on other sites

the problem is that in the admin a get the next error:

1146 - Table 'catalog.user_tracking' doesn't exist

 

select customer_id, full_name, ip_address, time_entry, time_last_click, last_page_url, page_desc, session_id from user_tracking where time_entry > 1047044551 and time_entry < 1047130951 order by time_last_click desc

 

(i did what was on the new readme, then changed 2 the old and enter the things from this site)

thanx yaniv

Link to comment
Share on other sites

check in your database if you have the user_tracking table :)

 

if not then import this:

 

CREATE TABLE user_tracking (

 customer_id int(11) default NULL,

 click_id int(11) default NULL,

 full_name varchar(64) NOT NULL default '',

 session_id varchar(128) NOT NULL default '',

 ip_address varchar(15) NOT NULL default '',

 time_entry varchar(14) NOT NULL default '',

 time_last_click varchar(14) NOT NULL default '',

 last_page_url varchar(64) NOT NULL default '',

 page_desc varchar(64) NOT NULL default ''

) TYPE=MyISAM;

Robert

 

We all need to learn it once, how hard it may seem when you look at it, also you will master it someday ;)

Link to comment
Share on other sites

updated to version 1.1

 

http://www.oscommerce.com/community/contributions,1055

 

 

There seem to be some BUGS, sorry for that... :(

 

updated the files.

 

thanks to Illicious & Morbantokk & davidturetsky for bug tracking :)

Robert

 

We all need to learn it once, how hard it may seem when you look at it, also you will master it someday ;)

Link to comment
Share on other sites

and another patch, sorry for all this trouble

 

it's not that easy to take out code from extremely modded files...lol

 

NOW everything works 100% :)

Robert

 

We all need to learn it once, how hard it may seem when you look at it, also you will master it someday ;)

Link to comment
Share on other sites

I am getting the same thing - instead of the page header tag (and I am using Linda's header tag cont.), it shows for the product pages:

 

21:51:44: ?HEADING_TITLE? /thestore/product_info.php?products_id=3

43&osCsid=01d05167bdbde0

 

 

and instead of the catagory name (which is also in the page title) from the default.php page I get:

 

21:50:32: ?Welcome? /thestore/default.php?cPath=1_4

 

other pages seem to show up fine:

 

21:35:42: ?Welcome, Please Sign In? //thestore/login.php

20:46:20: ?Get Them While They're Hot!? /thestore/specials.php

21:34:31: ?Read What Others Are Saying? /thestore/reviews.php

Link to comment
Share on other sites

I am getting the same thing - instead of the page header tag (and I am using Linda's header tag cont.), it shows for the product pages:

 

21:51:44: ?HEADING_TITLE? /thestore/product_info.php?products_id=3

43&osCsid=01d05167bdbde0

 

 

and instead of the catagory name (which is also in the page title) from the default.php page I get:

 

21:50:32: ?Welcome? /thestore/default.php?cPath=1_4

 

other pages seem to show up fine:

 

21:35:42: ?Welcome, Please Sign In? //thestore/login.php

20:46:20: ?Get Them While They're Hot!? /thestore/specials.php

21:34:31: ?Read What Others Are Saying? /thestore/reviews.php

Link to comment
Share on other sites

well, i see what the problem is, now its how and where to change it - in the user_tracking file it is using page_desc

 

what we want to do is set page_desc=product_description.PRODUCTS_HEAD_TITLE_TAG

Link to comment
Share on other sites

when I try to purge all records for last 72 hours I get the following error:

 

1064 - You have an error in your SQL syntax near '' . TABLE_USER_TRACKING . ' where time_last_click < 1047015983' at line 1

delete from ' . TABLE_USER_TRACKING . ' where time_last_click < 1047015983

Link to comment
Share on other sites

okay for those with problems

 

here is my admin/user_tracking.php version 1.21

 

<?php

/*

 $Id$



 osCommerce, Open Source E-Commerce Solutions

 http://www.oscommerce.com



 Copyright (c) 2002 osCommerce



 Released under the GNU General Public License



 Modified by Andrew Edmond

 Sept 14th, 2002

*/



 require('includes/application_top.php');



 require(DIR_WS_CLASSES . 'currencies.php');

 $currencies = new currencies();



 $LIMIT_DISPLAY_SESSIONS = CONFIG_USER_TRACKING_SESSION_LIMIT;   // SET to 999999 for unlimited per 24 hour period



?>

<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">

<html <?php echo HTML_PARAMS; ?>>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">

<title><?php echo TITLE; ?></title>

<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">

</head>

<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">

<!-- header //-->

<?php require(DIR_WS_INCLUDES . 'header.php'); ?>

<!-- header_eof //-->



<!-- body //-->

<table border="0" width="100%" cellspacing="2" cellpadding="2">

 <tr>

   <td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">

<!-- left_navigation //-->

<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>

<!-- left_navigation_eof //-->

   </table></td>

<!-- body_text //-->

   <td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="2">

     <tr>

       <td><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 class="smallText">



<?php

 if ($purge == '72')

 {

   tep_db_query("delete from user_tracking where time_last_click < "  . (time() - ($purge * 3600)));

   echo "<font color=red>" . TEXT_HAS_BEEN_PURGED . "</font><p>";

 }



 if ($delip == '1')

 {

   tep_db_query("DELETE FROM " . TABLE_USER_TRACKING . " WHERE ip_address = '" . CONFIG_USER_TRACKING_EXCLUDED . "'");

   echo "<font color=red>" . CONFIG_USER_TRACKING_EXCLUDED . " has been deleted. </font><p>";

   $delip='0';

 }

 if ($delsession)

 {

   tep_db_query("DELETE FROM " . TABLE_USER_TRACKING . " WHERE session_id = '" . $delsession . "'");

   echo "<font color=red>" . $delsession . " has been deleted. </font><p>";

  }



 echo EXPLAINATION, "<p>";



 // some time routines

 $time_frame = time();

 if ($HTTP_GET_VARS['time'])

 { 

   $time_frame = $HTTP_GET_VARS['time'];

 }



 echo '<b>' . TEXT_SELECT_VIEW .': </b>';

 echo '<a href="' . FILENAME_USER_TRACKING . '?time=';

 echo $time_frame - 86400 . '">' . TEXT_BACK_TO . ' ' . date("M d, Y", $time_frame - 86400) . '</a> ';



 echo "<p>" . TEXT_DISPLAY_START . $LIMIT_DISPLAY_SESSIONS . TEXT_DISPLAY_END;

 echo TEXT_PURGE_START . ' <a href="user_tracking.php?purge=72">'. TEXT_PURGE_RECORDS. '</a> ' . TEXT_PURGE_END. '</font><p>';



 echo 'Delete all info from IP-Address ' . CONFIG_USER_TRACKING_EXCLUDED . ' <a href="user_tracking.php?delip=1">'. TEXT_PURGE_RECORDS. '</a> </font><p>';

 

 if (time() > $time_frame + 86400)

 {

   echo '| <a href="' . FILENAME_USER_TRACKING . '?time=';

   echo $time_frame + 86400 . '">' . TEXT_FORWARD_TO . date("M d, Y", $time_frame + 86400) . '</a>';

 }

 // we need to slurp all the customer tracking information out of the database



 $whos_online_query = 

     tep_db_query("select customer_id, full_name, ip_address, time_entry, time_last_click, last_page_url, page_desc," .

                  " session_id from " . TABLE_USER_TRACKING  . 

                  " where time_entry > " . ($time_frame - 86400) . 

                  " and time_entry < " . $time_frame . 

                  " order by time_last_click desc");

 $results = 0;

 while ($whos_online = tep_db_fetch_array($whos_online_query)) 

 {

    $user_tracking[$whos_online['session_id']]['session_id']=$whos_online['session_id'];

    $user_tracking[$whos_online['session_id']]['ip_address']=$whos_online['ip_address'];

    $user_tracking[$whos_online['session_id']]['customer_id']=$whos_online['customer_id'];



    if ($whos_online['full_name'] != 'Guest') 

       $user_tracking[$whos_online['session_id']]['full_name']=$whos_online['full_name'];



    $user_tracking[$whos_online['session_id']]['last_page_url'][$whos_online['time_last_click']] = $whos_online['last_page_url'];

    $user_tracking[$whos_online['session_id']]['page_desc'][$whos_online['time_last_click']] = $whos_online['page_desc']; 



    if (($user_tracking[$whos_online['session_id']]['time_entry'] > $whos_online['time_entry']) ||

        (!$user_tracking[$whos_online['session_id']]['time_entry']))

         $user_tracking[$whos_online['session_id']]['time_entry'] = $whos_online['time_entry'];

    if (($user_tracking[$whos_online['session_id']]['end_time'] < $whos_online['time_entry']) ||

        (!$user_tracking[$whos_online['session_id']]['end_time']))

         $user_tracking[$whos_online['session_id']]['end_time'] = $whos_online['time_entry'];

    $results ++;

 }



?>

       <table border="0" width="100%" cellspacing="0" cellpadding="0">

   <tr> 

     <td valign="top" align=center><table border="0" width="95%" cellspacing="0" cellpadding="2"> 



<?php



 // now let's display it



 $listed=0;

 if ($results)

 while (($ut = each($user_tracking)) && ($listed++ < $LIMIT_DISPLAY_SESSIONS)) 

 {

   $time_online = (time() - $ut['value']['time_entry']);

   if ( ((!$HTTP_GET_VARS['info']) || (@$HTTP_GET_VARS['info'] == $ut['value']['session_id'])) && (!$info) ) {

     $info = $ut['value']['session_id'];

   }

echo '

      <tr class="dataTableHeadingRow"> 

       <td class="dataTableHeadingContent" colspan="5">'.TABLE_HEADING_SESSION_ID .'</td> 

       <td class="dataTableHeadingContent" colspan="1 width="150">'.TEXT_USER_SHOPPING_CART.'</td> 

      </tr>';





     echo '              <tr class="dataTableRowSelected">' . "n";



     if ($ut['value']['full_name'] == "")

       $ut['value']['full_name'] = "Guest";

?>

               <td colspan = "5" class="dataTableContent" valign="top"></b><a name="<?php echo $ut['value']['session_id'];?>"><?php echo $ut['value']['full_name'] . '</b>, ' . $ut['value']['session_id'] . ", <a href="user_tracking.php?delsession=" . $ut['value']['session_id'] . ""><font color=red>[delete session]</font></a>" . ", <a href="user_tracking.php?viewsession=" . $ut['value']['session_id'] . "#" . $ut['value']['session_id'] . ""><font color=green>[view session]</font></a>";?></td>

<?php



   // shopping cart decoding

   $session_data = tep_db_query("select value from " . TABLE_SESSIONS . " WHERE sesskey = '" . $ut['value']['session_id'] . "'");

   if (tep_db_num_rows($session_data)) {

     $session_data = tep_db_fetch_array($session_data);

     $session_data = trim($session_data['value']);

   } else {

     $session_data = @file(tep_session_save_path() . '/sess_' . $ut['value']['session_id']);

     $session_data = trim($session_data[0]);

   }   

   $cart = "";

   $referer_url = "";

   $num_sessions ++;

   session_decode($session_data);

   

   $contents = array();

   if (is_object($cart)) {

     $products = $cart->get_products();

     for ($i=0; $i<sizeof($products); $i++) {

       $contents[] = array('text' => $products[$i]['quantity'] . ' x ' . $products[$i]['name']);

     } 

     if (sizeof($products) > 0) {

       $contents[] = array('text' => tep_draw_separator('pixel_black.gif', '100%', '1'));

       $contents[] = array('align' => 'right', 'text'  => TEXT_SHOPPING_CART_SUBTOTAL . ' ' . $currencies->format($cart->show_total(), true, $currency));

     } else {

       $contents[] = array('text' => ' ');

     }

   }



   $heading = array();



   if (tep_not_null($contents)) 

   {



     echo '            <td rowspan="4" valign="top">' . "n";

       

     $box = new box;



     echo $box->infoBox($heading, $contents);       

     echo '            </td>' . "n";

   }

   else 

   {

     echo '            <td rowspan="4" valign="top" class="dataTableContent" align="center">session expired' . "n";

     echo '            </td>' . "n";

  

   }



?>



             </tr>

             <tr>

       <td class="dataTableContent" align="right" valign="top"><b><?php echo TABLE_HEADING_IP_ADDRESS ?></b></td> 

       <td class="dataTableContent" valign="top"><a href="http://www.dnsstuff.com/tools/whois.ch?ip=<?php echo $ut['value']['ip_address']; ?>" target="_new"><?php echo $ut['value']['ip_address']; ?></a></td> 

       <td class="dataTableContent" colspan=2 rowspan=2 align="center"> 

<table border="0" width="100%" cellspacing="0" cellpadding="2"> 

 <tr> 

   <td class="dataTableContent" align="right" valign="top"><b><?php echo TABLE_HEADING_ENTRY_TIME; ?></b></td> 

   <td class="dataTableContent" colspan="2" valign="top"><?php echo date('H:i:s', $ut['value']['time_entry']); ?></td> 

   <td class="dataTableContent" align="right" valign="top"><b><?php echo TEXT_IDLE_TIME ?></ b></td> 

   <td class="dataTableContent" colspan="2" valign="top"><?php echo date('H:i:s', (time() - $ut['value']['end_time']+ 28800)); ?></td> 

 </tr> 

 <tr> 

   <td class="dataTableContent" align="right" valign="top"><b><?php echo TABLE_HEADING_END_TIME; ?></b></td> 

   <td class="dataTableContent" colspan="2" valign="top"><?php echo date('H:i:s', $ut['value']['end_time']); ?></td> 

   <td class="dataTableContent" align="right" valign="top"><b><?php echo TEXT_TOTAL_TIME ?></b></td> 

   <td class="dataTableContent" colspan="2" valign="top"><?php echo date('H:i:s', ($ut['value']['end_time'] - $ut['value']['time_entry'] + 28800)); ?></td> 

</table> 

       </td> 

      </tr> 

      <tr> 

       <td class="dataTableContent" align="right" valign="top"><b><?php echo TABLE_HEADING_HOST ?></b></td> 

       <td class="dataTableContent" valign="top"><?php echo gethostbyaddr($ut['value']['ip_address']); ?></td> 

      </tr> 

      <tr> 

       <td class="dataTableContent" align="right" valign="top"><b><?php echo TEXT_ORIGINATING_URL ?></b></td> 

<?php 

$ref_name = chunk_split($referer_url,40,"<br>"); 

?> 

       <td class="dataTableContent" align="left" valign="top" colspan=3><?php echo '<a href="'.$referer_url.'" target="_new">'. $referer_url .'</a>'; ?> </td> 

      </tr> 

      <tr> 

       <td class="dataTableContent"></td> 

       <td class="dataTableContent" colspan=3> 

       <table border="0" cellspacing="1" cellpadding="2" bgcolor=999999 width=100%>

<?php 

// insert here

if ($viewsession == $ut['value']['session_id']){

 while (($pu = each($ut['value']['last_page_url']))&&($du = each($ut['value']['page_desc'])))

 { 

  

?> 

         <tr bgcolor=ffffff> 

           <td class="dataTableContent" valign=top align="right"><?php echo date('H:i:s', $pu['key']); ?>:</td> 

           <td class="dataTableContent" nowrap valign=top align="left"> <a href="<?php echo $pu['value']; ?>" target="_new"><?php if ($du['value']!=''){ echo $du['value'];} ?></a> </td> 

           <td class="dataTableContent" width=100% align="left"><a href="<?php echo $pu['value']; ?>" target="_new"><?php echo chunk_split($pu['value'],40,"<br>"); ?></a></td> 

         </tr> 

<?php 

 } 

}

echo'        </table> 

     </td> 

    </tr> ';

} 

?> 

      <tr> 

       <td class="smallText" colspan="7"><?php echo sprintf(TEXT_NUMBER_OF_CUSTOMERS, tep_db_num_rows($whos_online_query)); echo " Total number of customers: " . $num_sessions . "."; ?></td> 

      </tr> 

     </table></td> 

    </tr> 

   </table> 

  </td> 

  </tr> 

 </table></td> 

<!-- body_text_eof //--> 

</tr> 

</table> 

<!-- body_eof //--> 



<!-- footer //--> 

<?php require(DIR_WS_INCLUDES . 'footer.php'); ?> 

<!-- footer_eof //--> 

<br> 

</body> 

</html> 

<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>

 

i have added:

- view session next to the delete session

this makes it possible to view each session seperate with an <a name=session> to view the result at the top of the screen

 

the difference is that not all the pages from all sessions show up on the same page (at my site a HUGE list) but just the visitor info.

 

feedback always welcome :)

Robert

 

We all need to learn it once, how hard it may seem when you look at it, also you will master it someday ;)

Link to comment
Share on other sites

thank you for the update

 

do you use Linda's Header Tag Controller? Any idea about that issue and why things show up as follows:

 

14:35:33: ?HEADING_TITLE? /thestore/product_info.php?products_id=3

52&osCsid=033f6929069a90

14:35:29: ?%s Reviews? /thestore/product_reviews.php?products_i

d=352&osCsid=033f6929069

14:35:13: ?HEADING_TITLE? /thestore/product_info.php?products_id=3

52&osCsid=033f6929069a90

14:35:01: ?Categories? /thestore/default.php?cPath=2&osCsid=033

f6929069a90c13dc6bcc6707

14:34:53: ?Welcome? /thestore/default.php?cPath=33&osCsid=03

3f6929069a90c13dc6bcc670

14:34:44: ?Welcome? /thestore/default.php?cPath=24&osCsid=03

Link to comment
Share on other sites

nope i'm not using that (yet) maybe i will install it l8r sometime

 

but if you get that then you need to define the HEADING_TITLE for those pages.

 

Look at it as a check / bugtracker....lol

Robert

 

We all need to learn it once, how hard it may seem when you look at it, also you will master it someday ;)

Link to comment
Share on other sites

part of the function of the header tags contribution is to take info from the products_description table and use it in place of a static TITLE so that each page shows up with the product_name as the TITLE text...

 

now, back to user tracking - receiving the following error:

 

Parse error: parse error in /Users/jeffchas/Sites/firewiredepot/themanager/user_tracking.php on line 55

 

this is the line of code

 

tep_db_query("delete from user_tracking where time_last_click < "? . (time() - ($purge * 3600)));

 

have checked for stray/random white spaces and stripped them all out

Link to comment
Share on other sites

Hi there,

 

I've been folowing this thread as I was installing the addon today.

Two thing I have noticed

1. If you have the meta tag manager installed but have put a description for an item you will get strange line in the user report. On the product that I have completed in the database they seem to look alright :)

 

2. I noticed that an older issue is still alive

http://www.oscommerce.com/forums/viewtopic.php...t=user+tracking

It seem that the refering URL gets wiped at the end of a session :(

Any thought on a good way to correct this. I read the thread above but I couldn't find any of the code that they were talking about.

 

Cheers,

Mike

Link to comment
Share on other sites

The HEADING_TITLE issue has to do with catalog/includes/functions/user_tracking.php. Specifically, it's supposed to grab the products_name or categories_name value if the page is product_info or index w/ a cPath appended. It's not doing that, so is defaulting to HEADING_TITLE, which isn't defined for a category page, so it's just inserting HEADING_TITLE as text.

 

I'm not sure why it's working for me and not elsewhere (I'm seeing the same problem on another site). I thought it had to do with search engine safe URLs, though turning them off doesn't seem to help.

 

Any thoughts?

 

- Greg

Link to comment
Share on other sites

now, back to user tracking - receiving the following error:

 

Parse error: parse error in /Users/jeffchas/Sites/firewiredepot/themanager/user_tracking.php on line 55

 

this is the line of code

 

tep_db_query("delete from user_tracking where time_last_click < "? . (time() - ($purge * 3600)));

 

have checked for stray/random white spaces and stripped them all out

 

weird i dont have any troubles here,

what browser, OS do you use & what does your host uses win/unix/linux ?

 

try this query instead:

tep_db_query("delete from user_tracking where time_last_click < '" . (time() - ($purge * 3600))"'");

Robert

 

We all need to learn it once, how hard it may seem when you look at it, also you will master it someday ;)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...