Wednesday 28 March 2007 10:47:56 am
Hi Fabien First make sure that you set the serialize_supported flag of your datatype to true when you call its parents constructor. I doubt this is really necessary because it doesn't seem to be used somewhere except in the default implementation of serializeContentClassAttribute() in eZDatatype which is pretty useless. Example from ezauthor:
$this->eZDataType( EZ_DATATYPESTRING_AUTHOR, ezi18n( 'kernel/classes/datatypes', "Authors", 'Datatype name' ),
array( 'serialize_supported' => true ) );
Afterwards, there are two ways to get your content serialized and unserialized: <b>a</b> Let the parent class serialize and unserialize the content by specifying a mapping between attribute database fields and xml elements with the object_serialize_map key. Example from ezboolean:
$this->eZDataType( EZ_DATATYPESTRING_BOOLEAN, ezi18n( 'kernel/classes/datatypes', "Checkbox", 'Datatype name' ),
array( 'serialize_supported' => true,
'object_serialize_map' => array( 'data_int' => 'value' ) ) );
<b>b</b> Implement the functions serializeContentObjectAttribute and unserializeContentObjectAttribute. Example from ezauthor, this datatype already stores its value as xml in the database:
/*!
\reimp
\param package
\param content attribute
\return a DOM representation of the content object attribute
*/
function serializeContentObjectAttribute( &$package, &$objectAttribute )
{
$node = $this->createContentObjectAttributeDOMNode( $objectAttribute );
$xml = new eZXML();
$domDocument = $xml->domTree( $objectAttribute->attribute( 'data_text' ) );
$node->appendChild( $domDocument->root() );
return $node;
}
/*!
\reimp
\param package
\param contentobject attribute object
\param ezdomnode object
*/
function unserializeContentObjectAttribute( &$package, &$objectAttribute, $attributeNode )
{
$rootNode = $attributeNode->firstChild();
$objectAttribute->setAttribute( 'data_text', $rootNode->toString( 0 ) );
}
To do the same for the class attribute content, implement serializeContentClassAttribute and unserializeContentClassAttribute. Example from ezboolean:
/*!
\reimp
*/
function serializeContentClassAttribute( &$classAttribute, &$attributeNode, &$attributeParametersNode )
{
$defaultValue = $classAttribute->attribute( 'data_int3' );
$attributeParametersNode->appendChild( eZDOMDocument::createElementNode( 'default-value',
array( 'is-set' => $defaultValue ? 'true' : 'false' ) ) );
}
/*!
\reimp
*/
function unserializeContentClassAttribute( &$classAttribute, &$attributeNode, &$attributeParametersNode )
{
$defaultValue = strtolower( $attributeParametersNode->elementTextContentByName( 'default-value' ) ) == 'true';
$classAttribute->setAttribute( 'data_int3', $defaultValue );
}
independent eZ Publish developer and service provider | http://blog.coomanskristof.be | http://ezpedia.org
|