Forums / Developer / [Solved] Modify/Update objects from PHP

[Solved] Modify/Update objects from PHP

Author Message

Damien MARTIN

Wednesday 20 January 2010 2:14:41 am

Hi there,

I would like to know how can we do, to modify existing objects directly in PHP ?

To create Nodes It's really simple using eZContentFunctions::createAndPublishObject (thanks to Damien Pobel for the tip : http://pwet.fr/blog/comment_creer_des_objets_ez_publish_en_php )

Is there a simple way to update nodes like this ?

Otherwise, does someone have a method to do that ?

I need to update selected fields in my class and to store my modifications.

It is for a cronjob.

Thanks,

Damien

Gaetano Giunta

Wednesday 20 January 2010 3:01:04 am

take a look at data import extension - it has very clean code to do that

Principal Consultant International Business
Member of the Community Project Board

Damien MARTIN

Wednesday 20 January 2010 5:51:29 am

Thank you Gaetano,

Thanks to ImportOperator::save_eZ_attribute, I discovered what I was waited for :

$contentObjectAttribute->fromString( $value );
$contentObjectAttribute->store();

Where $contentObjectAttribute is retrieved from :

$object->DataMap();

after a simple :

$object = eZContentObject::fetchByNodeID($node_id);

The values are correctly updated !

Thank you again.

Laurent Dorier

Monday 25 January 2010 12:52:46 am

Hello,

I'm trying to do the same (not for a cronjob but for an eZ extension) but unsuccesful...

$object= eZContentObject::fetchByNodeID($node_id);
$dataMap = $object->dataMap();
$contentObjectAttribute = ImportOperator::save_eZ_attribute($dataMap['MyObject_relation_list']);
$value = '206-207-213';
$contentObjectAttribute->fromString( $value );
$contentObjectAttribute->store();

I get:

Non-static method ImportOperator::save_eZ_attribute() should not be called statically

Someone can help ?

Damien MARTIN

Monday 25 January 2010 1:12:44 am

Hi Laurent,

I have not used directly the classes from the extensions but I have extract it to my own class.

save_eZ_attribute is not static so, you should call it from an ImportOperator instance :

function save_eZ_attribute( $contentObjectAttribute )

Otherwise, this my version of the method :

/**
 * Sauve un attribut eZ d'un objet avec une nouvelle valeur.
 * Cette méthode à l'avantage de gérer complétement les ObjectRelations et les RelationList.
 * \arg $contentObjectAttribute Pointeur sur un attribut d'un objet
 * \arg $value La valeur au format TXT
 * \author Mugo Web Copyright (C) 2008 => extension data_import (http://projects.ez.no/data_import)
 */
function save_eZ_attribute( $contentObjectAttribute, $value )
{
    
    switch( $contentObjectAttribute->attribute( 'data_type_string' ) )
    {
        case 'ezobjectrelation':
        {
            // Remove any exisiting value first from ezobjectrelation
            /*
            eZContentObject::removeContentObjectRelation( $contentObjectAttribute->attribute('data_int'),
                                                          $this->current_eZ_object->attribute('current_version'),
                                                          $this->current_eZ_object->attribute('id'),
                                                          $contentObjectAttribute->attribute('contentclassattribute_id')
                                                          );
            */
            $contentObjectAttribute->setAttribute( 'data_int', 0 );
            $contentObjectAttribute->store();
            
        }
        break;
        
        case 'ezobjectrelationlist':
        {
            // Remove any exisiting value first from ezobjectrelationlist
            
            $content = $contentObjectAttribute->content();
            $relationList =& $content['relation_list'];
            $newRelationList = array();
            for ( $i = 0; $i < count( $relationList ); ++$i )
            {
                $relationItem = $relationList[$i];
                eZObjectRelationListType::removeRelationObject( $contentObjectAttribute, $relationItem );
            }
            $content['relation_list'] =& $newRelationList;
            $contentObjectAttribute->setContent( $content );
            $contentObjectAttribute->store();
            
        }
        break;
    }
    
    // fromString returns false - even when it is successfull
    // create a bug report for that
    $contentObjectAttribute->fromString( $value );
    $contentObjectAttribute->store();
    
}

I hope this will help you.

Damien

Laurent Dorier

Monday 25 January 2010 1:54:38 am

Thanks a lot Damien,

working like a charm. :)

But finally... I do it without this extension using the eZContentObject class...
Thanks anyway for your very fast answer.