T3CON10: The Tesseract Project for TYPO3
by Cobweb
- 1,929 views
The Tesseract Project is a suite of TYPO3 extensions that implement a global MVC pattern for collecting information from many sources (in particular the local database) and process it to some output ...
The Tesseract Project is a suite of TYPO3 extensions that implement a global MVC pattern for collecting information from many sources (in particular the local database) and process it to some output (in particular HTML for display in the frontend).
Statistics
- Likes
- 0
- Downloads
- 4
- Comments
- 0
- Embed Views
- Views on SlideShare
- 1,929
- Total Views
- 1,929



With over 6 years experience on TYPO3, we are the leading TYPO3 integrator in Western Swizerland.
Our experienced team consists of 10 senior consultant, webdesigner and developer.
Our clients are local Small and Medium Entreprises, Major companies like Manpower or non-profit organizations like International Federation of Red Cross and Red Crescent Societies.
Ecodev has been using TYPO3 since 2006 and consists of a team 7 people.
My self, as usual for business developers, I haven't really worked on the project... but I had the pleasure to experience it on various client projects.
My self, as usual for business developers, I haven't really worked on the project... but I had the pleasure to experience it on various client projects.
My self, as usual for business developers, I haven't really worked on the project... but I had the pleasure to experience it on various client projects.
My self, as usual for business developers, I haven't really worked on the project... but I had the pleasure to experience it on various client projects.
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
- contacts, locations, pieces of real estate, job offers, pharmacies, you name it
to sum it up “stuff”
And what do we want to do with that stuff? Most of the time, always the same:
- list it
- browse it
- view its details
- search it
- and create cross-links between various pieces of information
If you don’t have some special solution, you find yourself repeating the same developments over and over
The TYPO3 Extension Repository is full of extensions each dedicated to one particular type of structured information
This is not a solution
And what do we want to do with that stuff? Most of the time, always the same:
- list it
- browse it
- view its details
- search it
- and create cross-links between various pieces of information
If you don’t have some special solution, you find yourself repeating the same developments over and over
The TYPO3 Extension Repository is full of extensions each dedicated to one particular type of structured information
This is not a solution
And what do we want to do with that stuff? Most of the time, always the same:
- list it
- browse it
- view its details
- search it
- and create cross-links between various pieces of information
If you don’t have some special solution, you find yourself repeating the same developments over and over
The TYPO3 Extension Repository is full of extensions each dedicated to one particular type of structured information
This is not a solution
And what do we want to do with that stuff? Most of the time, always the same:
- list it
- browse it
- view its details
- search it
- and create cross-links between various pieces of information
If you don’t have some special solution, you find yourself repeating the same developments over and over
The TYPO3 Extension Repository is full of extensions each dedicated to one particular type of structured information
This is not a solution
And what do we want to do with that stuff? Most of the time, always the same:
- list it
- browse it
- view its details
- search it
- and create cross-links between various pieces of information
If you don’t have some special solution, you find yourself repeating the same developments over and over
The TYPO3 Extension Repository is full of extensions each dedicated to one particular type of structured information
This is not a solution
And what do we want to do with that stuff? Most of the time, always the same:
- list it
- browse it
- view its details
- search it
- and create cross-links between various pieces of information
If you don’t have some special solution, you find yourself repeating the same developments over and over
The TYPO3 Extension Repository is full of extensions each dedicated to one particular type of structured information
This is not a solution
And what do we want to do with that stuff? Most of the time, always the same:
- list it
- browse it
- view its details
- search it
- and create cross-links between various pieces of information
If you don’t have some special solution, you find yourself repeating the same developments over and over
The TYPO3 Extension Repository is full of extensions each dedicated to one particular type of structured information
This is not a solution
Nothing much happened afterwards, but in late 2007 I had an opportunity to develop a first rough solution, which was presented during T3DD08
In 2008 several large projects gave us the opportunity to start the real development and to put the solution to test on large, high-traffic web sites.
The project matured all the way to the current day and we chose T3CON10 as a deadline for going public.
What’s the possible solution to this conundrum? You can see it coming: a generic solution.
Big words
Does that scare you? It should.
That’s often how it ends up. You want to do everything and you end up with an overly complex structure which nobody understands anymore after a while.
But it needs not be so
There are clever generic solutions!
They rely on a simple principle: modularity
That’s often how it ends up. You want to do everything and you end up with an overly complex structure which nobody understands anymore after a while.
But it needs not be so
There are clever generic solutions!
They rely on a simple principle: modularity
This is the architecture of our solution.
At the center is a controller which receives a request to produce some output. It calls on something called a Data Provider which returns a set of data.
This data is passed to a Data Consumer to produce some output, which is returned by the controller. A typical output will be HTML to display in the TYPO3 FE.
How can that work?
Data Providers and Data Consumers exchange data in standardized formats. This means that there can exist any number of consumers and providers who don’t need to know anything about one another. They must be able to produce or handle the standard data formats. In effect this is an implementation of the Model-View-Controller pattern.
On top of that Data Providers may receive input from Data Filters that is used to restrict the data returned by the Data Provider (think browsing, filtering, searching).
This is the architecture of our solution.
At the center is a controller which receives a request to produce some output. It calls on something called a Data Provider which returns a set of data.
This data is passed to a Data Consumer to produce some output, which is returned by the controller. A typical output will be HTML to display in the TYPO3 FE.
How can that work?
Data Providers and Data Consumers exchange data in standardized formats. This means that there can exist any number of consumers and providers who don’t need to know anything about one another. They must be able to produce or handle the standard data formats. In effect this is an implementation of the Model-View-Controller pattern.
On top of that Data Providers may receive input from Data Filters that is used to restrict the data returned by the Data Provider (think browsing, filtering, searching).
This is the architecture of our solution.
At the center is a controller which receives a request to produce some output. It calls on something called a Data Provider which returns a set of data.
This data is passed to a Data Consumer to produce some output, which is returned by the controller. A typical output will be HTML to display in the TYPO3 FE.
How can that work?
Data Providers and Data Consumers exchange data in standardized formats. This means that there can exist any number of consumers and providers who don’t need to know anything about one another. They must be able to produce or handle the standard data formats. In effect this is an implementation of the Model-View-Controller pattern.
On top of that Data Providers may receive input from Data Filters that is used to restrict the data returned by the Data Provider (think browsing, filtering, searching).
This is the architecture of our solution.
At the center is a controller which receives a request to produce some output. It calls on something called a Data Provider which returns a set of data.
This data is passed to a Data Consumer to produce some output, which is returned by the controller. A typical output will be HTML to display in the TYPO3 FE.
How can that work?
Data Providers and Data Consumers exchange data in standardized formats. This means that there can exist any number of consumers and providers who don’t need to know anything about one another. They must be able to produce or handle the standard data formats. In effect this is an implementation of the Model-View-Controller pattern.
On top of that Data Providers may receive input from Data Filters that is used to restrict the data returned by the Data Provider (think browsing, filtering, searching).
This is the architecture of our solution.
At the center is a controller which receives a request to produce some output. It calls on something called a Data Provider which returns a set of data.
This data is passed to a Data Consumer to produce some output, which is returned by the controller. A typical output will be HTML to display in the TYPO3 FE.
How can that work?
Data Providers and Data Consumers exchange data in standardized formats. This means that there can exist any number of consumers and providers who don’t need to know anything about one another. They must be able to produce or handle the standard data formats. In effect this is an implementation of the Model-View-Controller pattern.
On top of that Data Providers may receive input from Data Filters that is used to restrict the data returned by the Data Provider (think browsing, filtering, searching).
This is the architecture of our solution.
At the center is a controller which receives a request to produce some output. It calls on something called a Data Provider which returns a set of data.
This data is passed to a Data Consumer to produce some output, which is returned by the controller. A typical output will be HTML to display in the TYPO3 FE.
How can that work?
Data Providers and Data Consumers exchange data in standardized formats. This means that there can exist any number of consumers and providers who don’t need to know anything about one another. They must be able to produce or handle the standard data formats. In effect this is an implementation of the Model-View-Controller pattern.
On top of that Data Providers may receive input from Data Filters that is used to restrict the data returned by the Data Provider (think browsing, filtering, searching).
Data Providers: dataquery (SQL-based), googlequery (Google Search Appliance or Google Mini), tagpackprovider (Tag Pack)
Data Consumers: templatedisplay (HTML templates), phpdisplay (straight templating in PHP)
Controllers: displaycontroller and displaycontroller_advanced which allows for more complicated interactions between the components
Data Filters: only datafilter, but it’s very powerful and we’ll come back to that later
Additionally there are a number of related extensions: tesseract (which is obviously a base extension), expressions (used by datafilter, more later), overlays (used by dataquery to transparently handle translations) and context (used to define some global values in TypoScript which can be picked up with datafilter - this is a more advanced concept of Tesseract, which I will not cover here)
Data Providers: dataquery (SQL-based), googlequery (Google Search Appliance or Google Mini), tagpackprovider (Tag Pack)
Data Consumers: templatedisplay (HTML templates), phpdisplay (straight templating in PHP)
Controllers: displaycontroller and displaycontroller_advanced which allows for more complicated interactions between the components
Data Filters: only datafilter, but it’s very powerful and we’ll come back to that later
Additionally there are a number of related extensions: tesseract (which is obviously a base extension), expressions (used by datafilter, more later), overlays (used by dataquery to transparently handle translations) and context (used to define some global values in TypoScript which can be picked up with datafilter - this is a more advanced concept of Tesseract, which I will not cover here)
Data Providers: dataquery (SQL-based), googlequery (Google Search Appliance or Google Mini), tagpackprovider (Tag Pack)
Data Consumers: templatedisplay (HTML templates), phpdisplay (straight templating in PHP)
Controllers: displaycontroller and displaycontroller_advanced which allows for more complicated interactions between the components
Data Filters: only datafilter, but it’s very powerful and we’ll come back to that later
Additionally there are a number of related extensions: tesseract (which is obviously a base extension), expressions (used by datafilter, more later), overlays (used by dataquery to transparently handle translations) and context (used to define some global values in TypoScript which can be picked up with datafilter - this is a more advanced concept of Tesseract, which I will not cover here)
Data Providers: dataquery (SQL-based), googlequery (Google Search Appliance or Google Mini), tagpackprovider (Tag Pack)
Data Consumers: templatedisplay (HTML templates), phpdisplay (straight templating in PHP)
Controllers: displaycontroller and displaycontroller_advanced which allows for more complicated interactions between the components
Data Filters: only datafilter, but it’s very powerful and we’ll come back to that later
Additionally there are a number of related extensions: tesseract (which is obviously a base extension), expressions (used by datafilter, more later), overlays (used by dataquery to transparently handle translations) and context (used to define some global values in TypoScript which can be picked up with datafilter - this is a more advanced concept of Tesseract, which I will not cover here)
Data Providers: dataquery (SQL-based), googlequery (Google Search Appliance or Google Mini), tagpackprovider (Tag Pack)
Data Consumers: templatedisplay (HTML templates), phpdisplay (straight templating in PHP)
Controllers: displaycontroller and displaycontroller_advanced which allows for more complicated interactions between the components
Data Filters: only datafilter, but it’s very powerful and we’ll come back to that later
Additionally there are a number of related extensions: tesseract (which is obviously a base extension), expressions (used by datafilter, more later), overlays (used by dataquery to transparently handle translations) and context (used to define some global values in TypoScript which can be picked up with datafilter - this is a more advanced concept of Tesseract, which I will not cover here)
Let’s look at a couple of them to better understand how the Tesseract components are called into action.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Thanks to Tesseract no specific extension needed to be developed to display this data.
The workhorse here is Data Query. We use SQL to query any of the imported tables.
Here’s an example query, aimed at retrieving a list of races.
This query is not executed as is. A Data Filter is applied to it, restricting the selection of races to one particular championship and one particular season.
On the other hand is the template. We use templatedisplay to use a HTML template, complete markers mapped to database fields and TypoScript configuration for finer rendering.
Finally everything is bound together by a Display Controller.
When the Data Query has executed its query, the resulting data set is passed to the Template Display component, which produces output, which is in turn sent to the FE by the Display Controller.
You can see how this matches the schema presented before, but this time with real-world components applied to a real-world web site.
Here again we have data coming from third-party system, namely job offers pushed to TYPO3 by a specialized job offers and applications management system.
This project relies on a Google Mini Server for searching, but we needed to bind search results with Tesseract to display customized lists of job offers.
The overall schema is the same as before, so I’ll mention what is really specific here.
One interesting point is that we created special pages using Tesseract that contain the job offer itself plus a number of information relating to it (in particular its primary key) as meta data. Using this information, Google Mini is able to perform a full-text search, but return the corresponding jobs primary keys.
The querying itself is performed using the “googlequery” extension which queries the Google server and returns the resulting data according to the Tesseract standards.
Here are some screenshots of “googlequery”, first is some general information, in the second tab comes the selection of information that we want to retrieve. This information will be available for mapping into the HTML template the same way that we saw in the previous example.
Here again we have data coming from third-party system, namely job offers pushed to TYPO3 by a specialized job offers and applications management system.
This project relies on a Google Mini Server for searching, but we needed to bind search results with Tesseract to display customized lists of job offers.
The overall schema is the same as before, so I’ll mention what is really specific here.
One interesting point is that we created special pages using Tesseract that contain the job offer itself plus a number of information relating to it (in particular its primary key) as meta data. Using this information, Google Mini is able to perform a full-text search, but return the corresponding jobs primary keys.
The querying itself is performed using the “googlequery” extension which queries the Google server and returns the resulting data according to the Tesseract standards.
Here are some screenshots of “googlequery”, first is some general information, in the second tab comes the selection of information that we want to retrieve. This information will be available for mapping into the HTML template the same way that we saw in the previous example.
Here again we have data coming from third-party system, namely job offers pushed to TYPO3 by a specialized job offers and applications management system.
This project relies on a Google Mini Server for searching, but we needed to bind search results with Tesseract to display customized lists of job offers.
The overall schema is the same as before, so I’ll mention what is really specific here.
One interesting point is that we created special pages using Tesseract that contain the job offer itself plus a number of information relating to it (in particular its primary key) as meta data. Using this information, Google Mini is able to perform a full-text search, but return the corresponding jobs primary keys.
The querying itself is performed using the “googlequery” extension which queries the Google server and returns the resulting data according to the Tesseract standards.
Here are some screenshots of “googlequery”, first is some general information, in the second tab comes the selection of information that we want to retrieve. This information will be available for mapping into the HTML template the same way that we saw in the previous example.
Here again we have data coming from third-party system, namely job offers pushed to TYPO3 by a specialized job offers and applications management system.
This project relies on a Google Mini Server for searching, but we needed to bind search results with Tesseract to display customized lists of job offers.
The overall schema is the same as before, so I’ll mention what is really specific here.
One interesting point is that we created special pages using Tesseract that contain the job offer itself plus a number of information relating to it (in particular its primary key) as meta data. Using this information, Google Mini is able to perform a full-text search, but return the corresponding jobs primary keys.
The querying itself is performed using the “googlequery” extension which queries the Google server and returns the resulting data according to the Tesseract standards.
Here are some screenshots of “googlequery”, first is some general information, in the second tab comes the selection of information that we want to retrieve. This information will be available for mapping into the HTML template the same way that we saw in the previous example.
Here again we have data coming from third-party system, namely job offers pushed to TYPO3 by a specialized job offers and applications management system.
This project relies on a Google Mini Server for searching, but we needed to bind search results with Tesseract to display customized lists of job offers.
The overall schema is the same as before, so I’ll mention what is really specific here.
One interesting point is that we created special pages using Tesseract that contain the job offer itself plus a number of information relating to it (in particular its primary key) as meta data. Using this information, Google Mini is able to perform a full-text search, but return the corresponding jobs primary keys.
The querying itself is performed using the “googlequery” extension which queries the Google server and returns the resulting data according to the Tesseract standards.
Here are some screenshots of “googlequery”, first is some general information, in the second tab comes the selection of information that we want to retrieve. This information will be available for mapping into the HTML template the same way that we saw in the previous example.
Here again we have data coming from third-party system, namely job offers pushed to TYPO3 by a specialized job offers and applications management system.
This project relies on a Google Mini Server for searching, but we needed to bind search results with Tesseract to display customized lists of job offers.
The overall schema is the same as before, so I’ll mention what is really specific here.
One interesting point is that we created special pages using Tesseract that contain the job offer itself plus a number of information relating to it (in particular its primary key) as meta data. Using this information, Google Mini is able to perform a full-text search, but return the corresponding jobs primary keys.
The querying itself is performed using the “googlequery” extension which queries the Google server and returns the resulting data according to the Tesseract standards.
Here are some screenshots of “googlequery”, first is some general information, in the second tab comes the selection of information that we want to retrieve. This information will be available for mapping into the HTML template the same way that we saw in the previous example.
Image the following scenario: you want to display a list of BE users on your web site, so that people can easily get in touch with the site’s administrators.
This is not possible by default in TYPO3 and you would normally have to develop a custom extension or some other workaround.
To get a list of BE users we’re going to use “dataquery”, since it allows us to send a SQL query to the TYPO3 database.
We choose to select just the admin’s name, username and e-mail address.
The syntax is fairly simple. It relies on markers close to the usual TYPO3 syntax, plus some control elements like loops and conditions.
We’ll come back to this component later.
In this case we just have a Data Provider and a Data Consumer.
Now that these two components have been related with one another, we can go back to the Data Consumer and take the next step...
This is easily achieved with a convenient point and click interface.
Each marker can be matched to one field. There are different field types, which - roughly - correspond to the base content object types. Additional TypoScript can be entered for each field.
This is a very simple example of what can be achieved with Tesseract. It’s far more powerful that this, but this example highlights a typical workflow.
We discussed before the danger that looms over all generic solutions: as they try to cover all situations they grow ever more complex until they become unwieldy and unmaintainable.
One way we avoided this pitfall in Tesseract is to exclude some features from it: one such feature is search forms.
It comes at a little additional efforts for site administrators, but let me try to convince you of this choice.
And there are often very precise design requirements too.
Look at this first form. That’s just simple drop-down menu to select years.
Next form. There’s still the year selector, but a few more have been added to that.
Next is the page browser. That’s also a form of filter. And note that we still have a year selector, but this time represented by actual pages.
And then there are some really sophisticated forms, with many fields, requiring some unusual layouts
Here’s another one to search for watches on many criteria.
This whole variety of search forms and filters is very difficult to achieve with a generic solution without ending up with an extremely complicated piece of software.
This is the reason why we chose to leave form building completely out of Tesseract.
And there are often very precise design requirements too.
Look at this first form. That’s just simple drop-down menu to select years.
Next form. There’s still the year selector, but a few more have been added to that.
Next is the page browser. That’s also a form of filter. And note that we still have a year selector, but this time represented by actual pages.
And then there are some really sophisticated forms, with many fields, requiring some unusual layouts
Here’s another one to search for watches on many criteria.
This whole variety of search forms and filters is very difficult to achieve with a generic solution without ending up with an extremely complicated piece of software.
This is the reason why we chose to leave form building completely out of Tesseract.
And there are often very precise design requirements too.
Look at this first form. That’s just simple drop-down menu to select years.
Next form. There’s still the year selector, but a few more have been added to that.
Next is the page browser. That’s also a form of filter. And note that we still have a year selector, but this time represented by actual pages.
And then there are some really sophisticated forms, with many fields, requiring some unusual layouts
Here’s another one to search for watches on many criteria.
This whole variety of search forms and filters is very difficult to achieve with a generic solution without ending up with an extremely complicated piece of software.
This is the reason why we chose to leave form building completely out of Tesseract.
And there are often very precise design requirements too.
Look at this first form. That’s just simple drop-down menu to select years.
Next form. There’s still the year selector, but a few more have been added to that.
Next is the page browser. That’s also a form of filter. And note that we still have a year selector, but this time represented by actual pages.
And then there are some really sophisticated forms, with many fields, requiring some unusual layouts
Here’s another one to search for watches on many criteria.
This whole variety of search forms and filters is very difficult to achieve with a generic solution without ending up with an extremely complicated piece of software.
This is the reason why we chose to leave form building completely out of Tesseract.
And there are often very precise design requirements too.
Look at this first form. That’s just simple drop-down menu to select years.
Next form. There’s still the year selector, but a few more have been added to that.
Next is the page browser. That’s also a form of filter. And note that we still have a year selector, but this time represented by actual pages.
And then there are some really sophisticated forms, with many fields, requiring some unusual layouts
Here’s another one to search for watches on many criteria.
This whole variety of search forms and filters is very difficult to achieve with a generic solution without ending up with an extremely complicated piece of software.
This is the reason why we chose to leave form building completely out of Tesseract.
And there are often very precise design requirements too.
Look at this first form. That’s just simple drop-down menu to select years.
Next form. There’s still the year selector, but a few more have been added to that.
Next is the page browser. That’s also a form of filter. And note that we still have a year selector, but this time represented by actual pages.
And then there are some really sophisticated forms, with many fields, requiring some unusual layouts
Here’s another one to search for watches on many criteria.
This whole variety of search forms and filters is very difficult to achieve with a generic solution without ending up with an extremely complicated piece of software.
This is the reason why we chose to leave form building completely out of Tesseract.
And there are often very precise design requirements too.
Look at this first form. That’s just simple drop-down menu to select years.
Next form. There’s still the year selector, but a few more have been added to that.
Next is the page browser. That’s also a form of filter. And note that we still have a year selector, but this time represented by actual pages.
And then there are some really sophisticated forms, with many fields, requiring some unusual layouts
Here’s another one to search for watches on many criteria.
This whole variety of search forms and filters is very difficult to achieve with a generic solution without ending up with an extremely complicated piece of software.
This is the reason why we chose to leave form building completely out of Tesseract.
And there are often very precise design requirements too.
Look at this first form. That’s just simple drop-down menu to select years.
Next form. There’s still the year selector, but a few more have been added to that.
Next is the page browser. That’s also a form of filter. And note that we still have a year selector, but this time represented by actual pages.
And then there are some really sophisticated forms, with many fields, requiring some unusual layouts
Here’s another one to search for watches on many criteria.
This whole variety of search forms and filters is very difficult to achieve with a generic solution without ending up with an extremely complicated piece of software.
This is the reason why we chose to leave form building completely out of Tesseract.
And there are often very precise design requirements too.
Look at this first form. That’s just simple drop-down menu to select years.
Next form. There’s still the year selector, but a few more have been added to that.
Next is the page browser. That’s also a form of filter. And note that we still have a year selector, but this time represented by actual pages.
And then there are some really sophisticated forms, with many fields, requiring some unusual layouts
Here’s another one to search for watches on many criteria.
This whole variety of search forms and filters is very difficult to achieve with a generic solution without ending up with an extremely complicated piece of software.
This is the reason why we chose to leave form building completely out of Tesseract.
And there are often very precise design requirements too.
Look at this first form. That’s just simple drop-down menu to select years.
Next form. There’s still the year selector, but a few more have been added to that.
Next is the page browser. That’s also a form of filter. And note that we still have a year selector, but this time represented by actual pages.
And then there are some really sophisticated forms, with many fields, requiring some unusual layouts
Here’s another one to search for watches on many criteria.
This whole variety of search forms and filters is very difficult to achieve with a generic solution without ending up with an extremely complicated piece of software.
This is the reason why we chose to leave form building completely out of Tesseract.
Thanks to the expressions library, the Data Filter can retrieve data from many sources including any GET/POST variables, TypoScript values, FE user values, etc.
Thus it does not matter how a search form is built nor how filters or restrictions are defined. It’s possible to catch all these values using a Data Filter.
These values then get injected into the Data Consumer to restrict its selection.
This is very powerful.
With all the wonders promised by recent and upcoming new technologies, you may wonder why we invested so much in the Tesseract project.
So we built a solution on an existing base, but we tried to make it as independent as possible: if you consider the whole Tesseract architecture, it’s really just the controller who are built as pibase plugins.
The other components are independent.
There could be an extbase-based controller.
But in the very near future it will be possible to also use Fluid within Tesseract.
This is very hard to say for now. There are talks about trying to create generic domain models. This might render Tesseract obsolete, but we’re not there yet.
The modular structure of Tesseract can certainly be reproduced in the v5 and some of the logic reused.
In the meantime Tesseract helps solve real-world problems in a very flexible way and we’re very happy about releasing it to the community.
We have also set up a dedicated web site with a global overview of the project and some tutorials. We plan to release more tutorials in the future, as well as tips & tricks and examples of advanced usage.
So go and look at the web site and watch the introductory screencast. Try out Tesseract and give us your feedback. We hope you will find it as useful as we do.