How to export xml or json from typo3 - typo3

I need to export content from a typo3 site to a web app. I am considering to use xml or json. But I haven't figure it out how to do it.
I'm new to typo3 development. So I would like to know if someone has suggestions how to do this.
Regards,

This highly depends on your requirements ;)
As a starting point you can use a new page type and disable all header codes to generate XML e.g.
xml = PAGE
xml {
typeNum = 123
config {
disableAllHeaderCode = 1
xhtml_cleaning = none
admPanel = 0
metaCharset = utf-8
additionalHeaders = Content-Type:text/xml;charset=utf-8
}
10 = COA
10 {
wrap = <?xml version="1.0" encoding="UTF-8" standalone="yes" ?><your_root_tag>|</your_root_tag>
# add code here to generate xml content
10 = ...
}
}
If you browse to http://example.com/index.php?type=123 you'll get the XML content.
But if things get more complex writing an extension maybe the better approach.

Related

How to prevent TYPO3 to render head- and body-elements when outputting JSON?

In TYPO3 8.7 I'm trying to generate JSON using FLUID.
I've created a page with dummy content and I've updated my TypoScript configuration for all pages in a folder.
TypoScript setup
[PIDinRootline = 10]
page = PAGE
page {
typeNum = 0
config {
disableAllHeaderCode = 1
disablePrefixComment = 1
xhtml_cleaning = none
admPanel = 0
debug = 0
metaCharset = utf-8
additionalHeaders = Content-Type:text/json;charset=utf-8
}
}
[global]
I created a dummy JSON file as well, to test the output, before creating the actual content using FLUID:
api.json
{
"hello": "world"
}
Now, this seems to work fine. But the output still includes the html- and body-elements.
Rendered output:
<html>
<head></head>
<body>
{"hello": "world"}
</body>
</html>
The documentations says:
If you want to output JSON, RSS or similar data with Fluid,
you have to write the appropriate TypoScript which passes the
page rendering to Extbase and Fluid respectively. Otherwise,
TYPO3 will always generate the <head>- and <body>-section.
But I don't know what to do here actually. How can I get TYPO3 to not render the wrapping HTML-elements?
The problem was a new syntax in TYPO3 8 and newer. In newer versions, the additionalHeaders is no longer just a TEXT but an array with numeric indices. So to set the correct header type, you have to use this one:
additionalHeaders.10.header = Content-Type:application/json;charset=utf-8
When you override the page object, you should remove all inside it before with page >.
Additionally Fluid is a templating engine for HTML, I don't know if that fits for JSON output.
Better way:
I'd suggest to use a separate object than page and a different page type:
[globalVar = GP:type = 133]
jsonOutput = PAGE
jsonOutput {
typeNum = 133
config {
...
}
}
[global]
What you are missing is this typoscript:
config.disableAllHeaderCode = 1
read the manual
as you want it on a special page you can use a special typoscript template for this page. For a pagetype it is a little more complicated as this configuration would work on all pagetypes.
if you want some config options only for a special pagetype you can add this config to the pagetype only like this:
json = PAGE
json.config.disableAllHeaderCode = 1
Be aware that fluid is more complicated if you output other structure than HTML. But it is possible! Have a special look on whitespace and braces ({})

Custom content element is not rendered in front-end

Need help with a custom content element that is not being rendered.
This is my typoscript:
tt_content.cat_button = FLUIDTEMPLATE
tt_content.cat_button {
template = FILE
template.file = EXT:so_product/Resources/Private/Templates/ContentELements/CategoryButton.html
layoutRootPath = EXT:so_product/Resources/Private/Layouts/
}
Even if I misspell CategoryButton.html, there won't be an error message. So how will I know if the correct template is found?
If I remove rows template and template.file, I get message "Oops, no template found..."
My template only contains <p>Test</p>. Do I need sections and layout too?
This is the guide I used: http://docs.typo3.org/typo3cms/extensions/sitepackage/CustomContentElements/Index.html
No errors in log.
Your typoscript is simply wrong.
Check the TSRef http://docs.typo3.org/typo3cms/TyposcriptReference/ContentObjects/Fluidtemplate/Index.html
tt_content.cat_button = FLUIDTEMPLATE
tt_content.cat_button {
file = EXT:so_product/Resources/Private/Templates/ContentELements/CategoryButton.html
}
Simple typo:
ContentELements -> ContentElements
Also bug in TYPO3 that didn't display error message.

XML sitemap which includes tt_news articles

Currently I'm using mc_googlesitemap. I've read that I can include tt_news articles in the xml output when using "Google Sitemap for Contents". In the documentation you have an option Table where the contents live but this is not available for me. I only can choose "Google Sitemap for Contents" and than I have "Selected Pages". There are no such option as seen in the docu and as described here.
I'm using Typo3 4.7.10 and mc_googlesitemap 0.4.2.
I also tried weeaar_googlesitemap but here in the xml output I only see the page itself where the plugin was configured to display its output. Accessing Web -> GoogleSitemap doesn't work because of the deprecated function
Fatal error: Call to undefined method t3lib_div::fixed_lgd_pre() in
/usr/home/xxx/typo3conf/ext/weeaar_googlesitemap/mod1/index.php
on line 121
I found this fix but currently I cannot adapt the source files because I've no permissions.
How do I get an xml sitemap which can also display me tt_news articles of a certain category?
Edit:
I fixed the deprecated warning and my TS looks like the following (for the weaar sitemap):
#############################
# Sitemap
#############################
sitemap = PAGE
sitemap {
typeNum = 200
10 >
10 < plugin.tx_weeaargooglesitemap_pi1
10.pid_list = 1
10.recursive = 0
10.allowedDoktypes = 2,1,4
10.domain = http://www.domain.com/
10.tt_news.single_page {
1 = 78
1.pid_list = 77
}
10.tt_news {
disabledParameter = day,month,year
}
config {
disableAllHeaderCode = 1
additionalHeaders = Content-type:text/xml
no_cache = 1
xhtml_cleaning = 0
}
}
I have the following problems:
Hidden Pages are shown in my sitemap.xml (there is no page with doktype 5 allowed)
tt_news articles are not displayed (what is wrong with my configuration?)
Explanation:
10.pid_list = 1 // this is my main entry point
10.tt_news.single_page.1 = 78 // this is my page id where the single view of tt_news resides
10.tt_news.single_page.1.pid_list = 77 // this is my sysfolder where the news are placed
What I'm doing wrong? Alternatives?
There is an extension called tq_seo which does all the SEO magic for your TYPO3 site. It's quite easy but also powerful.

Typoscript: Display register value as text

I'm using the extension seo_dynamic_tag, which is a fantastic plugin for TYPO3 SEO purposes.
It uses registers to store the generated meta description and keywords. Later on in the script, the page metadata is filled in from these registers:
page {
meta {
description {
field >
data = register:description
}
keywords {
field >
data = register:keywordss
}
}
1000 < temp.seo
}
So far it works like charm.
But in addition I'd like to display a TEXT object on the page with the meta description on the bottom. The text should read the meta description and some other stuff. That's where I need your help.
I tried to do the "magic" like this:
temp.description = COA
temp.description {
10 = TEXT
10.value = Meta description: {register:description}
stdWrap.insertData = 1
}
lib.footer < temp.description
This simply does not work. If I want to display something else, for example {page:title} or {date:y-m-d}, data insertion works. For register:xxx it doesn't.
I already spent lots of hours to google out my desired solution, but no success :(
Do you have any idea what I'm missing here?
I'm using TYPO3 4.5.3 (I know I should update ;)).
Many thanks in advance for your help! :)
Your stdWrap.insertData = 1 is applied to your COA-object, and not to your TEXT-object. You can instead set 10.insertData = 1 or just write the following:
10 = TEXT
10.data = register:description

Typo3 - Custom email newsletters with direct_mail

Im building a newsletter and the start is like this:
DEAR ###USER_gender### ###USER_first_name### ###USER_last_name###
which outpouts
DEAR ###USER_gender### JOHN DOE
and I was hoping it would replace the gender mark with "Miss" and "Sir", depending on the value. How could I do this?
Extra fields have to be added to the field list (see docu). But I'm not sure whether this automatically works with non-string fields. Maybe using a hook is your solution or using another extension which adds a new field to tt_address.
Another solution is to nest marker:
###GENDER_###USER_gender######
and then warp you content in a new template object:
10 = TEMPLATE
10 {
template < yourAlreadyProcessedContent
marks {
GENDER_m = TEXT
GENDER_m.value = Sir
}
}
It's a bit unusual, but sometimes it's very useful.
(Personally I use it to replace version numbers in tt_content records.)
Edit:
Example for Dbugger:
Download the Introduction Package and install it. After that add to the Welcome page a new template record with the following steup:
temp.mainTemplate = TEMPLATE
temp.mainTemplate {
template = TEXT
template.value = (
Foo
###CONTENT###
###CONTENT###
Bar
)
subparts {
CONTENT < styles.content.get
}
}
page = PAGE
page {
typeNum = 0
10 = TEMPLATE
10 {
template < temp.mainTemplate
marks {
TEST = TEXT
TEST.value = ok
}
}
Now include CSS Styled Contnet and enable the following options:
clear constants, clear setup, rootlevel
The output should look like that:
Foo
Congratulations ...
Bar
If you add ###TEST### to the the tt_content record on the welcome page it will be replaced with ok.
This should work with direct mail, too.
Edit:
I'm sorry, this only works which normal extension which are use in the rendering process.
a little bit late, but here's the best solution for the salutation in direct_mail & tt_address .. works perfect for me. The personalized marker is just ###USER_salutation###,
https://blog.webentwickler.at/individuelle-marker-in-direct-mail/