[[TOC(heading=Egg Cooking Tutorial, EggCookingTutorial/BasicEggCooking, EggCookingTutorial/AdvancedEggCooking, EggCookingTutorial/AdvancedEggCooking2)]]
= Cook even better eggs =
After you read [wiki:EggCookingTutorial/BasicEggCooking EggCookingTutorial/BasicEggCooking] and created your first egg, it's time to make it a bit better.
First we integrate our output to other Trac layout in form of !ClearSilver template.
== Adding template ==
To have a template we need a directory and of course the template itself. We will keep the same simple "Hello world!" text, but this time we will integrate our fine words into a Trac layout.
For that we need to create one additional directory:
{{{
./helloworld-plugin/helloworld/templates/
}}}
In that directory create a new file ''helloworld.cs'':
{{{
#!text/html
Hello world!
}}}
Now you have created the template for the plugin.
== Tell Trac where template is ==
Trac doesn't know where your template is so you have to tell it. This is done by implementing the ITemplateProvider interface in ''helloworld.py''.
So you change few lines as following:
Line 4 is changed from
{{{
#!python
from trac.web.chrome import INavigationContributor
}}}
to
{{{
#!python
from trac.web.chrome import INavigationContributor, ITemplateProvider
}}}
Line 9 is changed from
{{{
#!python
implements(INavigationContributor, IRequestHandler)
}}}
{{{
#!python
implements(INavigationContributor, IRequestHandler, ITemplateProvider)
}}}
Starting from line 23 old ''process_request'' method is replaced by
{{{
#!python
def process_request(self, req):
return 'helloworld.cs', None
}}}
And to end of file you need to tell where your template is located
{{{
#!python
# ITemplateProvider methods
def get_templates_dirs(self):
"""
Return the absolute path of the directory containing the provided
ClearSilver templates.
"""
from pkg_resources import resource_filename
return [resource_filename(__name__, 'templates')]
}}}
Complete version of ''helloworld.py'':
{{{
#!python
# Helloworld plugin
from trac.core import *
from trac.web.chrome import INavigationContributor, ITemplateProvider
from trac.web.main import IRequestHandler
from trac.util import escape, Markup
class UserbaseModule(Component):
implements(INavigationContributor, IRequestHandler, ITemplateProvider)
# INavigationContributor methods
def get_active_navigation_item(self, req):
return 'helloworld'
def get_navigation_items(self, req):
yield 'mainnav', 'helloworld', Markup('Hello', self.env.href.helloworld())
# IRequestHandler methods
def match_request(self, req):
return req.path_info == '/helloworld'
def process_request(self, req):
return 'helloworld.cs', None
# ITemplateProvider methods
def get_templates_dirs(self):
"""
Return the absolute path of the directory containing the provided
ClearSilver templates.
"""
from pkg_resources import resource_filename
return [resource_filename(__name__, 'templates')]
}}}
== Copy template to egg ==
Finally you have to include the new template directory in an egg.
So change ''setup.py'' to be like:
{{{
#!python
from setuptools import setup
PACKAGE = 'TracHelloworld'
VERSION = '0.1'
setup(name=PACKAGE,
version=VERSION,
packages=['helloworld'],
package_data={'helloworld' : ['templates/*.cs',]}
entry_points={'trac.plugins': '%s = helloworld' % PACKAGE},
)
}}}
== Building and deploying ==
Building and deployment goes exactly the same as it did in the previous tutorial [wiki:EggCookingTutorial/BasicEggCooking#Firstdeployment EggCookingTutorial/BasicEggCooking].
Now you should see a big "Hello world!" integrated into your Trac layout when you press that fancy button in the main navigation bar.
== Aftermath ==
Now that you have added a basic template for your plugin let's add the final twist, putting some static content like a stylesheet and an image. Continue to [wiki:EggCookingTutorial/AdvancedEggCooking2 EggCookingTutorial/AdvancedEggCooking2]
[[TagIt(rede)]]