Skip to content

Commit

Permalink
[Core] Optimize file uploads
Browse files Browse the repository at this point in the history
  • Loading branch information
TiSiE committed May 25, 2018
1 parent e4fc56c commit 10e0f8d
Show file tree
Hide file tree
Showing 5 changed files with 125 additions and 33 deletions.
9 changes: 7 additions & 2 deletions module/Core/config/module.config.php
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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(
Expand Down
59 changes: 32 additions & 27 deletions module/Core/public/js/core.forms.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
},

Expand Down
4 changes: 2 additions & 2 deletions module/Core/public/js/forms.file-upload.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -223,4 +223,4 @@
});
});

})(jQuery);
})(jQuery);
82 changes: 82 additions & 0 deletions module/Core/src/Core/Filter/File/Entity.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<?php
/**
* YAWIK
*
* @filesource
* @license MIT
* @copyright 2013 - 2018 Cross Solution <http://cross-solution.de>
*/

/** */
namespace Core\Filter\File;

use Core\Entity\FileInterface;
use Zend\Filter\AbstractFilter;
use Zend\Filter\Exception;

/**
* ${CARET}
*
* @author Mathias Gelhausen <gelhausen@cross-solution.de>
* @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;
}


}
4 changes: 2 additions & 2 deletions module/Core/src/Core/Form/View/Helper/FormEditor.php
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down Expand Up @@ -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");
Expand Down

0 comments on commit 10e0f8d

Please sign in to comment.