static function initialize()
 {
     $contentINI = eZINI::instance('content.ini');
     foreach (array_unique($contentINI->variable('EditSettings', 'ExtensionDirectories')) as $extensionDirectory) {
         $fileName = eZExtension::baseDirectory() . '/' . $extensionDirectory . '/content/' . $extensionDirectory . 'handler.php';
         if (file_exists($fileName)) {
             include_once $fileName;
             $className = $extensionDirectory . 'Handler';
             $storeActionList = call_user_func_array(array($className, 'storeActionList'), array());
             foreach ($storeActionList as $storeAction) {
                 eZContentObjectEditHandler::addStoreAction($storeAction);
             }
         } else {
             eZDebug::writeError('Cound not find content object edit handler ( defined in content.ini ) : ' . $fileName);
         }
     }
 }
 function publishObjectExtensionHandler($contentObjectID, $contentObjectVersion)
 {
     eZContentObjectEditHandler::executePublish($contentObjectID, $contentObjectVersion);
 }
    $validatedAttributes = $validationResult['validated-attributes'];
    $inputValidated = $validationResult['input-validated'];

    // Fixup input
    if ( $validationResult['require-fixup'] )
        $object->fixupInput( $contentObjectAttributes, $attributeDataBaseName );

    $validation['custom_rules'] = array();
    $customValidationResult = eZContentObjectEditHandler::validateInputHandlers( $Module, $class, $object, $version, $contentObjectAttributes, $EditVersion, $EditLanguage, $FromLanguage, $validationParameters );
    if ( $customValidationResult['warnings'] )
        $validation['custom_rules'] = $customValidationResult['warnings'];

    $inputValidated = ( $inputValidated && $customValidationResult['validated'] );

    // Check extension input handlers
    eZContentObjectEditHandler::executeInputHandlers( $Module, $class, $object, $version, $contentObjectAttributes, $EditVersion, $EditLanguage, $FromLanguage );

    // If no redirection uri we assume it's content/edit
    if ( !isset( $currentRedirectionURI ) )
        $currentRedirectionURI = $Module->redirectionURI( 'content', 'edit', array( $ObjectID, $EditVersion, $EditLanguage ) );

    $fetchResult = $object->fetchInput( $contentObjectAttributes, $attributeDataBaseName,
                                        $customActionAttributeArray,
                                        array( 'module' => $Module,
                                               'current-redirection-uri' => $currentRedirectionURI ) );
    $attributeInputMap = $fetchResult['attribute-input-map'];
    if ( $Module->isCurrentAction( 'Discard' ) )
        $inputValidated = true;

    // If an input is invalid, prevent from redirection that might be set by a custom action
    if ( !$inputValidated && $Module->exitStatus() == eZModule::STATUS_REDIRECT )
 /**
  * Save the draft with the provided POST fields like a click on the Store
  * draft button except that a validation issue on an attribute does not
  * prevent the others attributes to be stored.
  *
  * @param array $args array( content object id, version number, locale code )
  * @return array
  */
 public static function saveDraft($args)
 {
     // force text/plain to make IE happy...
     header('Content-Type: text/plain', true);
     $result = array('unvalidated-attributes' => array(), 'stored-attributes' => array(), 'valid' => true);
     $http = eZHTTPTool::instance();
     // workaround to the eZContentObjectEditHandler API that needs a Module
     $Module = false;
     if (count($args) != 3) {
         throw new InvalidArgumentException(ezpI18n::tr('extension/ezautosave/autosave', 'This action requires 3 parameters'));
     }
     if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
         throw new InvalidArgumentException(ezpI18n::tr('extension/ezautosave/autosave', "A POST request is expected"));
     }
     if (count($_POST) === 0) {
         throw new InvalidArgumentException(ezpI18n::tr('extension/ezautosave/autosave', "No POST data found, it's probably because you tried to upload a too big file"));
     }
     $contentObject = eZContentObject::fetch((int) $args[0]);
     if (!$contentObject instanceof eZContentObject) {
         throw new InvalidArgumentException(ezpI18n::tr('extension/ezautosave/autosave', 'Unable to load the content #%objectid', null, array('%objectid' => (int) $args[0])));
     }
     if ($contentObject->attribute('status') == eZContentObject::STATUS_ARCHIVED) {
         throw new InvalidArgumentException(ezpI18n::tr('extension/ezautosave/autosave', 'The content #%objectid is archived', null, array('%objectid' => $contentObject->attribute('id'))));
     }
     $version = $contentObject->version((int) $args[1]);
     if (!$version instanceof eZContentObjectVersion) {
         throw new InvalidArgumentException(ezpI18n::tr('extension/ezautosave/autosave', 'Unable to load version #%versionr of content #%objectid', null, array('%versionr' => (int) $args[1], '%objectid' => $contentObject->attribute('id'))));
     }
     if ($version->attribute('status') != eZContentObjectVersion::STATUS_DRAFT && $version->attribute('status') != eZContentObjectVersion::STATUS_INTERNAL_DRAFT) {
         throw new RuntimeException(ezpI18n::tr('extension/ezautosave/autosave', "Version #%versionr of content #%objectid is not a draft", null, array('%versionr' => $version->attribute('version'), '%objectid' => $version->attribute('contentobject_id'))));
     }
     if ($version->attribute('creator_id') != eZUser::currentUserID()) {
         throw new RuntimeException(ezpI18n::tr('extension/ezautosave/autosave', "You're not allowed to store a version that is not yours"));
     }
     $editLanguage = $args[2];
     $language = eZContentLanguage::fetchByLocale($editLanguage);
     if (!$language instanceof eZContentLanguage) {
         throw new InvalidArgumentException(ezpI18n::tr('extension/ezautosave/autosave', "Unable to load the language '%localeCode'", null, array('%localeCode' => $editLanguage)));
     }
     $class = eZContentClass::fetch($contentObject->attribute('contentclass_id'));
     $contentObjectAttributes = $version->contentObjectAttributes($editLanguage);
     $validationParameters = array('skip-isRequired' => true);
     $attributeDataBaseName = 'ContentObjectAttribute';
     $validationResult = $contentObject->validateInput($contentObjectAttributes, $attributeDataBaseName, false, $validationParameters);
     if ($validationResult['require-fixup']) {
         $contentObject->fixupInput($contentObjectAttributes, $attributeDataBaseName);
     }
     $customValidationResult = eZContentObjectEditHandler::validateInputHandlers($Module, $class, $contentObject, $version, $contentObjectAttributes, $version->attribute('version'), $editLanguage, false, $validationParameters);
     $result['valid'] = $validationResult['input-validated'] && $customValidationResult['validated'];
     $invalidAttributeIds = array();
     foreach ($validationResult['unvalidated-attributes'] as $info) {
         $invalidAttributeIds[$info['id']] = true;
         $result['unvalidated-attributes'][] = $info;
     }
     eZContentObjectEditHandler::executeInputHandlers($Module, $class, $contentObject, $version, $contentObjectAttributes, $version->attribute('version'), $editLanguage, false);
     $customActionAttributeArray = array();
     $fetchResult = $contentObject->fetchInput($contentObjectAttributes, $attributeDataBaseName, $customActionAttributeArray, array());
     $version->setAttribute('modified', time());
     $status = eZContentObjectVersion::STATUS_INTERNAL_DRAFT;
     if ($http->hasPostVariable('StoreExitButton')) {
         $status = eZContentObjectVersion::STATUS_DRAFT;
     }
     $version->setAttribute('status', $status);
     $attributesToStore = array();
     foreach ($fetchResult['attribute-input-map'] as $id => $value) {
         if (!isset($invalidAttributeIds[$id])) {
             $result['stored-attributes'][$id] = $id;
             $attributesToStore[$id] = true;
         }
     }
     $db = eZDB::instance();
     $db->begin();
     $version->store();
     $contentObject->storeInput($contentObjectAttributes, $attributesToStore);
     $contentObject->setName($class->contentObjectName($contentObject, $version->attribute('version'), $editLanguage), $version->attribute('version'), $editLanguage);
     $db->commit();
     $time = eZLocale::instance()->formatShortTime($version->attribute('modified'));
     $result['message_success'] = ezpI18n::tr('extension/ezautosave', "Draft saved at %time", null, array('%time' => $time));
     $result['message_ago'] = ezpI18n::tr('extension/ezautosave', "(%min minutes ago)", null, array('%min' => 0));
     $result['timestamp'] = $version->attribute('modified');
     return $result;
 }