ShipSync v1.3 - Magento + FedEx API, now with THERMAL printing support!

ShipSync v1.2

Woohoo! This update is packed full of coolness. I won't bother listing all the new features, since they're listed quite nicely below. However, I will take a moment to rave about the addition of thermal printing support. ShipSync now supports EPL2, ZPLII, and DPL thermal printers, and a wide variety of new label and paper types! Additionally, the quality of the images are greatly improved (the PDF option prints absolutely gorgeous labels---so much nicer than the PNG option). Super big thanks to my FedEx rep for helping out with this.

FedEx must be tired of me running test orders, but I just can't get over how cool these new labels are... Anyways, these new features are just the beginning. I've received a lot of good feedback from my customers, and am currently implementing a number of requested features. Stay tuned!

02/08/2010 - ShipSync v1.3
• Added Free Shipping method
• Added options for all FedEx image types, including Thermal Printing support
- PDF
- PNG
- EPL2 (Zebra ZPL)
- ZPLII (Zebra ZPL)
- DPL (Datamax)
• Added support for all FedEx stock types
- PAPER_7X4.75
- PAPER_4X6
- PAPER_4X8
- PAPER_4X9
- PAPER_8.5X11_BOTTOM_HALF_LABEL
- PAPER_8.5X11_TOP_HALF_LABEL
- STOCK_4X6
- STOCK_4X6.75_LEADING_DOC_TAB
- STOCK_4X6.75_TRAILING_DOC_TAB
- STOCK_4X8
- STOCK_4X9_LEADING_DOC_TAB
- STOCK_4X9_TRAILING_DOC_TAB
• Added option to reprint labels (found on Shipments page)
• Fixed a few minor display bugs

01/13/2010 - ShipSync v1.2
- Added choice of LIST or ACCOUNT rates
- Fixed issues with Internet Explorer
- Fixed problems with Magento v1.2
- Fixed issues with multiple packages
- Added ability to turn off SOAP caching
- Changed label image size from 4x6 to 4.75x7 per FedEx's suggestion
- Various display tweaks

01/01/2010 - ShipSync v1.10
- First public release!

Get ShipSync! http://www.illapps.com/shipsync.html

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • NewsVine
  • Reddit
  • Slashdot
  • StumbleUpon
  • Technorati
  • TwitThis
1 Comment

ShipSync v1.2 - Magento + FedEx, getting easier by the day

ShipSync v1.2
Oh man, the FedEx API is a real beast.. I just spent the entire evening trying to get ACCOUNT rates to work in Magento.. It seemed strange that Magento didn't support them before, especially since it's such a simple flag when making the rate request, but sometimes things aren't as easy as they should be.. After adding the option to retrieve account rates, my staging site mysteriously started crashing anytime I'd try to retrieve rates. So, what the heck? This is bunk. After hours of tinkering, I finally noticed that when retrieving account rates, FedEx sends Home Delivery in a *different* format than the rest of the shipping options. What?!?! Anyways, I'm a pragmatist, so I added an exception for this format, and account rates started working. Boy, was I relieved.    So, I proudly present VERSION 1.2! Hurray for stability.

01/13/2010 - ShipSync v1.2
- Added choice of LIST or ACCOUNT rates
- Fixed issues with Internet Explorer
- Fixed problems with Magento v1.2
- Fixed issues with multiple packages
- Added ability to turn off SOAP caching
- Changed label image size from 4x6 to 4.75x7 per FedEx's suggestion
- Various display tweaks

01/01/2010 - ShipSync v1.10
- First public release!

Get ShipSync! http://www.illapps.com/shipsync.html

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • NewsVine
  • Reddit
  • Slashdot
  • StumbleUpon
  • Technorati
  • TwitThis
6 Comments

ShipSync : Simple FedEx API Integration for Magento

Hey kiddos. Remember that mess of FedEx code I posted a few months back? Well, time to throw it in the trash. I've got a new plugin, designed from the ground up to get FedEx/Magento integration right. So, if you're tired of hacking away at this crap, you can kiss your troubles goodbye with my new sweet-ass plugin. It does everything you would want Magento to do, (and you guys already know I have the chops to get it done).

So, if you want to make your boss happy, buy this plugin.

Oh yeah, one more thing. As a customer you get first priority in my email box, and I'm more than happy to help you get your FedEx integration going right..

I expect some of you are disappointed that this isn't open source, but I'll be honest: I've spent hundreds of hours over the past year figuring out the ins-and-outs of FedEx and Magento, and I just didn't have the heart to give it away.. Besides, the money for this plugin will go towards important things like music equipment, beer, and making more cool apps.

... and without further ado, the link -> http://www.illapps.com/shipsync.html

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • NewsVine
  • Reddit
  • Slashdot
  • StumbleUpon
  • Technorati
  • TwitThis
No Comments

Magento MySQL Order Export Tool v1.01

Magento

Magento's database structure is rather arcane, but the API provides a clean way of retrieving order data. So, I made this little tool to pull Magento's orders from the API and then populate these orders in a second MySQL database. The orders are exported to two tables : mage (the order data, including customer shipping and billing information), and mage_items (which includes info on the items purchased). The tables are linked by the increment_id (which is also the order #), so it makes for a very readable database. This tool was designed for reporting, but could likely be useful for other applications... If anyone has any suggestions or improvements definitely send 'em my way!

Installation

  1. Create a Magento API username and key (done within the Magento back-end)
  2. Untar to a protected directory on your webserver ("tar -xvf magesync_v1.00a.tar")
  3. Edit /etc/cfg.php and define your absolute path, database host, database name, database username, database password, Magento API URL, Magento API username, and Magento API key
  4. Setup a CRON job and set to run as desired (ex, "cd /path/to/magesync; php -q cron.php")
  5. Watch and be amazed as Magento's database is demystified!
Download MageSYNC v1.01

 

Update Log

01/06/2010 - Removed removeMagicQuotes and unregisterGlobals functions since they appeared to be causing problems on some systems (and were also superfluous)

 

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • NewsVine
  • Reddit
  • Slashdot
  • StumbleUpon
  • Technorati
  • TwitThis
2 Comments

Magento <=> FedEx API (WSDL v6)

For some time now FedEx has been phasing out their legacy DC API, and encouraging developers to migrate to the new Web Services API. I had already starting dabbling in the new API to help automate shipping, but the fire was put under my tail yesterday when I received this Magento error report ->

Warning: Simplexml_load_string() function.simplexml-load-string] Entity: line 1 parser error string not closed expecting “ or “ in /app/code/core/Mage/Usa/Model/Shipping/Carrier/Fedex.php on line 432

Uh oh. It looks like a truncated or corrupted xml response. So I did a bit of googling, and discovered that others are currently having the same issues with FedEx. But, as much as I'd like to point the finger at the big guy, it turns out that Magento is using FedEx's legacy API, and this service will likely be decommissioned in the near future. So, it's not surprising that we're having trouble with this old crap. FedEx now offers a new web services API, and it is much much cooler. Thus, the solution here is to update Magento to support the new FedEx web services. Additionally, Magento needs failover shipping support! Here's the scoop ->

Disclaimers

This solution is just a hack, but you may find it useful, or as a starting point for a more elegant solution. If enough people take interest I may do more with it.

Warning : Do not attempt this process on a live site. Try it on a staging site first. If you must do it on a live site, backup everything before proceeding.

Step 1 - Install Zenprint XAXJAX Integration

Install Zenprint XAXJAX Integration (Zenprint_Xajax)

I'm not really interested in another AJAX library, but it looks like this is only getting called during the shipping process, so it's not a ton of overheard. Either way, it's required for Zenprint's Shipping module, so for now we need it. Install via Magento Connect.

Note: this says 1.2 in the package manager, but seems to be working fine in 1.3.x

Step 2 - Install Zenprint API Shipping Module

Install Zenprint API Shipping module (Zenprint_Ordership)

This module adds auto shipping (with tracking numbers and PDF shipping labels). Install via Magento Connect.

Note: this one also says 1.2, but installs fine in 1.3.x

Help!

On a shared host? >>> Having permissions problems with Magento Connect? Click here

On a shared host? >>> You may need to ask your hosting provider to install needed dependencies

Step 3 - Signup for FedEx Developer Resources, and setup Zenprint

At this point you need a FedEx account, key, password, and meter. Speak to your FedEx representative or check out FedEx Developer Resources to get started.

Once you get your keys and such, fill in the data in the Magento admin backend (System->Configuration->Shipping Methods->FedEx). You must also enter your address in the shipping settings configuration (System->Configuration->Shipping Settings). Now take a moment to read the Zenprint_Ordership Documentation, and apply any relevant tweaks to your system.

Save everything, and clear your cache for good measure.

Step 4 - Update WSDL to v6

Now we get our hands dirty. First, download the shipping WSDL (ShipService_v6) and the rate WSDL (RateService_v6) from FedEx Developer Resources. Put both of these files in the following directory :

/magento/app/code/community/Zenprint/Ordership/Model/Shipping/Carrier/wsdl/

Note: When you first receive these files, the WSDL URL is set to "https://gatewaybeta.fedex.com:443/web-services." You will want to change this to the live URL ("https://gateway.fedex.com:443/web-services") once you begin using the production keys.

Step 5 - Load Fedex.php

Now load up the following file in your favorite editor :

/magento/app/code/community/Zenprint/Ordership/Model/Shipping/Carrier/Fedex.php

# You made that backup already, right???

Step 6 - Find and Replace

find↓

protected $_gatewayUrl = 'https://gateway.fedex.com/GatewayDC';

replace ↓

protected $_gatewayUrl = 'https://gateway.fedex.com/web-services';

find↓

$wsdlpath = dirname(__FILE__).'/wsdl/ShipService_v5.wsdl';

replace↓

$wsdlpath = dirname(__FILE__).'/wsdl/ShipService_v6.wsdl';

find↓

# 07/19/09 - Oops! Forgot this part--Added

$request['Version'] = array('ServiceId' => 'ship', 'Major' => 5, 'Intermediate' => 0, 'Minor' => 0);

replace↓

$request['Version'] = array('ServiceId' => 'ship', 'Major' => 6, 'Intermediate' => 0, 'Minor' => 0);

find↓

protected function _getXmlQuotes()
{
..
..
..
}

replace↓

# The following function makes the API call. The SOAP request is slow. Caching may help.

protected /************************************************************\
*
\************************************************************/
function _getXmlQuotes()
 
{
 
	$r = $this->_rawRequest;
	# Retrieve Magento data
 
	$newline = "<br>";
	# Define HTML break
 
	$path_to_wsdl = dirname(__FILE__).'/wsdl/RateService_v6.wsdl';
	# WSDL path
 
	try
 
	{
		ini_set("soap.wsdl_cache_enabled", "0");
 
		$client = new SoapClient($path_to_wsdl);
 
		# Authenticate FedEx Key, and Password
		$request['WebAuthenticationDetail'] = array(
		'UserCredential' =>
		array(
		'Key' =>
		Mage::getStoreConfig('carriers/fedex/key'),
		'Password' =>
		Mage::getStoreConfig('carriers/fedex/password')));
 
		# Fedex Account and Meter
		$request['ClientDetail'] = array(
		'AccountNumber' =>
		Mage::getStoreConfig('carriers/fedex/account'),
		'MeterNumber' =>
		Mage::getStoreConfig('carriers/fedex/meter'));
 
		$request['TransactionDetail'] = array(
		'CustomerTransactionId' =>
		' *** Rate Available Services Request v6 using PHP ***');
 
		$request['Version'] = array('ServiceId' =>
		'crs', 'Major' =>
		'6', 'Intermediate' =>
		'0', 'Minor' =>
		'0');
 
		# DropoffType, ShipTimestamp, and PackagingType
		$request['RequestedShipment']['DropoffType'] = $this->
		getUnderscoreCodeFromCode(Mage::getStoreConfig('carriers/fedex/dropoff'));
 
		$request['RequestedShipment']['ShipTimestamp'] = date('c');
 
		$request['RequestedShipment']['PackagingType'] = $this->
		getUnderscoreCodeFromCode(Mage::getStoreConfig('carriers/fedex/packaging'));
 
		if(Mage::getStoreConfig('carriers/fedex/third_party') == 1)
		{
 
			$shipping_charges_payment = array('PaymentType' =>
			'THIRD_PARTY', 'Payor' =>
			array('AccountNumber' =>
			Mage::getStoreConfig('carriers/fedex/third_party_fedex_account'), 'CountryCode' =>
			Mage::getStoreConfig('carriers/fedex/third_party_fedex_account_country')));
 
		}
 
		else
		{
 
			$shipping_charges_payment = array('PaymentType' =>
			'SENDER', 'Payor' =>
			array('AccountNumber' =>
			Mage::getStoreConfig('carriers/fedex/account'), 'CountryCode' =>
			Mage::getStoreConfig('carriers/fedex/account_country')));
 
		}
 
		# Generate shipping street
		$shipperstreetlines = array(Mage::getStoreConfig('shipping/origin/address1'));
 
		if(Mage::getStoreConfig('shipping/origin/address2') != '')
		{
 
			$shipperstreetlines[] = Mage::getStoreConfig('shipping/origin/address2');
 
		}
 
		if(Mage::getStoreConfig('shipping/origin/address3') != '')
		{
 
			$shipperstreetlines[] = Mage::getStoreConfig('shipping/origin/address3');
 
		}
 
		# Set Shipper and Recipient
		$request['RequestedShipment']['Shipper'] = array('Address' =>
		array(
		'StreetLines' =>
		$shipperstreetlines, #Origin details
		'City' =>
		Mage::getStoreConfig('shipping/origin/city'),
		'StateOrProvinceCode' =>
		Mage::getModel('directory/region')->
		load(Mage::getStoreConfig('shipping/origin/region_id'))->
		getCode(),
		'PostalCode' =>
		Mage::getStoreConfig('shipping/origin/postcode'),
		'CountryCode' =>
		Mage::getStoreConfig('shipping/origin/country_id')));
 
		$request['RequestedShipment']['Recipient'] = array('Address' =>
		array(
		'PostalCode' =>
		$r->
		getDestPostal(),
		'CountryCode' =>
		$r->
		getDestCountry()));
 
		$request['RequestedShipment']['ShippingChargesPayment'] = $shipping_charges_payment;
 
		$request['RequestedShipment']['RateRequestTypes'] = 'LIST';
 
		$request['RequestedShipment']['PackageCount'] = '1';
 
		$request['RequestedShipment']['PackageDetail'] = 'INDIVIDUAL_PACKAGES';
 
		$request['RequestedShipment']['RequestedPackages'] = array('0' =>
		array('SequenceNumber' =>
		'1',
		'InsuredValue' =>
		array(
		'Amount' =>
		$r->
		getValue(),
		'Currency' =>
		Mage::app()->
		getBaseCurrencyCode()),
		'Weight' =>
		array('Value' =>
		$r->
		getWeight(), 'Units' =>
		'LB')));
 
		$response = $client->getRates($request);
	}
 
	catch (SoapFault $fault)
	{
		return $this->_parseXmlResponse(NULL);
	}
 
	if ($response->HighestSeverity == 'FAILURE')
		{ return $this->_parseXmlResponse(NULL); }
	else { return $this->_parseXmlResponse($response); }
}
 

replace↓

# This parses the response, and sets up a failsafe flat rate if FedEx is unavailable.

protected /************************************************************\
*
\************************************************************/
function _parseXmlResponse($response)
 
{	
 
	# Retrieve Magento data
	# Check for allowed shipping methods
	$allowedMethods = explode(",", $this->
	getConfigData('allowed_methods'));
 
	foreach ($allowedMethods as $method)
 
	{
 
		$parsedAllowedMethods[] = $this->
		getUnderscoreCodeFromCode($method);
 
	}
 
	$result = Mage::getModel('shipping/rate_result');
 
	$defaults = $this->
	getDefaults();
 
	if ($response == NULL)
	{
		# Set flat rate
		$rate = Mage::getModel('shipping/rate_result_method');
 
		$rate->
		setCarrier('fedex');
 
		$rate->
		setCarrierTitle($this->
		getConfigData('title'));
 
		$rate->
		setMethod('FEDEX_GROUND');
		# Shipping method
		$rate->
		setMethodTitle('FedEx Ground (Flat)');
		# Customer view
		$rate->
		setCost(7);
		# $7.00
		$rate->
		setPrice(7);
		# $7.00
		$result->
		append($rate);
 
		return $result;
	}
 
	elseif ($response->HighestSeverity == 'ERROR')
	{
		$msg = '';
		if(is_array($response->Notifications))
		{
			foreach ($response->Notifications as $notification)
				{ $msg .= $notification->Severity.': '.$notification->Message.$newline; }
		}
		else
		{
			$msg .= $response->Notifications->Severity.': '.$response->Notifications->Message.$newline;
		}
		$error = Mage::getModel('shipping/rate_result_error');
		$error->setCarrier('fedex');
		$error->setCarrierTitle($this->getConfigData('title'));
		$error->setErrorMessage($msg);
		$result->append($error);
		return $result;
	}
 
	else
	{
		# Iterate through retrieved FedEx responses
		foreach ($response->RateReplyDetails as $rateReply)
		{
			# Now update shipping rates for allowed methods
			if (in_array($rateReply->
			ServiceType, $parsedAllowedMethods))
 
			{
				$_serviceType = str_replace('_', '', $rateReply->ServiceType);
 
				$rate = Mage::getModel('shipping/rate_result_method');
 
				$rate->
				setCarrier('fedex');
 
				$rate->
				setCarrierTitle($this->
				getConfigData('title'));
 
				$rate->
				setMethod($_serviceType);
 
				$rate->
				setMethodTitle($this->
				getCode('method', $rateReply->
				ServiceType, true));
				$rate->
				setCost(
				$rateReply->
				RatedShipmentDetails[0]->
				ShipmentRateDetail->
				TotalNetCharge->
				Amount);
 
				$rate->
				setPrice($rateReply->
				RatedShipmentDetails[0]->
				ShipmentRateDetail->
				TotalNetCharge->
				Amount);
 
				$result->
				append($rate);
 
			}
		}
		return $result;
	}
}

Step 7 - Cleanup

I had to insert a definition for 2nd day air to get the text label to show up ->

public function getCode($type, $code='', $underscore=false)
    {
..
..
..
        //Needed since XML requests have no underscore, while SOAP interface includes them (nice one Fedex)
        $codes_underscore = array(
            'method'=>array(
                'PRIORITY_OVERNIGHT'                => Mage::helper('usa')->__('Priority Overnight'),
                'STANDARD_OVERNIGHT'                => Mage::helper('usa')->__('Standard Overnight'),
                'FIRST_OVERNIGHT'                   => Mage::helper('usa')->__('First Overnight'),
                'FEDEX_2DAY'                        => Mage::helper('usa')->__('2Day'),
  		'FEDEX_2_DAY'                        => Mage::helper('usa')->__('2Day'),  # Added
                'FEDEX_EXPRESS_SAVER'                => Mage::helper('usa')->__('Express Saver'),
                'INTERNATIONAL_PRIORITY'            => Mage::helper('usa')->__('International Priority'),
                'INTERNATIONAL_ECONOMY'             => Mage::helper('usa')->__('International Economy'),
                'INTERNATIONAL_FIRST'               => Mage::helper('usa')->__('International First'),
                'FEDEX_1DAY_FREIGHT'                 => Mage::helper('usa')->__('1 Day Freight'),
                'FEDEX_2DAY_FREIGHT'                 => Mage::helper('usa')->__('2 Day Freight'),
                'FEDEX_3DAY_FREIGHT'                 => Mage::helper('usa')->__('3 Day Freight'),
                'FEDEX_GROUND'                      => Mage::helper('usa')->__('Ground'),
                'GROUND_HOME_DELIVERY'               => Mage::helper('usa')->__('Home Delivery'),
                'INTERNATIONAL_PRIORITY_FREIGHT'    => Mage::helper('usa')->__('Intl Priority Freight'),
                'INTERNATIONAL_ECONOMY_FREIGHT'     => Mage::helper('usa')->__('Intl Economy Freight'),
                'EUROPE_FIRST_INTERNATIONAL_PRIORITY' => Mage::helper('usa')->__('Europe First Priority'),
            ),
..
..
..
}

# 07/20/09 - Added better error handling and fixed a few bugs, updated code snippets above

Step 8 - Test

-> Test rate requests
-> Test auto ship functionality
-> Test PDF label printing
-> Test tracking number generation

Once you have everything working, FedEx will give you a production key and you can start shipping orders.

Conclusion

It's a hack, but it works. Enjoy!

..
..
..

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • NewsVine
  • Reddit
  • Slashdot
  • StumbleUpon
  • Technorati
  • TwitThis

Tags: , , ,

10 Comments

THE DEATH OF IE6

IE6 FAIL

 

IE6 is over 7 YEARS OLD.    It's time to die.            

Good news!  Microsoft has announced that they will now give users an automatic update notification to upgrade to IE8 (http://blogs.msdn.com/ie/archive/2009/04/10/prepare-for-automatic-update-distribution-of-ie8.aspx).     Unfortunately this is not a compulsory update, and there are many corporate users and luddites who may being locked into IE6 for some time to come.  So, this piece of shit browser will still continue to plague us.

 

Why does IE6 suck so bad?

Internet Explorer 6 is incredibly insecure.    This alone is reason enough to nix it from the world's browser repertoire.   Additionally, IE6 is not standards compliant, has severe useability issues, doesn't properly support new technologies, suffers from poor performance, and that's just the tip of the iceberg.    To further drive home my point, observe that Microsoft's very own MSN site is not IE6 compliant.

Also, let us also not forget IE6's economic impact.    Developers spend countless hours "hacking" clean, well-designed websites to display properly in IE6.      This time often accounts for as much as 20% of the total cost of development.   In terms of dollars, this translate to millions in wasted time and lost productivity.    It's time for developers and clients to take a stand against IE6.

 

How can we take a stand?

The cleanest way is to insert code that prevents (or discourages) IE6 users from visiting our sites.       The Stop IE6 Campaign has provided a Javascript app just for this purpose.     So, speak with your clients, and let them know the dangers, useability issues, and cost of IE6.     Together, we can fight this pandemic.

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • NewsVine
  • Reddit
  • Slashdot
  • StumbleUpon
  • Technorati
  • TwitThis
2 Comments

Psystar warms my soul.

Psystar

Now this is truly open computing.

http://psystar.com/

These guys are awesome.   They're fighting Apple tooth and nail to be able to distribute OSX on their pcs.     So far it looks like they're winning.   However it pans out, they've won in my book.

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • NewsVine
  • Reddit
  • Slashdot
  • StumbleUpon
  • Technorati
  • TwitThis
No Comments

AMD Hackintosh Challenge! (Day 1)

Welcome!   Today I'm going to attempt to install Mac OS on my AMD Phenom system.      I've decided to blog the process, so grab a cup of coffee, sit back, and enjoy!

System Specs

Abit AN78GS Motherboard (nForce 730a)
AMD Phenom 9500+ (Quad Core) 
3GB DDR-1066 RAM
Nvidia GeForce 8800 GTS 320MB
M-Audio Delta 1010LT Audio Interface (I'll be stoked if I can get this to work)
Western Digital 160GB SATA (Could be difficult to get working)
Seagate 250GB External USB Drive (This will be the OSx86 install disk) 

OSX will run on a number of hardware configurations, but people seem to have the best luck with Intel chipsets.   Installing on my Nvidia chipset could prove to be challenging.    Check out the OSx86 Project Wiki for compatible hardware.

 

Obtaining an OSX disc

I downloaded iDeneb v1.4 (OSX 10.5.6) from the interwebs...   You're on your own with this step.     To best follow along with my post, it would be wise to obtain this same release.   

 

Burning the ISO

Use your favorite app to burn the ISO to a DVD.    I used PowerISO, but any app should work.     If you don't know how to burn an ISO you probably should stop now and go buy a real Mac.

 

Installing

Seagate 250 GB External USB

Now the fun begins!    I have opted to install to my Seagate 250GB USB drive since I am doubtful that the installer will detect my SATA drive.

 

1. First, place the DVD in your drive tray and boot the OSX installer.      The booting process will vary depending on your machine.   You may need to enter BIOS to rearrange your boot order, or hit a hotkey to instruct the system to boot from DVD (see screenshot).

Boot

 

2. Next you will see the Darwin bootloader.      I suggest hitting "F8" at the prompt and selecting "-v" from the boot options.     This enables verbose messaging so you will know if there are any issues.

Darwin Bootloader

 

3. As the installer loads you will see a bunch of messages fly across the screen, and if all goes well you will be greeted by the glorious Apple loading screen!

Apple loading screen

My installation failed at first because my DVD was dirty.   I cleaned it with a t-shirt and tried again.    This time the installer loaded just fine.

 

 

4. The next few steps are simple.    Select your language, and agree to the software license.

 

5. Once you've accepted the licensing agreement you will be given the option to select your installation disk.     It is unlikely that you will have an Apple partition already, so you must enter the disk utility to prepare a drive for OSX to use.

Disk Utility

 

6. The disk utility will load and show your available drives.    As I suspected, my SATA drives are not present, but I can see both of my USB drives.    Select the drive you would like to install OSX on, and choose "Erase."     This will format the drive using Mac OS Extended (journaled) and then mount the drive for the installer.   NOTE: This will wipe your entire drive.    Please exercise caution during this step.

Select Drive

Erase

 

7.   Now close out of the disk utility, select your newly formatted drive, and click "Continue"

Destination

 

8. This next step is probably the most important.   You must select "Customize" and tweak the installation for your system.

Customize

 

9.  The iDeneb install disc provides a number of alternate kernels and drivers to accommodate a variety of hardware configurations, so feel free to experiment here.     These are the packages I installed ->

Chipset -> AppleNForceATA Test (Hopefully this will get my SATA drives working)
Kernel -> Kernel 9.5.0 Voodoo (This is the only kernel that worked with my AMD system)
Ethernet -> nForce Ethernet  (LAN)
Video -> Nvidia -> NVdarwin -> NVdarwin 320mb (for my GeForce 8800 GTS 320MB)

 

10.   Once you've selected your customizations, click next and begin the install!    Cross your fingers and hope for the best.

Installing

 

11.  Once the install is complete your system will reboot and OSX will load.       Watch the Apple intro video and pat yourself on the back.   If you've made it this far you're doing pretty damn good.   Click through the registration process and enjoy your new operating system!

OSx86 AMD

OSx86

 

Troubleshooting!

But wait, we're not done yet!    I've got a somewhat functional Hackintosh, but my SATA drives still aren't working.    I also need to track down my audio drivers.    So check back tomorrow for DAY 2 of my Hackintosh challenge!

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • NewsVine
  • Reddit
  • Slashdot
  • StumbleUpon
  • Technorati
  • TwitThis

Tags: ,

8 Comments

How to add custom fields to Magento checkout

Custom Magento checkout fields

Here's a quick easy way to add fields to the checkout process.

 

1. Visit Magento Connect and install the Customer Order Comment Extension
  • Magento Connect can be accessed from the Magneto Admin panel by going to System -> Magento Connect -> Magento Connect Manager
  • If you have difficulties with Connect, check out my other post regarding Connect permissions

 

2. Update Magento template files
  • Check out the sample file templates in  /app/code/community/Biebersdorf/CustomerOrderComment/design/ and copy these files over the corresponding files in your template.    You may also use these files as a reference, and simply modify your existing template files.
  • To update the displayed text, modify this line in each of the aformentioned templates -> <?php echo $this->helper('biebersdorfcustomerordercomment')->__('How did you hear about us?') ?>
  • If you do not already have a custom template, I suggest installing the Magento Blank Theme and modifying this instead of the default Magento template

 

3. Voila!
  • Make sure your Magento cache is turned off, and test the checkout process.   You should now see the new field on the checkout confirmation page.

 

Room for improvement?

Certainly.     You can add additional fields by following these steps ->

  • Modify /app/code/community/Biebersdorf/CustomerOrderComment/design/mysql4-install-0.0.3.php and add the desired EAV-Attributes in the "sales/order" entity.
  • Run this file and it will create the attributes and corresponding database entries
  • Add the form fields in the template files
  • Modify /app/code/community/Biebersdorf/CustomerOrderComment/Helper/Data.php to grab these new fields and save them in the database
Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • NewsVine
  • Reddit
  • Slashdot
  • StumbleUpon
  • Technorati
  • TwitThis

Tags: ,

5 Comments

CHMOD Octal Cheat Sheet

 

It's simple, really.

7 rwx read, write, execute
6 rw- read, write
5 r-x read, execute
4 r-- read
3 -wx write, execute
2 -w- write
1 --x execute
0 --- no permissions

 

Here are a few examples :

chmod 777 (rwxrwxrwx)
chmod 775 (rwxrwxr-x)
chmod 666 (rw-rw-rw-)

 

Further Reading

http://en.wikipedia.org/wiki/Octal
http://en.wikipedia.org/wiki/Chmod

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • Furl
  • NewsVine
  • Reddit
  • Slashdot
  • StumbleUpon
  • Technorati
  • TwitThis

Tags:

2 Comments