Index: kernel/classes/ezcontentobjectedithandler.php =================================================================== --- kernel/classes/ezcontentobjectedithandler.php (wersja 21835) +++ kernel/classes/ezcontentobjectedithandler.php (kopia robocza) @@ -75,6 +75,18 @@ } /*! + \abstract + + Override this function in the extension to handle input validation. + */ + function validateInput( $http, &$module, &$class, $object, &$version, $contentObjectAttributes, $editVersion, $editLanguage, $fromLanguage, $validationParameters ) + { + $result = array( 'is_valid' => true, 'warnings' => array() ); + + return $result; + } + + /*! \static Initialize all extension input handler. */ @@ -103,11 +115,11 @@ /*! \static - Calls all extension object edit input handler, and executes this the fetchInput function + Execute handler $functionName function with given $params parameters */ - static function executeInputHandlers( &$module, &$class, $object, &$version, $contentObjectAttributes, $editVersion, $editLanguage, $fromLanguage ) + static function executeHandlerFunction( $functionName, $params ) { - $http = eZHTTPTool::instance(); + $result = array(); $contentINI = eZINI::instance( 'content.ini' ); foreach( array_unique( $contentINI->variable( 'EditSettings', 'ExtensionDirectories' ) ) as $extensionDirectory ) { @@ -117,31 +129,88 @@ include_once( $fileName ); $className = $extensionDirectory . 'Handler'; $inputHandler = new $className(); - call_user_func_array( array( $inputHandler, 'fetchInput' ), - array( $http, &$module, &$class, $object, &$version, $contentObjectAttributes, $editVersion, $editLanguage, $fromLanguage ) ); + $functionResult = call_user_func_array( array( $inputHandler, $functionName ), $params ); + $result[] = array( 'handler' => $className, + 'function' => array( 'name' => $functionName, 'value' => $functionResult ) ); } } + + return $result; } /*! \static + Calls all extension object edit input handler, and executes this the fetchInput function + */ + static function executeInputHandlers( &$module, &$class, $object, &$version, $contentObjectAttributes, $editVersion, $editLanguage, $fromLanguage ) + { + $http = eZHTTPTool::instance(); + $functionName = 'fetchInput'; + $params = array( $http, + &$module, + &$class, + $object, + &$version, + $contentObjectAttributes, + $editVersion, + $editLanguage, + $fromLanguage ); + + self::executeHandlerFunction( $functionName, $params ); + } + + /*! + \static Calls all publish functions. */ static function executePublish( $contentObjectID, $contentObjectVersion ) { - $contentINI = eZINI::instance( 'content.ini' ); - foreach( array_unique( $contentINI->variable( 'EditSettings', 'ExtensionDirectories' ) ) as $extensionDirectory ) + $functionName = 'publish'; + $params = array( $contentObjectID, $contentObjectVersion ); + + self::executeHandlerFunction( $functionName, $params ); + } + + /*! + \static + Calls all input validation functions. + */ + static function validateInputHandlers( &$module, &$class, $object, &$version, $contentObjectAttributes, $editVersion, $editLanguage, $fromLanguage, $validationParameters ) + { + $result = array( 'validated' => true, 'warnings' => array() ); + $validated =& $result['validated']; + $warnings =& $result['warnings']; + + $http = eZHTTPTool::instance(); + + $functionName = 'validateInput'; + $params = array( $http, + &$module, + &$class, + $object, + &$version, + $contentObjectAttributes, + $editVersion, + $editLanguage, + $fromLanguage, + $validationParameters ); + + $validationResults = self::executeHandlerFunction( $functionName, $params ); + + foreach( $validationResults as $validationResult ) { - $fileName = eZExtension::baseDirectory() . '/' . $extensionDirectory . '/content/' . $extensionDirectory . 'handler.php'; - if ( file_exists( $fileName ) ) + $value = $validationResult['function']['value']; + + if ( $value['is_valid'] == false ) { - include_once( $fileName ); - $className = $extensionDirectory . 'Handler'; - $inputHandler = new $className(); - call_user_func_array( array( $inputHandler, 'publish' ), - array( $contentObjectID, $contentObjectVersion ) ); + if ( $value['warnings'] ) + $warnings = array_merge( $warnings, $value['warnings'] ); + + $validated = false; } } + + return $result; } /*! Index: kernel/content/attribute_edit.php =================================================================== --- kernel/content/attribute_edit.php (wersja 21835) +++ kernel/content/attribute_edit.php (kopia robocza) @@ -235,6 +235,13 @@ if ( $http->hasPostVariable( 'HasObjectInput' ) ) $hasObjectInput = $http->postVariable( 'HasObjectInput' ); +$contentObjectDataMap = array(); +foreach ( $contentObjectAttributes as $contentObjectAttribute ) +{ + $contentObjectAttributeIdentifier = $contentObjectAttribute->attribute( 'contentclass_attribute_identifier' ); + $contentObjectDataMap[$contentObjectAttributeIdentifier] = $contentObjectAttribute; +} + // These variables will be modified according to validation $inputValidated = true; $requireFixup = false; @@ -261,6 +268,13 @@ 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 ); @@ -280,6 +294,7 @@ if ( !$inputValidated && $Module->exitStatus() == eZModule::STATUS_REDIRECT ) $Module->setExitStatus( eZModule::STATUS_OK ); + $db = eZDB::instance(); if ( $inputValidated and count( $attributeInputMap ) > 0 ) { if ( $Module->runHooks( 'pre_commit', array( $class, $object, $version, $contentObjectAttributes, $EditVersion, $EditLanguage, $FromLanguage ) ) ) @@ -287,7 +302,6 @@ $version->setAttribute( 'modified', time() ); $version->setAttribute( 'status', eZContentObjectVersion::STATUS_DRAFT ); - $db = eZDB::instance(); $db->begin(); $version->store(); // print( "storing
" ); @@ -432,13 +446,6 @@ eZSection::setGlobalID( $object->attribute( 'section_id' ) ); } -$contentObjectDataMap = array(); -foreach ( $contentObjectAttributes as $contentObjectAttribute ) -{ - $contentObjectAttributeIdentifier = $contentObjectAttribute->attribute( 'contentclass_attribute_identifier' ); - $contentObjectDataMap[$contentObjectAttributeIdentifier] = $contentObjectAttribute; -} - $object->setCurrentLanguage( $EditLanguage ); $tpl->setVariable( 'edit_version', $EditVersion ); Index: design/admin/templates/content/edit_validation.tpl =================================================================== --- design/admin/templates/content/edit_validation.tpl (wersja 21835) +++ design/admin/templates/content/edit_validation.tpl (kopia robocza) @@ -1,5 +1,5 @@ {section show=$validation.processed} - {section show=or( $validation.attributes, $validation.placement )} + {section show=or( $validation.attributes, $validation.placement, $validation.custom_rules )}

[{currentdate()|l10n( shortdatetime )}] {'The draft could not be stored.'|i18n( 'design/admin/content/edit' )}

@@ -20,6 +20,15 @@ {/section} {/section} + + {section show=$validation.custom_rules} +

{'The following data is invalid according to the custom validation rules'|i18n( 'design/admin/content/edit' )}:

+ + {/section}
{section-else}