Saturday 7 February 2009

Develop mobile stylesheets - handheld.css

Designing for mobiles can be IS a pain. First of all I'd recommend developing a 'handheld.css' stylesheet using these two browsers:
  • Firefox & Web Developer Toolbar. (CSS -> display CSS by media type -> handheld)
  • Opera. (View -> Small Screen)

Force mobiles to read the handheld stylesheet

Once you have the handheld stylesheet looking how you want it. Add it to your pages using this php script. We all know browser detection is evil and bad, but mobile support for standards isn't here yet and this is the most pain free way. In my case I did something like this:


if( mobile_device_detect()==true ) {
//I am a mobile
<link rel="stylesheet" type="text/css" media="screen, handheld" href="handheld.css">
}
else {
//I am a browser
<link rel="stylesheet" type="text/css" media="screen" href="main_layout.css">
<link rel="stylesheet" type="text/css" media="handheld" href="handheld.css">
}


Test on an emulator

Installing a mobile phone emulator can be a bit of a lengthy process as well:

  1. Install ActiveSync
  2. Unzip and install V1Emulator standalone_emulator_V1.exe
  3. Install the Virtual Network Driver (part of Virtual PC)
  4. Install the Emulator Images & Device manager for Windows Mobile 6.1

The tricky part is enabling internet connectivity. Start ActiceSync and set "Allow connections to one of the following" to "DMA" in the File, Connection Settings menu of ActiveSync.

Choose an emulator to launch, e.g. Start -> SDK -> Smartphone QVGA - Coldboot. Once it's running, open Start -> SDK -> Tools -> Device Emulator Manager. Right click on the device and select 'cradle'. This will place the emulated smartphone in the virtual "cradle" so it can access the network through ActiveSync.

Test on a phone

The only sure fire way to test if everything is working properly is to use an actual smart phone.

Good luck

Refs:

http://www.alistapart.com/comments/returnofthemobilestylesheet/

http://detectmobilebrowsers.mobi/

http://www.codinghorror.com/blog/archives/000782.html


Thursday 13 November 2008

Adding a subsite in Silverstripe

Assuming you've got the subsites module installed and created your first subsite 'Template' manually, you can now go about adding subsites!

Click on the Sub-sites tab at the top of the Silverstripe CMS to add a new subsite.

You will see this panel on the left hand side. Just enter a name and subdomain and click add.

You can see I've already added two domains here which point to http://sub1.localhost and http://sub2.localhost

Each new subsite is based on a 'Template', so in this case will have the domain 'mysite.com' appended.

I first tried setting this up in my home directory but Silverstripe could not resolve addresses of the form http://sub1.localhost/~username/

Once I installed Silverstripe to the main apache Documents folder it worked no problem, i.e. Silverstripe will resolve http://whatever.localhost/

In my case, because I'm developing locally I added the following entries to my /etc/hosts file:

127.0.0.1    sub1.localhost
127.0.0.1 sub2.localhost


Happy subsiting...

Monday 10 November 2008

Install Silverstripe 'Subsites' module

The following steps worked for me when installing the Silverstripe Subsites module:

1. Create a directory in your root silverstripe installation. '~/Sites/silverstripe/subsites'

Download, and unzip the code into this directory. I deleted the 'trunk' directory to keep things tidy.

2. Ensure every folder in your silverstripe hierarchy has the user '_www' read/write access

3. There is a problem linking the Group table in the database, so for now comment it out in 'silverstripe/subsites/_config.php' so it looks like this:
<?php

/**
* The subsites module modifies the behaviour of the CMS - in the SiteTree and Group databases - to store information
* about a number of sub-sites, rather than a single site.
*/


Object::add_extension('SiteTree', 'SiteTreeSubsites');
// Hack - this ensures that the SiteTree defineMethods gets called before any of its subclasses...
new SiteTree();
Object::add_extension('ContentController', 'ControllerSubsites');
Object::add_extension('LeftAndMain', 'LeftAndMainSubsites');
Object::add_extension('LeftAndMain', 'ControllerSubsites');
//Object::add_extension('Group', 'GroupSubsites');
Object::add_extension('File', 'FileSubsites');

?>


Then visit http://localhost/silverstripe/db/build?flush=1 This will set up the initial database tables for the subsites module.


5. We need to manually modify the Group table using the following SQL. Note that 'Group' is a reserved keyword in mysql so make sure you wrap it in backquotes:

alter table `Group` add SubsiteID int(11) not null default 0;

6. We also need to manually insert the first 'Template' into the Subsite table:

insert into Subsite (ID, ClassName, Created, LastEdited, Subdomain, Title, Domain)
values ("", "Subsite_Template", NOW(), NOW(), "newsubdomain", "newtitle", "mysite.com");

7. Now you can uncomment your 'silverstripe/subsites/_config.php' file and add the following two lines so that it looks like this:

<?php

Object::add_extension('SiteTree', 'SiteTreeSubsites');
// Hack - this ensures that the SiteTree defineMethods gets called before any of its subclasses...
new SiteTree();
Object::add_extension('ContentController', 'ControllerSubsites');
Object::add_extension('LeftAndMain', 'LeftAndMainSubsites');
Object::add_extension('LeftAndMain', 'ControllerSubsites');
Object::add_extension('Group', 'GroupSubsites');
Object::add_extension('File', 'FileSubsites');

Director::addRules(100, array(
'admin/subsites/$Action/$ID/$OtherID' => 'SubsiteAdmin',
)
);
Object::addStaticVars( 'LeftAndMain', array( 'extra_menu_items' => array(
'Sub-sites' => array("intranets", "admin/subsites/", 'SubsiteAdmin')
)
)
);

?>


For good measure, visit http://localhost/silverstripe/?flush=1 to make sure any database changes have been picked up.

8. Then visit http://localhost/silverstripe/admin?flush=1 to reload your CMS.
You should now have the 'Sub-Sites' tab in the Silverstripe admin CMS along with a dropdown in the top right hand corner that allows you to select which subsite you are currently working on.

Documentation for this module is in alpha ;-) , so if anyone has any tips on refining these installation instructions please let me know.

Thursday 6 November 2008

iconv will not link when compiling PHP on OSX

When trying to compile PHP on OSX Leopard, the ./configure command completed successfully but iconv would not link....

Undefined symbols:
"_iconv_close", referenced from:
_php_iconv_string in iconv.o
_php_iconv_string in iconv.o
__php_iconv_strlen in iconv.o
__php_iconv_strpos in iconv.o
__php_iconv_mime_decode in iconv.o
__php_iconv_mime_decode in iconv.o
__php_iconv_mime_decode in iconv.o
_zif_iconv_substr in iconv.o
_zif_iconv_substr in iconv.o
_php_iconv_stream_filter_dtor in iconv.o
_zif_iconv_mime_encode in iconv.o
_zif_iconv_mime_encode in iconv.o
"_iconv_open", referenced from:
_php_iconv_string in iconv.o
__php_iconv_strlen in iconv.o
__php_iconv_strpos in iconv.o
__php_iconv_mime_decode in iconv.o
__php_iconv_mime_decode in iconv.o
_zif_iconv_substr in iconv.o
_zif_iconv_substr in iconv.o
_zif_iconv_mime_encode in iconv.o
_zif_iconv_mime_encode in iconv.o
_php_iconv_stream_filter_factory_create in iconv.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1

I believe this is a problem with the default /usr/include/iconv.h header file in Leopard.

I have a different version of iconv.h installed with Fink which puts all it's software in /sw
I added the following to the ./configure command's options, as suggested here.

--with-iconv=shared,/sw


This would not work unless 'shared' is specified. Perhaps this is because Fink compile iconv as a shared library.

Wednesday 5 November 2008

Broken Web Sharing / Apache on OSX Leopard

I recently installed Leopard on my macbook and wanted to enable Web Sharing but when I visited http://localhost, Firefox gave me the following error:
Failed to Connect
Firefox can't establish a connection to the server at io.
I tried to uncheck/check Web Sharing in System Preferences. I also tried stopping/starting Apache on the command line with no luck.

Finally I used this resource on DIYMacServer to reinstall Apache on my machine. It now works like a charm, thanks Richard!

(This all came about because I want to install SilverStripe which suggests using MAMP, but I did not want multiple versions of Apache installed on my machine.)

Wednesday 8 August 2007

Association Callbacks

Similiar to the normal callbacks that hook into the lifecycle of an Active Record object, you can also define callbacks that get trigged when you add an object to or removing an object from a association collection. Example:
class Project
has_and_belongs_to_many :developers, :after_add => :evaluate_velocity

def evaluate_velocity(developer)
...
end
end

It’s possible to stack callbacks by passing them as an array.

Possible callbacks are: before_add, after_add, before_remove and after_remove.

Should any of the before_add callbacks throw an exception, the object does not get added to the collection. Same with the before_remove callbacks, if an exception is thrown the object doesn’t get removed.

Monday 9 July 2007

ssh segmentation fault osx

Argh!! Every time I install an update on my MacBook it breaks ssh. Up until now I'd been using Pacifist to extract & reinstall the Kerberos Framework from the 10.4.8 update, as per these instructions.

I'm now having to do this on a regular basis which is very annoying and I'm getting concerned that replacing Kerberos with an older version is introducing security holes. so I've decided to install Fink and openssh instead of using Apple's ssh.