/** * get ids for tags and create non-existing ones * * @param array $tags Array of strings * @param QueryBuilder $qb Query builder instance * @return array (name => id) */ public function getIdsForTags(array $tags, User $user, QueryBuilder $qb = null) { if ($qb == null) { $qb = $this->builder; } if (!empty($tags)) { $qb->add('select', 't.name, t.id')->andWhere($qb->expr()->andX($qb->expr()->in('t.name', ':tags'), $qb->expr()->eq('t.user', ':user')))->setParameters(array('tags' => $tags, 'user' => $user->getId())); $existingTags = $qb->getQuery()->getResult(); $ids = array(); foreach ($existingTags as $tag) { $ids[$tag['name']] = $tag['id']; } $missingTags = array_diff($tags, array_keys($ids)); if (0 < count($missingTags)) { foreach ($missingTags as $tagName) { $newTag = new Tag(); $newTag->setName($tagName); $newTag->setUser($user); $this->getEntityManager()->persist($newTag); } $this->getEntityManager()->flush(); $ids = array_merge($ids, $this->getIdsForTags(array_values($missingTags), $user, $qb)); } return array_values($ids); } else { return array(); } }
/** * Called on bind * * @param mixed $value * @return mixed|void */ public function reverseTransform($value) { $result = array(); if (null == $value) { return $result; } if (is_string($value)) { $value = explode(' ', $value); } $tagNames = array(); $tagIds = array(); foreach ($value as $tag) { if (is_numeric($tag)) { $tagIds[] = $tag; } else { $tagNames[] = $tag; } } $repository = $this->em->getRepository('DimeTimetrackerBundle:Tag'); if (!empty($tagIds)) { $qb = $repository->createQueryBuilder('t'); $qb->andWhere($qb->expr()->andX($qb->expr()->in('t.id', ':ids'), $qb->expr()->eq('t.user', ':user'))); $qb->setParameters(array('ids' => $tagIds, 'user' => $this->user->getId())); $dbResults = $qb->getQuery()->getResult(); foreach ($dbResults as $tag) { $result[] = $tag; } } if (!empty($tagNames)) { $qb = $repository->createQueryBuilder('t'); $qb->andWhere($qb->expr()->andX($qb->expr()->in('t.name', ':tags'), $qb->expr()->eq('t.user', ':user'))); $qb->setParameters(array('tags' => $tagNames, 'user' => $this->user->getId())); $existingTags = array(); $dbResults = $qb->getQuery()->getResult(); foreach ($dbResults as $tag) { $result[] = $tag; $existingTags[] = $tag->getName(); } $missingTags = array_diff($tagNames, $existingTags); if (count($missingTags) > 0) { foreach ($missingTags as $name) { $name = trim($name); if (!empty($name)) { $newTag = new Tag(); $newTag->setName($name); $newTag->setUser($this->user); $result[] = $newTag; } } } } return $result; }
/** * create a new activity * * [POST] /activities * * @return View */ public function postActivitiesAction() { // create new activity entity $activity = new Activity(); // convert json to assoc array from request content $data = json_decode($this->getRequest()->getContent(), true); if (isset($data['parse'])) { // Run parser $result = $this->parse($data['parse']); if (isset($data['date'])) { $date = new \DateTime($data['date']); } else { $date = new \DateTime(); } // create new activity and timeslice entity $activity = new Activity(); $activity->setUser($this->getCurrentUser()); if (isset($result['customer'])) { try { $customer = $this->getCustomerRepository()->createCurrentQueryBuilder('c')->scopeByField('user', $this->getCurrentUser()->getId())->scopeByField('alias', $result['customer'])->getCurrentQueryBuilder()->setMaxResults(1)->getQuery()->getSingleResult(); $activity->setCustomer($customer); } catch (NoResultException $e) { } } if (isset($result['project'])) { try { $project = $this->getProjectRepository()->createCurrentQueryBuilder('p')->scopeByField('user', $this->getCurrentUser()->getId())->scopeByField('alias', $result['project'])->getCurrentQueryBuilder()->setMaxResults(1)->getQuery()->getSingleResult(); $activity->setProject($project); // Auto set customer because of direct relation to project if ($activity->getCustomer() == null) { $activity->setCustomer($project->getCustomer()); } } catch (NoResultException $e) { } } if (isset($result['service'])) { try { $service = $this->getServiceRepository()->createCurrentQueryBuilder('p')->scopeByField('user', $this->getCurrentUser()->getId())->scopeByField('alias', $result['service'])->getCurrentQueryBuilder()->setMaxResults(1)->getQuery()->getSingleResult(); $activity->setService($service); } catch (NoResultException $e) { } } if (isset($result['tags']) && !empty($result['tags'])) { foreach ($result['tags'] as $tagname) { try { $tag = $this->getTagRepository()->createCurrentQueryBuilder('t')->scopeByField('user', $this->getCurrentUser()->getId())->scopeByField('name', $tagname)->getCurrentQueryBuilder()->setMaxResults(1)->getQuery()->getSingleResult(); } catch (NoResultException $e) { $tag = null; } if ($tag == null) { $tag = new Tag(); $tag->setName($tagname); $tag->setUser($this->getCurrentUser()); } $activity->addTag($tag); } } if (isset($result['description'])) { $activity->setDescription($result['description']); } // create timeslice $timeslice = new Timeslice(); $timeslice->setActivity($activity); $timeslice->setUser($this->getCurrentUser()); $activity->addTimeslice($timeslice); if (isset($result['range']) || isset($result['duration'])) { // process time range if (isset($result['range'])) { $range = $result['range']; if (empty($range['stop'])) { $start = new \DateTime($range['start']); $stop = new \DateTime('now'); } elseif (empty($range['start'])) { $start = new \DateTime('now'); $stop = new \DateTime($range['stop']); } elseif (!empty($range['start']) && !empty($range['stop'])) { $start = new \DateTime($range['start']); $stop = new \DateTime($range['stop']); } $start->setDate($date->format('Y'), $date->format('m'), $date->format('d')); $stop->setDate($date->format('Y'), $date->format('m'), $date->format('d')); $timeslice->setStartedAt($start); $timeslice->setStoppedAt($stop); } else { // track date for duration $date->setTime(0, 0, 0); $timeslice->setStartedAt($date); $timeslice->setStoppedAt($date); } // process duration if (isset($result['duration'])) { if (empty($result['duration']['sign'])) { $timeslice->setDuration($result['duration']['number']); } else { if ($result['duration']['sign'] == '-') { $timeslice->setDuration($timeslice->getCurrentDuration() - $result['duration']['number']); } else { $timeslice->setDuration($timeslice->getCurrentDuration() + $result['duration']['number']); } } } } else { // start a new timeslice with date 'now' $timeslice->setStartedAt(new \DateTime('now')); } // save change to database $em = $this->getDoctrine()->getManager(); $em->persist($activity); $em->flush(); $em->refresh($activity); $view = $this->createView($activity); } else { // create activity form $form = $this->createForm(new ActivityType($this->getDoctrine()->getManager(), $this->getCurrentUser()), $activity); $view = $this->saveForm($form, $data); } return $view; }