protected function get_metadatas_ids() { try { return $this->get_data_from_cache(); } catch (\Exception $e) { } $connbas = $this->databox_field->get_connection(); $sql = 'SELECT id FROM metadatas WHERE record_id = :record_id AND meta_struct_id = :meta_struct_id'; $params = [':record_id' => $this->record->get_record_id(), ':meta_struct_id' => $this->databox_field->get_id()]; $stmt = $connbas->prepare($sql); $stmt->execute($params); $ids = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); $this->set_data_to_cache($ids); return $ids; }
private function generateSubdefPathname(\record_adapter $record, \databox_subdef $subdef, $oldVersion = null) { if ($oldVersion) { $pathdest = \p4string::addEndSlash(pathinfo($oldVersion, PATHINFO_DIRNAME)); } else { $pathdest = \databox::dispatch($this->filesystem, $subdef->get_path()); } return $pathdest . $record->get_record_id() . '_' . $subdef->get_name() . '.' . $this->getExtensionFromSpec($subdef->getSpecs()); }
public function substitute(\record_adapter $record, $name, MediaInterface $media) { $newfilename = $record->get_record_id() . '_0_' . $name . '.' . $media->getFile()->getExtension(); $subdef_def = false; if ($name == 'document') { $baseprefs = $record->get_databox()->get_sxml_structure(); $pathhd = \p4string::addEndSlash((string) $baseprefs->path); $filehd = $record->get_record_id() . "_document." . strtolower($media->getFile()->getExtension()); $pathhd = \databox::dispatch($this->fs, $pathhd); $this->fs->copy($media->getFile()->getRealPath(), $pathhd . $filehd, true); $subdefFile = $pathhd . $filehd; $meta_writable = true; } else { $type = $record->isStory() ? 'image' : $record->get_type(); $subdef_def = $record->get_databox()->get_subdef_structure()->get_subdef($type, $name); if ($record->has_subdef($name) && $record->get_subdef($name)->is_physically_present()) { $path_file_dest = $record->get_subdef($name)->get_pathfile(); $record->get_subdef($name)->remove_file(); $record->clearSubdefCache($name); } else { $path = \databox::dispatch($this->fs, $subdef_def->get_path()); $this->fs->mkdir($path, 0750); $path_file_dest = $path . $newfilename; } try { $this->alchemyst->turnInto($media->getFile()->getRealPath(), $path_file_dest, $subdef_def->getSpecs()); } catch (MediaAlchemystException $e) { return; } $subdefFile = $path_file_dest; $meta_writable = $subdef_def->meta_writeable(); } $this->fs->chmod($subdefFile, 0760); $media = $this->mediavorus->guess($subdefFile); \media_subdef::create($this->app, $record, $name, $media); $record->delete_data_from_cache(\record_adapter::CACHE_SUBDEFS); if ($meta_writable) { $record->write_metas(); } if ($name == 'document') { $record->rebuild_subdefs(); } $this->dispatcher->dispatch(RecordEvents::MEDIA_SUBSTITUTED, new RecordMediaSubstitutedEvent($record)); }
public function log(record_adapter $record, $action, $final, $comment) { $sql = 'INSERT INTO log_docs (id, log_id, date, record_id, action, final, comment) VALUES (null, :log_id, NOW(), :record_id, :action, :final, :comm)'; $stmt = $this->databox->get_connection()->prepare($sql); $params = [':log_id' => $this->get_id(), ':record_id' => $record->get_record_id(), ':action' => $action, ':final' => $final, ':comm' => $comment]; $stmt->execute($params); $stmt->closeCursor(); return $this; }
/** * {@inheritdoc} */ public function execute(InputInterface $input, OutputInterface $output) { foreach ($this->app->getDataboxes() as $databox) { foreach ($databox->get_meta_structure()->get_elements() as $databox_field) { if ($databox_field->is_on_error()) { throw new \Exception(sprintf("Databox description field %s is on error, please fix it before continue</error>", $databox_field->get_name())); } } $this->ensureMigrateColumn($databox); do { $rs = $this->getEmptyOriginalNameRecords($databox); $databox->get_connection()->beginTransaction(); foreach ($rs as $record) { $this->setOriginalName($databox, $record); } $databox->get_connection()->commit(); } while (count($rs) > 0); do { $rs = $this->getRecordsToMigrate($databox); $databox->get_connection()->beginTransaction(); $sql = 'UPDATE record SET migrate35=1 WHERE record_id = :record_id'; $stmt = $databox->get_connection()->prepare($sql); foreach ($rs as $row) { $stmt->execute([':record_id' => $row['record_id']]); try { $record = new \record_adapter($this->app, $databox->get_sbas_id(), $row['record_id']); } catch (\Exception $e) { $this->app['monolog']->addError(sprintf("Unable to load record %d on databox %d : %s", $record->get_record_id(), $record->get_sbas_id(), $record->get_sbas_id(), $e->getMessage())); continue; } try { $this->updateMetadatas($record, $row['xml']); } catch (\Exception $e) { $this->app['monolog']->addError(sprintf("Error while upgrading metadatas for record %d on databox %d : %s", $record->get_record_id(), $record->get_sbas_id(), $e->getMessage())); } try { $record->set_binary_status($row['status']); } catch (\Exception $e) { $this->app['monolog']->addError(sprintf("Error while upgrading status for record %d on databox %d : %s", $record->get_record_id(), $record->get_sbas_id(), $e->getMessage())); } unset($record); } $stmt->closeCursor(); $databox->get_connection()->commit(); } while (count($rs) > 0); } foreach ($this->app->getDataboxes() as $databox) { $this->ensureDropMigrateColumn($databox); } }
/** * * @param boolean $random * @return string */ protected function generate_url() { if (!$this->is_physically_present()) { return; } if (in_array($this->mime, ['video/mp4'])) { $token = p4file::apache_tokenize($this->app['conf'], $this->get_pathfile()); if ($token) { $this->url = $token; return; } } $this->url = "/datafiles/" . $this->record->get_sbas_id() . "/" . $this->record->get_record_id() . "/" . $this->get_name() . "/"; return; }
/** * * @param boolean $random * @return string */ protected function generate_url() { if (!$this->is_physically_present()) { return; } if ($this->get_name() === 'thumbnail') { if ($this->app['phraseanet.static-file-factory']->isStaticFileModeEnabled() && null !== ($url = $this->app['phraseanet.static-file']->getUrl($this->get_pathfile()))) { $this->url = $url; return; } } if ($this->app['phraseanet.h264-factory']->isH264Enabled() && in_array($this->mime, ['video/mp4'])) { if (null !== ($url = $this->app['phraseanet.h264']->getUrl($this->get_pathfile()))) { $this->url = $url; return; } } $this->url = Url::factory("/datafiles/" . $this->record->get_sbas_id() . "/" . $this->record->get_record_id() . "/" . $this->get_name() . "/"); return; }
public function serialize(\record_adapter $record) { $technicalInformation = $caption = $business = $status = []; foreach ($record->get_technical_infos() as $name => $value) { $technicalInformation[$name] = $value; } foreach ($record->get_caption()->get_fields(null, true) as $field) { $isDate = $field->get_databox_field()->get_type() === \databox_field::TYPE_DATE; $isBusiness = $field->get_databox_field()->isBusiness(); $vi = $field->get_values(); if ($field->is_multi()) { $values = []; foreach ($vi as $value) { $values[] = $this->sanitizeSerializedValue($value->getValue()); } $value = implode(' ' . $field->get_databox_field()->get_separator(false) . ' ', $values); } else { $value = $this->sanitizeSerializedValue(array_pop($vi)->getValue()); } if ($isDate) { try { $date = new \DateTime($value); $value = $date->format(DATE_ATOM); } catch (\Exception $e) { continue; } } if ($isBusiness) { $business[$field->get_databox_field()->get_name()] = $value; } $caption[$field->get_databox_field()->get_name()] = $value; } $i = 0; foreach (preg_split('//', strrev($record->get_status()), -1, PREG_SPLIT_NO_EMPTY) as $val) { $status['status-' . $i] = (int) $val; $i++; } return ['databox_id' => $record->get_sbas_id(), 'record_id' => $record->get_record_id(), 'collection_id' => $record->get_collection()->get_coll_id(), 'base_id' => $record->get_base_id(), 'mime_type' => $record->get_mime(), 'title' => $record->get_title(), 'original_name' => $record->get_original_name(), 'updated_on' => $record->get_modification_date()->format(DATE_ATOM), 'created_on' => $record->get_creation_date()->format(DATE_ATOM), 'sha256' => $record->get_sha256(), 'technical_informations' => $technicalInformation, 'phrasea_type' => $record->get_type(), 'type' => $record->is_grouping() ? 'story' : 'record', 'uuid' => $record->get_uuid(), 'caption' => $caption, 'status' => $status, 'caption-business' => $business]; }
public static function create(Application $app, Bridge_Account $account, record_adapter $record, $title, $status, $type, array $datas = []) { $sql = 'INSERT INTO bridge_elements (id, account_id, sbas_id, record_id, dist_id, title, `type` , serialized_datas, status, created_on, updated_on) VALUES (null, :account_id, :sbas_id, :record_id, null, :title, :type ,:datas , :status, NOW(), NOW())'; $params = [':account_id' => $account->get_id(), ':sbas_id' => $record->get_sbas_id(), ':record_id' => $record->get_record_id(), ':status' => $status, ':title' => $title, ':type' => $type, ':datas' => serialize($datas)]; $stmt = $app->getApplicationBox()->get_connection()->prepare($sql); $stmt->execute($params); $stmt->closeCursor(); $element_id = $app->getApplicationBox()->get_connection()->lastInsertId(); return new self($app, $account, $element_id); }
private function createQueryParams($query, SearchEngineOptions $options, \record_adapter $record = null) { $params = ['index' => $this->indexName, 'type' => 'record', 'body' => ['fields' => ['databox_id', 'record_id'], 'sort' => $this->createSortQueryParams($options)]]; $ESquery = $this->createESQuery($query, $options); $filters = $this->createFilters($options); if ($record) { $filters[] = ['term' => ['_id' => sprintf('%s-%s', $record->get_sbas_id(), $record->get_record_id())]]; $fields = []; foreach ($record->get_databox()->get_meta_structure() as $dbField) { $fields['caption.' . $dbField->get_name()] = new \stdClass(); } $params['body']['highlight'] = ["pre_tags" => ["[[em]]"], "post_tags" => ["[[/em]]"], "fields" => $fields]; } if (count($filters) > 0) { $ESquery = ['filtered' => ['query' => $ESquery, 'filter' => ['and' => $filters]]]; } $params['body']['query'] = $ESquery; return $params; }
/** * @param \record_adapter $record * @return \Alchemy\Phrasea\Application */ protected function mockElasticsearchResult(\record_adapter $record) { $app = $this->getApplication(); $elasticsearchRecord = new ElasticsearchRecord(); $elasticsearchRecord->setDataboxId($record->get_sbas_id()); $elasticsearchRecord->setRecordId($record->get_record_id()); $result = new SearchEngineResult(new ArrayCollection([$elasticsearchRecord]), '', 0, 0, 1, 1, 0, 0, new ArrayCollection(), null, null); $searchEngine = $this->prophesize(SearchEngineInterface::class); $searchEngine->query('', 0, Argument::any(), Argument::any())->willReturn($result); $searchEngine->excerpt(Argument::any(), Argument::any(), Argument::any(), Argument::any())->willReturn([]); $app['search_engine'] = $searchEngine->reveal(); return $app; }
public static function create(Application $app, databox_field $databox_field, \record_adapter $record, $value, Vocabulary\ControlProvider\ControlProviderInterface $vocabulary = null, $vocabularyId = null) { $connbas = $databox_field->get_connection(); /** * Check consistency */ if (!$databox_field->is_multi()) { try { $field = $record->get_caption()->get_field($databox_field->get_name()); $values = $field->get_values(); $caption_field_value = array_pop($values); /* @var $value \caption_Field_Value */ $caption_field_value->set_value($value); if (!$vocabulary || !$vocabularyId) { $caption_field_value->removeVocabulary(); } else { $caption_field_value->setVocab($vocabulary, $vocabularyId); } return $caption_field_value; } catch (\Exception $e) { } } $sql_ins = 'INSERT INTO metadatas (id, record_id, meta_struct_id, value, VocabularyType, VocabularyId)' . ' VALUES (null, :record_id, :field, :value, :VocabType, :VocabId)'; $params = [':record_id' => $record->get_record_id(), ':field' => $databox_field->get_id(), ':value' => $value, ':VocabType' => $vocabulary ? $vocabulary->getType() : null, ':VocabId' => $vocabulary ? $vocabularyId : null]; $stmt_ins = $connbas->prepare($sql_ins); $stmt_ins->execute($params); $stmt_ins->closeCursor(); $meta_id = $connbas->lastInsertId(); $caption_field_value = new self($app, $databox_field, $record, $meta_id); $caption_field_value->update_cache_value($value); $record->get_caption()->delete_data_from_cache(); $databox_field->delete_data_from_cache(); $caption_field_value->delete_data_from_cache(); return $caption_field_value; }
public function findContainingRecordForUser(\record_adapter $record, User $user) { $dql = 'SELECT b FROM Phraseanet:Basket b JOIN b.elements e WHERE e.record_id = :record_id AND e.sbas_id = e.sbas_id AND b.user = :usr_id'; $params = ['record_id' => $record->get_record_id(), 'usr_id' => $user->getId()]; $query = $this->_em->createQuery($dql); $query->setParameters($params); return $query->getResult(); }
/** * Display information about a document * * @param Request $request * @return JsonResponse */ public function doReportInformationDocument(Request $request) { $config = ['photo' => [$this->app->trans('report:: document'), 0, 0, 0, 0], 'record_id' => [$this->app->trans('report:: record id'), 0, 0, 0, 0], 'date' => [$this->app->trans('report:: date'), 0, 0, 0, 0], 'type' => [$this->app->trans('phrseanet:: sous definition'), 0, 0, 0, 0], 'titre' => [$this->app->trans('report:: titre'), 0, 0, 0, 0], 'taille' => [$this->app->trans('report:: poids'), 0, 0, 0, 0]]; $config_dl = ['ddate' => [$this->app->trans('report:: date'), 0, 0, 0, 0], 'user' => [$this->app->trans('report:: utilisateurs'), 0, 0, 0, 0], 'final' => [$this->app->trans('phrseanet:: sous definition'), 0, 0, 0, 0], 'coll_id' => [$this->app->trans('report:: collections'), 0, 0, 0, 0], 'comment' => [$this->app->trans('report:: commentaire'), 0, 0, 0, 0], 'fonction' => [$this->app->trans('report:: fonction'), 0, 0, 0, 0], 'activite' => [$this->app->trans('report:: activite'), 0, 0, 0, 0], 'pays' => [$this->app->trans('report:: pays'), 0, 0, 0, 0], 'societe' => [$this->app->trans('report:: societe'), 0, 0, 0, 0]]; //format conf according user preferences if ('' !== ($columnsList = $request->request->get('list_column', ''))) { $new_conf = $config_dl; $columns = explode(',', $columnsList); foreach (array_keys($config_dl) as $col) { if (!in_array($col, $columns)) { unset($new_conf[$col]); } } $config_dl = $new_conf; } try { $record = new \record_adapter($this->app, $request->request->get('sbasid'), $request->request->get('rid')); } catch (\Exception $e) { $this->app->abort(404); } $what = new \module_report_nav($this->app, $request->request->get('dmin'), $request->request->get('dmax'), $request->request->get('sbasid'), $request->request->get('collection')); $what->setPeriode(''); $what->setCsv(false); $what->setPrint(false); /** @var \record_adapter $record */ $reportArray = $what->buildTabUserWhat($record->get_base_id(), $record->get_record_id(), $config); $title = $what->getTitle(); $html = $this->render('report/ajax_data_content.html.twig', ['result' => isset($reportArray['report']) ? $reportArray['report'] : $reportArray, 'is_infouser' => false, 'is_nav' => false, 'is_groupby' => false, 'is_plot' => false, 'is_doc' => false]); $from = $request->request->get('from', ''); if ('TOOL' === $from) { $what->setTitle(''); return $this->app->json(['rs' => $html, 'display_nav' => false, 'title' => $title]); } if ('DASH' !== $from && 'PUSHDOC' !== $from) { $download = new \module_report_download($this->app, $request->request->get('dmin'), $request->request->get('dmax'), $request->request->get('sbasid'), $request->request->get('collection')); $mapColumnTitleToSqlField = $download->getTransQueryString(); $currentfilter = []; if ('' !== ($serializedFilter = $request->request->get('liste_filter', ''))) { $currentfilter = @unserialize(urldecode($serializedFilter)); } $filter = new \module_report_filter($this->app, $currentfilter, $mapColumnTitleToSqlField); if ('' !== ($filterColumn = $request->request->get('filter_column', ''))) { $field = current(explode(' ', $filterColumn)); $value = $request->request->get('filter_value', ''); if ($request->request->get('liste') == 'on') { return $this->app->json(['diag' => $this->render('report/colFilter.html.twig', ['result' => $download->colFilter($field), 'field' => $field]), 'title' => $this->app->trans('filtrer les resultats sur la colonne %colonne%', ['%colonne%' => $field])]); } if ($field === $value) { $filter->removeFilter($field); } else { $filter->addFilter($field, '=', $value); } } $filter->addfilter('record_id', '=', $record->get_record_id()); $download->setFilter($filter->getTabFilter()); $download->setOrder('ddate', 'DESC'); $download->setTitle($this->app->trans('report:: historique des telechargements')); $download->setConfig(false); $reportArray = $download->buildReport($config_dl); if ($request->request->get('printcsv') == 'on') { $download->setPrettyString(false); return $this->getCSVResponse($download, 'info_document'); } $html .= $this->render('report/ajax_data_content.html.twig', ['result' => isset($reportArray['report']) ? $reportArray['report'] : $reportArray, 'is_infouser' => false, 'is_nav' => false, 'is_groupby' => false, 'is_plot' => false, 'is_doc' => false]); return $this->app->json(['rs' => $html, 'display_nav' => false, 'title' => $title]); } if ($this->getConf()->get(['registry', 'modules', 'anonymous-report']) == false && $from !== 'DOC' && $from !== 'DASH' && $from !== 'GEN' && $from !== 'PUSHDOC') { $conf = ['identifiant' => [$this->app->trans('report:: identifiant'), 0, 0, 0, 0], 'nom' => [$this->app->trans('report:: nom'), 0, 0, 0, 0], 'mail' => [$this->app->trans('report:: email'), 0, 0, 0, 0], 'adresse' => [$this->app->trans('report:: adresse'), 0, 0, 0, 0], 'tel' => [$this->app->trans('report:: telephone'), 0, 0, 0, 0]]; $info = new \module_report_nav($this->app, $request->request->get('dmin'), $request->request->get('dmax'), $request->request->get('sbasid'), $request->request->get('collection')); $info->setPeriode(''); $info->setConfig(false); $info->setTitle($this->app->trans('report:: utilisateur')); $reportArray = $info->buildTabGrpInfo(false, [], $request->request->get('user'), $conf, false); if ($request->request->get('printcsv') == 'on' && isset($download)) { return $this->getCSVResponse($this->app, $info, 'info_user'); } $html .= $this->render('report/ajax_data_content.html.twig', ['result' => isset($reportArray['report']) ? $reportArray['report'] : $reportArray, 'is_infouser' => false, 'is_nav' => false, 'is_groupby' => false, 'is_plot' => false, 'is_doc' => false]); return $this->app->json(['rs' => $html, 'display_nav' => false, 'title' => $title]); } return $this->app->json(['rs' => $html, 'display_nav' => false, 'title' => $title]); }
/** * {@inheritdoc} */ public function apply(base $appbox, Application $app) { try { $sql = 'ALTER TABLE `ssel` ADD `migrated` INT NOT NULL DEFAULT "0"'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute(); $stmt->closeCursor(); } catch (\Exception $e) { } $sql = 'SELECT ssel_id, usr_id, name, descript, pub_date, updater, pub_restrict, homelink FROM ssel WHERE (public = "1" OR homelink="1") AND migrated = 0'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute(); $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); $date_ref = new DateTime(); $n = 0; $app['orm.em']->getEventManager()->removeEventSubscriber(new TimestampableListener()); foreach ($rs as $row) { if (null === ($user = $this->loadUser($app['orm.em'], $row['usr_id']))) { continue; } $feed = $this->get_feed($app, $appbox, $user, $row['pub_restrict'], $row['homelink']); if (!$feed instanceof Feed) { continue; } $publishers = $feed->getPublishers(); $entry = new FeedEntry(); $entry->setAuthorEmail((string) $user->getEmail()); $entry->setAuthorName((string) $user->getDisplayName()); $entry->setFeed($feed); $entry->setPublisher($publishers->first()); $entry->setTitle($row['name']); $entry->setSubtitle($row['descript']); $feed->addEntry($entry); $date_create = new DateTime($row['pub_date']); if ($date_create < $date_ref) { $date_ref = $date_create; } $entry->setCreatedOn($date_create); if ($row['updater'] != '0000-00-00 00:00:00') { $date_update = new DateTime($row['updater']); $entry->setUpdatedOn($date_update); } $sql = 'SELECT sselcont_id, ssel_id, base_id, record_id FROM sselcont WHERE ssel_id = :ssel_id ORDER BY ord ASC'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute([':ssel_id' => $row['ssel_id']]); $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); foreach ($rs as $row) { try { $record = new record_adapter($app, phrasea::sbasFromBas($app, $row['base_id']), $row['record_id']); $item = new FeedItem(); $item->setEntry($entry); $entry->addItem($item); $item->setRecordId($record->get_record_id()); $item->setSbasId($record->get_sbas_id()); $app['orm.em']->persist($item); } catch (NotFoundHttpException $e) { } } $app['orm.em']->persist($entry); $sql = 'UPDATE ssel SET deleted = "1", migrated="1" WHERE ssel_id = :ssel_id'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute([':ssel_id' => $row['ssel_id']]); $stmt->closeCursor(); $app['orm.em']->persist($feed); $n++; if ($n % 1000 == 0) { $app['orm.em']->flush(); $app['orm.em']->clear(); } } $this->set_feed_dates($date_ref); $app['orm.em']->flush(); $app['orm.em']->clear(); $app['orm.em']->getEventManager()->removeEventSubscriber(new TimestampableListener()); return true; }
/** * Retrieve detailled informations about one story * * @param \record_adapter $story * * @return array */ public function list_story(Application $app, Request $request, \record_adapter $story) { if (!$story->is_grouping()) { return Result::createError($request, 404, 'Story not found')->createResponse(); } $that = $this; $records = array_map(function (\record_adapter $record) use($that, $app) { return $that->list_record($app, $record); }, array_values($story->get_children()->get_elements())); $caption = $story->get_caption(); $format = function (\caption_record $caption, $dcField) { $field = $caption->get_dc_field($dcField); if (!$field) { return null; } return $field->get_serialized_values(); }; return ['@entity@' => self::OBJECT_TYPE_STORY, 'databox_id' => $story->get_sbas_id(), 'story_id' => $story->get_record_id(), 'updated_on' => $story->get_modification_date()->format(DATE_ATOM), 'created_on' => $story->get_creation_date()->format(DATE_ATOM), 'collection_id' => \phrasea::collFromBas($app, $story->get_base_id()), 'thumbnail' => $this->list_embedable_media($app, $story, $story->get_thumbnail()), 'uuid' => $story->get_uuid(), 'metadatas' => ['@entity@' => self::OBJECT_TYPE_STORY_METADATA_BAG, 'dc:contributor' => $format($caption, \databox_Field_DCESAbstract::Contributor), 'dc:coverage' => $format($caption, \databox_Field_DCESAbstract::Coverage), 'dc:creator' => $format($caption, \databox_Field_DCESAbstract::Creator), 'dc:date' => $format($caption, \databox_Field_DCESAbstract::Date), 'dc:description' => $format($caption, \databox_Field_DCESAbstract::Description), 'dc:format' => $format($caption, \databox_Field_DCESAbstract::Format), 'dc:identifier' => $format($caption, \databox_Field_DCESAbstract::Identifier), 'dc:language' => $format($caption, \databox_Field_DCESAbstract::Language), 'dc:publisher' => $format($caption, \databox_Field_DCESAbstract::Publisher), 'dc:relation' => $format($caption, \databox_Field_DCESAbstract::Relation), 'dc:rights' => $format($caption, \databox_Field_DCESAbstract::Rights), 'dc:source' => $format($caption, \databox_Field_DCESAbstract::Source), 'dc:subject' => $format($caption, \databox_Field_DCESAbstract::Subject), 'dc:title' => $format($caption, \databox_Field_DCESAbstract::Title), 'dc:type' => $format($caption, \databox_Field_DCESAbstract::Type)], 'records' => $records]; }
/** * @param Application $app * @param \record_adapter $Story * @return StoryWZ[] */ public function findByRecord(Application $app, \record_adapter $Story) { $dql = 'SELECT s FROM Phraseanet:StoryWZ s WHERE s.sbas_id = :sbas_id AND s.record_id = :record_id'; $query = $this->_em->createQuery($dql); $query->setParameters(['sbas_id' => $Story->get_sbas_id(), 'record_id' => $Story->get_record_id()]); /** @var StoryWZ[] $stories */ $stories = $query->getResult(); foreach ($stories as $key => $story) { try { $story->getRecord($app); } catch (NotFoundHttpException $e) { $this->getEntityManager()->remove($story); $this->getEntityManager()->flush(); unset($stories[$key]); } } return $stories; }
/** * * @param Application $app * @param string $lst * @param integer $sstid * @param integer $storyWZid * @return set_export */ public function __construct(Application $app, $lst, $sstid, $storyWZid = null) { $this->app = $app; $download_list = []; $remain_hd = []; if ($storyWZid) { $repository = $app['EM']->getRepository('\\Entities\\StoryWZ'); $storyWZ = $repository->findByUserAndId($this->app, $app['authentication']->getUser(), $storyWZid); $lst = $storyWZ->getRecord($this->app)->get_serialize_key(); } if ($sstid != "") { $repository = $app['EM']->getRepository('Phraseanet:Basket'); /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ $Basket = $repository->findUserBasket($sstid, $app['authentication']->getUser(), false); $this->exportName = str_replace([' ', '\\', '/'], '_', $Basket->getName()) . "_" . date("Y-n-d"); foreach ($Basket->getElements() as $basket_element) { $base_id = $basket_element->getRecord($this->app)->get_base_id(); $record_id = $basket_element->getRecord($this->app)->get_record_id(); if (!isset($remain_hd[$base_id])) { if ($app['acl']->get($app['authentication']->getUser())->is_restricted_download($base_id)) { $remain_hd[$base_id] = $app['acl']->get($app['authentication']->getUser())->remaining_download($base_id); } else { $remain_hd[$base_id] = false; } } $current_element = $download_list[] = new record_exportElement($app, $basket_element->getRecord($this->app)->get_sbas_id(), $record_id, $Basket->getName(), $remain_hd[$base_id]); $remain_hd[$base_id] = $current_element->get_remain_hd(); } } else { $this->exportName = "Export_" . date("Y-n-d") . '_' . mt_rand(100, 999); $tmp_lst = explode(';', $lst); $n = 1; foreach ($tmp_lst as $basrec) { $basrec = explode('_', $basrec); if (count($basrec) != 2) { continue; } try { $record = new record_adapter($this->app, $basrec[0], $basrec[1]); } catch (\Exception_Record_AdapterNotFound $e) { continue; } if ($record->is_grouping()) { foreach ($record->get_children() as $child_basrec) { $base_id = $child_basrec->get_base_id(); $record_id = $child_basrec->get_record_id(); if (!isset($remain_hd[$base_id])) { if ($app['acl']->get($app['authentication']->getUser())->is_restricted_download($base_id)) { $remain_hd[$base_id] = $app['acl']->get($app['authentication']->getUser())->remaining_download($base_id); } else { $remain_hd[$base_id] = false; } } $current_element = $download_list[] = new record_exportElement($app, $child_basrec->get_sbas_id(), $record_id, $record->get_title(null, null, true) . '_' . $n, $remain_hd[$base_id]); $remain_hd[$base_id] = $current_element->get_remain_hd(); } } else { $base_id = $record->get_base_id(); $record_id = $record->get_record_id(); if (!isset($remain_hd[$base_id])) { if ($app['acl']->get($app['authentication']->getUser())->is_restricted_download($base_id)) { $remain_hd[$base_id] = $app['acl']->get($app['authentication']->getUser())->remaining_download($base_id); } else { $remain_hd[$base_id] = false; } } $current_element = $download_list[$basrec[0] . '_' . $basrec[1]] = new record_exportElement($app, $record->get_sbas_id(), $record_id, '', $remain_hd[$base_id]); $remain_hd[$base_id] = $current_element->get_remain_hd(); } $n++; } } $this->elements = $download_list; $display_download = []; $display_orderable = []; $this->total_download = 0; $this->total_order = 0; $this->total_ftp = 0; $this->businessFieldsAccess = false; foreach ($this->elements as $download_element) { if ($app['acl']->get($app['authentication']->getUser())->has_right_on_base($download_element->get_base_id(), 'canmodifrecord')) { $this->businessFieldsAccess = true; } foreach ($download_element->get_downloadable() as $name => $properties) { if (!isset($display_download[$name])) { $display_download[$name] = ['size' => 0, 'total' => 0, 'available' => 0, 'refused' => []]; } $display_download[$name]['total']++; if ($properties !== false) { $display_download[$name]['available']++; $display_download[$name]['label'] = $properties['label']; $display_download[$name]['class'] = $properties['class']; $this->total_download++; $display_download[$name]['size'] += $download_element->get_size($name); } else { $display_download[$name]['refused'][] = $download_element->get_thumbnail(); } } foreach ($download_element->get_orderable() as $name => $properties) { if (!isset($display_orderable[$name])) { $display_orderable[$name] = ['total' => 0, 'available' => 0, 'refused' => []]; } $display_orderable[$name]['total']++; if ($properties !== false) { $display_orderable[$name]['available']++; $this->total_order++; } else { $display_orderable[$name]['refused'][] = $download_element->get_thumbnail(); } } } foreach ($display_download as $name => $values) { $display_download[$name]['size'] = (int) $values['size']; } $display_ftp = []; $hasadminright = $app['acl']->get($app['authentication']->getUser())->has_right('addrecord') || $app['acl']->get($app['authentication']->getUser())->has_right('deleterecord') || $app['acl']->get($app['authentication']->getUser())->has_right('modifyrecord') || $app['acl']->get($app['authentication']->getUser())->has_right('coll_manage') || $app['acl']->get($app['authentication']->getUser())->has_right('coll_modify_struct'); $this->ftp_datas = []; if ($this->app['conf']->get(['registry', 'ftp', 'ftp-enabled']) && ($hasadminright || $this->app['conf']->get(['registry', 'ftp', 'ftp-user-access']))) { $display_ftp = $display_download; $this->total_ftp = $this->total_download; $lst_base_id = array_keys($app['acl']->get($app['authentication']->getUser())->get_granted_base()); if ($hasadminright) { $sql = "SELECT Users.id AS usr_id ,Users.login AS usr_login ,Users.email AS usr_mail, FtpCredential.*\n FROM (\n FtpCredential INNER JOIN Users ON (\n FtpCredential.active = 1 AND FtpCredential.user_id = Users.id\n ) INNER JOIN basusr ON (\n Users.id=basusr.usr_id\n AND (basusr.base_id=\n '" . implode("' OR basusr.base_id='", $lst_base_id) . "'\n )\n )\n )\n GROUP BY Users.id "; $params = []; } elseif ($this->app['conf']->get(['registry', 'ftp', 'ftp-user-access'])) { $sql = "SELECT Users.id AS usr_id ,Users.login AS usr_login ,Users.email AS usr_mail, FtpCredential.*\n FROM (\n FtpCredential INNER JOIN Users ON (\n FtpCredential.active = 1 AND FtpCredential.id = Users.id\n ) INNER JOIN basusr ON (\n Users.id=basusr.usr_id\n AND Users.id = :usr_id\n AND (basusr.base_id=\n '" . implode("' OR basusr.base_id='", $lst_base_id) . "'\n )\n )\n )\n GROUP BY Users.id "; $params = [':usr_id' => $app['authentication']->getUser()->getId()]; } $datas[] = ['name' => $app->trans('export::ftp: reglages manuels'), 'usr_id' => '0', 'address' => '', 'login' => '', 'password' => '', 'ssl' => false, 'dest_folder' => '', 'prefix_folder' => 'Export_' . date("Y-m-d_H.i.s"), 'passive' => false, 'max_retry' => 5, 'sendermail' => $app['authentication']->getUser()->getEmail()]; $stmt = $app['phraseanet.appbox']->get_connection()->prepare($sql); $stmt->execute($params); $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); foreach ($rs as $row) { $datas[] = ['name' => $row["usr_login"], 'usr_id' => $row['usr_id'], 'address' => $row['address'], 'login' => $row['login'], 'password' => $row['password'], 'ssl' => !!$row['tls'], 'dest_folder' => $row['reception_folder'], 'prefix_folder' => strlen(trim($row['repository_prefix_name'])) > 0 ? trim($row['repository_prefix_name']) : 'Export_' . date("Y-m-d_H.i.s"), 'passive' => !!$row['passive'], 'max_retry' => $row['max_retry'], 'usr_mail' => $row['usr_mail'], 'sender_mail' => $app['authentication']->getUser()->getEmail()]; } $this->ftp_datas = $datas; } $this->display_orderable = $display_orderable; $this->display_download = $display_download; $this->display_ftp = $display_ftp; return $this; }
public function grant_preview_on(record_adapter $record, User $pusher, $action) { $sql = 'REPLACE INTO records_rights (id, usr_id, sbas_id, record_id, preview, `case`, pusher_usr_id) VALUES (null, :usr_id, :sbas_id, :record_id, 1, :case, :pusher)'; $params = [':usr_id' => $this->user->getId(), ':sbas_id' => $record->get_sbas_id(), ':record_id' => $record->get_record_id(), ':case' => $action, ':pusher' => $pusher->getId()]; $stmt = $this->app['phraseanet.appbox']->get_connection()->prepare($sql); $stmt->execute($params); $stmt->closeCursor(); $this->delete_data_from_cache(self::CACHE_RIGHTS_RECORDS); return $this; }
public function findReceivedValidationElementsByRecord(\record_adapter $record, User $user) { $dql = 'SELECT e FROM Phraseanet:BasketElement e JOIN e.basket b JOIN b.validation v JOIN v.participants p WHERE p.user = :usr_id AND e.record_id = :record_id AND e.sbas_id = :sbas_id'; $params = ['sbas_id' => $record->get_sbas_id(), 'record_id' => $record->get_record_id(), 'usr_id' => $user->getId()]; $query = $this->_em->createQuery($dql); $query->setParameters($params); return $query->getResult(); }
/** * Return basic information about a record * * @param integer $bid base id * @param integer $rid record id * @param array $tab config for the html table * * @return array */ public function buildTabUserWhat($bid, $rid, $tab = false) { $this->initialize(); $sbas_id = phrasea::sbasFromBas($this->app, $bid); try { $record = new record_adapter($this->app, $sbas_id, $rid); } catch (\Exception_Record_AdapterNotFound $e) { return $this->report; } $this->setDisplay($tab); $this->champ = ['photo', 'record_id', 'date', 'type', 'titre', 'taille']; $document = $record->get_subdef('document'); $this->title = $this->app->trans('report:: Information sur l\'enregistrement numero %number%', ['%number%' => (int) $rid]); $x = $record->get_thumbnail(); $this->result[] = ['photo' => "<img style='width:" . $x->get_width() . "px;height:" . $x->get_height() . "px;'\n src='" . $x->get_url() . "'>", 'record_id' => $record->get_record_id(), 'date' => $this->app['date-formatter']->getPrettyString($document->get_creation_date()), 'type' => $document->get_mime(), 'titre' => $record->get_title(), 'taille' => $document->get_size()]; $this->setDisplayNav(); $this->setReport(); return $this->report; }
public function removeChild(\record_adapter $record) { if (!$this->is_grouping()) { throw new \Exception('Only stories can append children'); } $connbas = $this->get_databox()->get_connection(); $sql = "DELETE FROM regroup WHERE rid_parent = :parent_record_id\n AND rid_child = :record_id"; $params = [':parent_record_id' => $this->get_record_id(), ':record_id' => $record->get_record_id()]; $stmt = $connbas->prepare($sql); $stmt->execute($params); $stmt->closeCursor(); $sql = 'UPDATE record SET moddate = NOW() WHERE record_id = :record_id'; $stmt = $connbas->prepare($sql); $stmt->execute([':record_id' => $this->get_record_id()]); $stmt->closeCursor(); $this->delete_data_from_cache(); return $this; }
/** * {@inheritdoc} */ public function removeRecord(\record_adapter $record) { $connbas = $record->get_databox()->get_connection(); $sql = "DELETE FROM prop WHERE record_id = :record_id"; $stmt = $connbas->prepare($sql); $stmt->execute([':record_id' => $record->get_record_id()]); $stmt->closeCursor(); $sql = "DELETE FROM idx WHERE record_id = :record_id"; $stmt = $connbas->prepare($sql); $stmt->execute([':record_id' => $record->get_record_id()]); $stmt->closeCursor(); $sql = "DELETE FROM thit WHERE record_id = :record_id"; $stmt = $connbas->prepare($sql); $stmt->execute([':record_id' => $record->get_record_id()]); $stmt->closeCursor(); unset($stmt, $connbas); return $this; }
public function setRecord(\record_adapter $record) { $this->setRecordId($record->get_record_id()); $this->setSbasId($record->get_sbas_id()); }
/** * {@inheritdoc} */ public function removeRecord(\record_adapter $record) { if (!$this->rt_conn) { throw new RuntimeException('Unable to connect to sphinx real-time index'); } $CRCdatabox = $this->CRCdatabox($record->get_databox()); $indexes = ["metadatas" . $CRCdatabox, "metadatas" . $CRCdatabox . "_stemmed_en", "metadatas" . $CRCdatabox . "_stemmed_fr", "metadatas" . $CRCdatabox . "_stemmed_de", "metadatas" . $CRCdatabox . "_stemmed_nl"]; $RTindexes = ["metas_realtime" . $CRCdatabox, "metas_realtime_stemmed_fr_" . $CRCdatabox, "metas_realtime_stemmed_en_" . $CRCdatabox, "metas_realtime_stemmed_nl_" . $CRCdatabox, "metas_realtime_stemmed_de_" . $CRCdatabox]; foreach ($record->get_caption()->get_fields(null, true) as $field) { foreach ($field->get_values() as $value) { foreach ($indexes as $index) { $this->sphinx->UpdateAttributes($index, ["deleted"], [$value->getId() => [1]]); } foreach ($RTindexes as $index) { $this->rt_conn->exec("DELETE FROM " . $index . " WHERE id = " . $value->getId()); } } } $indexes = ["documents" . $CRCdatabox, "documents" . $CRCdatabox . "_stemmed_fr", "documents" . $CRCdatabox . "_stemmed_en", "documents" . $CRCdatabox . "_stemmed_de", "documents" . $CRCdatabox . "_stemmed_nl"]; $RTindexes = ["docs_realtime" . $CRCdatabox, "docs_realtime_stemmed_fr_" . $CRCdatabox, "docs_realtime_stemmed_en_" . $CRCdatabox, "docs_realtime_stemmed_nl_" . $CRCdatabox, "docs_realtime_stemmed_de_" . $CRCdatabox]; foreach ($indexes as $index) { $this->sphinx->UpdateAttributes($index, ["deleted"], [$record->get_record_id() => [1]]); } foreach ($RTindexes as $index) { $this->rt_conn->exec("DELETE FROM " . $index . " WHERE id = " . $record->get_record_id()); } return $this; }
public function hasRecord(Application $app, \record_adapter $record) { foreach ($this->getElements() as $basket_element) { $bask_record = $basket_element->getRecord($app); if ($bask_record->get_record_id() == $record->get_record_id() && $bask_record->get_sbas_id() == $record->get_sbas_id()) { return true; } } return false; }
public function testRecordsSetStatus() { self::$DI['app']['phraseanet.SE'] = $this->createSearchEngineMock(); $this->setToken($this->userAccessToken); $route = '/api/v1/records/' . self::$DI['record_1']->get_sbas_id() . '/' . self::$DI['record_1']->get_record_id() . '/setstatus/'; $record_status = strrev(self::$DI['record_1']->get_status()); $statusStructure = self::$DI['record_1']->getStatusStructure(); $tochange = []; foreach ($statusStructure as $n => $datas) { $tochange[$n] = substr($record_status, $n - 1, 1) == '0' ? '1' : '0'; } $this->evaluateMethodNotAllowedRoute($route, ['GET', 'PUT', 'DELETE']); self::$DI['client']->request('POST', $route, $this->getParameters(['status' => $tochange]), [], ['HTTP_Accept' => $this->getAcceptMimeType()]); $content = $this->unserialize(self::$DI['client']->getResponse()->getContent()); /** * Get fresh record_1 */ $testRecord = new \record_adapter(self::$DI['app'], self::$DI['record_1']->get_sbas_id(), self::$DI['record_1']->get_record_id()); $this->evaluateResponse200(self::$DI['client']->getResponse()); $this->evaluateMeta200($content); $this->evaluateRecordsStatusResponse($testRecord, $content); $record_status = strrev($testRecord->get_status()); foreach ($statusStructure as $n => $datas) { $this->assertEquals(substr($record_status, $n, 1), $tochange[$n]); } foreach ($tochange as $n => $value) { $tochange[$n] = $value == '0' ? '1' : '0'; } self::$DI['client']->request('POST', $route, $this->getParameters(['status' => $tochange]), [], ['HTTP_Accept' => $this->getAcceptMimeType()]); $content = $this->unserialize(self::$DI['client']->getResponse()->getContent()); /** * Get fresh record_1 */ $testRecord = new \record_adapter(self::$DI['app'], $testRecord->get_sbas_id(), $testRecord->get_record_id()); $this->evaluateResponse200(self::$DI['client']->getResponse()); $this->evaluateMeta200($content); $this->evaluateRecordsStatusResponse($testRecord, $content); $record_status = strrev($testRecord->get_status()); foreach ($statusStructure as $n => $datas) { $this->assertEquals(substr($record_status, $n, 1), $tochange[$n]); } self::$DI['record_1']->set_binary_status(str_repeat('0', 32)); }
/** * @covers Alchemy\Phrasea\Controller\Prod\Property::changeType */ public function testChangeType() { $file = new File(self::$DI['app'], self::$DI['app']['mediavorus']->guess(__DIR__ . '/../../../../../files/cestlafete.jpg'), self::$DI['collection']); $record = \record_adapter::createFromFile($file, self::$DI['app']); $record2 = \record_adapter::createFromFile($file, self::$DI['app']); self::$DI['client']->request('POST', '/prod/records/property/type/', ['lst' => implode(';', [$record->get_serialize_key(), $record2->get_serialize_key()]), 'types' => [$record->get_serialize_key() => 'document', $record2->get_serialize_key() => 'flash']]); $response = self::$DI['client']->getResponse(); $datas = (array) json_decode($response->getContent()); $this->assertArrayHasKey('success', $datas); $this->assertTrue($datas['success']); $this->assertArrayHasKey('updated', $datas); $record = new \record_adapter(self::$DI['app'], $record->get_sbas_id(), $record->get_record_id()); $record2 = new \record_adapter(self::$DI['app'], $record2->get_sbas_id(), $record2->get_record_id()); $this->assertEquals('document', $record->get_type()); $this->assertEquals('flash', $record2->get_type()); $record->delete(); $record2->delete(); unset($response, $datas, $record2, $record, $file); }
/** * @covers media_subdef::get_record_id */ public function testGet_record_id() { $this->assertEquals(self::$recordonbleu->get_record_id(), self::$objectNotPresent->get_record()->get_record_id()); $this->assertEquals(self::$recordonbleu->get_record_id(), self::$objectPresent->get_record()->get_record_id()); }
public function connect(Application $app) { $app['controller.prod.story'] = $this; $controllers = $app['controllers_factory']; $app['firewall']->addMandatoryAuthentication($controllers); $controllers->get('/create/', function (Application $app) { return $app['twig']->render('prod/Story/Create.html.twig', []); })->bind('prod_stories_create'); $controllers->post('/', function (Application $app, Request $request) { /* @var $request \Symfony\Component\HttpFoundation\Request */ $collection = \collection::get_from_base_id($app, $request->request->get('base_id')); if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_base($collection->get_base_id(), 'canaddrecord')) { throw new AccessDeniedHttpException('You can not create a story on this collection'); } $Story = \record_adapter::createStory($app, $collection); $records = RecordsRequest::fromRequest($app, $request, true); foreach ($records as $record) { if ($Story->hasChild($record)) { continue; } $Story->appendChild($record); } $metadatas = []; foreach ($collection->get_databox()->get_meta_structure() as $meta) { if ($meta->get_thumbtitle()) { $value = $request->request->get('name'); } else { continue; } $metadatas[] = ['meta_struct_id' => $meta->get_id(), 'meta_id' => null, 'value' => $value]; break; } $Story->set_metadatas($metadatas)->rebuild_subdefs(); $StoryWZ = new StoryWZ(); $StoryWZ->setUser($app['authentication']->getUser()); $StoryWZ->setRecord($Story); $app['EM']->persist($StoryWZ); $app['EM']->flush(); if ($request->getRequestFormat() == 'json') { $data = ['success' => true, 'message' => $app->trans('Story created'), 'WorkZone' => $StoryWZ->getId(), 'story' => ['sbas_id' => $Story->get_sbas_id(), 'record_id' => $Story->get_record_id()]]; return $app->json($data); } else { return $app->redirectPath('prod_stories_story', ['sbas_id' => $StoryWZ->getSbasId(), 'record_id' => $StoryWZ->getRecordId()]); } })->bind('prod_stories_do_create'); $controllers->get('/{sbas_id}/{record_id}/', function (Application $app, $sbas_id, $record_id) { $Story = new \record_adapter($app, $sbas_id, $record_id); $html = $app['twig']->render('prod/WorkZone/Story.html.twig', ['Story' => $Story]); return new Response($html); })->bind('prod_stories_story')->assert('sbas_id', '\\d+')->assert('record_id', '\\d+'); $controllers->post('/{sbas_id}/{record_id}/addElements/', function (Application $app, Request $request, $sbas_id, $record_id) { $Story = new \record_adapter($app, $sbas_id, $record_id); if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_base($Story->get_base_id(), 'canmodifrecord')) { throw new AccessDeniedHttpException('You can not add document to this Story'); } $n = 0; $records = RecordsRequest::fromRequest($app, $request, true); foreach ($records as $record) { if ($Story->hasChild($record)) { continue; } $Story->appendChild($record); $n++; } $data = ['success' => true, 'message' => $app->trans('%quantity% records added', ['%quantity%' => $n])]; if ($request->getRequestFormat() == 'json') { return $app->json($data); } else { return $app->redirectPath('prod_stories_story', ['sbas_id' => $sbas_id, 'record_id' => $record_id]); } })->assert('sbas_id', '\\d+')->assert('record_id', '\\d+'); $controllers->post('/{sbas_id}/{record_id}/delete/{child_sbas_id}/{child_record_id}/', function (Application $app, Request $request, $sbas_id, $record_id, $child_sbas_id, $child_record_id) { $Story = new \record_adapter($app, $sbas_id, $record_id); $record = new \record_adapter($app, $child_sbas_id, $child_record_id); if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_base($Story->get_base_id(), 'canmodifrecord')) { throw new AccessDeniedHttpException('You can not add document to this Story'); } $Story->removeChild($record); $data = ['success' => true, 'message' => $app->trans('Record removed from story')]; if ($request->getRequestFormat() == 'json') { return $app->json($data); } else { return $app->redirectPath('prod_stories_story', ['sbas_id' => $sbas_id, 'record_id' => $record_id]); } })->bind('prod_stories_story_remove_element')->assert('sbas_id', '\\d+')->assert('record_id', '\\d+')->assert('child_sbas_id', '\\d+')->assert('child_record_id', '\\d+'); /** * Get the Basket reorder form */ $controllers->get('/{sbas_id}/{record_id}/reorder/', function (Application $app, $sbas_id, $record_id) { $story = new \record_adapter($app, $sbas_id, $record_id); if (!$story->is_grouping()) { throw new \Exception('This is not a story'); } return new Response($app['twig']->render('prod/Story/Reorder.html.twig', ['story' => $story])); })->bind('prod_stories_story_reorder')->assert('sbas_id', '\\d+')->assert('record_id', '\\d+'); $controllers->post('/{sbas_id}/{record_id}/reorder/', function (Application $app, $sbas_id, $record_id) { $ret = ['success' => false, 'message' => $app->trans('An error occured')]; try { $story = new \record_adapter($app, $sbas_id, $record_id); if (!$story->is_grouping()) { throw new \Exception('This is not a story'); } if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_base($story->get_base_id(), 'canmodifrecord')) { throw new ControllerException($app->trans('You can not edit this story')); } $sql = 'UPDATE regroup SET ord = :ord WHERE rid_parent = :parent_id AND rid_child = :children_id'; $stmt = $story->get_databox()->get_connection()->prepare($sql); foreach ($app['request']->request->get('element') as $record_id => $ord) { $params = [':ord' => $ord, ':parent_id' => $story->get_record_id(), ':children_id' => $record_id]; $stmt->execute($params); } $stmt->closeCursor(); $ret = ['success' => true, 'message' => $app->trans('Story updated')]; } catch (ControllerException $e) { $ret = ['success' => false, 'message' => $e->getMessage()]; } catch (\Exception $e) { } return $app->json($ret); })->assert('sbas_id', '\\d+')->assert('record_id', '\\d+'); return $controllers; }