The problem itself is solved, but the question is still open cause I want to test the tipps from Krystian. See Edit 3 at the bottom of this question.
I have a TYPO3 project that is very slow. So I did some tests and found some problems.
I tested the startpage, the startpage containers 2 news list (total 9 articles) (tx_news version 2.3.0 - not the newest one). It contains the menu (created with fluid v:page.menu), the footer (also created with v:page.menu), a right column (mainly image content elements, gathered from another page with typoscript) and a news-taglist (created with typoscript). The news-taglist is used twice - once in the menu and once in the right column.
First the performance overview:
No Menu/No Footer (without taglist), No News, No Labellist
0.65s
With menu and footer (without taglist)
0.95s
With menu and footer (with taglist)
2.3s
With menu and footer (with taglist) and Taglist in right column
3s
With all
4.2s
A big point is the taglist (right now there is a total of 1303 tags). here is the Typoscript that generate the taglist:
plugin.tx_mytemplate {
newsTags = CONTENT
newsTags {
table = tx_news_domain_model_tag
select {
pidInList = 1,589
hidden = 0
deleted = 0
orderBy = title
}
orderBy = title
renderObj = COA
renderObj {
1 = LOAD_REGISTER
1 {
Counter.cObject = TEXT
Counter.cObject.data = register:Counter
Counter.cObject.wrap = |+1
Counter.prioriCalc = intval
}
2 = TEXT
2.insertData = 1
2 = TEXT
2.insertData = 1
2.field = title
2.typolink {
# link to page
parameter = 588
# the current tag
additionalParams = &tx_news_pi1[overwriteDemand][tags]={field:uid}
additionalParams.insertData = 1
}
2.wrap = <li data-test="{field:uid}" data-index="{register:Counter}">|</li>
}
wrap = <ul>|</ul>
}
}
I use this once in the menu and once in a content element with:
<f:cObject typoscriptObjectPath="plugin.tx_mytemplate.newsTags" />
What I don't understand is, for my understanding there should not be a big difference in using it once or twice (or even more), cause after the first use the typoscript-object should be created and there is no need to create it a second time. Am I missing something here?
This is the SQL:
SELECT * FROM tx_news_domain_model_tag WHERE tx_news_domain_model_tag.pid IN (1,589) AND tx_news_domain_model_tag.deleted=0 AND tx_news_domain_model_tag.hidden=0 ORDER BY title;
It needs 0.004s to execute this query. So the other point I don't understand is, why is it so expensive to create this typoscript-object? Is it the typolink that is used to create all 1303 Links? (I used realURL)
Also, this taglist does not change often, is it somehow possible to full cache it? And for example only create a new taglist when Flush general caches (or frontend cahches) is executed?
Any other ideas? ( I know I could load the taglist via ajax after the page is loaded, but that is just the last work around and maybe there are better solutions)
Edit: I tested the taglist without the typolink and its around 1s faster. That means to create a typolink for 1303 Link costs around 1s.
Edit 2: I found a hidden config.no_cache = 1 And testing right now if everything works when cache is enabled. But anyway I am interessted why typolink is so expensive.
.
Edit 3: I test Krystians answer:
Cache the Typoscript Object with stdWrap.cache.key = someHash
plugin.tx_mytemplate {
newsTags = CONTENT
newsTags {
table = tx_news_domain_model_tag
select {
pidInList = 1,589
hidden = 0
deleted = 0
orderBy = title
}
orderBy = title
renderObj = COA
renderObj {
1 = LOAD_REGISTER
1 {
Counter.cObject = TEXT
Counter.cObject.data = register:Counter
Counter.cObject.wrap = |+1
Counter.prioriCalc = intval
}
2 = TEXT
2.insertData = 1
2 = TEXT
2.insertData = 1
2.field = title
2.typolink {
# link to page
parameter = 588
# the current tag
additionalParams = &tx_news_pi1[overwriteDemand][tags]={field:uid}
additionalParams.insertData = 1
}
2.wrap = <li data-test="{field:uid}" data-index="{register:Counter}">|</li>
}
wrap = <ul>|</ul>
stdWrap.cache.key = mytaglist
stdWrap.cache.lifetime = unlimited
}
}
I can't see any changes in loading time. is there a way to check if this object really gets cached? Did I something wrong?
Using VHS to cache the content with v:render.cache
I replaced
<f:cObject typoscriptObjectPath="plugin.tx_mytemplate.newsTags" />
with
<v:render.cache content="<f:cObject typoscriptObjectPath='plugin.tx_mytemplate.newsTags' />" identity="test1234" />
It seems to work, cause the first call needs longer. But then the next call is "normal" (as I would not use the v.render.cache) until I take the content part out and just use the identify:
<v:render.cache content="test" identity="test1234" />
This is faster and still displays the taglist. So it works so far, that the cached version behind test1234 is used. But it also seems that he render the f:cObject typoscript object in the content part every time. What am I missing here?
Even stranger is, when I use the code with content="test"and flush frontend caches and flush general caches the taglist is still displayed (and not "test"). The docu says: The cache behind this ViewHelper is the Extbase object cache, which is cleared when you clear the page content cache.. What exactly is the page content cache? Not one of the two flush frontend caches or flush general caches ?
Edit 4: With cache enabled I found a problem with the news plugin. I use realURL for the newsplugin:
'category' => array(
array(
'GETvar' => 'tx_news_pi1[overwriteDemand][categories]',
'lookUpTable' => array(
'table' => 'tx_news_domain_model_category',
'id_field' => 'uid',
'alias_field' => 'CONCAT(title, "-", uid)',
'addWhereClause' => ' AND NOT deleted',
'useUniqueCache' => 1,
'useUniqueCache_conf' => array(
'strtolower' => 1,
'spaceCharacter' => '-'
)
)
)
),
'tag' => array(
array(
'GETvar' => 'tx_news_pi1[overwriteDemand][tags]',
'lookUpTable' => array(
'table' => 'tx_news_domain_model_tag',
'id_field' => 'uid',
'alias_field' => 'CONCAT(title, "-", uid)',
'addWhereClause' => ' AND NOT deleted',
'useUniqueCache' => 1,
'useUniqueCache_conf' => array(
'strtolower' => 1,
'spaceCharacter' => '-'
)
)
)
),
Calling a category link works without problem, but when I call a tag link then I see only the news from the first hit (changing the tag does not affect anything, it still shows the news filtered by the first tag). So it seems something went wrong there with the cache, but I can not figure out what. For me categories and tag looks pretty much the same, the only difference is another parameter, but realURL should handle that.
Try that:
plugin.tx_mytemplate = TEXT
plugin.tx_mytemplate {
stdWrap.cache.key = mytaglist
stdWrap.cache.lifetime = unlimited
stdWrap.append = CONTENT
stdWrap.append {
# ... your TS
}
}
The first thing you can do is to cache all elements that are common for all pages. Good candidates for that are header and footer elements and in your case maybe the tag list. If you have header done with typoscript then you can use "cache" property of stdWrap.
5 = TEXT
5 {
stdWrap.cache.key = someHash
}
Read the docs here: http://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Cache/Index.html
If you use this construction then this element is rendered on first page hit. Then for all next pages when TYPO3 needs to render this element it uses value from cache.
If you think that you can not use it for menu becase you have states like "active"/"current" then you are wrong. You can set the staes using Javascript. Here the example.
var urlSplitted = window.location.pathname.substring(1).split('/');
var urlToCheck = [];
$.each(urlSplitted, function (index, value) {
if (value.length) {
urlToCheck.push(value);
$('#main-nav a').filter(function () {
var match = '^/' + urlToCheck.join('/') + '/$';
if ($(this).attr('href') != undefined) {
return $(this).attr('href').match(new RegExp(match, "i"));
} else {
return false;
}
}).parent().addClass('current');
}
})
If you use Fluid then you can also use such caching of common element. Install ext: vhs and then use this ViewHelper
https://fluidtypo3.org/viewhelpers/vhs/1.1.0/Render/CacheViewHelper.html
Related
I am using cobj_xpath object in my page typoscript as follows.
lib.xpath = XPATH
lib.xpath {
source = http://docsouth.unc.edu/southlit/poe/poe.xml
return = string
resultObj {
cObjNum = 1
1.current = 1
}
}
page.10 = FLUIDTEMPLATE
page.10.variables {
title < lib.xpath
title.expression = /TEI.2/text/front/titlePage/docTitle/titlePart
author < lib.xpath
author.expression = /TEI.2/text/front/titlePage/docAuthor
}
I can access the 'title' and 'author' variables in page template successfully via {title} and {author} viewhelpers but I cannot access them in the content element level. I cannot even find them in at CE level. Also I have the same problem with other COAs e.g.:
taleArgument = TEXT
taleArgument.data = GP:tale
MORE INFO:
I have created the CE via mask extension and configured it to create the required files in /Resources/Mask/ folder. In this folder there is a json file which contains the CE configuration and two folders named Backend and Frontend. Each of these folders contain Layout/Partial/Templates folders. I have inserted the CE created by mask in one of my pages. I manipulate the HTML file in Frontend/Templates as the template file and I can access the fields which I have created in the CE backend properly, so I suppose that my configuration is working well to this end.
Typo3 Version: 9.5.19
cobj_xpath and cobj_xslt version: 1.9.0
Further Investigations:
To get rid of external extensions, I installed a fresh Typo3. Then I developed a CE in my sitepackage from scratch. My configuration follows:
my_ext/Configuration/TsConfig/Page/Mod/Wizards/NewContentElement.tsconfig
mod.wizards.newContentElement.wizardItems.common {
elements {
my_ext_newcontentelement {
iconIdentifier = folder-open
title = Registration Example
description = Create a registration form
tt_content_defValues {
CType = my_ext_newcontentelement
}
}
}
show := addToList(my_ext_newcontentelement)
}
my_ext/Configuration/TCA/Overrides/tt_content.php
<?php
defined('TYPO3_MODE') or die();
call_user_func(function () {
// Adds the content element to the "Type" dropdown
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem(
'tt_content',
'CType',
[
'Registration Example',
'my_ext_newcontentelement',
'form-checkbox',
],
'textmedia',
'after'
);
// Configure the default backend fields for the content element
$GLOBALS['TCA']['tt_content']['types']['my_ext_newcontentelement'] = [
'showitem' => '
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
--palette--;;general,
--palette--;;headers,
bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel,
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
--palette--;;frames,
--palette--;;appearanceLinks,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
--palette--;;language,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access,
--palette--;;hidden,
--palette--;;access,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories,
categories,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes,
rowDescription,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended,
',
'columnsOverrides' => [
'bodytext' => [
'config' => [
'enableRichtext' => true,
'richtextConfiguration' => 'default',
],
],
],
];
});
my_ext/Configuration/TypoScript/setup.typoscript
lib.contentElement {
templateRootPaths.200 = EXT:my_ext/Resources/Private/Templates/ContentElements/
}
tt_content {
my_ext_newcontentelement =< lib.contentElement
my_ext_newcontentelement {
templateName = NewContentElement
}
}
my_ext/Resources/Private/Templates/ContentElements/NewContentElement.html:
<div>{data.bodytext -> f:format.html()}</div>
I tested my CE after adding one to the backend and it works fine so far.
Then I create a new variable in my_ext/Configuration/TypoScript/setup.typoscript:
page.10.variables {
test = TEXT
test.value = test
}
I can see the variable when I add {_all} to my page template:
but no luck when I try to catch it in my CE template:
TLDR:
each fluid rendering has it's own variables. There are no global fluid-variables.
It is obvious that you can not access test from your content element as the definition of page.10.variables results in fluid variables used while you are renderend the page-template (page.10).
In your content element you have an independent rendering with it's own set of variables.
Meanwhile you often have fluid for some rendering, but each has its own definition and variable set.
The whole page has a page fluid rendering.
Each plugin has it's own fluid rendering, probably for each action. Although they share a common extension setting which results in some common fluid variables.
Each content element has a Fluid rendering, though they might share some definition as the result from the same kind of data (a tt_content record). The kind of CE defines which template is used to start with and there are different renderings.
Using TYPO9 and ext:bootstrap_package (and ext_fluid_styled_content) you can find:
The rendering of the CEs is defined below tt_content. with the name of the CE as next key. All definitions are based on lib.dynamicContent
if you want to access any data independent from context in your fluid you could use typoscript viewhelpers like:
lib.text = TEXT
lib.text.value = test
lib.getText = TEXT
lib.getText.data = GP:text
the calls in fluid:
<f:cObject typoscriptObjectPath="lib.text" />
{f:cObject(typoscriptObjectPath:'lib.getText')}
The problem at hand has to do with the TCA and its addRecord option, which should save new records to a specific pid configured by ###PAGE_TSCONFIG_ID###. (TYPO3 8.7.24, php 7.2)
The websites extension has a tx_rwfm_domain_model_websitecategory and a tx_rwfm_domain_model_website table, related via a m:m table. The idea is to create website categories and then collect websites, which are assigned to a category. In the BE, the categories (pid=24) as well as the websites (pid=12) have their own folder in the site tree. websitecategory has a multiSelectField to easily select websites and assign them to the category in question. And also "website" has a multiSelectField for categories to easily assign a website to multiple categories.
So far everything is working fine.
Now I bump into this scenario:
I want to add websites to the categories, so I open the websitecategory folder page in list view.
I now realise that the website I want to add has not yet been created.
Instead of closing the websitecategory page, I click on "addRecord" next the multiSelectField of websites (m:m connection)
A new window opens to create the new website, "save and close" brings me back to the websitecategory page, where I can see that the new website was added to the selection list.
The point is: The new website has to be created in its own folder page (pid=12) and NOT on the websitecategory page (pid=24). To do so, there is the property ###PAGE_TSCONFIG_ID###, which I try to configure like this:
// TCA of websitecategory
return [
[...],
'columns' => [
'websites' => [
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'enableMultiSelectFilterTextfield' => true,
'foreign_table' => 'tx_rwfm_domain_model_website',
'foreign_table_where' => 'AND tx_rwfm_domain_model_website.sys_language_uid IN (-1,0) ORDER BY tx_rwfm_domain_model_website.title ASC',
'MM' => 'tx_rwfm_domain_model_website_websitecategory_mm',
'MM_opposite_field' => 'categories',
'fieldControl' => [
'editPopup' => [...],
'addRecord' => [
'disabled' => false,
'options' => [
'setValue' => 'prepend',
'title' => 'Create a new website record',
'table' => 'tx_rwfm_domain_model_website',
'pid' => '###PAGE_TSCONFIG_ID###',
],
],
]
]
]
[...]
]
Following the documentation https://docs.typo3.org/typo3cms/TSconfigReference/8.7/PageTsconfig/TCEform/Index.html?highlight=page_tsconfig_id I add this to my page TSconfig:
// TSconfig
TCEFORM {
tx_rwfm_domain_model_website {
pid.PAGE_TSCONFIG_ID = 12
}
tx_rwfm_domain_model_websitecategory {
pid.PAGE_TSCONFIG_ID = 28
}
}
Unfortunately, this does not work. Instead, TYPO3 tries to add it to [root_level] 0, where the table is not allowed.
However, if I replace ###PAGE_TSCONFIG_ID### in TCA -> addRecord with the hard-coded value of the pid, 12, the website is indeed saved on the proper page folder with pid 12.
How do I have to configue TSconfig to make the saving process work propertly?
Using pid as a table reference before the constant PAGE_TSCONFIG_ID is most likely the wrong field you want to address. So this:
TCEFORM {
tx_rwfm_domain_model_website {
pid.PAGE_TSCONFIG_ID = 12
}
tx_rwfm_domain_model_websitecategory {
pid.PAGE_TSCONFIG_ID = 28
}
}
should become this:
TCEFORM {
tx_rwfm_domain_model_website {
[field_of_related_table].PAGE_TSCONFIG_ID = 12
}
tx_rwfm_domain_model_websitecategory {
[field_of_related_table].PAGE_TSCONFIG_ID = 28
}
}
as far as I read the source code, this only applies to values defined in foreign_table_where.
After fooling around quite some time (actually years!), it finally has become clear to me, that the field you need to assign the PID_TSCONFIG_ID to has to be the one, that acts as the pivot to the m:m relation. Or: the opposite field. The even more confusing thing about that is, that, by definition, the opposite field must only be defined on one side of the relationship. So for the "other side" you need to look at the related table's name and use that one.
In the above example that would mean, that categories has to be used instead of pid:
// TSconfig
TCEFORM {
tx_rwfm_domain_model_website {
categories.PAGE_TSCONFIG_ID = 12
}
tx_rwfm_domain_model_websitecategory {
websites.PAGE_TSCONFIG_ID = 28
}
}
That way, records get saved to their given page ids. Thanks, TYPO3, for providing such a mysterious documentation on that topic! :-(
Will try to improve the docu in that aspect ASAP.
I made an extbase Extension for custom content elements. Since this is my first extension I started with a simple "hello_world_ce". This are my files:
ext_tables.php
<?php
$TCA['tt_content']['types']['hello_world_ce']['showitem'] = '--palette--;LLL:EXT:hello_world/Resources/Private/Language/locallang_mod.xlf:content_element.hello_world.general;general, --palette--;LLL:EXT:hello_world/Resources/Private/Language/locallang_mod.xlf:content_element.hello_world.header;header';
ext_localconf.php
<?php
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig('<INCLUDE_TYPOSCRIPT: source="FILE:EXT:'.$_EXTKEY.'/Configuration/TypoScript/ModWizards.ts">');
ModWizards.ts
mod.wizards {
newContentElement {
wizardItems {
hello_world {
header = LLL:EXT:hello_world/Resources/Private/Language/locallang_mod.xlf:content_tab_header
elements {
hello_world_ce {
icon = gfx/c_wiz/regular_header.gif
title = LLL:EXT:hello_world/Resources/Private/Language/locallang_mod.xlf:content_element.hello_world
description = LLL:EXT:hello_world/Resources/Private/Language/locallang_mod.xlf:content_element.hello_world.description
tt_content_defValues {
CType = hello_world_ce
}
}
}
}
show = *
}
}
}
In the TYPO3 Backend I see my content element and can add it to a page but the dropdown menu for the content type says INVALID VALUE ("hello_world_ce")
What am I missing?
EDIT: I found the missing part. I needed to add my content type to the CType array
ext_tables.php
$backupCTypeItems = $GLOBALS['TCA']['tt_content']['columns']['CType']['config']['items'];
$GLOBALS['TCA']['tt_content']['columns']['CType']['config']['items'] = array(
array(
'LLL:EXT:'.$_EXTKEY.'/Resources/Private/Language/locallang_mod.xlf:content_tab_header',
'--div--'
),
array(
'LLL:EXT:'.$_EXTKEY.'/Resources/Private/Language/locallang_mod.xlf:content_element.hello_world',
'hello_world_ce',
'i/tt_content_header.gif'
)
);
foreach($backupCTypeItems as $key => $value){
$GLOBALS['TCA']['tt_content']['columns']['CType']['config']['items'][] = $value;
}
The question was edited, but I think there is a better way to achieve the solution.
Only to be clear about the problem:
The content element hello_world_ce was not added to the "types" dropdown by adding a new content element.
The hint in the question is correct it was not defined for the CType field.
But instead of manipulating the array you could use a core function:
// Adds the content element to the "Type" dropdown
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPlugin(
array(
'LLL:EXT:your_extension_key/Resources/Private/Language/locallang_mod.xlf:content_element.hello_world',
'hello_world_ce',
'i/tt_content_header.gif'
),
'CType',
'your_extension_key'
);
Here is a very good example of how to add your own content element in the version TYPO3 7.6.
Note: This function is accessible in TYPO3 6.2 as well.
I have created a content type with an associated image field.
Each user is able to see a list of all the nodes of this content type and should be able to upload a new image in the appropriate field.
I've tried many solutions, but in the end I'm trying with a form and managed files.
In the page with the list of all the nodes I'm creating a lightbox with a form for each node.
Each form is created like this:
function coverupload_form($form, &$form_state, $uid, $relid) {
$form['#attributes']['id'] = 'coverup-'.$relid;
$form_state['storage']['rid'] = $relid;
$cliente = cataloghi_user_edit_get_cliente($uid);
$release = node_load($relid);
$form['cover'] = array(
'#title' => 'Carica la cover per la release '.$release->title,
'#description' => 'I file caricati devono avere estensione \'.jpeg\', risoluzione di 1440x1440 e dimensione massima di 5MB',
'#type' => 'managed_file',
'#upload_location' => 'public://clienti/'.$cliente->title.'/cover',
'#upload_validators' => array(
'file_validate_extensions' => array('jpeg, jpg'),
// Pass the maximum file size in bytes
'file_validate_size' => array(5*1024*1024),
'file_validate_image_resolution' =>array('1440x1440', '1440x1440'),
),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('CARICA'),
);
return $form;
}
function coverupload_form_submit($form, &$form_state) {
$file = file_load($form_state['values']['cover']);
// Change status to permanent.
$file->status = FILE_STATUS_PERMANENT;
// Save.
file_save($file);
$nodo = node_load($form_state['storage']['rid']);
$nodo->field_release_copertina['und'][0] = (array)$file;
if($nodo = node_submit($nodo)) { // Prepare node for saving
node_save($nodo);
}
}
All the forms have display: none, and when the user click on the cover upload button only the corresponding form is showed in the lightbox.
Well, everything works fine when the image is validated.
The problems start when the image is not validated (like if it's below 1440x1440px).
If I check the lightbox with the inspector, the correct number of forms is generated but they all refer to the same node (so they all have id 'coverup-17' for example).
I have checked everything, and it seems like I pass the correct values to the form everytime, so I'm starting to think that it may be a problem connected with my poor understanding of forms.
Would it be better to try a different type of approach?
Thanks and sorry for if this is a bit messy...
I managed to solve the problem.
It depended on the fact that I had multiple instances of the same form on the same page.
I implemented hook_forms().
function mymodule_forms($form_id, $args) {
$forms = array();
if(strpos($form_id, 'coverupload_form_') === 0) {
$forms[$form_id] = array(
'callback' => 'coverupload_form',
'callback arguments' => array($args[0], $args[1]),
);
}
return $forms;
}
and then I changed my form call to
drupal_render(drupal_get_form('coverupload_form_'.$relid, $arg1, $arg2));
In an eID script I want to render all the content elements of a specific page with the function cObjGetSingle but it gives me an empty string? My code:
tslib_eidtools::connectDB(); //Connect to database
$cObj = t3lib_div::makeInstance('tslib_cObj');
$conf['tables'] = 'tt_content';
$conf['source'] = "551";
$conf['dontCheckPid'] = 1;
return $cObj->cObjGetSingle('RECORDS', $conf);
EDIT: There is a problem in class.tslib_content.php in the function cObjGetSingle? The function doesn't get executed because there is a crazy recursion loop check? The code:
// Checking that the function is not called eternally. This is done by interrupting at a depth of 100
$GLOBALS['TSFE']->cObjectDepthCounter--;
if ($GLOBALS['TSFE']->cObjectDepthCounter > 0) {
$name = trim($name);
When I call cObjGetSingle $GLOBALS['TSFE']->cObjectDepthCounter is null and after the check it's -1 so the function kills the loop. But why?
Edit 2: This doesn't solve the problem either: http://lists.typo3.org/pipermail/typo3-dev/2007-August/024497.html? Here is my conf-Array:
$conf = array (
'tables' => 'tt_content',
'source' => "551",
'dontCheckPid' => 1,
"conf." => array (
"tt_content" => "TEXT",
"tt_content." => array (
"field" => 'uid'
),
)
);
Edit 3: According to the post I'm not sure if it is a USER_INT / COA_INT or caching problem because the page I use this is uncached and I want to use an eID (ajax) function to render my content object??? I'm not sure how I can debug this?
Edit 4: Maybe the solutions is to create a cObj? http://www.mneuhaus.com/2008/12/05/function-to-make-a-cobj-in-typo3/????
Edit 5: Here is another shorter version: http://sebastiaandejonge.com/blog/articles/2010/september/21/bringing-ajax-to-your-frontend-plugins/?
You are missing a rendering definition below conf!
Have a look into tt_content at TSOB. On a normal page, this is there. Now you have to do it manually.