Author
|
Message
|
Luc Chase
|
Saturday 16 September 2006 7:54:49 pm
Have two objects <b>sharing the same keyword</b>, yet the related_ojects attribute is false for both. How can this be? In <b>both</b> cases {$node.data_map.keywords.content|attribute(show)}
outputs...
Attribute Type Value
keywords array Array(1)
>0 string 'Canada'
keyword_string string 'Canada'
related_objects boolean false
related_nodes boolean false
The Web Application Service Provider
|
Claudia Kosny
|
Wednesday 20 September 2006 1:08:36 pm
Hello Luc
For the moment just a few questions:
What version of EZ do you use?
What classes do the two objects in question have? If you make a copy of one of the objects - do the two copies see each other as related? Greetings from Luxembourg Claudia
|
Luc Chase
|
Wednesday 20 September 2006 3:15:40 pm
Claudia,
What version of EZ do you use? 3.7.9
What classes do the two objects in question have? One is similar to Article but with the 'keywords' attribute added and the other is a custom class called Country which also includes the 'keywords' attribute.
If you make a copy of one of the objects - do the two copies see each other as related? No. It looks to me that there is also a possible bug in the template code that displays relations in the admin siteaccess... but when I amend it, it seems to make no difference.
{set list_items=fetch_alias( children, hash( parent_node_id, $node.node_id,
offset, $view_parameters.offset,
attribute_filter, $time_filter,
sort_by, $node.sort_array,
limit, $page_limit ) )}
{foreach $list as $element} /* MAYBE THIS SHOULD BE foreach $list_items as $element ? */
{$element.link_object.name|wash} ({$element.keyword|wash}) <br />
{/foreach}
The Web Application Service Provider
|
Claudia Kosny
|
Friday 22 September 2006 3:42:16 pm
Hello Luc I played around with it a bit and it seems that for classes to be related via keywords they must be of the same type. They also kind of mention this in the docu here http://ez.no/doc/ez_publish/technical_manual/3_8/reference/datatypes/keywords but it is not very clear. When you try a fetch for 'content' 'keyword' you nevertheless get all objects sharing this keyword, no matter the classtype they have. But what I find really puzzling is that the two copies of the same object (or rather the original and the copy) do not see each other as related. For me (Ez 3.8.4) that worked just fine. If you know a bit about SQL I would suggest having a look at the ezkeyword tables to see whether there are any entries corresponding to your objects. Aaprt from that I unfortunately do not know what to do... Greetings from Luxembourg Claudia
|
Luc Chase
|
Saturday 23 September 2006 2:42:09 am
Claudia,
thanks for your reply. I had already checked the table before my post and they seem to be in order with correct records in the cross-reference table, etc. - don't remember the name of the two tables involved but it looked correct. I had tried the fetch function but it did not return any values for me. Could you please post the fetch code you used that worked so I can try again?
The Web Application Service Provider
|
Claudia Kosny
|
Saturday 23 September 2006 11:27:40 am
Hello Luc
here is my test setup:
all nodes have the same keyword 'fate'
nodes 90 and 91 are of the class nodes 92 and 93 are of the same class
{* this returns all four entries *}
{def $sameKeywordsArr = fetch('content', 'keyword', hash('alphabet', 'fate'))}
{foreach $sameKeywordsArr as $keywordObj}
{$keywordObj.link_object.name} - {$keywordObj.link_object.node_id}<br /> {/foreach}
{* now check each node on its own *}
{def $node90 = fetch('content', 'node', hash('node_id', 90))
$node91 = fetch('content', 'node', hash('node_id', 91))
$node92 = fetch('content', 'node', hash('node_id', 92))
$node93 = fetch('content', 'node', hash('node_id', 93))}
{* returns 91 *}
{$node90.data_map.keywords.content.related_nodes[0].node_id}
{* returns 90 *} {$node91.data_map.keywords.content.related_nodes[0].node_id}
{* returns 93 *}
{$node92.data_map.keywords.content.related_nodes[0].node_id}
{* returns 92 *} {$node93.data_map.keywords.content.related_nodes[0].node_id}
You might also want to check the SQL-output generated by the retrieving of the keyword attribute.
A good way to this lik this:
{def $dataMap = $node93.data_map}
{debug-timing-point id="foobar"}
{$dataMap.keywords.content.related_nodes[0].node_id} {/debug-timing-point} Then just have a look at the queries between the start and the end of the timing point. Greetings from Luxembourg Claudia
|
Luc Chase
|
Saturday 23 September 2006 2:24:33 pm
Claudia,
although I could not get any value from {$node91.data_map.keywords.content.related_nodes[0].node_id}
The preceeding code worked fine and produced a list of nodes with keywords in common, but.... mysteriously it doesn't work any longer. I now get a SQL syntax error.
{def $sameKeywordsArr = fetch( 'content', 'keyword', hash( 'alphabet', 'uk' ) ) }
{foreach $sameKeywordsArr as $keywordObj}
{$keywordObj.link_object.name} - {$keywordObj.link_object.node_id} <br/>
{/foreach}
returns this error...
Query error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') or () or ())
AND ezcontentclass.version=0
' at line 4. Query: SELECT ezkeyword.keyword,ezcontentobject_tree.node_id
FROM ezkeyword, ezkeyword_attribute_link,ezcontentobject_tree,ezcontentobject,ezcontentclass, ezcontentobject_attribute
WHERE ezkeyword.keyword LIKE 'uk%'
AND (() or () or ())
AND ezcontentclass.version=0
AND ezcontentobject.status=1
AND ezcontentobject_attribute.version=ezcontentobject.current_version
AND ezcontentobject_tree.main_node_id=ezcontentobject_tree.node_id
AND ezcontentobject_attribute.contentobject_id=ezcontentobject.id
AND ezcontentobject_tree.contentobject_id = ezcontentobject.id
AND ezcontentclass.id = ezcontentobject.contentclass_id
AND ezcontentobject_attribute.id=ezkeyword_attribute_link.objectattribute_id
AND ezkeyword_attribute_link.keyword_id = ezkeyword.id ORDER BY ezkeyword.keyword ASC
weird.
The Web Application Service Provider
|
Luc Chase
|
Saturday 23 September 2006 3:31:23 pm
Now it's working again. Same code. All I did was clear cache again. Looks like the $node.data_map.keywords.content.related_objects and $node.data_map.keywords.content.related_nodes have nothing to do with keyword relations, but are only concerned with explicit relations through the relation or relations attribute type.
The Web Application Service Provider
|
Claudia Kosny
|
Sunday 24 September 2006 12:00:31 pm
Hi Luc
Looks like the $node.data_map.keywords.content.related_objects and $node.data_map.keywords.content.related_nodes have nothing to do with keyword relations, but are only concerned with explicit relations through the relation or relations attribute type.
This is definitely not the case for me, the nodes/objects in my example did not have any other relations at all so the relation was only created by the shared keyword. The part in your SQL statement that caused problems is usually related to permission and owner checking so you might want to try whether it makes any difference if you are logged in as admin or not. Also make sure (at least for testing) that the objects that should be related via keywords do not have different access permissions and are in the same section. Actually I just realised that I do not know the version of EZ you use. If it is an older version you might want to test your setup on the newest version - maybe the problem was fixed meanwhile. In case it helps find below the sql output I get when I do the following:
{def $node93 = fetch('content', 'node', hash('node_id', 93))}
{def $dataMap = $node93.data_map}
{debug-timing-point id="foobar"}
{$dataMap.keywords.content.related_nodes}
{/debug-timing-point}
debug-timing-point START: foobar
Notice: eZMySQLDB::query(1 rows, 2.846 ms) query number per page:4 Sep 24 2006 19:59:17
SELECT ezkeyword.keyword FROM ezkeyword_attribute_link, ezkeyword
WHERE ezkeyword_attribute_link.keyword_id=ezkeyword.id AND
ezkeyword_attribute_link.objectattribute_id='352'
Notice: eZMySQLDB::query(1 rows, 1.366 ms) query number per page:5 Sep 24 2006 19:59:17
SELECT * FROM ezkeyword_attribute_link
WHERE objectattribute_id='352'
Notice: eZMySQLDB::query(1 rows, 1.969 ms) query number per page:6 Sep 24 2006 19:59:17
SELECT DISTINCT ezcontentobject_attribute.contentobject_id FROM ezkeyword_attribute_link, ezcontentobject_attribute
WHERE keyword_id IN ( 28 ) AND
ezcontentobject_attribute.id = ezkeyword_attribute_link.objectattribute_id
AND objectattribute_id <> '352'
Notice: eZMySQLDB::query(1 rows, 1.967 ms) query number per page:7 Sep 24 2006 19:59:17
SELECT ezcontentobject.*,
ezcontentobject_tree.*,
ezcontentclass.name as class_name
FROM ezcontentobject_tree,
ezcontentobject,
ezcontentclass
WHERE ezcontentobject_tree.contentobject_id in ( 92 ) AND
ezcontentobject_tree.main_node_id = ezcontentobject_tree.node_id AND
ezcontentobject_tree.contentobject_id=ezcontentobject.id AND
ezcontentclass.version=0 AND
ezcontentclass.id = ezcontentobject.contentclass_id
Timing: Sep 24 2006 19:59:17
debug-timing-point END: foobar
Don't forget that for the related_nodes to work, the objects must have the same class. Good luck Claudia
|
Luc Chase
|
Wednesday 27 September 2006 2:35:54 am
Claudia, I'm still working on this. But wondering if anyone has used the new (?) related_view_gui template function. Will need to sort and group my related objects and maybe related_view_gui may help with that.
The Web Application Service Provider
|