<?php
namespace OceanExpertBundle\Controller;
use DateTime;
use OceanExpertBundle\Entity\AgendaitemDocuments;
use OceanExpertBundle\Entity\DoclistDocuments;
use OceanExpertBundle\Entity\DoclistGroups;
use OceanExpertBundle\Entity\Doclists;
use OceanExpertBundle\Entity\DocumentFiles;
use OceanExpertBundle\Entity\Documents;
use OceanExpertBundle\Entity\EventBackgrounddocs;
use OceanExpertBundle\Entity\EventOtherdocs;
use OceanExpertBundle\Entity\EventPresentations;
use OceanExpertBundle\Entity\EventReports;
use OceanExpertBundle\Repository\DoclistsRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
/**
* Class DocumentController
* @package OceanExpertBundle\Controller
*/
class DocumentController extends AbstractController
{
private DoclistsRepository $doclistsRepository;
public function __construct(DoclistsRepository $doclistsRepository)
{
$this->doclistsRepository = $doclistsRepository;
}
/**
* @param $name
* @return Response
*/
public function indexAction($name)
{
return $this->render('', array('name' => $name));
}
/**
* @param Request $request
* @return Response
*/
public function searchDocumentAction(Request $request)
{
$searchTerm = $request->request->get('searchterm');
$request->request->get('doctype');
$em = $this->getDoctrine()->getManager();
$result = $em->getRepository('OceanExpertBundle:Documents')->createQueryBuilder('d')
->select('d.idDoc,d.title,d.authorText,dt.doctypename')
->leftJoin('OceanExpertBundle:Doctypes', 'dt', 'WITH', 'd.idDoctype = dt.idDoctype')
->where('d.title LIKE :searchterm')
->orWhere('d.summary LIKE :searchterm')
->orWhere('d.authorText LIKE :searchterm')
->orWhere('d.docCode LIKE :searchterm')
->andWhere('d.approved = 1')
->setParameter('searchterm', '%' . $searchTerm . '%')
->getQuery()
->getResult();
return new JsonResponse(array('data' => $result));
}
/**
* @param Request $request
* @param $idDoc
* @return Response
*/
public function getDocumentByIdAction(Request $request, $idDoc)
{
if ($idDoc == 0) {
$idDoc = $request->query->get('idDoc');
}
$em = $this->getDoctrine()->getManager();
$result = $em->getRepository('OceanExpertBundle:Documents')->createQueryBuilder('d')
->select('d.docCode, d.idDoc, d.title, d.summary, d.authorText, d.publishedOn, d.notes, d.keywords, d.createdAt, d.updatedAt,d.idCreator,d.lastEditBy,dt.doctypename')
->leftJoin('OceanExpertBundle:Doctypes', 'dt', 'WITH', 'd.idDoctype = dt.idDoctype')
->where('d.idDoc = :idDoc')
->setParameter('idDoc', $idDoc)
->getQuery()
->getResult()[0];
if ($result['idCreator'] != '') {
$indiv = $this->getDoctrine()->getRepository('OceanExpertBundle:Indiv')->findOneByIdInd($result['idCreator']);
if ($indiv) {
$result['createdBy'] = $indiv->getFname() . ' ' . $indiv->getSname();
} else {
$result['createdBy'] = '';
}
}
if ($result['lastEditBy'] != '') {
$indiv = $this->getDoctrine()->getRepository('OceanExpertBundle:Indiv')->findOneByIdInd($result['lastEditBy']);
if ($indiv) {
$result['updatedBy'] = $indiv->getFname() . ' ' . $indiv->getSname();
} else {
$result['updatedBy'] = '';
}
}
$groups = $em->getRepository('OceanExpertBundle:DocumentGroups')->createQueryBuilder('d')
->select('d.idGroup,g.groupname')
->leftJoin('OceanExpertBundle:Groups', 'g', 'WITH', 'd.idGroup = g.idGroup')
->where('d.idDoc = :idDoc')
->setParameter('idDoc', $idDoc)
->getQuery()
->getResult();
$docGroupList = $em->getRepository('OceanExpertBundle:DoclistDocuments')->createQueryBuilder('d')
->select('dl.idDoclist, dl.title')
->leftJoin('OceanExpertBundle:Doclists', 'dl', 'WITH', 'dl.idDoclist = d.idDoclist')
->where('d.idDoc = :idDoc')
->setParameter('idDoc', $idDoc)
->getQuery()
->getResult();
$docFiles = $em->getRepository('OceanExpertBundle:DocumentFiles')->createQueryBuilder('d')
->select('d.idFileformat, d.version, l.languagename, d.idFile, f.filename, f.url, f.size,f.content,f.path')
->leftJoin('OceanExpertBundle:Files', 'f', 'WITH', 'f.idFile = d.idFile')
->leftJoin('OceanExpertBundle:Languages', 'l', 'WITH', 'f.idLanguage = l.idLanguage')
->where('d.idDoc = :idDoc')
->setParameter('idDoc', $idDoc)
->getQuery()
->getResult();
$result['documentGroup'] = $groups;
$result['docGroupList'] = $docGroupList;
$result['docFiles'] = $docFiles;
return $this->render('Documents/view.document.block.html.twig', array('data' => $result));
}
/**
*
*/
public function deleteEventDocumentAction(Request $request)
{
$authorised = true;
$docType = $request->request->get('doctype');
$idEvent = $request->request->get('idEvent');
$idDoc = $request->request->get('idDoc');
if (null != ($request->request->get('idAgenda'))) {
$idAgenda = $request->request->get('idAgenda');
} else {
$idAgenda = '';
}
$id = 0;
if ($authorised) {
$em = $this->getDoctrine()->getManager();
switch ($docType) {
case 'report':
$report = $em->getRepository('OceanExpertBundle:EventReports')->findOneBy(array('idEvent' => $idEvent, 'idDoc' => $idDoc));
if ($report) {
$em->remove($report);
$em->flush();
$id = 1;
}
break;
case 'presentation':
$presentation = $em->getRepository('OceanExpertBundle:EventPresentations')->findOneBy(array('idEvent' => $idEvent, 'idDoc' => $idDoc));
if ($presentation) {
$em->remove($presentation);
$em->flush();
$id = 2;
}
break;
case 'backgrounddocs':
$backgroundocs = $em->getRepository('OceanExpertBundle:EventBackgrounddocs')->findOneBy(array('idEvent' => $idEvent, 'idDoc' => $idDoc));
if ($backgroundocs) {
$em->remove($backgroundocs);
$em->flush();
$id = 3;
}
break;
case 'agendaitems':
if ($idAgenda != '') {
$agendaDetails = $em->getRepository('OceanExpertBundle:EventAgendaitems')->findOneBy(array('idEvent' => $idEvent, 'id' => $idAgenda));
if ($agendaDetails) {
$agendaitem = $agendaDetails->getIdAgendaitem();
$agendaDocs = $em->getRepository('OceanExpertBundle:AgendaitemDocuments')->findOneBy(array('idEvent' => $idEvent, 'idDoc' => $idDoc, 'idAgendaitem' => $agendaitem));
if ($agendaDocs) {
$em->remove($agendaDocs);
$em->flush();
$id = 5;
}
}
}
break;
case 'otherdocs':
$otherdocs = $em->getRepository('OceanExpertBundle:EventOtherdocs')->findOneBy(array('idEvent' => $idEvent, 'idDoc' => $idDoc));
if ($otherdocs) {
$em->remove($otherdocs);
$em->flush();
$id = 4;
}
break;
default:
echo 'No type provided';
break;
}
}
if ($id != 0) {
$data = array('status' => 1, 'section' => $docType, 'idAgenda' => $idAgenda, 'idEvent' => $idEvent, 'idDoc' => $idDoc);
return new JsonResponse($data);
} else {
return new JsonResponse(array('status' => 0));
}
}
/**
* upload a new file that is attached to an event or a doclist
*
* @param Request $request
*
* @return JsonResponse
*/
public function uploadEventDocumentAction(Request $request): JsonResponse
{
$userId = $this->get('security.token_storage')
->getToken()
->getUser()
->getid();
//get all the data we need
$uploadFile = $request->files->get('file');
parse_str($request->request->get('formdata'), $params);
//summary and notes are in the get request for both events and doclists
$summary = $request->request->get('summary');
$notes = $request->request->get('notes');
//something strange is going on with the title when using doclist
//the title of the document is replace with the title of the doclist
//try to avoid that
if ($request->request->get('doc-title') != '') {
$title = $request->request->get('doc-title');
} elseif (isset($params['title'])
&& $params['title'] != ''
) {
$title = $params['title'];
} else {
$title = 'no title';
}
if (isset($params['doctype'])
&& $params['doctype'] != ''
) {
$docType = $params['doctype'];
} else {
$docType = $request->request->get('doctype');
}
if (isset($params['status'])
&& $params['status'] != ''
) {
$status = $params['status'];
} else {
$status = $request->request->get('status');
}
if (isset($params['author'])
&& $params['author'] != ''
) {
$authors = $params['author'];
} elseif ($request->request->get('authors') !== null
&& $request->request->get('authors') != ''
) {
$authors = $request->request->get('authors');
} else {
$authors = '';
}
if (isset($params['keywords'])
&& $params['keywords'] != ''
) {
$keywords = $params['keywords'];
} elseif ($request->request->get('keywords') !== null) {
$keywords = $request->request->get('keywords');
} else {
$keywords = '';
}
if (isset($params['doccode'])
&& $params['doccode'] != ''
) {
$docCode = $params['doccode'];
} elseif ($request->request->get('doccode') !== null) {
$docCode = $request->request->get('doccode');
} else {
$docCode = '';
}
if (isset($params['websiteUrl'])
&& $params['websiteUrl'] != ''
) {
$url = $params['websiteUrl'];
} else {
$url = $request->request->get('url');
}
if (isset($params['doclist'])
&& $params['doclist'] != ''
) {
$docList = $params['doclist'];
} else {
$docList = $request->request->get('doclist');
}
if (isset($params['version'])
&& is_array($params['version'])
&& count($params['version'])
) {
$version = $params['version'];
} else {
//default version is 1
$version = array(1);
}
/*
dump($request->request);
dump($summary);
dump($title);
dump($notes);
dump($uploadFile);
dump($docType);
dump($status);
dump($authors);
dump($keywords);
dump($docCode);
dump($url);
dump($docList);
die();
*/
//cleanup the data
$agendaItem = '';
$idEvent = '';
$idAgenda = '';
$section = '';
$idDoc = '';
if ($docType != ''
&& $status != ''
) {
$em = $this->getDoctrine()->getManager();
/**
* Create a document entry in documents table
*/
$document = new Documents();
$document->setIdDoctype($docType);
$document->setDocCode($docCode);
$document->setTitle($title);
$document->setSummary($summary);
$document->setAuthorText($authors);
$document->setNotes($notes);
$document->setKeywords($keywords);
$document->setUrl($url);
$document->setIdDocstatus($status);
if ($status == 1) {
$document->setPublishedOn(new DateTime('now'));
}
$document->setCreatedAt(new DateTime('now'));
$document->setUpdatedAt(new DateTime('now'));
if ($this->get('security.authorization_checker')->isGranted('ROLE_GLOBAL_EDITOR')) {
$document->setApproved(1);
} else {
$document->setApproved(0);
}
$document->setIdCreator($userId);
$document->setLastEditBy($userId);
$em->persist($document);
$em->flush();
if (is_array($docList)
&& count($docList) > 0
) {
// if documentlist is set then enter id documentlist table.
foreach ($docList as $docListID) {
$doclist = $em->getRepository('OceanExpertBundle:DoclistDocuments')
->findOneBy(
array(
'idDoclist' => $docListID,
'idDoc' => $document->getIdDoc()
)
);
if (!$doclist) {
$doclist = new DoclistDocuments();
}
$doclist->setIdDoclist($docListID);
$doclist->setIdDoc($document->getIdDoc());
$doclist->setAddedAt(new DateTime('now'));
$em->persist($doclist);
$em->flush();
}
}
//if file is uploaded then upload the files in event or document section.
if (count($uploadFile) > 0) {
$i = 0;
foreach ($uploadFile as $file) {
$fileType = $file->guessClientExtension();
//$fileName = $file->getClientOriginalName();
//cleanup the final filename
$fileName = preg_replace(
'/[^\w\.]+/',
'_',
$file->getClientOriginalName()
);
$fileSize = $file->getClientSize();
if ($fileType == 'bin') {
$fileType = pathinfo($fileName, PATHINFO_EXTENSION);
}
$format = $em->getRepository('OceanExpertBundle:Fileformats')
->findOneBy(
array(
'extension' => $fileType
)
);
if ($format) {
$idFileFormat = $format->getIdFileformat();
} else {
$idFileFormat = 0;
}
if (array_key_exists('idEvent',$params)) {
$directory = 'uploads/events/documents/' . $params['idEvent'] . '/';
} else {
$directory = 'uploads/documents/';
}
$uploadfile = $file->move($directory, $fileName);
$filepath = $directory . $fileName;
/**
* Create file entry in files table. == filenew is added as multiple column primary indexes were set in old table,
* cannot change as it might affect previos PPC sections. needs to verify if there is no break of code in the e
* earlier ppc.
*/
if (isset($params['id_language'][$i])) {
$defaultLanguage = $params['id_language'][$i];
} else {
$defaultLanguage = 1;
}
$conn = $this->getDoctrine()->getConnection();
$stmt = $conn->prepare('INSERT INTO files
(version, id_language, id_fileformat, url, size, content, filename)
VALUES
(?, ?, ?, ?, ?, ?, ?)'
);
if (isset($version[$i])) {
$thisVersion = $version[$i];
} else {
$thisVersion = 1;
}
$stmt->bindValue(1, $thisVersion);
$stmt->bindValue(2, $defaultLanguage);
$stmt->bindValue(3, $idFileFormat);
$stmt->bindValue(4, utf8_encode($filepath));
$stmt->bindValue(5, $fileSize);
$stmt->bindValue(6, '');
$stmt->bindValue(7, utf8_encode($filepath));
$stmt->execute();
$idFile = $this->getDoctrine()
->getConnection()
->lastInsertId();
$files = new DocumentFiles();
$files->setIdDoc($document->getIdDoc());
$files->setIdFile($idFile);
$files->setVersion($thisVersion);
$files->setIdLanguage($defaultLanguage);
$files->setIdFileformat($idFileFormat);
$em->persist($files);
$em->flush();
$i++;
}
}
if (array_key_exists('filesection',$params)) {
if (array_key_exists('idEvent',$params)) {
$idEvent = $params['idEvent'];
}
if (array_key_exists('idEvent',$params)) {
$idAgenda = $params['idAgenda'];
}
$idDoc = $document->getIdDoc();
if ($idAgenda != '') {
$agenda = $em->getRepository('OceanExpertBundle:EventAgendaitems')
->findOneBy(
array(
'id' => $idAgenda,
'idEvent' => $idEvent
)
);
if ($agenda) {
$agendaItem = $agenda->getIdAgendaitem();
}
}
//is this linked to some event or agenda
if (array_key_exists('filesection',$params)) {
$section = $params['filesection'];
switch ($section) {
case 1:
$report = $em->getRepository('OceanExpertBundle:EventReports')
->findOneBy(
array('idEvent' => $idEvent)
);
if (!$report) {
$report = new EventReports();
}
$report->setIdEvent($idEvent);
$report->setIdDoc($idDoc);
$em->persist($report);
$em->flush();
break;
case 2:
$presentation = new EventPresentations();
$presentation->setIdEvent($idEvent);
$presentation->setIdDoc($idDoc);
$presentation->setIdAgendaitem('');
$em->persist($presentation);
$em->flush();
break;
case 3:
$backgrounddocs = new EventBackgrounddocs();
$backgrounddocs->setIdEvent($idEvent);
$backgrounddocs->setIdDoc($idDoc);
$backgrounddocs->setIdAgendaitem('');
$em->persist($backgrounddocs);
$em->flush();
break;
case 4:
$otherdocs = new EventOtherdocs();
$otherdocs->setIdEvent($idEvent);
$otherdocs->setIdDoc($idDoc);
$em->persist($otherdocs);
$em->flush();
break;
case 5:
if (isset($agendaItem) && $agendaItem != '') {
$agendaItemDocs = new AgendaitemDocuments();
$agendaItemDocs->setIdEvent($idEvent);
$agendaItemDocs->setIdDoc($idDoc);
$agendaItemDocs->setIdAgendaitem($agendaItem);
$em->persist($agendaItemDocs);
$em->flush();
}
break;
default:
$data = array(
'status' => 0,
'message' => 'document could not be uploaded'
);
return new JsonResponse($data);
}
}
}
$data = array(
'status' => 1,
'section' => $section,
'idEvent' => $idEvent,
'idAgenda' => $idAgenda,
'idDoc' => $idDoc,
'docname' => $title
);
} else {
/*
print 'params:';
dump($params);
dump($summary);
dump($notes);
dump($uploadFile);
die();
*/
$data = array(
'status' => 1,
'error' => 'something went wrong, not enough data'
);
}
return new JsonResponse($data);
}
/**
* @param $idDoclist
*
* @return Response
*/
public function viewDoclistAction($idDoclist)
{
$data = $this->doclistsRepository
->getDocListDocuments(
intval($idDoclist)
);
return $this->render(
'Documents/view.doclist.html.twig',
array(
'data' => $data
)
);
}
/**
*/
public function viewAllDoclistsAction()
{
/*
* @todo
* this is not used
* should this be gone or will that serve for later?
* Arno 18/06/2021
*
$repository = $this->getDoctrine()
->getManager()
->createQueryBuilder();
$repository->add('select', 'g.idGroup, g.groupname');
$repository->add('from', 'OceanExpertBundle:Groups g');
$repository->where('g.hasSite = 1');
$allGroups = $repository->getQuery()->getResult();
*/
$repository = $this->getDoctrine()
->getManager()
->createQueryBuilder();
$repository->add(
'select',
'd.idDoclist, d.title, d.description,g.idGroup,g.groupname'
);
$repository->add(
'from',
'OceanExpertBundle:Doclists d'
);
$repository->leftJoin(
'OceanExpertBundle:DoclistGroups',
'dg',
'WITH',
'd.idDoclist = dg.idDoclist'
);
$repository->leftJoin(
'OceanExpertBundle:Groups',
'g',
'WITH',
'g.idGroup = dg.idGroup'
);
$repository->where(
'g.groupname is not null'
);
$repository->orderBy(
'g.idGroup',
'ASC'
);
$doclists = $repository->getQuery()
->getResult();
$doclistsArr = [];
$templevel=$doclists[0]['groupname'];
/*
* @todo
* this is not used
* should this be gone or will that serve for later?
* Arno 18/06/2021
*
$grouparr[$templevel] = '';
*/
foreach ($doclists as $key => $val) {
if ($templevel == $val['groupname']) {
$doclistsArr[$templevel][] = $val;
} else {
$doclistsArr[$val['groupname']][] = $val;
}
}
return $this->render(
'Documents/view.doclists.html.twig',
array(
'data' => $doclistsArr
)
);
}
/**
* @param int $idDoclist
*
* @return array
*/
public function getDocListDocuments(int $idDoclist): array
{
$data = array();
$em = $this->getDoctrine()->getManager();
$doclist = $em->getRepository('OceanExpertBundle:Doclists')->findOneBy(array('idDoclist'=>$idDoclist));
if($doclist){
$repository = $this->getDoctrine()->getManager()->createQueryBuilder();
$repository->add('select', 'd.docCode, d.title, d.summary, d.authorText, d.publishedOn,d.idDoc, d.idDocstatus');
$repository->add('from', 'OceanExpertBundle:Documents d');
$repository->leftJoin('OceanExpertBundle:DoclistDocuments', 'dd', 'WITH', 'dd.idDoc = d.idDoc');
$repository->where('dd.idDoclist = :idDoclist');
$repository->setParameter('idDoclist', $idDoclist);
switch ($doclist->getOrderBy()){
case 1:
$repository->orderBy('d.publishedOn','desc');
break;
case 2:
$repository->orderBy('d.publishedOn','asc');
break;
case 3:
$repository->orderBy('dd.addedAt','desc');
break;
case 4:
$repository->orderBy('dd.addedAt','asc');
break;
case 5:
$repository->orderBy('d.docCode','desc');
break;
case 6:
$repository->orderBy('d.docCode','asc');
break;
default:
$repository->orderBy('d.title','asc');
break;
}
$documents = $repository->getQuery()->getResult();
$data = array(
'doclist'=>$doclist,
'documents'=>$documents,
);
}
return $data;
}
/**
* @param int $idDoclist
* @param Request $request
*
* @return Response
*/
public function editDoclistAction(int $idDoclist, Request $request): Response
{
$em = $this->getDoctrine()->getManager();
$author = $this->get('security.token_storage')->getToken()->getUser();
if ($request->isMethod('POST')) {
$doclistdata = $request->request->all();
if ($idDoclist != 0) {
$doclist = $em->getRepository('OceanExpertBundle:Doclists')
->findOneBy(
array(
'idDoclist' => $idDoclist
)
);
} else {
$doclist = new Doclists();
$doclist->setCreatedAt(new DateTime('now'));
$doclist->setCreatedBy($author->getId());
}
$doclist->setTitle(
$doclistdata['title'] ?? ''
);
$doclist->setDescription(
$doclistdata['description'] ?? ''
);
$doclist->setIsPublic(
$doclistdata['isPublic'] ?? 0
);
$doclist->setOrderBy(
$doclistdata['order'] ?? 1
);
$doclist->setUpdatedAt(new DateTime('now'));
$em->persist($doclist);
$em->flush();
if (isset($doclistdata['websitegroup'])
&& $doclistdata['websitegroup'] !== ''
) {
echo $doclistdata['websitegroup'];
$doclistGroup = $em->getRepository('OceanExpertBundle:DoclistGroups')
->findOneBy(
array(
'idDoclist' => $idDoclist
)
);
if (!$doclistGroup) {
$doclistGroup = new DoclistGroups();
$doclistGroup->setIdDoclist($doclist->getIdDoclist());
}
$doclistGroup->setIdGroup($doclistdata['websitegroup']);
$em->persist($doclistGroup);
$em->flush();
}
return $this->redirect(
$this->generateUrl(
'edit_doclist',
array(
'idDoclist' => $doclist->getIdDoclist()
)
)
);
}
$data = $this->getDocListDocuments($idDoclist);
$data['doclistOrder'] = array(
'0' => 'title',
'1' => 'date published (most recent first)',
'2' => 'date published (oldest first)',
'3' => 'date added to list (most recent first)',
'4' => 'date added to list (oldest first)',
'5' => 'document code (reverse alphabetically)',
'6' => 'document code (alphabetically)',
);
$repository = $this->getDoctrine()->getManager()->createQueryBuilder();
$repository->add('select', 'g.idGroup, g.groupname');
$repository->add('from', 'OceanExpertBundle:Groups g');
$repository->where('g.hasSite = 1');
$data['allwebsiteGroup'] = $repository->getQuery()->getResult();
if ($idDoclist != 0){
$repository = $this->getDoctrine()->getManager()->createQueryBuilder();
$repository->add('select', 'd.idGroup');
$repository->add('from', 'OceanExpertBundle:DoclistGroups d');
$repository->where('d.idDoclist = :idDoclist');
$repository->setParameter('idDoclist',$idDoclist);
$repository->getQuery()->getOneOrNullResult();
$data['doclistGroup'] = $repository->getQuery()->getSingleResult();
$doclist = $em->getRepository('OceanExpertBundle:Doclists')->findOneBy(array('idDoclist'=>$idDoclist));
if($doclist){
$data['doclist'] = $doclist;
}
$data['documentList'] = $this->getDocumentList();
}
return $this->render('Documents/edit.doclist.html.twig',array('data'=>$data));
}
/**
* @param Request $request
*
* @return Response
*/
public function documentDownloadBlockAction(Request $request): Response
{
if (null != $request->request->get('idDoc')) {
$idDoc = $request->request->get('idDoc');
$repository = $this->getDoctrine()->getManager()->createQueryBuilder();
$repository->add('select', 'd.idDoc,d.url, df.idFile, df.version, l.languagename, l.languagecode, ff.mimetype, ff.extension,f.filename, f.size, f.content');
$repository->add('from', 'OceanExpertBundle:Documents d');
$repository->leftJoin('OceanExpertBundle:DocumentFiles', 'df', 'WITH', 'd.idDoc = df.idDoc');
$repository->leftJoin('OceanExpertBundle:Languages', 'l', 'WITH', 'df.idLanguage = l.idLanguage');
$repository->leftJoin('OceanExpertBundle:Fileformats', 'ff', 'WITH', 'df.idFileformat = ff.idFileformat');
$repository->leftJoin('OceanExpertBundle:Files', 'f', 'WITH', 'df.idFile = f.idFile');
$repository->where('d.idDoc =:idDoc');
$repository->setParameter('idDoc', $idDoc);
$documents = $repository->getQuery()->getResult();
return $this->render('Documents/download.document.html.twig', array('documents' => $documents));
} else {
return new Response('No document Available');
}
}
/**
* download the file with the given file id (!= doc id)
*
* @param int $idFile
*
* @return mixed
*/
public function downloadFileAction($idFile)
{
if ($idFile == 0) {
return new JsonResponse(
array(
'status' => 1,
'error' => 'file id is missing, nothing to be downloaded'
)
);
} else {
$fileData = $this->getDoctrine()
->getRepository('OceanExpertBundle:Files')
->findOneBy(
array(
'idFile' => $idFile
)
);
if ($fileData) {
/*
* no idea why we should do that...
$downloadFileName = preg_replace(
'/(.+)-(.+?)$/',
"$1.$2",
basename($fileData->getFilename())
);
*/
//clean the filename that will be used to download the file
// see #433
$downloadFileName = trim(
basename(
$fileData->getFilename()
)
);
$downloadFileName = preg_replace(
'/[[:^print:]]/',
'_',
$downloadFileName
);
//sometimes we have like very strange filenames
//where the file extension is glued to the filename
//get rid of that glue and make it a file extension again
$fileExtensionId = $fileData->getIdFileFormat();
$fileExtensionData = $this->getDoctrine()
->getRepository('OceanExpertBundle:Fileformats')
->findOneBy(
array(
'idFileformat' => $fileExtensionId
)
);
if ($fileExtensionData) {
$fileExtension = $fileExtensionData->getExtension();
} else {
return new JsonResponse(
array(
'status' => 1,
'error' => "problem : cannot get the file extension data from $downloadFileName"
)
);
}
if (!preg_match("/(.+?)\.$fileExtension$/", $downloadFileName)) {
$downloadFileName = preg_replace(
"/(.+)\W$fileExtension$/",
"$1.$fileExtension",
$downloadFileName
);
/*
return new JsonResponse(
array(
'status' => 1,
'error' => "correct : file ext $fileExtensionId : $fileExtension : $downloadFileName"
)
);
*/
}
/*
return new JsonResponse(
array(
'status' => 1,
'error' => "wrong : file ext $fileExtensionId : $fileExtension : $downloadFileName"
)
);
*/
if ($fileData->getUrl() == '') {
//this is a file that we have stored in the db
// Return a response with a specific content
$response = new Response(stream_get_contents($fileData->getContent()));
// Create the disposition of the file
$disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$downloadFileName
);
// Set the content disposition
$response->headers->set('Content-Disposition', $disposition);
// Dispatch request
return $response;
} else {
//check if the file exists
$fileToCheck = $fileData->getUrl();
if (is_file($fileToCheck)) {
$response = new BinaryFileResponse($fileData->getUrl());
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$downloadFileName
);
return $response;
} else {
return new JsonResponse(
array(
'status' => 3,
'error' => "no file with file id '$idFile' found on the server ('$fileToCheck')"
)
);
}
}
} else {
return new JsonResponse(
array(
'status' => 2,
'error' => "no file found with file id '$idFile'"
)
);
}
}
}
/**
* @param int $idDoc
* @param Request $request
*
* @return Response
*/
public function addDocumentAction(int $idDoc, Request $request)
{
$document = array();
$docDoclist = array();
$files = array();
$type = '';
$postdata = '';
$filedata = '';
$userId = $this->get('security.token_storage')
->getToken()
->getUser()
->getid();
$em = $this->getDoctrine()
->getManager();
if ($idDoc != 0) {
$document = $this->getDoctrine()
->getRepository('OceanExpertBundle:Documents')
->findOneBy(
array(
'idDoc' => $idDoc
)
);
}
if ($request->request->has('submit')) {
$postdata = $request->request->all();
$filedata = $request->files->get('userfile');
if (array_key_exists('doctype', $postdata)
&& $postdata['doctype'] != ''
&& $postdata['status'] != '') {
/**
* Create a document entry in documents table
*/
if ($idDoc == 0) {
$document = new Documents();
}
$document->setIdDoctype($postdata['doctype']);
$document->setDocCode(isset($postdata['doccode']) ? $postdata['doccode'] : '');
$document->setTitle(isset($postdata['title']) ? $postdata['title'] : '');
$document->setSummary(isset($postdata['summary']) ? $postdata['summary'] : '');
$document->setAuthorText(isset($postdata['authors']) ? $postdata['authors'] : '');
if ($postdata['status'] == 2) {
$document->setPublishedOn(new DateTime('now'));
}
$document->setNotes(isset($postdata['notes']) ? $postdata['notes'] : '');
$document->setKeywords(isset($postdata['keywords']) ? $postdata['keywords'] : '');
$document->setUrl(isset($postdata['websiteUrl']) ? $postdata['websiteUrl'] : '');
$document->setIdDocstatus(isset($postdata['status']) ? $postdata['status'] : '');
$document->setCreatedAt(new DateTime('now'));
$document->setUpdatedAt(new DateTime('now'));
if ($this->get('security.authorization_checker')->isGranted('ROLE_GLOBAL_EDITOR')) {
$document->setApproved(1);
} else {
$document->setApproved(0);
}
$document->setIdCreator($userId);
$document->setLastEditBy($userId);
$em->persist($document); //marks object to be saved in the next transaction.
$em->flush(); //performs all saves and transactions.
if (isset($postdata['doclist'])
&& count($postdata['doclist']) > 0
) {
/**
* if documentlist is set then enter id documentlist table.
*/
foreach ($postdata['doclist'] as $docListID) {
$doclist = $em->getRepository('OceanExpertBundle:DoclistDocuments')
->findOneBy(
array(
'idDoclist' => $docListID,
'idDoc' => $document->getIdDoc()
)
);
if (!$doclist) {
$doclist = new DoclistDocuments();
}
$doclist->setIdDoclist($docListID);
$doclist->setIdDoc($document->getIdDoc());
$doclist->setAddedAt(new DateTime('now'));
$em->persist($doclist);
$em->flush();
}
}
if (count($filedata) > 0) {
/**
* if file is uploaded then upload the files in event section.
*/
$i = 0;
foreach ($filedata as $file) {
if ($file != null) {
$fileType = $file->guessClientExtension();
//cleanup the filename, we don't want any strange chars here
$fileName = $file->getClientOriginalName();
$fileName = preg_replace(
array(
'/\s+/',
'/\W+/',
),
array(
'_',
'-'
),
$fileName
);
if ($fileType == 'bin') {
$fileType = pathinfo($fileName, PATHINFO_EXTENSION);
}
$format = $em->getRepository('OceanExpertBundle:Fileformats')
->findOneBy(
array(
'extension' => $fileType
)
);
if ($format) {
$idFileFormat = $format->getIdFileformat();
} else {
$idFileFormat = 0;
}
$directory = 'uploads/documents/' . $document->getIdDoc() . '/';
$uploadfile = $file->move($directory, $fileName);
$filepath = $directory . $fileName;
/**
* Create file entry in files table. == filenew is added as multiple column primary indexes were set in old table,
* cannot change as it might affect previos PPC sections. needs to verify if there is no break of code in the e
* earlier ppc.
*/
if (isset($postdata['id_language'][$i])) {
$language = $postdata['id_language'][$i];
} else {
$language = 1;
}
$conn = $this->getDoctrine()->getConnection();
$stmt = $conn->prepare('INSERT
INTO files (
version,
id_language,
id_fileformat,
url,
size,
content,
filename
)
VALUES (?, ?, ?, ?, ?, ?, ?)'
);
$stmt->bindValue(1, $postdata['version'][$i]);
$stmt->bindValue(2, $language);
$stmt->bindValue(3, $idFileFormat);
$stmt->bindValue(4, utf8_encode($filepath));
$stmt->bindValue(5, $file->getClientSize());
$stmt->bindValue(6, '');
$stmt->bindValue(7, utf8_encode($filepath));
$stmt->execute();
$idFile = $this->getDoctrine()->getConnection()->lastInsertId();
$files = new DocumentFiles();
$files->setIdDoc($document->getIdDoc());
$files->setIdFile($idFile);
$files->setVersion($postdata['version'][$i]);
$files->setIdLanguage($language);
$files->setIdFileformat($idFileFormat);
$em->persist($files);
$em->flush();
$i++;
}
}
}
}
return $this->redirectToRoute(
'view_document',
array(
'idDoc' => $document->getIdDoc()
)
);
}
if ($idDoc != 0) {
$repository = $em->createQueryBuilder();
$repository->add(
'select',
'd.idDoclist'
);
$repository->add('from', 'OceanExpertBundle:DoclistDocuments d');
$repository->where('d.idDoc = :idDoc');
$repository->setParameter('idDoc', $idDoc);
$docDoclist = array_column($repository->getQuery()->getResult(), 'idDoclist');
$repository = $em->createQueryBuilder();
$repository->add(
'select',
'd.idDoc, l.languagename, f.fileformatname,d.version, d.idFileformat,d.idFile'
);
$repository->add('from', 'OceanExpertBundle:DocumentFiles d');
$repository->leftJoin('OceanExpertBundle:Languages', 'l', 'WITH', 'd.idLanguage = l.idLanguage');
$repository->leftJoin('OceanExpertBundle:Fileformats', 'f', 'WITH', 'f.idFileformat = d.idFileformat');
$repository->where('d.idDoc = :idDoc');
$repository->setParameter('idDoc', $idDoc);
$files = $repository->getQuery()->getResult();
}
$docType = array(
1 => 'Report',
3 => 'Presentation',
4 => 'Information Document',
5 => 'Letter',
6 => 'Book',
7 => 'MOU',
8 => 'Other',
9 => 'Website',
10 => 'Reference Document',
11 => 'Working Document'
);
$data = array(
'document' => $document,
'docDoclist' => $docDoclist,
'type' => $type,
'postdata' => $postdata,
'filedata' => $filedata,
'files' => $files,
'docTypes' => $docType,
'documentList' => $this->getDocumentList(),
);
return $this->render(
'Documents/edit.document.html.twig',
array(
'data' => $data
)
);
}
/**
* view the info of a document with the given doc id
*
* @param $idDoc
*
* @return Response
*/
public function viewDocumentAction($idDoc)
{
$em = $this->getDoctrine()->getManager();
$queryBuilder = $em->getRepository('OceanExpertBundle:Documents')->createQueryBuilder('d');
$queryBuilder->select('
d.docCode,
d.idDoc,
d.idDocstatus,
d.title,
d.summary,
d.authorText,
d.publishedOn,
d.notes,
d.keywords,
d.createdAt,
d.updatedAt,
d.idCreator,
d.lastEditBy,
dt.doctypename')
->leftJoin(
'OceanExpertBundle:Doctypes',
'dt',
'WITH',
'd.idDoctype = dt.idDoctype')
->where('d.idDoc = :idDoc');
if (!($this->get('security.authorization_checker')->isGranted('ROLE_MANAGER'))) {
$queryBuilder->andWhere('d.approved = 1');
}
$queryBuilder->setParameter('idDoc', $idDoc);
$query = $queryBuilder->getQuery();
$result = $query->getResult();
if(count($result)>0) {
$result = $result[0];
if ($result['idCreator'] != '') {
$indiv = $this->getDoctrine()->getRepository('OceanExpertBundle:Indiv')->findOneByIdInd($result['idCreator']);
if ($indiv) {
$result['createdBy'] = $indiv->getFname() . ' ' . $indiv->getSname();
} else {
$result['createdBy'] = '';
}
}
if ($result['lastEditBy'] != '') {
$indiv = $this->getDoctrine()->getRepository('OceanExpertBundle:Indiv')->findOneByIdInd($result['lastEditBy']);
if ($indiv) {
$result['updatedBy'] = $indiv->getFname() . ' ' . $indiv->getSname();
} else {
$result['updatedBy'] = '';
}
}
}
$groups = $em->getRepository('OceanExpertBundle:DocumentGroups')->createQueryBuilder('d')
->select('d.idGroup,g.groupname')
->leftJoin('OceanExpertBundle:Groups', 'g', 'WITH', 'd.idGroup = g.idGroup')
->where('d.idDoc = :idDoc')
->setParameter('idDoc', $idDoc)
->getQuery()
->getResult();
$docGroupList = $em->getRepository('OceanExpertBundle:DoclistDocuments')->createQueryBuilder('d')
->select('dl.idDoclist, dl.title')
->leftJoin('OceanExpertBundle:Doclists', 'dl', 'WITH', 'dl.idDoclist = d.idDoclist')
->where('d.idDoc = :idDoc')
->setParameter('idDoc', $idDoc)
->orderBy('dl.title','ASC')
->getQuery()
->getResult();
$docGroupListAll = $em->getRepository('OceanExpertBundle:Doclists')->createQueryBuilder('d')
->select("d.idDoclist, CONCAT(g.groupname, ' - ', d.title) as title")
->leftJoin('OceanExpertBundle:DoclistGroups', 'dg', 'WITH', 'd.idDoclist = dg.idDoclist')
->leftJoin('OceanExpertBundle:Groups', 'g', 'WITH', 'dg.idGroup = g.idGroup')
->where("g.groupname != ''")
->orderBy('g.groupname, d.title','ASC')
->getQuery()
->getResult();
$docFiles = $em->getRepository('OceanExpertBundle:DocumentFiles')->createQueryBuilder('d')
->select('d.idFileformat, d.version, l.languagename, d.idFile, f.filename, f.url, f.size,f.content,f.path')
->leftJoin('OceanExpertBundle:Files', 'f', 'WITH', 'f.idFile = d.idFile')
->leftJoin('OceanExpertBundle:Languages', 'l', 'WITH', 'f.idLanguage = l.idLanguage')
->where('d.idDoc = :idDoc')
->setParameter('idDoc', $idDoc)
->getQuery()
->getResult();
$docGroupListArr = array();
foreach ($docGroupList as $doclist){
$docGroupListArr[] = $doclist['idDoclist'];
}
$result['documentGroup'] = $groups;
$result['docGroupList'] = $docGroupList;
$result['docFiles'] = $docFiles;
$result['docGroupListArr'] = $docGroupListArr;
$result['docGroupListAll'] = $docGroupListAll;
return $this->render('Documents/view.document.html.twig', array('data' => $result));
}
/**
* show all existing documents
*
* @param Request $request
*
* @return Response|void
*/
function viewDocumentsAction( Request $request): Response
{
$em = $this->get('doctrine')->getManager();
$connection = $em->getConnection();
$limits = array(
10 => 10,
25 => 25,
50 => 50,
100 => 100,
500 => 500
);
$limit = $request->query->get('limit', 10);
$query = $request->query->get('search', '');
$orderby = $request->query->get('orderby', 'order');
$dir = $request->query->get('dir', 'asc');
if (!in_array($orderby, array('id', 'title'))) {
$orderby = 'title';
}
if (!in_array($dir, array('asc', 'desc'))) {
$dir = 'asc';
}
//get all the doclists
$repo = $this->getDoctrine()
->getRepository('OceanExpertBundle:Doclists');
$docListsQB = $repo->createQueryBuilder('dl');
$docListsQB->select('
dl.idDoclist,
dl.title'
);
$docListsQuery = $docListsQB->getQuery();
$docListsTmp = $docListsQuery->execute();
foreach($docListsTmp as $docList) {
$docLists[$docList['idDoclist']] = $docList['title'];
}
//get all the doclist docs, this avoids having to make an join that is veryveryvery slow
$repo = $this->getDoctrine()
->getRepository('OceanExpertBundle:DoclistDocuments');
$docListDocumentsQB = $repo->createQueryBuilder('dld');
$docListDocumentsQB->select('
dld.id,
dld.idDoclist,
dld.idDoc'
);
$docListDocumentsQuery = $docListDocumentsQB->getQuery();
$docListDocumentsTmp = $docListDocumentsQuery->execute();
foreach($docListDocumentsTmp as $docListDocument) {
$docListDocuments[$docListDocument['idDoc']][] = $docListDocument;
}
$repo = $this->getDoctrine()
->getRepository('OceanExpertBundle:Documents');
$documents = $repo->createQueryBuilder('d');
$documents->select('
d.idDoc,
d.title,
d.createdAt'
);
if (trim($query) != '') {
$documents->andwhere('d.title LIKE :query');
$documents->setParameter(
'query',
'%' . trim($query) . '%'
);
}
$documents->getQuery();
$paginator = $this->get('knp_paginator');
$data = $paginator->paginate(
$documents,
$request->query->getInt('page', 1),
$limit,
array(
'pageParameterName' => 'page',
'sortDirectionParameterName' => 'dir',
'defaultSortFieldName' => 'd.createdAt',
'defaultSortDirection' => 'desc'
)
);
$data->setCustomParameters([
'limits' => $limits,
'title' => 'Documents'
]);
return $this->render(
'Documents/viewDocuments.html.twig',
array(
'documentData' => $data,
'doclists' => $docLists,
'doclistDocuments' => $docListDocuments
)
);
}
/**
* delete a document
* this should not be called in the browser or via a direct link
*
* @return Response
*/
public function deleteDocumentAction(Request $request)
{
$idDoc = $request->request->get('idDoc');
if ($idDoc
&& $idDoc != ''
&& is_numeric($idDoc)
) {
$em = $this->getDoctrine()->getManager();
$document = $em->getRepository('OceanExpertBundle:Documents')
->findOneBy(
array(
'idDoc' => $idDoc
)
);
$documentFiles = $em->getRepository('OceanExpertBundle:DocumentFiles')
->findBy(
array(
'idDoc' => $idDoc
)
);
if ($document) {
$em->remove($document);
$em->flush();
}
if ($documentFiles) {
foreach ($documentFiles as $documentFile) {
$file = $em->getRepository('OceanExpertBundle:Files')
->findOneBy(
array(
'idFile' => $documentFile->getIdFile()
)
);
if ($file) {
if (file_exists($file->getFilename())) {
unlink($file->getFilename());
}
$em->remove($file);
$em->flush();
}
$em->remove($documentFile);
$em->flush();
}
}
$data = array('status' => 1);
} else {
$data = array(
'status' => 0,
'message' => "no document id found, did you call this from a browser? Don't"
);
}
return new JsonResponse($data);
}
public function removeDocumentFileAction(Request $request)
{
$idDoc = $request->request->get('idDoc');
$idFile = $request->request->get('idFile');
if (isset($idDoc)
&& is_numeric($idDoc)
&& isset($idFile)
&& is_numeric($idFile)
) {
$em = $this->getDoctrine()->getManager();
$docFiles = $em->getRepository('OceanExpertBundle:DocumentFiles')
->findOneBy(
array(
'idDoc' => $idDoc,
'idFile' => $idFile
)
);
if ($docFiles) {
$em->remove($docFiles);
$em->flush();
}
$file = $em->getRepository('OceanExpertBundle:Files')->findOneBy(array('idFile' => $idFile));
if (file_exists($file->getFilename())) {
unlink($file->getFilename());
}
if ($file) {
$em->remove($file);
$em->flush();
}
$data = array('status' => 1);
} else {
$data = array(
'status' => 0,
'message' => 'do not call this directly in the browser, we need post data'
);
}
return new JsonResponse($data);
}
/**
* @return Response
*/
public function removeDocumentFromListAction(Request $request)
{
$idDoc = $request->request->get('idDoc');
$idDoclist = $request->request->get('idDoclist');
$em = $this->getDoctrine()->getManager();
$document = $em->getRepository('OceanExpertBundle:DoclistDocuments')->findOneBy(array('idDoc' => $idDoc,'idDoclist'=>$idDoclist));
if ($document) {
$em->remove($document);
$em->flush();
}
$data = array('status' => 1);
return new JsonResponse($data);
}
/**
* @return Response
*/
public function deleteDocumentListAction(Request $request)
{
$idDoclist = $request->request->get('idDoclist');
$em = $this->getDoctrine()->getManager();
$documentList = $em->getRepository('OceanExpertBundle:Doclists')->findOneBy(array('idDoclist'=>$idDoclist));
if ($documentList) {
$em->remove($documentList);
$em->flush();
}
$documents = $em->getRepository('OceanExpertBundle:DoclistDocuments')->findBy(array('idDoclist'=>$idDoclist));
if ($documents) {
foreach ($documents as $document){
$em->remove($document);
$em->flush();
}
}
$data = array('status' => 1);
return new JsonResponse($data);
}
/**
* @return array
*/
function getUserGroups()
{
$userId = $this->get('security.token_storage')
->getToken()
->getUser()
->getid();
if ($userId) {
$repository = $this->getDoctrine()
->getManager()
->createQueryBuilder();
$repository->add(
'select',
'g.idGroup'
);
$repository->add(
'from',
'OceanExpertBundle:MemberGroups g'
);
$repository->where(
'g.idInd = :userId'
);
$repository->setParameter(
'userId',
$userId
);
return $repository->getQuery()->getResult();
} else {
return false;
}
}
/**
* @return array
*/
function getDocumentList(){
//this is what we will return
$documentList = array();
$grouplist = array_map(
'current',
$this->getUserGroups()
);
$repository = $this->getDoctrine()
->getManager()
->createQueryBuilder();
$repository->add(
'select',
'distinct(d.idGroup) as idGroup, g.groupname'
);
$repository->add(
'from',
'OceanExpertBundle:DoclistGroups d'
);
$repository->leftJoin(
'OceanExpertBundle:Groups',
'g',
'WITH',
'd.idGroup = g.idGroup'
);
$repository->where(
'g.idGroup in (:grouplist)'
);
$repository->setParameter(
'grouplist',
$grouplist
);
$repository->orderBy('g.groupname');
$docGroups = $repository->getQuery()->getResult();
foreach ($docGroups as $docGroup) {
$repository = $this->getDoctrine()
->getManager()
->createQueryBuilder();
$repository->add(
'select',
'd.idDoclist, d.title, dg.idGroup'
);
$repository->add(
'from',
'OceanExpertBundle:Doclists d'
);
$repository->leftJoin(
'OceanExpertBundle:DoclistGroups',
'dg',
'WITH',
'dg.idDoclist = d.idDoclist'
);
$repository->where('dg.idGroup =:idGroup');
$repository->setParameter(
'idGroup',
$docGroup['idGroup']
);
$repository->orderBy('d.title', 'asc');
$documentList[$docGroup['groupname']] = $repository->getQuery()->getResult();
}
return $documentList;
}
/**
*
*/
public function addDocumentListAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$idDoclist = $request->request->get('idDocList');
$idDoc = $request->request->get('idDoc');
if ($idDoclist == ''
|| $idDoc == ''
) {
$message = 'We really need a document id and a doclist id to do this. ';
$message .= 'Did you call this directly in the browser? You should not do this.';
return $this->render(
'Exception/error.html.twig',
array(
'message' => $message
)
);
}
$doclist = $em->getRepository('OceanExpertBundle:DoclistDocuments')
->findOneBy(
array(
'idDoclist' => $idDoclist,
'idDoc' => $idDoc)
);
if (!$doclist) {
$doclist = new DoclistDocuments();
}
$doclist->setIdDoclist($idDoclist);
$doclist->setIdDoc($idDoc);
$doclist->setAddedAt(new DateTime('now'));
$em->persist($doclist);
$em->flush();
return new JsonResponse(
array(
'status'=>1
)
);
}
}