public function initbuildAction(Request $request) { /* @var $em \Doctrine\ORM\EntityManager */ $em = $this->get('doctrine')->getManager(); $core_world = $request->request->get('core_world'); if (!$core_world) { $this->get('session')->getFlashBag()->set('error', "A core world is required."); return $this->redirect($this->generateUrl('deck_buildform')); } $world = $em->getRepository('AppBundle:Card')->findOneBy(array("id" => $core_world)); $tags = [$world->getName()]; $faction = $em->getRepository('AppBundle:Faction')->findOneBy(array("id" => $world->getFaction()->getId())); if (!$faction) { $this->get('session')->getFlashBag()->set('error', "A faction is required."); return $this->redirect($this->generateUrl('deck_buildform')); } $tags[] = $faction->getCode(); $name = sprintf("New deck: %s", $faction->getName()); $pack = $em->getRepository('AppBundle:Pack')->findOneBy(array("code" => "core")); $deck = new Deck(); $deck->setDescriptionMd(""); $deck->setFaction($faction); $deck->setCoreWorld($world); $deck->setLastPack($pack); $deck->setName($name); $deck->setProblem('deckSize'); $deck->setTags(join(' ', array_unique($tags))); $deck->setUser($this->getUser()); $em->persist($deck); $em->flush(); return $this->redirect($this->get('router')->generate('deck_edit', ['deck_id' => $deck->getId()])); }
public function createDecklistFromDeck(Deck $deck, $name = null, $descriptionMd = null) { $lastPack = $deck->getLastPack(); if (!$lastPack->getDateRelease() || $lastPack->getDateRelease() > new \DateTime()) { throw new \Exception("You cannot publish this deck yet, because it has unreleased cards."); } $problem = $this->deckValidationHelper->findProblem($deck); if ($problem) { throw new \Exception('This deck cannot be published because it is invalid: "' . $this->deckValidationHelper->getProblemLabel($problem) . '".'); } // all good for decklist publication // increasing deck version $deck->setMinorVersion(0); $deck->setMajorVersion($deck->getMajorVersion() + 1); if (empty($name)) { $name = $deck->getName(); } $name = substr($name, 0, 60); if (empty($descriptionMd)) { $descriptionMd = $deck->getDescriptionMd(); } $description = $this->texts->markdown($descriptionMd); $new_content = json_encode($deck->getSlots()->getContent()); $new_signature = md5($new_content); $decklist = new Decklist(); $decklist->setName($name); $decklist->setVersion($deck->getVersion()); $decklist->setNameCanonical($this->texts->slugify($name) . '-' . $decklist->getVersion()); $decklist->setDescriptionMd($descriptionMd); $decklist->setDescriptionHtml($description); $decklist->setDateCreation(new \DateTime()); $decklist->setDateUpdate(new \DateTime()); $decklist->setSignature($new_signature); $decklist->setFaction($deck->getFaction()); $decklist->setLastPack($deck->getLastPack()); $decklist->setNbVotes(0); $decklist->setNbfavorites(0); $decklist->setNbcomments(0); $decklist->setUser($deck->getUser()); foreach ($deck->getSlots() as $slot) { $decklistslot = new Decklistslot(); $decklistslot->setQuantity($slot->getQuantity()); $decklistslot->setCard($slot->getCard()); $decklistslot->setDecklist($decklist); $decklist->getSlots()->add($decklistslot); } if (count($deck->getChildren())) { $decklist->setPrecedent($deck->getChildren()[0]); } else { if ($deck->getParent()) { $decklist->setPrecedent($deck->getParent()); } } $decklist->setParent($deck); $deck->setMinorVersion(1); return $decklist; }
public function initbuildAction(Request $request) { $translator = $this->get('translator'); /* @var $em \Doctrine\ORM\EntityManager */ $em = $this->getDoctrine()->getManager(); $faction_code = $request->request->get('faction'); $agenda_code = $request->request->get('agenda'); if (!$faction_code) { $this->get('session')->getFlashBag()->set('error', $translator->trans("decks.build.errors.nofaction")); return $this->redirect($this->generateUrl('deck_buildform')); } $faction = $em->getRepository('AppBundle:Faction')->findByCode($faction_code); if (!$faction) { $this->get('session')->getFlashBag()->set('error', $translator->trans("decks.build.errors.nofaction")); return $this->redirect($this->generateUrl('deck_buildform')); } $tags = [$faction_code]; if (!$agenda_code) { $agenda = NULL; $name = $translator->trans("decks.build.newname.noagenda", array("%faction%" => $faction->getName())); $pack = $em->getRepository('AppBundle:Pack')->findOneBy(array("code" => "Core")); } else { $agenda = $em->getRepository('AppBundle:Card')->findByCode($agenda_code); $name = $translator->trans("decks.build.newname.noagenda", array("%faction%" => $faction->getName(), "%agenda%" => $agenda->getName())); $pack = $agenda->getPack(); $tags[] = $this->get('agenda_helper')->getMinorFactionCode($agenda); } $deck = new Deck(); $deck->setDescriptionMd(""); $deck->setFaction($faction); $deck->setLastPack($pack); $deck->setName($name); $deck->setProblem('too_few_cards'); $deck->setTags(join(' ', array_unique($tags))); $deck->setUser($this->getUser()); if ($agenda) { $slot = new Deckslot(); $slot->setCard($agenda); $slot->setQuantity(1); $slot->setDeck($deck); $deck->addSlot($slot); } $em->persist($deck); $em->flush(); return $this->redirect($this->get('router')->generate('deck_edit', ['deck_id' => $deck->getId()])); }
public function initbuildAction(Request $request) { /* @var $em \Doctrine\ORM\EntityManager */ $em = $this->get('doctrine')->getManager(); $faction_code = $request->request->get('faction'); $agenda_code = $request->request->get('agenda'); if (!$faction_code) { $this->get('session')->getFlashBag()->set('error', "A faction is required."); return $this->redirect($this->generateUrl('deck_buildform')); } $faction = $em->getRepository('AppBundle:Faction')->findOneBy(array("code" => $faction_code)); if (!$faction) { $this->get('session')->getFlashBag()->set('error', "A faction is required."); return $this->redirect($this->generateUrl('deck_buildform')); } $tags = [$faction_code]; if (!$agenda_code) { $agenda = NULL; $name = sprintf("New deck: %s", $faction->getName()); $pack = $em->getRepository('AppBundle:Pack')->findOneBy(array("code" => "core")); } else { $agenda = $em->getRepository('AppBundle:Card')->findOneBy(array("code" => $agenda_code)); $name = sprintf("New deck: %s, %s", $faction->getName(), $agenda->getName()); $pack = $agenda->getPack(); $tags[] = $this->get('agenda_helper')->getMinorFactionCode($agenda); } $deck = new Deck(); $deck->setDescriptionMd(""); $deck->setFaction($faction); $deck->setLastPack($pack); $deck->setName($name); $deck->setProblem('deckSize'); $deck->setTags(join(' ', array_unique($tags))); $deck->setUser($this->getUser()); if ($agenda) { $slot = new Deckslot(); $slot->setCard($agenda); $slot->setQuantity(1); $slot->setDeck($deck); $deck->addSlot($slot); } $em->persist($deck); $em->flush(); return $this->redirect($this->get('router')->generate('deck_edit', ['deck_id' => $deck->getId()])); }
/** * * @param unknown $user * @param Deck $deck * @param unknown $decklist_id * @param unknown $name * @param unknown $faction * @param unknown $description * @param unknown $tags * @param unknown $content * @param unknown $source_deck */ public function saveDeck($user, $deck, $decklist_id, $name, $faction, $description, $tags, $content, $source_deck) { $deck_content = []; if ($decklist_id) { $decklist = $this->doctrine->getRepository('AppBundle:Decklist')->find($decklist_id); if ($decklist) { $deck->setParent($decklist); } } $deck->setName($name); $deck->setFaction($faction); $deck->setDescriptionMd($description); $deck->setUser($user); $deck->setMinorVersion($deck->getMinorVersion() + 1); $cards = []; /* @var $latestPack \AppBundle\Entity\Pack */ $latestPack = null; foreach ($content as $card_code => $qty) { $card = $this->doctrine->getRepository('AppBundle:Card')->findOneBy(array("code" => $card_code)); if (!$card) { continue; } $pack = $card->getPack(); if (!$latestPack) { $latestPack = $pack; } else { if ($latestPack->getCycle()->getPosition() < $pack->getCycle()->getPosition()) { $latestPack = $pack; } else { if ($latestPack->getCycle()->getPosition() == $pack->getCycle()->getPosition() && $latestPack->getPosition() < $pack->getPosition()) { $latestPack = $pack; } } } $cards[$card_code] = $card; } $deck->setLastPack($latestPack); if (empty($tags)) { // tags can never be empty. if it is we put faction in $tags = [$faction->getCode()]; } if (is_string($tags)) { $tags = preg_split('/\\s+/', $tags); } $tags = implode(' ', array_unique(array_values($tags))); $deck->setTags($tags); $this->doctrine->persist($deck); // on the deck content if ($source_deck) { // compute diff between current content and saved content list($listings) = $this->diff->diffContents(array($content, $source_deck->getSlots()->getContent())); // remove all change (autosave) since last deck update (changes are sorted) $changes = $this->getUnsavedChanges($deck); foreach ($changes as $change) { $this->doctrine->remove($change); } $this->doctrine->flush(); // save new change unless empty if (count($listings[0]) || count($listings[1])) { $change = new Deckchange(); $change->setDeck($deck); $change->setVariation(json_encode($listings)); $change->setIsSaved(TRUE); $change->setVersion($deck->getVersion()); $this->doctrine->persist($change); $this->doctrine->flush(); } // copy version $deck->setMajorVersion($source_deck->getMajorVersion()); $deck->setMinorVersion($source_deck->getMinorVersion()); } foreach ($deck->getSlots() as $slot) { $deck->removeSlot($slot); $this->doctrine->remove($slot); } foreach ($content as $card_code => $qty) { $card = $cards[$card_code]; $slot = new Deckslot(); $slot->setQuantity($qty); $slot->setCard($card); $slot->setDeck($deck); $deck->addSlot($slot); $deck_content[$card_code] = array('card' => $card, 'qty' => $qty); } $deck->setProblem($this->deck_validation_helper->findProblem($deck)); return $deck->getId(); }