Retail Evolved

Skip to Main Content »

Search Site
Home of the Original Facebook Like Button for Magento

You're currently on:

Facebook Updates OpenGraph Page Requirements

Tuesday, November 8, 2011 12:00:51 AM MST

You MUST update your <html> tags if you are using the XFBML button

Recently, we started to receive a number of support requests indicating that the Like button was not posting correct images and descriptions to user's walls. We started digging and discovered that Facebook quietly made a change to their documentation that will have a direct impact on you if you are using an XFBML button.

In the old version of our docs, it instructed you to change your opening <html> tag to:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->getLang() ?>" xmlns:fb="http://www.facebook.com/2008/fbml" xmlns:og="http://opengraph.org/schema/" lang="<?php echo $this->getLang() ?>"

Well, they changed it. Now you need to change it to read:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->getLang() ?>" xmlns:fb="http://www.facebook.com/2008/fbml" xmlns:og="http://ogp.me/ns#" lang="<?php echo $this->getLang() ?>"

Note the change to xmlns:og="http://ogp.me/ns#".

This change needs to be made to the following files:
  • app/design/frontend/[package]/[theme]/template/page/1column.phtml
  • app/design/frontend/[package]/[theme]/template/page/2columns-left.phtml
  • app/design/frontend/[package]/[theme]/template/page/2columns-right.phtml
  • app/design/frontend/[package]/[theme]/template/page/3columns.phtml
If you do not make this change, the button may not function as you expect it to. Once you are done making the change, you should run a few test URLs through the Facebook URL linter here: https://developers.facebook.com/tools/debug - it will tell you if there are any problems. You may get a warning about a locale, but that is an issue that will be addressed in a future update (don't worry, Facebook still grabs the locale from your web page).

   


0 Comments | Posted in Retailers Magento Developers By Alex Nielsen

Retail Needs a Simple Data Sharing Standard

Friday, May 28, 2010 8:24:21 AM MDT

Current data sharing solutions are expensive and complicated - so much so, that typically only the "big box" stores can participate. It's time to move away from complexity and embrace a simple data sharing standard for retail.

How it Could Save (and Earn!) Cash

Eliminates most manual data entry. Think about it: Much of the information you input into your system is created at the top of the supply-chain by the manufacturer. Descriptions, images, suggested pricing, UPC, manufacturer part number - just to name a few. If you buy direct, they even have your cost. A simple sharing standard would open this up to be used by distributors and retailers alike. Why should you enter data again if somebody has already done it for you?

Up-to-date information. Have you ever lost money because a supplier forgot to send you information about a cost increase? Mistakes happen, and some are more expensive than others. Maintaining pricing information in particular can be a tedious and difficult task. In my dream world of simple data sharing, my POS system will automatically get updated costs every night. When I get there in the morning, I will be presented with cost movements so that I can intelligently determine if I need to adjust my selling price. I know, it sounds like Minority Report style retail technology; but, this type of functionality would be commonplace if a standard were in place.

Your systems could talk to each other! Even the smallest operations will have multiple systems nowadays. It's not uncommon for a "mom and pop" to have a POS system, accounting software, and a website. Guess what? They *all* need some of the same data. As a standard gets adopted, software developers could build import / export functionality into everything they do. Wouldn't it be nice if inputting your data once caused it to cascade automatically to all of your systems?

Customers would love it! "What? Most customers couldn't care less about what my data looks like or how it gets there". That is, unless part of the standard enabled you to share live inventory information. Mobile, location-based services are huge right now. A customer could literally take their Christmas shopping list and find every store near them that has what they are looking for. What's more, since it is an open standard, developers could make all sorts of applications to utilize your data.

What it Should Look Like

Public property - no gatekeepers. No private organization should claim ownership of the standard. An organization could be created to administer the standard, but adopters shouldn't even have to be aware of this organization to start implementing it. Think HTML and websites. Did you have to call the W3C to start developing your website? Did you even know that they existed?

Simple. Yep, simple. Now, the term "simple" is relative. But standards like EDI and GS1 are way over the top. They try to provide rules for every possible scenario resulting in thick rulebooks and incomprehensible jargon. Here's an idea: Instead of trying to think of every possible scenario, make the standard flexible. Let participants find creative ways to solve problems and they will. Just look at how far the web has come!

Free. Access to the standard should be free (looking at you, ARTS). Adoption of the standard should not require an admission fee or annual dues. The only cost should be the cost of implementation. Again, like building a website.

Privacy and Access Controls. One difference between web sites and a retail standard is the need for privacy. Some information should not be available for public consumption (i.e. your cost). Participants must be able to determine who has access to what information.

0 Comments | Posted in Retailers Developers By Alex Nielsen

Facebook Like Button Featured by Varien

Monday, April 26, 2010 8:30:36 AM MDT

This morning, the Facebook Like Button extension was featured by Varien! You can read the post here.

If you don't read it, at least make sure to use the coupon code that they talk about. For a limited time, if you use the coupon code "MagentoConnect" at checkout, you will receive $10 off of your Facebook Like Button purchase.

0 Comments | Posted in Magento By Alex Nielsen

Facebook Like Button - What you should know

Friday, April 23, 2010 12:13:16 PM MDT

We just recently launched our latest extension: Facebook Like Button. When Facebook announced this new way of connecting with users on Wednesday, we immediately got to work on making it easy for you to add this powerful feature to your Magento catalog.

Our goal was to make it so that you can add a Like button to your catalog in less than 5 minutes. If you've got 15 minutes, you can take the time to set up a Facebook application and enable the commenting feature of the Like button - something that we highly recommend.

You can see a sample of the commenting feature here. The 5-minute install version is here.

One last note: In addition to adding a Like button to your product pages, we optimized the experience for your users by adding meta tags with the most relevant product name, image, and description and providing a central place in the Magento admin for managing your buttons.

0 Comments | Posted in Retailers Magento By Alex Nielsen

Magento Launch Checklist

Thursday, March 18, 2010 4:24:43 PM MDT

Launching a new Magento website can be a daunting task. We've been through a few of them and are publishing the Magento Pre-Launch Checklist that we provide to all of our customers, free of charge.

This 9-page document has been refined over many Magento installations and will save you hours of research and experimentation.

Please contact us if you have any questions or would like a free consultation.

0 Comments | Posted in Retailers Magento By Alex Nielsen

The New Retail Evolved

Friday, March 5, 2010 12:22:59 AM MST

We haven't posted for a while because we have been busy launching our new website. Now you'll be able to easily purchase many of our Magento extensions and services. We'll also use this as a platform for launching all of our new products.

If you have any questions, comments, or suggestions, you can always contact us.

We are going to be posting some great Magento tips and tricks over the next week so stay tuned.

0 Comments | Posted in Retailers By Alex Nielsen

Google to Allow Remote File Storage

Tuesday, January 12, 2010 11:00:00 AM MST

According to TechCrunch (see the original article here), Google will soon be allowing you to upload any file as part of Google Docs.

What does this mean for you? Here are a few ideas:

Simple File Sharing

When email attachments aren’t good enough, uploading a file to Google Docs is a perfect solution. There is apparently going to be a 250 MB file size limit, which is much higher than most restrictions on email attachments. The service will also allow you to share the files with anybody (Google and non-Google users alike).

Poor Man’s VPN

One reason to have a VPN is to enable remote file access. If you don’t have the resources or expertise to set up and manage a VPN, this service could be a very cost-effective method for accessing important files while away from the office. Am I advocating this as a true alternative to a VPN? Absolutely not,but it does make it easy to access your files from anywhere.

File Sync Between Machines

Almost every professional has more than one computer now. Between office desktops, personal laptops, netbooks for traveling and, soon enough, tablet computers, there is a clear need to be able to easily share documents between machines. Memeo Connect looks like it will be a simple solution for keeping your files synced, no matter which computer you are on.

0 Comments | Posted in Retailers By Alex Nielsen

10 Things I Wish I Knew Before Making an iPhone App, Part 2

Sunday, January 10, 2010 1:13:47 PM MST

This is the second and final post about what I wish I knew when I started iPhone development. Last time, we spent a lot of time on memory management and some basic XCode and Objective-C tips. To wrap up, we’ll be focusing on dot notation, Instruments, and App Store tips.

6) Properties and Dot Notation

The concept of properties and dot notation is pretty familiar to developers. In fact, it is so second nature in many high level languages, that some developers may be surprised there’s a term for it.

Just in case you are one of those developers, dot notation is when you access an object’s attributes like so:

string myString = myObject.attribute;

or

myObject.attribute = 'new value';

As developers, we love that. It’s much simpler than using getters and setters (though, in thruth, that’s what is happening in the background).

Objective-C supports dot notation for accessing attributes. The usage is extremely straight forward when accessing the built-in classes. The confusion comes when you need to create your own properties to be accessed via dot notation (which I highly recommend).

Before I continue, please note that the following advice has worked for me very well. I’ve seen it implemented in lots of samples, but there are other ways to accomplish the same thing.

Creating a property is a three step process:

  1. In the header file of your class, define a local variable that begins with an underscore (the underscore is just good practice)
  2. In the header file of your class, define a property – the property name should be the same as the local variable, but without the underscore (again, for good practice)
  3. In the main file of your class, synthesize the property that was defined in the header file and associate it with the local variable

Let’s step through that with an example of a simple class. I’m going to make a Person class and give it a property called name. I know, your mind has just been blown. Stay with me, it gets better.

First in the header file (let’s call it Person.h), we define our local variable:

@interface Person : NSObject {
NSString *_name;
}

Next, define the property (still in the header file):

@interface Person : NSObject {
NSString *_name;
}

@property (nonatomic, retain) NSString *name;
@end

The @property keyword is used to declare a property. (nonatomic, retain) are further instructions regarding the generated property. I encourage you to look up the meaning of nonatomic (and the other options for this portion) on your own. That said, if you are dealing with properties of complex types, you will use (nonatomic, retain) 95% of the time.

The retain keyword is extremely important and can be the cause of much angst if you don’t understand it. This keyword will cause new assignments to the property to be automatically retained (don’t worry, it also automatically releases it’s prior assigned value). More on that later.

Lastly, in the main file (let’s say Person.m), you need to synthesize the newly declared property and associate it with the local variable:

#import "Person.h"

@implementation Person

@synthesize name = _name;

@end

Now, you may be wondering why I like to have my local variable and my property named differently. That has to do with my two rules for dealing with object attributes:

  1. When dealing with the attribute from inside of the class, DO NOT use dot notation
  2. When dealing with the attribute assignments from outside of the class, DO use dot notation, but DO NOT allocate, initialize, and assign a value in the same line

Why? It all goes back to that retain keyword from earlier. See if you can figure out why this is bad:

self.name = [[NSString alloc] initWithString:@"Alex"];

Figured it out? Here’s a clue: What is the retain count of self.name after executing the above line of code? It’s 2. 1 for the alloc and another because we used dot notation on a property that was declared with the retain keyword.

It is this behavior that results in examples from Apple that look like this:

self.name = [[NSString alloc] initWithString:@"Alex"];

[self.name release];

The first time I saw that, it made no sense – that is, until I leaked a bunch of memory because I didn’t understand dot notation in Objective-C.

To keep it clear in my mind, this is how I handle attribute assignments from inside of the class:

_name = [[NSString alloc] initWithString:@"Alex"];

The retain count after that line? 1. By using the local variable, I avoid all manner of confusion (and pestilence).

When outside of the class, I prefer to do this:

NSString *newName = [[NSString alloc] initWithString:@"Alex"];

myPerson.name = newName;

Yes, it’s an extra line of code vs. Apple’s method, but it requires me to be actively aware of the memory consequences of my actions.

7) Instruments

Don’t underestimate the power of Apple’s bundled Instruments. These are invaluable in detecting leaks, managing memory, monitoring activity, and much more. I could devote a post to each instrument, but instead I’ll focus on the two that I have found to be the most useful: Leaks and Object Allocations.

Leaks is pretty straight forward, it monitors your application for memory leaks. It is a good first line of defense against poor memory management – much like a compiler is a good way to detect syntax errors. But, just like a compiler, it can’t catch all of your mistakes.

To start the Leaks Instrument, simply select Run->Start With Performance Tool->Leaks from your project in Xcode. It actually also runs Object Allocations, but I’ll get more into that in a minute.

To use Leaks, select Leaks from the Instruments panel on the left. It will auto-detect leaks every 10 seconds, or you can change the interval or force it to check manually. If there are leaks, you’ll visually see an orange spike on the timeline where it occurred and you’ll also get a full list of the leaked objects and their types.

What type of leaks does this pick up? Any time a variable goes out of scope but it has not been released, Leaks can detect that. However, it will not detect a leak if the variable and the objects retaining it are in scope. This is why I like Object Allocations.

Object Allocations has saved me on a number of occasions where I kept running out of memory but was not showing any leaks. By using Object Allocations, I could quickly identify that a certain class of object was getting allocated and staying in memory without ever getting released every time a certain button was pushed.

The “# Net” column of Object allocations is particularly useful as it tells you how many instances are currently taking up memory. You can filter down the objects being displayed by using the search box in the bottom-right of Instruments.

8 ) App Store: Cater to Offline Users

I have a confession. I’ve had apps rejected… multiple times… for multiple reasons. Sometimes the reasons don’t make much sense in my opinion. In fact, in one instance a friend and I tag-teamed on an app that got rejected because of a policy that was “going to be published with the next OS upgrade”. Thanks, Apple.

One reason that made total sense to me was that I had failed to cater to offline users. In my testing, for some reason beyond my comprehension, I had assumed that all of the users would have internet access. This was a stupid assumption, I know. Your users may not be online for any number of reasons (one being that AT&T has notoriously bad service).

How do you cater to these users? It’s pretty simple: If your app has online content, detect if the user is online (see Apple’s “Reachability” app) and let your users know that a connection is required to access that feature of your application.

9) App Store: Release Dates

If you’re a relatively small shop like me, or your clients don’t have a huge advertising budget, some of the best advertising you get is in the first few days that your application is released.

During that period, your app is front page in the primary category you list in. If you screw up your release date, you stand to lose a lot of sales / downloads.

To do this right, make sure that when you first submit your app that you set your release date way in the future (I’m talking 6 months). Don’t underestimate the time it will take to get your app through the review process – it can be a while sometimes. To maximize the time on that front page, wait for the coveted approval e-mail from Apple and then set your release date to the next day.

10) App Store: Mind Your Trademarks

The App Store is a great distribution channel. It is also extremely easy for intellectual property trolls from huge companies to troll for the slightest infringement. Before you release an app, make sure that the name is not trademarked.

In one instance, I accidentally stepped on a legitimate trademark. After a threatening letter, I quickly changed the name of the app and no harm was done.

In another instance, it wasn’t quite so clean. See, I share a last name with a very prominent media company. I used to use my last name in my business name, but was threatened with law suits by said media company that I needed to change my name. Never mind that surnames cannot be trade marked – I simply couldn’t afford to defend against the huge budget of a media giant. So, I backed down.

My point is that they found me through the App Store. Technically, I was not in the wrong, but I could not afford to defend against their claim. Again, be careful with company and app names.

 

0 Comments | Posted in Developers By Alex Nielsen

Must Read: The Go-Giver

Saturday, December 26, 2009 11:00:00 AM MST

The Go-GiverA friend and mentor let me borrow a book this week called The Go-Giver: A Little Story About a Powerful Business Idea.

I would highly recommend it to anybody, whether you are in business or not. It is an extended parable about a “go-getter” that is trying to land the biggest sales deal of his career. He is introduced by a friend to a man who teaches him the 5 Principles of Stratospheric Success.

It’s a quick read, but will leave you thinking for a long time. For me, it easily lands in my top 5 business books of all time (a list that includes Good to Great and Blue Ocean Strategy).

Tags:

0 Comments | Posted in Retailers By Alex Nielsen

MySQL GROUP_CONCAT Function

Monday, December 21, 2009 11:46:07 PM MST

I frequently jump between databases as lots of clients require data to be transferred between their old systems to their new systems. The two databases I work with most frequently are Microsoft SQL and MySQL. I like them both. In the constant battle for my devoted worship, MySQL wins today.

I’m currently working on a migration to Magento from a MySQL backed Rails site. When possible, I like to use Magento’s built-in import functionality due to its extremely complex table structure. I needed to get a comma-separated list of values representing the various images associated with a product.

The way it was in the original database was pretty straight forward – here’s a simplified version:

idproduct_idfilename
111a.jpg
211b.jpg

I needed to turn that into “1a.jpg;1b.jpg”. Now, in Microsoft SQL, you need to do some SQL acrobatics to make this happen (see this post). In MYSQL, this is cake:

SELECT product_id, GROUP_CONCAT(filename ORDER BY filename ASC SEPARATOR ';') AS 'filenames'
FROM product_images GROUP BY product_id

The results?

product_idfilenames
11a.jpg;1b.jpg

There’s nothing like a little simplicity.

0 Comments | Posted in Developers By Alex Nielsen
 

My Cart

You have no items in your shopping cart.

Newsletter

Newsletter