Full-service Internet Marketing & Web Development
Recent Posts

Recommended Reads
|
TinyMCE convert_urls patchDawn Rossi, July 7 -- Filed under Programming |
TinyMCE is a popular WYSIWYG (What You See Is What You Get) online html editor.
We use TinyMCE throughout the SPI platform, for easy editing of autoresponder messages and email broadcasts.
One issue we recently experienced with TinyMCE is its internal 'convert_urls' feature, whereby TinyMCE attempts to clean up urls (href's) so that they comply to a certain format.
This feature clashed with SPI's Dynamic Fields, a feature that automatically populates data into a message, based on the recipient information.
As an example, we allow users to enter links in this format:
http://www.MyDomain.com/?aff_id={%aff_id : 1234%}
or
http://{%website : www.MyDomain.com%}
Where {% %} identifies the dynamic tag and the colon : lists the default value.
{%SomeField : DefaultValue%}
TinyMCE would strip the DefaultValue and garble the links.
We tried turning off convert_urls, relative urls, cleanup and a few other options, but nothing helped.
The patch is to completely turn-off url_convertor in the TinyMCE source code.
Open tiny_mce.src and locate this line:
:case"href":if(j.keep_values){if(&& j.url_converter)
Change it to:
:case"href":if(j.keep_values){if( 0 && j.url_converter)
Now find the section that begins with:
convertURL:function(q,x,w){var r=this,v=r.settings;
And change it to:
convertURL:function(q,x,w){return q;var r=this,v=r.settings;
-
In our case we had *.js caching turned on with the web-server. To force users to re-download the file, had to rename the folder name from /tiny_mce to /tiny_mce_patched
We use TinyMCE throughout the SPI platform, for easy editing of autoresponder messages and email broadcasts.
One issue we recently experienced with TinyMCE is its internal 'convert_urls' feature, whereby TinyMCE attempts to clean up urls (href's) so that they comply to a certain format.
This feature clashed with SPI's Dynamic Fields, a feature that automatically populates data into a message, based on the recipient information.
As an example, we allow users to enter links in this format:
http://www.MyDomain.com/?aff_id={%aff_id : 1234%}
or
http://{%website : www.MyDomain.com%}
Where {% %} identifies the dynamic tag and the colon : lists the default value.
{%SomeField : DefaultValue%}
TinyMCE would strip the DefaultValue and garble the links.
We tried turning off convert_urls, relative urls, cleanup and a few other options, but nothing helped.
The patch is to completely turn-off url_convertor in the TinyMCE source code.
Open tiny_mce.src and locate this line:
:case"href":if(j.keep_values){if(&& j.url_converter)
Change it to:
:case"href":if(j.keep_values){if( 0 && j.url_converter)
Now find the section that begins with:
convertURL:function(q,x,w){var r=this,v=r.settings;
And change it to:
convertURL:function(q,x,w){return q;var r=this,v=r.settings;
-
In our case we had *.js caching turned on with the web-server. To force users to re-download the file, had to rename the folder name from /tiny_mce to /tiny_mce_patched
|
SPI EmailDesk UpdatesDawn Rossi, July 6 -- Filed under SoftwareProjects Products |
SPI EmailDesk is a full fledged email help desk solution, featuring:
* Full look&feel customization
* Web-based or email-driven (no need to login to reply to tickets)
* Auto-reply
* Canned responses
* FAQ / Knowledge base
* Escalation
* Email aliases
* Full attachments support via Amazon S3
* Smart message-content parsing
* Multi-lingual support
* API for third-party integration

This weekend we've incorporated a few changes to this service:
* Support for messages of unlimited length
* Message-body templates, and
* Better handling of unicode characters.
If you notice anything out of the ordinary, or have any questions, please contact us.
* Full look&feel customization
* Web-based or email-driven (no need to login to reply to tickets)
* Auto-reply
* Canned responses
* FAQ / Knowledge base
* Escalation
* Email aliases
* Full attachments support via Amazon S3
* Smart message-content parsing
* Multi-lingual support
* API for third-party integration

This weekend we've incorporated a few changes to this service:
* Support for messages of unlimited length
* Message-body templates, and
* Better handling of unicode characters.
If you notice anything out of the ordinary, or have any questions, please contact us.
|
Authorize.net is DownAdrian Singer, July 3 -- Filed under Get Online |
Authorize.net, the largest payment gateway in the US, lost power to their Seattle data center early this morning.
SJC data center cannot handle the load and as a result, all payments are declining
Twitter is full with users reporting Authorize.net outages:

Expected resolution time is 2 hours.
If you're using the SPI shopping cart and have defined more than a single payment gateway, the system will automatically divert charges to your secondary payment gateway.
Otherwise, if you only have Authorize.net, contact your SPI account manager and we'll instruct you how to easily resubmit all declines once Authorize.net is back online.
-
This outage is the third major outage this week and once again goes to show the importance of multihomed hosting.
SJC data center cannot handle the load and as a result, all payments are declining
Twitter is full with users reporting Authorize.net outages:

Expected resolution time is 2 hours.
If you're using the SPI shopping cart and have defined more than a single payment gateway, the system will automatically divert charges to your secondary payment gateway.
Otherwise, if you only have Authorize.net, contact your SPI account manager and we'll instruct you how to easily resubmit all declines once Authorize.net is back online.
-
This outage is the third major outage this week and once again goes to show the importance of multihomed hosting.
|
Rackspace is down... Multihomed hosting rulezAdrian Singer, June 29 -- Filed under Get Online |
Rackspace, one of the largest tier-1 hosting providers, is down today, affecting tens of thousands of websites, including some celebrity sites like Justin Timberlake and many others...

Here at SPI, we believe in multi-homed hosting.
Our client sites are hosted with Rackspace, NTT Verio, Softlayer and iWeb... all at the same time.
They're all great hosting providers, but as our friends at Pingdom frequently report, if things can go wrong they will.
Replicating our client sites across multiple data-centers with multiple non-related hosting providers, is the only way to deliver true 100% uptime across the board.
If your site needs to be up and running at all times, contact us today. We'd love to help.

Here at SPI, we believe in multi-homed hosting.
Our client sites are hosted with Rackspace, NTT Verio, Softlayer and iWeb... all at the same time.
They're all great hosting providers, but as our friends at Pingdom frequently report, if things can go wrong they will.
Replicating our client sites across multiple data-centers with multiple non-related hosting providers, is the only way to deliver true 100% uptime across the board.
If your site needs to be up and running at all times, contact us today. We'd love to help.
|
Basic Web 2.0 Website TemplateDawn Rossi, June 24 -- Filed under Basics |
10 years ago, a typical website included about 6 pages, with a home, about us, contact, privacy policy, terms & conditions and FAQ page.
While these are still Must have pages, nowadays, every decent website is expected to feature a blog / forum, photos, videos, social network links and do a better job of "telling the company's story", showing the people behind the site.
I was looking for a simple "push-button" solution to create a skeleton of such a site, but couldn't find one.
SPI does offer thousands of pre-made website templates, as well as custom website development, but I wanted a simple fully-functional template to help new clients get a quick-start with their websites.
Since I couldn't find any existing solution, I went ahead and created one, that covers it all:

* a complete website with a clean "Web 2.0" look&feel,
* Wordpress blog,
* vBulletin Forum,
* Social-network links,
* Navigation menu and
* Contact form
You can use my template to get this setup live, in 30 minutes or less.
Step 1: Register your profile on the social networks
Signup for Facebook, Youtube, Twitter, Digg, LinkedIn, TwitThis and FeedBurner.
Record your username (you'll need it later)
Step 2: Create Logo, Banner & Avatar
You're going to need a unique logo design and nice banner for your new website. Use these image specs and file names -
Top logo logo.png Dimensions: 240x88
Footer logo logo-footer.png Dimensions: 170x66
Post avatar post-avatar.png Dimensions: 24x51
Menu avatar menu-avatar.png Dimensions: 19x23
Top banner top-banner.png Dimensions: 728x90
Step 3: Install Website template
Download the web 2.0 website template
Extract it to your main website folder
The template includes easy to modify top.php, bottom.php and sidebar.php files, that control the header, menu system, footer and sidebar links. These three files are included on all pages.
Note: You can get the latest version of WordPress here. To keep this process streamlined, I've included WordPress as part of the zip file.
Step 4: Install Wordpress
WordPress is located under the /blog folder
Open the /blog/wp-config.php file and update it with your database settings (You'll have to change DB_NAME, DB_USER, DB_PASSWORD, DB_HOST)
If you installed the latest version of WordPress (as opposed to use the version included in the zip file), you'll have to make these additional changes:
(a) Install WordPress by pointing your browser to http://www.YOURDOMAIN.com/blog/wp-admin/install.php and follow the on screen instructions
(b) Update blog/wp-content/themes/default/header.php to:
require_once($_SERVER['DOCUMENT_ROOT']."/top.php");
(c) Update blog/wp-content/themes/default/footer.php to:
require_once($_SERVER['DOCUMENT_ROOT']."/sidebar.php");
require_once($_SERVER['DOCUMENT_ROOT']."/bottom.php");
(d) Update blog/wp-content/themes/default/sidebar.php to:
return;
(e) Update blog/wp-content/themes/default/index.php to:
<?php
get_header(); ?>
<div id="content" class="narrowcolumn" role="main">
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div <?php post_class() ?> id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php
the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
<small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
<div class="entry">
<?php the_content('Read the rest of this entry »'); ?>
</div>
<p class="postmetadata">
<ul class="foot">
<li class="alpha"><?php edit_post_link('Edit', '', ' | '); ?> <?php
comments_popup_link('No Comments »',
'1 Comment. Join the discussion »', '% Comments »'); ?> </li>
<li class="beta">
<ul class="liaison">
<li class="rss"><a href="<?=$RSSURL?>">RSS</a></li>
<li class="twitter"><script type="text/javascript" src="/js/twitthis.js"></script>
<script type="text/javascript">document.write('<a href="javascript:;" onclick="TwitThis.pop();">TwitThis</a>');</script></li>
<li class="email"><a href="/contact">Email</a></li>
</ul>
</li>
</ul>
</p>
</div>
<?php endwhile; ?>
<div class="navigation">
<div class="alignleft"><?php next_posts_link('« Older Entries') ?></div>
<div class="alignright"><?php previous_posts_link('Newer Entries »') ?></div>
</div>
<?php else : ?>
<h2 class="center">Not Found</h2>
<p class="center">Sorry, but you are looking for something that isn't here.</p>
<?php get_search_form(); ?>
<?php endif; ?>
</div>
<?php get_footer(); ?>
Step 5: Install vBulletin
Purchase a license to vBulletin ($180) and download it from http://members.vbulletin.com
Extract vbulletin to a /forum folder on your server, then follow these steps:
(a) Rename includes/config.php.new to includes/config.php and update 'dbname', 'servername', 'username', 'password' with your database details.
(b) Open www.YOURDOMAIN.com/forum/install/install.php in your browser and follow the on-screen instructions (you'll need your vBulletin customer number to continue)
(c) Update the fetch_gzipped_text() function under forum/includes/functions.php to:
function fetch_gzipped_text($text, $level = 1)
{
return $text;
}
(d) Open forum/global.php and locate this section in the file:
eval('$headinclude = "' . fetch_template('headinclude') . '";');
eval('$header = "' . fetch_template('header') . '";');
eval('$footer = "' . fetch_template('footer') . '";');
Replace these 3 lines with this section:
@ob_start();
require("../top.php");
$buf = @ob_get_contents();
@ob_end_clean();
eval('$header = "$buf";');
$header .= "<div><div><div>";
@ob_start();
require("../sidebar.php");
$buf = @ob_get_contents();
@ob_end_clean();
@ob_start();
require("../bottom.php");
$buf .= @ob_get_contents();
@ob_end_clean();
eval('$footer = "$buf";');
$footer = "</div></div></div>".$footer;
eval('$headinclude = "";');
Step 6: Update images
Update the images in the /images folder with the ones you created in step 2
Step 7: Update company name, links
Update config.php with your company name, tagline, keywords and social network usernames.
It's important to set all the usernames as these will get populated on all of your pages. If you don't want to use a specific network, make sure you update bottom.php and top.php
-
In the future, I will update this template to include a built-in image gallery, the SPI FAQ service, the SPI Helpdesk service, Customer back-office and a video links manager.
View 1 Comment(s)
While these are still Must have pages, nowadays, every decent website is expected to feature a blog / forum, photos, videos, social network links and do a better job of "telling the company's story", showing the people behind the site.
I was looking for a simple "push-button" solution to create a skeleton of such a site, but couldn't find one.
SPI does offer thousands of pre-made website templates, as well as custom website development, but I wanted a simple fully-functional template to help new clients get a quick-start with their websites.
Since I couldn't find any existing solution, I went ahead and created one, that covers it all:

* a complete website with a clean "Web 2.0" look&feel,
* Wordpress blog,
* vBulletin Forum,
* Social-network links,
* Navigation menu and
* Contact form
You can use my template to get this setup live, in 30 minutes or less.
Step 1: Register your profile on the social networks
Signup for Facebook, Youtube, Twitter, Digg, LinkedIn, TwitThis and FeedBurner.
Record your username (you'll need it later)
Step 2: Create Logo, Banner & Avatar
You're going to need a unique logo design and nice banner for your new website. Use these image specs and file names -
Top logo logo.png Dimensions: 240x88
Footer logo logo-footer.png Dimensions: 170x66
Post avatar post-avatar.png Dimensions: 24x51
Menu avatar menu-avatar.png Dimensions: 19x23
Top banner top-banner.png Dimensions: 728x90
Step 3: Install Website template
Download the web 2.0 website template
Extract it to your main website folder
The template includes easy to modify top.php, bottom.php and sidebar.php files, that control the header, menu system, footer and sidebar links. These three files are included on all pages.
Note: You can get the latest version of WordPress here. To keep this process streamlined, I've included WordPress as part of the zip file.
Step 4: Install Wordpress
WordPress is located under the /blog folder
Open the /blog/wp-config.php file and update it with your database settings (You'll have to change DB_NAME, DB_USER, DB_PASSWORD, DB_HOST)
If you installed the latest version of WordPress (as opposed to use the version included in the zip file), you'll have to make these additional changes:
(a) Install WordPress by pointing your browser to http://www.YOURDOMAIN.com/blog/wp-admin/install.php and follow the on screen instructions
(b) Update blog/wp-content/themes/default/header.php to:
require_once($_SERVER['DOCUMENT_ROOT']."/top.php");
(c) Update blog/wp-content/themes/default/footer.php to:
require_once($_SERVER['DOCUMENT_ROOT']."/sidebar.php");
require_once($_SERVER['DOCUMENT_ROOT']."/bottom.php");
(d) Update blog/wp-content/themes/default/sidebar.php to:
return;
(e) Update blog/wp-content/themes/default/index.php to:
<?php
get_header(); ?>
<div id="content" class="narrowcolumn" role="main">
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div <?php post_class() ?> id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php
the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
<small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
<div class="entry">
<?php the_content('Read the rest of this entry »'); ?>
</div>
<p class="postmetadata">
<ul class="foot">
<li class="alpha"><?php edit_post_link('Edit', '', ' | '); ?> <?php
comments_popup_link('No Comments »',
'1 Comment. Join the discussion »', '% Comments »'); ?> </li>
<li class="beta">
<ul class="liaison">
<li class="rss"><a href="<?=$RSSURL?>">RSS</a></li>
<li class="twitter"><script type="text/javascript" src="/js/twitthis.js"></script>
<script type="text/javascript">document.write('<a href="javascript:;" onclick="TwitThis.pop();">TwitThis</a>');</script></li>
<li class="email"><a href="/contact">Email</a></li>
</ul>
</li>
</ul>
</p>
</div>
<?php endwhile; ?>
<div class="navigation">
<div class="alignleft"><?php next_posts_link('« Older Entries') ?></div>
<div class="alignright"><?php previous_posts_link('Newer Entries »') ?></div>
</div>
<?php else : ?>
<h2 class="center">Not Found</h2>
<p class="center">Sorry, but you are looking for something that isn't here.</p>
<?php get_search_form(); ?>
<?php endif; ?>
</div>
<?php get_footer(); ?>
Step 5: Install vBulletin
Purchase a license to vBulletin ($180) and download it from http://members.vbulletin.com
Extract vbulletin to a /forum folder on your server, then follow these steps:
(a) Rename includes/config.php.new to includes/config.php and update 'dbname', 'servername', 'username', 'password' with your database details.
(b) Open www.YOURDOMAIN.com/forum/install/install.php in your browser and follow the on-screen instructions (you'll need your vBulletin customer number to continue)
(c) Update the fetch_gzipped_text() function under forum/includes/functions.php to:
function fetch_gzipped_text($text, $level = 1)
{
return $text;
}
(d) Open forum/global.php and locate this section in the file:
eval('$headinclude = "' . fetch_template('headinclude') . '";');
eval('$header = "' . fetch_template('header') . '";');
eval('$footer = "' . fetch_template('footer') . '";');
Replace these 3 lines with this section:
@ob_start();
require("../top.php");
$buf = @ob_get_contents();
@ob_end_clean();
eval('$header = "$buf";');
$header .= "<div><div><div>";
@ob_start();
require("../sidebar.php");
$buf = @ob_get_contents();
@ob_end_clean();
@ob_start();
require("../bottom.php");
$buf .= @ob_get_contents();
@ob_end_clean();
eval('$footer = "$buf";');
$footer = "</div></div></div>".$footer;
eval('$headinclude = "";');
Step 6: Update images
Update the images in the /images folder with the ones you created in step 2
Step 7: Update company name, links
Update config.php with your company name, tagline, keywords and social network usernames.
It's important to set all the usernames as these will get populated on all of your pages. If you don't want to use a specific network, make sure you update bottom.php and top.php
-
In the future, I will update this template to include a built-in image gallery, the SPI FAQ service, the SPI Helpdesk service, Customer back-office and a video links manager.
View 1 Comment(s)
|
How to Add a New Order under a CustomerAdrian Singer, June 23 -- Filed under SoftwareProjects Products |
In a previous post, I explained How to Edit Order details, updating the shipping-address, price, credit-card or product for an existing order.
Today, I'd like to cover How to Add a new Order under an existing customer
This is helpful when you're looking to -
* Process orders offline
OR
* Credit a customer with a "Free order"
-
Step 1: Access Customer Manager
Login to your SPI account account and click on the Customer Manager. Search for the customer, for whom you'd like to add the new order.
If the customer doesn't exist yet, use "Add Customer" to add a new customer record.
Step 2: Click on New Order
Scroll down and click on the 'New Order' button.

Step 3: Edit Order Details
Select the product, store and shipping information (if applicable)

Turn-on the 'Free Order' checkbox to designate this order as a free one, for which the customer will never be charged.
Note: Orders added using this interface do NOT credit affiliates any commissions.
Step 4: (Optional) Charge customer
If you'd like to immediately charge the customer for this new order, complete adding the new order, then click on the order ID to enter the 'Edit Order details' screen.
Follow steps 4 and 5 here, to process the charge.

Note: If the new order caused the customer to have an outstanding balance and you don't process the charge yourself, the charge will be processed daily when the recurring-payments script runs.
Today, I'd like to cover How to Add a new Order under an existing customer
This is helpful when you're looking to -
* Process orders offline
OR
* Credit a customer with a "Free order"
-
Step 1: Access Customer Manager
Login to your SPI account account and click on the Customer Manager. Search for the customer, for whom you'd like to add the new order.
If the customer doesn't exist yet, use "Add Customer" to add a new customer record.
Step 2: Click on New Order
Scroll down and click on the 'New Order' button.

Step 3: Edit Order Details
Select the product, store and shipping information (if applicable)

Turn-on the 'Free Order' checkbox to designate this order as a free one, for which the customer will never be charged.
Note: Orders added using this interface do NOT credit affiliates any commissions.
Step 4: (Optional) Charge customer
If you'd like to immediately charge the customer for this new order, complete adding the new order, then click on the order ID to enter the 'Edit Order details' screen.
Follow steps 4 and 5 here, to process the charge.

Note: If the new order caused the customer to have an outstanding balance and you don't process the charge yourself, the charge will be processed daily when the recurring-payments script runs.
| « Previous Posts | » Next Posts |
