Output Filter¶
Output filters allow to modify HTML on the fly. It is best practice to use output filters instead of modifying .tt
files directly. There are three good reasons for that. When the same adaptation has to be applied to several front end modules then the adaption only has to be implemented once. The second advantage is that when OTOBO is upgraded there is a chance that the filter doesn’t have to be updated, when the relevant pattern has not changed. When two extensions modify the same file there is a conflict during the installation of the second package. This conflict can be resolved by using two output filters that modify
the same front end module.
There are three different kinds of output filters. They are active at different stages of the generation of HTML content.
FilterElementPost
¶
These filters allow to modify the output of a template after it was rendered.
To translate content, you can run $LayoutObject->Translate()
directly. If you need other template features, just define a small template file for your output filter and use it to render your content before injecting it into the main data. It can also be helpful to use jQuery DOM operations to reorder/replace content on the screen in some cases instead of using regular expressions. In this case you would inject the new code somewhere in the page as invisible content (e. g. with the class Hidden
), and then move it with jQuery to the correct location in the DOM and show it.
To make using post output filters easier, there is also a mechanism to request HTML comment hooks for certain templates/blocks. You can add in your module config XML like:
<Setting Name="Frontend::Template::GenerateBlockHooks###100-OTOBOBusiness-ContactWithData" Required="1" Valid="1">
<Description Translatable="1">Generate HTML comment hooks for the specified blocks so that filters can use them.</Description>
<Navigation>Frontend::Base::OutputFilter</Navigation>
<Value>
<Hash>
<Item Key="AgentTicketZoom">
<Array>
<Item>CustomerTable</Item>
</Array>
</Item>
</Hash>
</Value>
</Setting>
This will cause the block CustomerTable
in AgentTicketZoom.tt
to be wrapped in HTML comments each time it is rendered:
<!--HookStartCustomerTable-->
... block output ...
<!--HookEndCustomerTable-->
With this mechanism every package can request just the block hooks it needs, and they are consistently rendered. These HTML comments can then be used in your output filter for easy regular expression matching.
FilterContent
¶
This kind of filter allows to process the complete HTML output for the request right before it is sent to the browser. This can be used for global transformations.
FilterText
¶
This kind of output filter is a plugin for the method Kernel::Output::HTML::Layout::Ascii2HTML()
and is only active when the parameter LinkFeature
is set to 1. Thus the FilterText
output filters are currently only active for the display of the body of plain text articles. Plain text articles are generated by incoming non-HTML mails and when OTOBO is configured to not use the Rich Text feature in the front end.
Output Filter Code Example¶
See package TemplateModule.
Output Filter Configuration Example¶
See package TemplateModule.
Output Filter Use Case Example¶
- Show additional ticket attributes in
AgentTicketZoom
- This can be achieved with a
FilterElementPost
output filter. - Show the service selection as a multi level menu
- Use a
FilterElementPost
for this feature. The list of selectable services can be parsed from the processed template output. The multi level selection can be constructed from the service list and inserted into the template content. AFilterElementPost
output filter must be used for that. - Create links within plain text article bodies
- A biotech company uses gene names like IPI00217472 in plain text articles. A
FilterText
output filter can be used to create links to a sequence database, e.g. http://srs.ebi.ac.uk/srsbin/cgi-bin/wgetz?-e+[IPI-acc:IPI00217472]+-vn+2, for the gene names. - Prohibit active content
- There is firewall rule that disallows all active content. In order to avoid rejection by the firewall, the HTML tag
<applet>
can be filtered with aFilterContent
output filter.
Note
Every FilterElementPost
output filter is constructed and run for every configured template that is needed for the current request. Thus low performance of the output filter or a large number of filters can severely degrade performance.
Best Practices¶
In order to increase flexibility the list of affected templates should be configured in system configuration.