diff --git a/module/Core/config/module.config.php b/module/Core/config/module.config.php index cc70673cc..9a8ddbe43 100644 --- a/module/Core/config/module.config.php +++ b/module/Core/config/module.config.php @@ -17,6 +17,7 @@ use Core\Factory\Controller\FileControllerFactory; use Core\Factory\Controller\LazyControllerFactory; use Zend\I18n\Translator\Resources; +use Zend\ServiceManager\Factory\InvokableFactory; $doctrineConfig = include __DIR__ . '/doctrine.config.php'; @@ -447,10 +448,14 @@ 'invokables' => array( 'Core/Repository/PropertyToKeywords' => 'Core\Repository\Filter\PropertyToKeywords', ), - 'factories' => array( + 'factories' => [ "Core/XssFilter" => 'Core\Filter\XssFilterFactory', "Core/HtmlAbsPathFilter" => 'Core\Factory\Filter\HtmlAbsPathFilterFactory', - ), + Filter\File\Entity::class => InvokableFactory::class, + ], + 'aliases' => [ + 'FileEntity' => Filter\File\Entity::class, + ], ), 'form_elements' => array( diff --git a/module/Core/public/js/core.forms.js b/module/Core/public/js/core.forms.js index 0e2cda934..7adde1470 100644 --- a/module/Core/public/js/core.forms.js +++ b/module/Core/public/js/core.forms.js @@ -65,33 +65,38 @@ $form.trigger('yk.forms.start', {data: data}); // DEPRECATED EVENT USE NEXT $form.trigger('start.yk.core.forms', {data: data}); //DEPRECATED EVENT USE NEXT - $form.trigger('yk:forms:start', {data:data}); - $.ajax({ - url: $form.attr('action'), - type: $form.attr('method'), - dataType: dataType, - data: data - }) - .done(function(data, textStatus, jqXHR) { - // the data-object can contains following values - // valid = boolean ,if explicitly set to false, errors will be displayed - methods.clearErrors($form); - if ('valid' in data && !data.valid) { - methods.displayErrors($form, data.errors); - } -// console.debug('bubble done event for form',$form,data); - $form.trigger('yk.forms.done', {data: data, status:textStatus, jqXHR:jqXHR}); // DEPRECATED EVENT USE NEXT - $form.trigger('done.yk.core.forms', {data: data, status:textStatus, jqXHR: jqXHR}); //DEPRECATED EVENT USE NEXT - $form.trigger('yk:forms:success', {data: data, status:textStatus, jqXHR: jqXHR}); - $form.trigger('ajax.ready', {'data': data}); - }) - .fail(function(jqXHR, textStatus, errorThrown) { - console.debug(textStatus, errorThrown); - $form.trigger('yk.forms.fail', {jqXHR: jqXHR, status: textStatus, error: errorThrown}); // DEPRECATED EVENT USE NEXT - $form.trigger('fail.yk.core.forms', {jqXHR: jqXHR, status: textStatus, error: errorThrown}); // DEPRECATED EVENT USE NEXT - $form.trigger('yk:forms:fail', {jqXHR: jqXHR, status: textStatus, error: errorThrown}); - }) - .always(function() { $button.attr('disabled', false); }); + + var startEvent = $.Event('yk:forms:start'); + $form.trigger(startEvent, {data:data}); + + if (!startEvent.preventSubmit) { + $.ajax({ + url: $form.attr('action'), + type: $form.attr('method'), + dataType: dataType, + data: data + }) + .done(function(data, textStatus, jqXHR) { + // the data-object can contains following values + // valid = boolean ,if explicitly set to false, errors will be displayed + methods.clearErrors($form); + if ('valid' in data && !data.valid) { + methods.displayErrors($form, data.errors); + } + // console.debug('bubble done event for form',$form,data); + $form.trigger('yk.forms.done', {data: data, status:textStatus, jqXHR:jqXHR}); // DEPRECATED EVENT USE NEXT + $form.trigger('done.yk.core.forms', {data: data, status:textStatus, jqXHR: jqXHR}); //DEPRECATED EVENT USE NEXT + $form.trigger('yk:forms:success', {data: data, status:textStatus, jqXHR: jqXHR}); + $form.trigger('ajax.ready', {'data': data}); + }) + .fail(function(jqXHR, textStatus, errorThrown) { + console.debug(textStatus, errorThrown); + $form.trigger('yk.forms.fail', {jqXHR: jqXHR, status: textStatus, error: errorThrown}); // DEPRECATED EVENT USE NEXT + $form.trigger('fail.yk.core.forms', {jqXHR: jqXHR, status: textStatus, error: errorThrown}); // DEPRECATED EVENT USE NEXT + $form.trigger('yk:forms:fail', {jqXHR: jqXHR, status: textStatus, error: errorThrown}); + }) + .always(function() { $button.attr('disabled', false); }); + } return false; }, diff --git a/module/Core/public/js/forms.file-upload.js b/module/Core/public/js/forms.file-upload.js index f82a2ce59..6dc552885 100644 --- a/module/Core/public/js/forms.file-upload.js +++ b/module/Core/public/js/forms.file-upload.js @@ -80,7 +80,7 @@ } }); - $('.multi-file-upload').each(function() { + $('.multi-file-upload, .single-file-upload').each(function() { var $form = $(this); $form.find('.fu-remove-all').click(function() { @@ -223,4 +223,4 @@ }); }); -})(jQuery); \ No newline at end of file +})(jQuery); diff --git a/module/Core/src/Core/Filter/File/Entity.php b/module/Core/src/Core/Filter/File/Entity.php new file mode 100644 index 000000000..516618d5b --- /dev/null +++ b/module/Core/src/Core/Filter/File/Entity.php @@ -0,0 +1,82 @@ + + */ + +/** */ +namespace Core\Filter\File; + +use Core\Entity\FileInterface; +use Zend\Filter\AbstractFilter; +use Zend\Filter\Exception; + +/** + * ${CARET} + * + * @author Mathias Gelhausen + * @todo write test + */ +class Entity extends AbstractFilter +{ + private $alreadyFiltered = []; + + private $fileEntity; + + public function __construct($fileEntityOrOptions) + { + if (is_object($fileEntityOrOptions) || is_string($fileEntityOrOptions)) { + $this->setFileEntity($fileEntityOrOptions); + } else { + $this->setOptions($fileEntityOrOptions); + } + } + + public function setFileEntity($entity) + { + if (is_string($entity)) { + $entity = new $entity(); + } + + $this->fileEntity = $entity; + } + + public function getFileEntity() + { + if (! $this->fileEntity instanceOf FileInterface) { + throw new \RuntimeException('No file entity set or it does not implement \Core\Entity\FileInterface.'); + } + + return clone $this->fileEntity; + } + + public function filter($value) + { + if (! is_array($value) || ! isset($value['tmp_name'])) { + return null; + } + + if (UPLOAD_ERR_OK != $value['error']) { + throw new \RuntimeException('File upload failed.'); + } + + if (isset($this->alreadyFiltered[$value['tmp_name']])) { + return $this->alreadyFiltered[$value['tmp_name']]; + } + + $file = $this->getFileEntity(); + + $file->setName($value['name']); + $file->setType($value['type']); + $file->setFile($value['tmp_name']); + + $this->alreadyFiltered[$value['tmp_name']] = $file; + + return $file; + } + + +} diff --git a/module/Core/src/Core/Form/View/Helper/FormEditor.php b/module/Core/src/Core/Form/View/Helper/FormEditor.php index daff8367d..7464f0102 100644 --- a/module/Core/src/Core/Form/View/Helper/FormEditor.php +++ b/module/Core/src/Core/Form/View/Helper/FormEditor.php @@ -79,7 +79,7 @@ public function render(ElementInterface $element) $basepath = $renderer->plugin('basepath'); $headscript->appendFile($basepath('js/tinymce/tinymce.min.js')); - $headscript->prependFile($basepath('/assets/jquery/jquery.min.js')); + //$headscript->prependFile($basepath('/assets/jquery/jquery.min.js')); $headscript->offsetSetScript( '1000_tinymce_' . $this->getTheme(), @@ -110,7 +110,7 @@ public function render(ElementInterface $element) $(container).parents("html").addClass("yk-changed"); var form = $(container).parents("form"); //console.log("form", form, container); - form.submit(); + ' . ($element->getOption('no-submit') ? '' : 'form.submit();').' $(form).on("yk.forms.done", function(){ console.log("done"); //$(container).parents("html").removeClass("yk-changed");