Khanh Hoang - Kenn
Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.
I was recently working on a Drupal 7 project which required updating an Image style on a node based on whether or a flag was set or not.
The specific context was that the nodes were biography nodes and each biography had an image attached. The requirement was to give editors the ability to allow certain bio's to display a large or small version of an uploaded image.
I considered using taxonomy, a CCK field and finally settled on using a flag. Mostly due to the fact that the Flag module places a nice Ajax link on the node for logged in users, allowing them to quickly tag and un-tag the node as needed.
What you need to achieve this is:
$flag = flag_get_flag('your_flag_name_here'); // Get the flag // If there is an image and this node has been flagged... if (!empty($node->field_photo['und'][0]['filename']) && $flag->is_flagged($node->nid)) { // Show the large image... print theme('image_style', array('style_name' => 'profile_pic_lrg', 'path' => $node->field_photo['und'][0]['uri'])); } else { // Show the small image... print theme('image_style', array('style_name' => 'profile_pic', 'path' => $node->field_photo['und'][0]['uri'])); }
flag_get_flag('your_flag_name_here');
$flag->is_flagged($node->nid)
The $flag object has a Boolean method that allows you to check if a certain Node is flagged, this is exactly what we need. IT returns TRUE if flagged,FALSE if not. If the node has a flag set, we want to display a large image, if not a small one.
theme_image_style()
works perfectly for our needs here. The function takes the Image style preset name and an array of information as arguments
When testing this I noticed that the image sizes did not change for Anonymous users. The main reason is because flags are usually user based. A user flags content and all of the API functions return status for a certain user or the current user. Because I had flagged the content as an administrator, it was not showing up for anonymous users. I eventually realized that the flag should not be associated with a user and remembered a check-box when setting up the flag that allowed it to be set as a "Global" flag; which meant that it didn't matter which user set it.