Forums / Developer / Fetch and filter on object relations

Fetch and filter on object relations

Author Message

Koutouan Emmanuel

Wednesday 29 October 2008 5:00:02 am

Hi ,
I have a class with a attribute of type "Object relations" (I can link multiples objects)) and I want to fetch all items of my class on a unique object.
My class is news with an attribute Theme (list of themes).
I want to get all the news of the theme "Cinema".

My fecth :
set $children=fetch_alias( 'children', hash( 'parent_node_id', $node.node_id,
'offset', $view_parameters.offset,
'sort_by', $node.sort_array,
'class_filter_type', 'exclude',
'class_filter_array', $classes,
'limit', $page_limit,
'attribute_filter', array( array( 'news/theme','=',231))
) )

the id of the node object used is 231 for a test.

But I have no results.
I read the doc (http://ez.no/doc/ez_publish/technical_manual/4_0/reference/modules/content/fetch_functions/list)
and the example :
{fetch( 'content',
'list',
hash( 'parent_node_id', 42,
'attribute_filter', array( array( 'article/image',
'=',
87 ) ) ) )}

But it doesn't work in my case.

Anybody with the same problems ?
Any ideas ?

I

justin kazadi

Wednesday 29 October 2008 5:53:53 am

hello,
you can get all the objects related to an attribute of an object by using this:


{foreach $node.data_map.name_of_attribute(theme).content.relation_list as $name}

{$name}
{/foreach}

where

$node

is your current node.

The theory is when we know everything and nothing works.
The practice is when everything works and nobody knows why.
If the practice and theory are met, nothing works and we do not know why.

Albert Einstein

Koutouan Emmanuel

Tuesday 04 November 2008 7:31:34 am

Thanks for you answer.

But we want the exact opposite.

Grégory BECUE

Thursday 20 November 2008 12:55:20 pm

Hi Emmanuel,

It's not possible to use an attribute_filter on an objet relationS ... but it's possible on an objet relation (single select).

You can read this :
http://ez.no/developer/forum/developer/attribute_filter_on_object_relations_datatype

Perhaps you can use related_objects fetch ... i don't know your project.
Greg

Grégory BECUE

Friday 21 November 2008 12:54:49 pm

Hi Emmanuel,

After few tests, it's possible to fetch items with object relationS parameters. You must to create an extended attribute filter ! it's not possible with a classic fetch !

I have found this : http://ez.no/developer/contribs/datatypes/enhanced_object_relation_filter
It's nice ; i have made a test and all is ok for me.

With this extension (it's an extended attribute filter), you can make your fetch.

Greg

Grégory BECUE

Friday 21 November 2008 1:58:02 pm

Just an add-on ...

If you want to search about items with object relation X or Y ... it's not possible with the previous extension (http://ez.no/developer/contribs/datatypes/enhanced_object_relation_filter ; very good work) but you can search about items with object relation X and Y ...

I have modified the main class :
line 40, file 'eorfilter.php'

        // multiple objects ids
        if ( is_array($param[1]) )
        {
	    // Treatment for 'and' parameters
            if($param[2] == 'and')
            {            	
		foreach( $param[1] as $objectId )
		{
			if ( is_numeric( $objectId ) )
			{
			    $tableName = 'eor_link_' . $objectId;
			    $tables[] = 'ezcontentobject_link ' . $tableName;
			
			    $joins[]  = $tableName . '.from_contentobject_id = ezcontentobject.id';
			    $joins[]  = $tableName . '.from_contentobject_version = ezcontentobject.current_version';
			    $joins[]  = $tableName . '.contentclassattribute_id = ' . $classAttributeId;
			    $joins[]  = $tableName . '.to_contentobject_id = ' . $objectId;
			}
		}
	     }
	     elseif($param[2] == 'or') 
	     {
	     	// Treatment for 'or' parameters
	    	$cpt = 0;
		$chaineCritere = "(";
		foreach( $param[1] as $objectId )
		{
			if ( is_numeric( $objectId ) )
			{
				if($cpt == 0)
				{	
					$tableName = 'eor_link_' . $objectId;
					$tables[] = 'ezcontentobject_link ' . $tableName;
					
					$joins[]  = $tableName . '.from_contentobject_id = ezcontentobject.id';
					$joins[]  = $tableName . '.from_contentobject_version = ezcontentobject.current_version';
					$joins[]  = $tableName . '.contentclassattribute_id = ' . $classAttributeId;
					
					$chaineCritere .= $tableName . '.to_contentobject_id = ' . $objectId;
				}
			    	else
			    	{
			    		$chaineCritere .= ' or '.$tableName . '.to_contentobject_id = ' . $objectId;	
			    	}	
			}
			
			$cpt++;
		}	     	
	     	
	     	$joins[]  = $chaineCritere.")";
	     }
	     
        }


Now, it's possible to make an OR or AND search.

 
	{def $listeOffre = fetch(content, list, hash(
	'parent_node_id', 81,
        'extended_attribute_filter', hash(
                              		'id', 'eorfilter',
                              		'params', array(
                              			array('offre_emploi/pays', array(99,100,928), 'or'),
                              			array('offre_emploi/niveau', array(97,98), 'or')
                              			)
                          )))}

Greg

Simon Boyer

Wednesday 13 July 2011 8:15:16 am

Hi,

I added a new extension based on the previous extension (enhanced_object_relation_filter) and the previous Grégory Becue's post (good work) :

http://projects.ez.no/oworfilter

This extension provides an extended attribute filter to use with fetch functions, supporting basic logical operators and multiple class attributes.

--
Developer at Open Wide