
Photo by Rain Breaw
I have lots of clients who hate thier mail service. They use webmail or whatever thier old host provides. I ALWAYS recommend google apps. I have done tons of reasearch. My clients don't have alot of money and email services are usually pretty expensive. Google apps does a great job with small organizations for free and larger non-profits or educational organizations for free.
I have been using webmail for Intrinsic Web Designs for a couple of years. Just basically having a webmail account that forwards to my personal gmail. Well, the problem is that the webmail account has a really small memory limit and it gets full. Then, my email bounces back. This is really embarassing and I lose messages and clients get frustrated that they can't get ahold of me. It's all bad.
Today I bit the bullet and switched my intrinsicwebdesigns.com email to Google Apps free edition. It's perfect because we only have 2 email addresses so it's free. For the record, you can have up to 10 free. The education and non-profit is much larger if you have a 501(c)(3).
No more full mailboxes, no more lost email, and I'm eating my own dogfood. I am using what I give my clients because I think it the best solution.
Here's the link for more info on the free version of google apps. http://www.google.com/apps/intl/en/group/index.html

I have been through a lot of hosts with Drupal. I have used GoDaddy and HotDrupal and have my own VPS on Linode. Last year I got a WebEnabled account when training with Volacci for SEO for Drupal. We had a great testing environment and the whole class had a clone of the same site so we could all play. I thought it was cool at the time, but then subsequently forgot I had a web enabled account.
Recently I have started a new project and am collaborating with two other developers and we needed a shared dev environment. Those guys are using WebEnabled, so today I got an account.. ok, i tried to get an account. I already had an account and I just logged in and bought a devx1 account.
I've been playing around with it today and so far I like it. I have two other websites that I will be collaborating with others on and that also need to be moved from my VPS to a shared host. (I have decided that systems administration scares me and stresses me out too much.) So I'm moving both of them to Web Enabled.
I will be a good test. How hard is it to migrate to WebEnabled, is it easy to share, how do you use GIT with it are all questions that will be answered.
I like that you can collaborate on sites. I like that it works with version control. I like that you can clone and deploy your sites with the click of a button. That's rad.
If you would also like to try WebEnabled, then use my referral account here: https://www.webenabled.com/user/register?r=2990032 There is a free trial for dev accounts for 30 days and 2 dev sites. It's on the pricing page under the table.
I will keep you posted on my WebEnabled adventure. So far so good.
Note: When migrating a site, you need to change your settings.php and keep in mind they don't use local host. It will be your Host port in your dashboard it will be like: 123.456.7.7.8/1234 but in your settings.php you change the slash to a colon. It's ...123.456.7.7.8:1234/databasename . This is totally not documented on webenabled. I figured it out cause I'm reeely smart.
I did a presentation on Drupal 6 Organic Groups for the L.A. Drupal group at Media Temple on Tuesday April 26th. It's really difficult to present such a huge topic in such a short time.
I talked about a project that Jassen and I have been working on called Golf Central Station which relys very heavily on Organic Groups module in Drupal. Golf Central Station allows golf teaching professionals to be listed on the site in a gmap pin map. They can have a red pin if they have a "station" which is an organic group or a green pin if they just have a free profile on the site.
When a golf pro creates a station, the website walks them through a series of forms that are designed to help them populate thier station with content automatically. Their user picture is created, they add thier swing theory, they can add thier facebook and twitter links and when they are done, they will have an auto populated web page that pulls social media information, as well as all the information they added. They can then finish filling out thier content by posting blogs, tip videos and can sell lessons online.
If you want to try out Organic Groups yourself, here are the basic modules that I would start with:
Backup and Migrate http://www.drupal.org/project/backup_migrate (in case you screw up)
Organic Groups http://www.drupal.org/project/og
Token http://www.drupal.org/project/token
Chaos Tools http://www.drupal.org/project/ctools
Panels http://www.drupal.org/project/panels
Organic Groups Panels http://www.drupal.org/project/og_panels
Views http://www.drupal.org/project/views
Admin Menu (just because it makes everything easier) http://www.drupal.org/project/admin_menu
If you have a brand spanking new drupal installation, and you don't know where to put this stuff, you put them in the directory: yoursite.com/sites/all/modules
Drupal gives you the sites/all directories, you have to create the modules directory yourself. Stick your module folders in the new modules directory you have created.

You may see a few errors when you turn on ctools and panels.
Once you do that you can enable them at: admin/build/modules
Turn on admin menu, chaos tools, custom content panes, custom rulesets, page manager, views content panes, Organic Groups, Organic Groups Access, Organic Groups actions, Organic Groups Panels, Organic Groups Views Integration, Backup and Migrate, token, token actions, mini panels, panel nodes, panels, Views and Views UI.
Save.
The first thing we need is a "group node" which is a content type that will become the group. So, let's mosey on to create a new content type here: /admin/content/types

At this time, you should only have 3 content types. Page, story and panel.
You need a new content type. Click on the "add content type" tab at the top of the content area to get started.
You should see:

Let's do:
Name- group
Type- group
Description- This is the group content type. This is the container for all group posts.
submission form settings- Title can be changed to Name of group and Body can be changed to About Your Group
Workflow settings- uncheck promote to home page
Organic Groups- This is important. Choose "group node" see below:

Comment settings: your choice, on or off. I turn them off.
Save.
Now, lets configure Orgainc Groups.
Configuration should start at /admin/og/og
It looks like this:

Organic Groups needs a content type that "is" a group node and another content type that can be posted into the group as a "group post". We are going to make a page a group post.
Click on Content Types and you will see the list of all your content types you have created.
Find "page" and click edit.
This takes you to the content type edit form for the page content type.
You want to scroll down to Organic Groups and choose Standard Group Post

Then save.
Alternately, you could create a new content type for your group posts. It's up to you. It was quicker for me not to do a new content type, but that's easy enough to do.
At this point, you now can create a group and post to the group. Yay.
To create a group you just need to Create Content > Group and fill in the form.
To post to the group you Create content> Page and fill out the form. You will have the option to post it to your group. It's that simple.
Let's go back to look at the other OG configurations at /admin/og/og
Here is Group Details

You have alot of options here as to what you want users to be able to do on your site. They are somewhat self explanitory. Obviously the system creates a groups directory that your groups can be listed on. Some of the things that you may not recognise are "audience checkboxes" and "Group Home Page View". The audience checkboxes will show up in the node add form when you create a new group post. If the checkboxes are turned off, Drupal assumes you want to post to the current group. The Group Home page view is coming from the "Views" module and the fact that there is a dropdown here tells us we can make the home page point to any view. Cool. So these choices are personal, so that's all I have to say about that.
Messaging and Notifications
I'm not even going to go into this part. If you want to use this feature, you need to install messaging and notifications modules. At this time it is iffy as to whether these modules are currently playing nicely with Organic Groups. With that said, I'm going to leave that subject alone. For our project, we had to build a custom module to handle messaging and notifications from OG. I know that this feature is currently functional on Groups.drupal.org.
OG Access is here: admin/og/og_access
This is where you have control over where your group posts are able to be posted, and group privacy. Again, these settings are personal and will depend on your project. I'm just letting you know that they are there and you should visit this configuration page and make your choices.

That's pretty much all there is to setting up OG itself.
It's been rainy here in sunny So Cal, so our Little League games have been cancelled. Normally we don't have games on Sundays. Today is an exception. We had our first make up game today and it was a beautiful day for a game. My son Isaac has taken a break from baseball for about 2 years. This year he is doing exceptionally well and his coaches have made him the teams regular catcher recently. They say he is the best catcher on the team. He says he likes to catch. That thrills me as a mom because I see him really working hard and getting lots of encouragement from his coaches.
Enter the grouchy gramma. At today's game, she yelled at my kid. Not encouragingly either. I won't say what she said, but I didn't like it, but I shut my mouth. She then proceded to walk over to the coaches and laundry list to them how they need to teach my kid to catch. Then my hackles really went up and I had to call out to her, "Hey, that's my son you are talking about." I said "I don't like you yelling at my kid" and I also defended the coaches and said that Little League is about learning to play baseball and kids trying new positions. She walked over to me and justified herself and her words as if it was ok. I repeated again that I didn't like her yelling at my kid and that I don't yell at other peoples kids and I don't expect people to yell at mine. The coach finally told her to sit down and she did.
After she sat down, 3 moms told me what a great job they thought my son was doing and told stories about how he has told them how much he likes catching and what a hard position it is to master. That was nice.
I like baseball alot. It's one of my favorite games. I don't like how some parents or "grouchy grammas" take a fun game, a learning game and turn it into a highly competitive activity. They turn it into something about them, and not a game for the kids. Parents and grandparents are really not even allowed to coach from the sidelines like this woman did. You are allowed to cheer and encourage only. That's the way it should be.
I'm glad I told her how I felt and stood up for my son. I don't think she will do that again. I hope I didn't ruin her day either. I'm not even angry.
Little League is about baseball and kids. Not about the score, not about the parents. I am so grateful to the coaches for what a great job they are doing and the time committment they have freely volunteered. Leave your expectations at home and let the kids have fun and play the game!
So, recently I have been having problems with the Drupal Twitter module mostly because twitter stopped using basic auth and started using open auth.
What I want is a circle. I want to post to my website, and have my post automatically post to twitter and then show up on my webisite again if I want to show my recent tweets somewhere. This totally worked for me before they shut off basic auth. Now it's broken.
I have spent hours trying to make twitter module work again and it's not. So I began looking for a workaround. I thought to myself that Drupal is really good at outputting RSS feeds. You get one automatically on the home page and you can easily make a custom RSS feed of any custom view. So, then I thought, what if you could populate your Twitter account with an RSS feed. That would be perfect.
Enter Twitterfeed.com
This service is free and offers not only to post to twitter from ANY rss feed, but also to post to facebook as well as other services. Your URLs are also shortened via bit.ly
This solves the problem. In Drupal all you need to do is create a view, if you have not already and add a display that is RSS. Then you can pull that view into Facebook and Twitter automatically.
I will give you an example of how this works for us. At Intrinsic Web Designs, we build websites mostly for Police Officer Associations. They want to provide useful content to the community. One of the feeds that we put on community pages is an Amber Alerts. Amber alerts come from a feed. We could use that feed and put it right into twitterfeed, but our goal is to bring people back to our sites. We use feed API module so that feeds that are brought into the site create first class nodes. Those nodes are pulled into a view. That view can have a feed of it's own. That feed can be put into twitterfeed and the link that is posted to twitter goes back to Our site, not the site the original feed comes from.
To accomplish the last goal of having our recent tweets displayed in a sidebar, you can easily create a twitter widget here: http://twitter.com/about/resources that pulls your recent tweets. You just create a new block and paste the code inside.
This solution is pretty easy and allows you to leverage twitter without even having to install any twitter modules. It makes updating your twitter and facebook statuses easy and automatic.
I'm sure there are multiple services that allow you to tweet and post to facebook from a feed. This is just the one I found today. If you have any good 3rd party services, post it to the comments and share!
So I am working on a new site. It is actually going to be for Intrinsic Web Designs. It is a total re-branding and I'm really excited about it.
I'm working on my portfolio page and I have a CCK image field with image cache for the screen shot of the featured website. Then I have the body area with the text about the project.
Originally it looked like this:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam adipiscing justo nisl, ut placerat est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris nec quam sem. Etiam molestie augue pellentesque ipsum ornare a adipiscing enim scelerisque. Proin erat elit, semper a hendrerit sit amet, interdum in purus. Aenean et sapien quis nibh mollis facilisis. Phasellus at ornare mauris. Sed dapibus, diam sed suscipit iaculis, dui libero porta nunc, vitae molestie neque quam non nisl. Integer imperdiet diam pellentesque erat sagittis consequat. Quisque a magna posuere tellus dictum blandit. Fusce eget tortor mi, vel dictum neque. Fusce imperdiet, turpis eu porttitor sodales, sapien turpis posuere urna, et blandit urna neque non felis. Etiam non eros id purus fermentum sollicitudin. Donec ut risus non velit fermentum imperdiet at in augue. Sed elementum nisi vitae erat pharetra dictum. Mauris porta congue tincidunt. Mauris ac sollicitudin ante.

photo is underneath and body text on top
In order to style this, I need the photo to load first, so I went to my content type administration and went to "manage fields" and used the drag and drop interface to put the cck image field above the body. Now the page loads like this:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam adipiscing justo nisl, ut placerat est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris nec quam sem. Etiam molestie augue pellentesque ipsum ornare a adipiscing enim scelerisque. Proin erat elit, semper a hendrerit sit amet, interdum in purus. Aenean et sapien quis nibh mollis facilisis. Phasellus at ornare mauris. Sed dapibus, diam sed suscipit iaculis, dui libero porta nunc, vitae molestie neque quam non nisl. Integer imperdiet diam pellentesque erat sagittis consequat. Quisque a magna posuere tellus dictum blandit. Fusce eget tortor mi, vel dictum neque. Fusce imperdiet, turpis eu porttitor sodales, sapien turpis posuere urna, et blandit urna neque non felis. Etiam non eros id purus fermentum sollicitudin. Donec ut risus non velit fermentum imperdiet at in augue. Sed elementum nisi vitae erat pharetra dictum. Mauris porta congue tincidunt. Mauris ac sollicitudin ante.
What I am going for is this:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam adipiscing justo nisl, ut placerat est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris nec quam sem. Etiam molestie augue pellentesque ipsum ornare a adipiscing enim scelerisque. Proin erat elit, semper a hendrerit sit amet, interdum in purus. Aenean et sapien quis nibh mollis facilisis. Phasellus at ornare mauris. Sed dapibus, diam sed suscipit iaculis, dui libero porta nunc, vitae molestie neque quam non nisl. Integer imperdiet diam pellentesque erat sagittis consequat. Quisque a magna posuere tellus dictum blandit. Fusce eget tortor mi, vel dictum neque. Fusce imperdiet, turpis eu porttitor sodales, sapien turpis posuere urna, et blandit urna neque non felis. Etiam non eros id purus fermentum sollicitudin. Donec ut risus non velit fermentum imperdiet at in augue. Sed elementum nisi vitae erat pharetra dictum. Mauris porta congue tincidunt. Mauris ac sollicitudin ante.
Photo is left and text wraps around.
So I went to my style.css file and put this in:
/*customizing imagefield for portfolio*/
.field-[field-name-here] {
float: left;
padding-top:0px;
padding-right:10px;
margin-right:10px;
margin-bottom:10px;
}
If you field is named screen_shot it becomes .field-field-screen-shot
If your field is named smart_dog it becomes .field-field-smart-dog
I made sure that the file was saved, uploaded to the server and then made sure to clear my cache.
Remember Firebug
for Firefox
is your friend.
Nicole Bluto
I just have to tell you abou this great service I have been using for quite a while. It's called Dropbox. It is a file sharing service. We all have had the experience where we have a file that is too big to send via email, or we have numerous files that we want to send to someone. Dropbox solves this problem FREE! Basically you sign up for Dropbox and you get free storage space. You can install the dropbox app on your computer iphone and ipad and drop any files into your dropbox folder. You can then share those files with others! It's super simple and free so it's a total no brainer. If you are a total ninja, you can install dropbox on your server to collect database backups and always have your backups available to you online. Pretty sweet. Anyway, sign up for dropbox. It's a very useful tool.
I just did a session at Drupalcamp LA 2010 and my presentation was on Updating Drupal without Drush. Well recently I was hacked. I can't tell you what site it was, but it wasn't pretty. At least it wasn't anything bad, just spam. Regardless, it freaked me out completely. The reason for the hack was that one of my modules was out of date. There was a security update that I hadn't applied.
Since then I am now hyper vigalant about updating my sites as you should be. It's not hard and it's well worth it. Drupal is a very secure platform to build from IF you take care of it. So, all of you "Drupaleros" (to quote Christefano) please do your updates. I will post my session here when it comes out from UC Irvine.
Seriously, It sucks to be the girl with no UNIX experience who needs to set up seemingly simple things like cron jobs. I don't understand the commands or what -0 -q -t means no matter how many times I read the handbook page on Drupal.org. I just want to know the command that works to I can plug it in to the GUI interface wherever I am, or I would even go so far as to run a command via ssh in the command line (shudder).
For the past few weeks I have been working within my first, very own VPS on Linode running Lenny on Debian 5. My friend Christefano helped me set this all up and I also installed webmin virtualmin cause I like that sort of interface. It works for me.
One of the things I have avoided until now is setting up a cron job for the site that I am working on.
Today I decided to tackle it because I need to go live with my site very soon, and my news feeds and backups rely on cron. Not to mention Drupal needs cron for "washing the windows and taking out the trash" so to speak.
So, in case you are running the same sort of set up I am and you are like me a total boob when it comes to cron, here is the command that finally worked for me:
/usr/bin/wget -O - - http://www.yoursite.com/cron.php
I almost jumped out of my skin when this worked.
I hope this helps someone out there.
NB
Update: So if you want to know where to access cron jobs, choose "webmin" and on the left will be a "system" dropdown with schedule cron jobs as a choice. From there you can create a new cron job or edit one.
So we needed to change the titles of the tabs in the product/edit form in Ubercart.
Lyle got us started with some code and David Blum finished it up for us. This will change the tab titles in one product type but not all of them:
/**
* Implementation of hook_menu_alter()
*/
function custom_module_menu_alter(&$items) {
$items['node/%node/edit/product']['title callback'] = 'custom_module_tab_callback';
$items['node/%node/edit/product']['title arguments'] = array(1, 'product');
$items['node/%node/edit/attributes']['title callback'] = 'custom_module_tab_callback';
$items['node/%node/edit/attributes']['title arguments'] = array(1, 'attributes');
$items['node/%node/edit/attributes/add']['title callback'] = 'custom_module_tab_callback';
$items['node/%node/edit/attributes/add']['title arguments'] = array(1, 'attributes');
$items['node/%node/edit/options']['title callback'] = 'custom_module_tab_callback';
$items['node/%node/edit/options']['title arguments'] = array(1, 'options');
$items['node/%node/edit/adjustments']['title callback'] = 'custom_module_tab_callback';
$items['node/%node/edit/adjustments']['title arguments'] = array(1, 'adjustments');
$items['node/%node/edit/features']['access callback'] = 'custom_module_tab_access';
$items['node/%node/edit/features']['access arguments'] = array(1);
}
/**
* Callback function to provide new tab titles
*/
function custom_module_tab_callback($node, $item) {
if ($node->type == 'lessons') {
switch ($item) {
case 'product':
return t('Lesson');
case 'attributes':
return t('Types');
case 'options':
return t('Prices');
case 'adjustments':
return t('Advanced');
}
}
else {
switch ($item) {
case 'product':
return t('Product');
case 'attributes':
return t('Attributes');
case 'options':
return t('Options');
case 'adjustments':
return t('Adjustments');
}
}
}
Thank you David Blum and Lyle! You guys ROCK!