diff --git a/lib/Alchemy/Phrasea/TaskManager/Editor/SubdefsEditor.php b/lib/Alchemy/Phrasea/TaskManager/Editor/SubdefsEditor.php index e2ee1478f8..fb54cea097 100644 --- a/lib/Alchemy/Phrasea/TaskManager/Editor/SubdefsEditor.php +++ b/lib/Alchemy/Phrasea/TaskManager/Editor/SubdefsEditor.php @@ -11,6 +11,10 @@ namespace Alchemy\Phrasea\TaskManager\Editor; +use Alchemy\Phrasea\Application; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Alchemy\Phrasea\Core\Configuration\PropertyAccess; class SubdefsEditor extends AbstractEditor @@ -40,7 +44,7 @@ class SubdefsEditor extends AbstractEditor 1 - 0 + 1 1 1 @@ -70,7 +74,77 @@ EOF; 'flush' => static::FORM_TYPE_INTEGER, 'maxrecs' => static::FORM_TYPE_INTEGER, 'maxmegs' => static::FORM_TYPE_INTEGER, - 'embedded' => static::FORM_TYPE_BOOLEAN + 'embedded' => static::FORM_TYPE_BOOLEAN, ]; } + + /** + * {@inheritdoc} + */ + public function updateXMLWithRequest(Request $request) + { + $dom = $this->createBlankDom(); + + if (false === @$dom->loadXML($request->request->get('xml'))) { + throw new BadRequestHttpException('Invalid XML data.'); + } + foreach ($this->getFormProperties() as $name => $type) { + + $values = $request->request->get($name); + if($values === null) { + $values = array(); + } elseif(!is_array($values)) { + $values = array($values); + } + + // erase the former setting but keep the node in place. + // in case on multi-valued, keep only the first node (except if no value at all: erase all) + foreach($dom->getElementsByTagName($name) as $i=>$node) { + if($i > 0 || count($values)==0) { + $node->parentNode->removeChild($node); + } else { + while ($child = $node->firstChild) { + $node->removeChild($child); + } + } + } + // if no setting to write, no reason to create a node + if(count($values) == 0) { + continue; + } + + // in case the node did not exist at all, create one + if ( ($node = $dom->getElementsByTagName($name)->item(0)) === null) { + $node = $dom->documentElement->appendChild($dom->createElement($name)); + } + + // because dom::insertBefore is used, reverse allows to respect order while serializing. + $values = array_reverse($values); + + // write + foreach($values as $i=>$value) { + if($i>0) { + // multi-valued ? add an entry + $node = $dom->documentElement->insertBefore($dom->createElement($name), $node); + } + $node->appendChild($dom->createTextNode($this->toXMLValue($type, $value))); + } + } + + return new Response($dom->saveXML(), 200, ['Content-type' => 'text/xml']); + } + + private function toXMLValue($type, $value) + { + switch ($type) { + case static::FORM_TYPE_BOOLEAN: + $value = (!$value ? '0' : '1'); + break; + case static::FORM_TYPE_INTEGER: + $value = ($value !== null ? (string)((int) $value) : ''); + break; + } + return $value; + } + } diff --git a/lib/Alchemy/Phrasea/TaskManager/Job/SubdefsJob.php b/lib/Alchemy/Phrasea/TaskManager/Job/SubdefsJob.php index 82eb1facf4..3f20dc1e60 100644 --- a/lib/Alchemy/Phrasea/TaskManager/Job/SubdefsJob.php +++ b/lib/Alchemy/Phrasea/TaskManager/Job/SubdefsJob.php @@ -60,18 +60,39 @@ class SubdefsJob extends AbstractJob Image2Image::$lookForEmbeddedPreview = $thumbnailExtraction; + $sqlqmark = array(); + $sqlparms = array(); + foreach(array('image', + 'video', + 'audio', + 'document', + 'flash', + 'unknown') as $type) { + if (!isset($settings->{"type_" . $type}) || !\p4field::isno($settings->{"type_" . $type})) { + $sqlqmark[] = '?'; + $sqlparms[] = $type; + } + } + foreach ($app['phraseanet.appbox']->get_databoxes() as $databox) { if (!$this->isStarted()) { break; } + + if(count($settings->xpath("sbas[text()=".$databox->get_sbas_id() ."]")) == 0) { + continue; + } + $conn = $databox->get_connection(); - $sql = 'SELECT coll_id, record_id - FROM record - WHERE jeton & ' . PhraseaTokens::MAKE_SUBDEF . ' > 0 - ORDER BY record_id DESC LIMIT 0, 30'; + $sql = 'SELECT coll_id, record_id FROM record' + . ' WHERE jeton & ' . PhraseaTokens::MAKE_SUBDEF . ' > 0'; + if(count($sqlqmark) > 0) { + $sql .= ' AND type IN(' . implode(',', $sqlqmark) . ')'; + } + $sql .= ' ORDER BY record_id DESC LIMIT 0, 30'; $stmt = $conn->prepare($sql); - $stmt->execute(); + $stmt->execute($sqlparms); $rs = $stmt->fetchAll(\PDO::FETCH_ASSOC); $stmt->closeCursor(); @@ -89,19 +110,19 @@ class SubdefsJob extends AbstractJob $this->log('warning', sprintf("Generate subdefs failed for : sbasid=%s / databox=%s / recordid=%s : %s", $databox->get_sbas_id(), $databox->get_dbname() , $row['record_id'], $e->getMessage())); } - $sql = 'UPDATE record - SET jeton=(jeton & ~' . PhraseaTokens::MAKE_SUBDEF . '), moddate=NOW() - WHERE record_id=:record_id'; + $sql = 'UPDATE record' + . ' SET jeton=(jeton & ~' . PhraseaTokens::MAKE_SUBDEF . '), moddate=NOW()' + . ' WHERE record_id=:record_id'; $stmt = $conn->prepare($sql); $stmt->execute([':record_id' => $row['record_id']]); $stmt->closeCursor(); // rewrite metadata - $sql = 'UPDATE record - SET status=(status & ~0x03), - jeton=(jeton | ' . PhraseaTokens::WRITE_META_SUBDEF . ') - WHERE record_id=:record_id'; + $sql = 'UPDATE record' + . ' SET status=(status & ~0x03),' + . ' jeton=(jeton | ' . PhraseaTokens::WRITE_META_SUBDEF . ')' + . ' WHERE record_id=:record_id'; $stmt = $conn->prepare($sql); $stmt->execute([':record_id' => $row['record_id']]); $stmt->closeCursor(); @@ -117,4 +138,5 @@ class SubdefsJob extends AbstractJob $app['elasticsearch.indexer']->flushQueue(); } + } diff --git a/templates/web/admin/task-manager/task-editor/subdefs.html.twig b/templates/web/admin/task-manager/task-editor/subdefs.html.twig index cae411c3e1..26f9ff6666 100644 --- a/templates/web/admin/task-manager/task-editor/subdefs.html.twig +++ b/templates/web/admin/task-manager/task-editor/subdefs.html.twig @@ -4,15 +4,11 @@
- + {% for databox in app['phraseanet.appbox'].get_databoxes() %} + + {% endfor %}
@@ -87,29 +83,31 @@ xml = $.parseXML(xml); xml = $(xml); - with(document.forms['graphicForm']) + var gform = document.forms['graphicForm']; + + gform.embedded.checked = !!parseInt(xml.find("embedded").text()); + gform.type_image.checked = !!parseInt(xml.find("type_image").text()); + gform.type_video.checked = !!parseInt(xml.find("type_video").text()); + gform.type_audio.checked = !!parseInt(xml.find("type_audio").text()); + gform.type_document.checked = !!parseInt(xml.find("type_document").text()); + gform.type_flash.checked = !!parseInt(xml.find("type_flash").text()); + gform.type_unknown.checked = !!parseInt(xml.find("type_unknown").text()); + gform.flush.value = minmax(parseInt(xml.find("flush").text()), 1, 100); + gform.maxrecs.value = minmax(parseInt(xml.find("maxrecs").text()), 10, 100); + gform.maxmegs.value = minmax(parseInt(xml.find("maxmegs").text()), 64, 512); + for(i=0; i < gform['sbas[]'].length; i++) { - embedded.checked = !!parseInt(xml.find("embedded").text()); - type_image.checked = !!parseInt(xml.find("type_image").text()); - type_video.checked = !!parseInt(xml.find("type_video").text()); - type_audio.checked = !!parseInt(xml.find("type_audio").text()); - type_document.checked = !!parseInt(xml.find("type_document").text()); - type_flash.checked = !!parseInt(xml.find("type_flash").text()); - type_unknown.checked = !!parseInt(xml.find("type_unknown").text()); - flush.value = minmax(parseInt(xml.find("flush").text()), 1, 100); - maxrecs.value = minmax(parseInt(xml.find("maxrecs").text()), 10, 100); - maxmegs.value = minmax(parseInt(xml.find("maxmegs").text()), 64, 512); - for(i in sbas.options) + var sbid = gform['sbas[]'][i].value; + + if(xml.find("sbas").filter(function(){return $(this).text()==sbid}).length > 0) { - if(sbas.options[i].value == parseInt(xml.find("sbas").text()) ) - { - sbas.options[i].selected = true; - } - else - { - sbas.options[i].selected = false; - } + gform['sbas[]'][i].checked = true; } + else + { + gform['sbas[]'][i].checked = false; + } + } } } diff --git a/templates/web/admin/task-manager/task-editor/task.html.twig b/templates/web/admin/task-manager/task-editor/task.html.twig index b432928ef4..60c0658d59 100644 --- a/templates/web/admin/task-manager/task-editor/task.html.twig +++ b/templates/web/admin/task-manager/task-editor/task.html.twig @@ -55,16 +55,6 @@