Drupal: How to theme a module - drupal

I'm trying to theme a modules output.
In particular i'm working on http://drupal.org/project/service_links
Any idea how that works?
Thanks in advance!

Generally, if you want to theme a module you have a few options.
Overwrite theme functions. You can overwrite the theme functions that the module uses/implements to change the markup, one example of such a function is theme_service_links_node_format. You change make a function in your theme's template.php called 'your_theme_name_service_links_node_format' and make your custom markup in it instead.
CSS. If you don't need to change the actual markup of a modules output, you only need to add the needed css, to theme it into your liking.
In some cases, it doesn't look like sercive links is such a case, you can also make your own templates, and make Drupal use them instead.
Another way, again it doesn't look like service is service links is such a case, is to implement preprocess functions in your template.php. This is needed if you want to alter how certain template variables are generated.

If you want to implement your own theming function services links defines 3 themables. In your theme you should imlement the following
yourtheme_service_links_build_link()
yourtheme_service_links_node_format()
yourtheme_service_links_node_format()
'service_links_build_link' => array(
'arguments' => array(
'text' => NULL,
'url' => NULL,
'title' => NULL,
'image' => NULL,
'nodelink' => NULL,
),
),
'service_links_node_format' => array(
'arguments' => array('links' => NULL),
),
'service_links_block_format' => array(
'arguments' => array('items' => NULL),
),
Have a look at http://drupalcode.org/viewvc/drupal/contributions/modules/service_links/service_links.module?view=markup line 389 and below

What's the problem? I mean, every module should use a different name for main container and so. You can use css selector in clever way to refer the template pages.
For example, the FAQ module use identificator to all part of html output, like faq-question and faq-answer in the main page.
Just inspect your resulting code and css it, if possible modify the module-related css!

If the module implements its own theme hooks you can use that. You can also use CSS.

Related

How to add attribute class in theme('pager') in drupal 7?

How to add attribute class in theme('pager') in drupal 7 ?
my code is following:
$directory_table .= theme('pager', array('quantity', $STAFF_COUNT ),array(
'element' => array(
'class' => array('pagination pull-right'))));
but it is not applying the class to the pager.
As the theme_pager function only expects 1 parameter (an array of variables), so your theme function call should look like this:
$directory_table .= theme('pager', array('quantity' => $STAFF_COUNT, 'element' => array('class' => array('pagination pull-right'))));
BUT:
It seems that theme_pager just sets a 'pager' class ignoring any variables which you may send to the function.
So, your best bet is to just override the theme_pager function. Do this by just copying it to your themes template.php file and renaming the function to MYTHEME_pager. Then you can just add the classes you need in that function, Or add the logic you need to add the classes depending on a variable sent to the function.
Remember to clear the theme cache after overriding the function.

How do i set a specific template for a specific module in drupal 6 using hook_theme

Is there any way by which i could assign a template to my custom module.I heard it may be possible.I tried out with the hook_theme function.My hook_theme looks something like this
function special_theme() {
return array(
'special' => array(
'template' => 'special',
'arguments' => array('link' => NULL),
),
);
}
I do have a special.tpl.php file in my module folder.But the tpl file is not called.Its my default template that is been shown as output.Could someone please help me in the right direction.would be very helpful.
What you define via hook_theme() is an available template, not one that is automatically used. In order to use that template you need to call theme('special', $link);.
It is also advised to avoid using simple words for theme names to avoid collisions ( try mymodule_special instead ).
Also note (though basic), that you also need to print the return value of theme(), it does not get automatically printed. So for instance,
print theme('special', $link);

Drupal 7 hook_theme() not loading template file

I'm trying to get a very simple module to load a template file using drupal's hook_theme(). It's pretty much as simple as you can possibly imagine.
function sectionheader_theme ( $existing, $type, $theme, $path ) {
return array(
'sectionheader' => array(
'variables' => array( 'foo' => NULL ),
'template' => 'sectionheader',
),
);
}
The template is named sectionheader.tpl.php. The rest of the module is working as expected. I've cleared the Drupal cache. I've inserted a die("Debug") statement in this function, and it is being executed, but my template is simply not being called, ever. The template merely has some debug text in it so I can see that it's working, but is not visible in any view of the module.
I've done everything in every example I can find, I've even copied and pasted code directly from other modules, and this template will still not load.
Note, if you have put your template file in a /theme subfolder in your module dir ( which is best practice), you'll also need to specify the file path in hook_theme
function example_theme($existing, $type, $theme, $path) {
return array(
'example_function' => array(
'variables' => array('var1' => array(), 'var2' => array(), 'var3' => array()),
'template' => 'example-template',
'path' => drupal_get_path('module', 'example').'/theme'
),
);
}
I had the same problem as yours, and I solved it by clearing the cache, I searched from the database, and in the cid column of table cache, I get something like "theme_registry:*", and I remove them, it works.
As mentioned in the comment above I hit the same problem. Everything was working fine in a development module but when I simply copied this module into a new one that would become my production module the template file no longer worked. I tried everything mentioned above withut luck. The original module was disabled and only the new one was enabled.
I even went back to see if the original module's theme could work and it didn't. hmmmm.
When I changed the name of the theme it suddenly started to work: the template file was located and displayed.
So, it appears that any module that registers a theme name ---- even if it is disabled --- still registers a theme AND it seems that theme names need to be unique throughout the system.
Answer: look for the same theme name being declared in other modules

Symfony sfWidgetFormSelect and custom rendering

I'm using a sfWidgetFormSelect widget to render a select list. More precisely i'm using the feature allowing groups, quite easy with this :
$choices = array(
'Europe' => array('France' => 'France', 'Spain' => 'Spain', 'Italy' => 'Italy'),
'America' => array('USA' => 'USA', 'Canada' => 'Canada', 'Brazil' => 'Brazil'),
);
$w = new sfWidgetFormChoice(array('choices' => $choices));
That's a good start but not enough because i need to have specific CSS classes attached to each item of the list.
How can i do that ? The doc is not really helping for this kind of advanced features.
Thanks.
Having played with these a little bit, from what I know, this level of control isn't possible via the form class. You can pass the CSS class to the main widget but it would apply to all <option> tags inside the <select>.
You might be better of just writing this dropdown yourself in HTML and making sure it corresponds to this widget in terms of how it's named. This way you can use your own HTML but still use the widget in validation. Another option might be to handle the advanced styling via Javascript where you can connect it to the option values themselves, although it does get a little messy.

Drupal theme functions workflow in module

I am a bit newbie in Drupal theming and I can't get one detail in Forum modules theming.
forum.module file contains forum_theme function that controls how this module is themed
and has this line
function forum_theme() {
......
'forum_list' => array(
'template' => 'forum-list',
'arguments' => array('forums' => NULL, 'parents' => NULL, 'tid' => NULL),
),
I also see forum-list.tpl.php file in forum directory, so I start to wonder when this file is called and where it gets data from, but all I can find in forum.module is this function.
function template_preprocess_forum_list(&$variables)
Am I missing something? So in general my question is who and when invokes custom registered theme function, like forum_list
Simple answer is if you in your theme directory put mytheme-forum-list.tpl.php (where mytheme is the name of your theme) and customise it drupal should pick it up (clear the cache first).
This line in template_preprocess_forum calls the Drupal theme function
$variables['forums'] = theme('forum_list',
$variables['forums'],
$variables['parents'],
$variables['tid']);
This will reference the line in forum_theme()
'forum_list' => array(
'template' => 'forum-list',
'arguments' => array('forums' => NULL, 'parents' => NULL, 'tid' => NULL),
),
Which tells the templating enging to look for forum-list.php and provides arguments.
If you install the devel module and turn on the theme developer module. This will show you all of the candidate templates and functions which Drupal will look for when rendering content.
In general (but with specific exceptions) Drupal looks for the best match template and falls back to the pre defined functions.
if there is nothing that matches. Have a look at the theme guide and in specific the section on Overriding themable output you may also find hook_theme of interest.

Resources