[TYPO3-mvc] Respect storage page ignored on object properties
Thomas "Thasmo" Deinhamer
thasmo at gmail.com
Fri May 28 00:51:02 CEST 2010
Hello Jochen, thanks a lot for your reply!
Applying your patch doesn't change the resultset.
The query which is missing the storage page
condition is this, where 'tx_hypestore_relation_category_product' is a
MM table:
==================================================
Array
(
[keywords] => Array
(
)
[tables] => Array
(
[tx_hypestore_relation_category_product] =>
tx_hypestore_relation_category_product
)
[unions] => Array
(
[tx_hypestore_domain_model_product] => LEFT JOIN
tx_hypestore_domain_model_product ON
tx_hypestore_relation_category_product.uid_local =
tx_hypestore_domain_model_product.uid
)
[fields] => Array
(
[tx_hypestore_relation_category_product] =>
tx_hypestore_domain_model_product.*
)
[where] => Array
(
[0] => tx_hypestore_relation_category_product.uid_foreign = ?
)
[additionalWhereClause] => Array
(
[0] => (tx_hypestore_domain_model_product.type='default' OR
tx_hypestore_domain_model_product.type='apparel' OR
tx_hypestore_domain_model_product.type='book' OR
tx_hypestore_domain_model_product.type='car')
[1] => tx_hypestore_domain_model_product.deleted=0 AND
tx_hypestore_domain_model_product.hidden=0 AND
tx_hypestore_domain_model_product.starttime<=1274999580 AND
(tx_hypestore_domain_model_product.endtime=0 OR
tx_hypestore_domain_model_product.endtime>1274999580) AND
(tx_hypestore_domain_model_product.fe_group='' OR
tx_hypestore_domain_model_product.fe_group IS NULL OR
tx_hypestore_domain_model_product.fe_group='0' OR
(tx_hypestore_domain_model_product.fe_group LIKE '%,0,%' OR
tx_hypestore_domain_model_product.fe_group LIKE '0,%' OR
tx_hypestore_domain_model_product.fe_group LIKE '%,0' OR
tx_hypestore_domain_model_product.fe_group='0') OR
(tx_hypestore_domain_model_product.fe_group LIKE '%,-1,%' OR
tx_hypestore_domain_model_product.fe_group LIKE '-1,%' OR
tx_hypestore_domain_model_product.fe_group LIKE '%,-1' OR
tx_hypestore_domain_model_product.fe_group='-1'))
[2] => tx_hypestore_domain_model_product.sys_language_uid
IN (0,-1)
)
[orderings] => Array
(
[0] =>
tx_hypestore_relation_category_product.sorting_foreign ASC
)
[limit] => Array
(
)
)
==================================================
As you can see inside "[additionalWhereClause]" the condition for the
storage pages are still missing.
Also note, that the actual table beeing queried is the MM table, but in
the end the query should fetch all fields of the table
'tx_hypestore_domain_model_product'.
To clarify my situation a bit more:
There are global objects of class 'Category' which are stored in a
seperate sysfolder. Then I got several page-trees, which all relate to
one domain each. Each tree/domain has it's own sysfolder with objects of
class 'Product' which can be assigned to the global categories. The
content plugin - lets call it 'Shop' - is inserted on every of the
trees/domains seperately and SHOULD display all categories and the
products within - but ONLY the products which are stored on the same
tree/domains.
Let's expect this pages:
[10] Global Categories
[20] Domain J
[21] Products J
[22] Shop J
[30] Domain R
[31] Products R
[32] Shop R
When I now insert the Shop plugin on page [22] and configure the storage
page to be "21,10" then it will list all categories BUT also the
products from this categories which are stored on [31] which is imho bad
- I only want to display products from [21].
This only happens when using $category->getProducts() but NOT when using
the product repository. But I have to use the object property to loop
throu all categories and (sub-loop) all products of each category.
Hopefully it's clear now what the problem is, and I really think that
the actual situation is not the best. If someone wants to show ALL
related objects of one object, he should configure the storage page to a
global parent page and set recursive to 99 to get all objects returned.
I think setting/defining storage pages is a planned process when
creating websites, so the sysfolders/pages where objects are stored, are
well known from beginning - it's not like someone doesn't know the page
uids beforehand and thus wants to return the objects without respecting
the storage pages. But if so, someone should just define a
superglobal/root page uid as storage page.
I'd really like to see this fixed and I would provide a patch, but if
I'd ever find out how to do it, it will be a mess of a code. So I really
appreciate your (in sense of you all) help on this.
Thanks a lot,
Thomas
Am 28.05.2010 00:06, schrieb Jochen Rau:
> Hi Thomas,
>
> sorry for jumping into this discussion late. After the the T3CON in
> Dallas I had to proof read the Extbase/Fluid book first.
>
> On 27.05.10 18:31, Thomas "Thasmo" Deinhamer wrote:
>> Okay, I think I found the place where things are either not yet
>> implemented or just not working correctly.
>>
>> In file 'Typo3DbBackend.php' on line 752 in the method
>> 'addAdditionalWhereClause' the query settinsg are checked if the storage
>> page should be set or not. If, then the method 'addPageIdStatement' on
>> line 802 is called which adds the storage pid restriction. But for MM
>> tables it won't do this, because there's an if statement, checking some
>> conditions of the TCA, where MM tables won't pass because they don't
>> match a specific TCA configuration.
>>
>> So I think in the method 'addPageIdStatement' there should be the logic
>> to check if the table is a MM table, and if so, the origin-table should
>> be determined and then it's possible to add the correct where clause.
>>
>> I'm not 100% sure if this will work, but I think it's the problem when
>> querying MM tables with a LEFT JOIN, but fetching the fields of the
>> origin table.
>>
>> Any idea how to extend the method to enable a storage page for left
>> joins?
>
> Fetching *related* records ignoring the PID is the intended behavior
> atm. Somebody must have consciously assigned this object to its parent.
> So I agree to Sebastian here. But this doesn't mean that we are right.
> IMO the whole PID topic is worth to be discussed again to improve or at
> least to clarify the things.
>
> The described behavior is determined in the DataMapper in line 357 as
> you already pointed out:
>
> $query->getQuerySettings()->setRespectStoragePage(FALSE);
>
> You already changed the argument to TRUE (or uncommented the line). And
> here you encountered an issue (thanks for that). The PID constraint was
> not added as it should have been. The issue should be fixed by applying
> the (hopefully) attached patch. Would you mind to test it?
>
> Regards
> Jochen
More information about the TYPO3-project-typo3v4mvc
mailing list