/** * Computes the diff between a list of SlotCollectionInterface * Mutates its arguments by removing the intersection from them * @param SlotCollectionInterface[] $list_slots * @return SlotCollectionInterface $intersection */ public function getSlotsDiff($list_slots) { // list of all the codes found in every slots $cardCodes = []; /* @var $slots SlotCollectionInterface */ foreach ($list_slots as $slots) { /* @var $slot SlotInterface */ foreach ($slots as $slot) { // since we're going to mutate the slots, we detach them first $this->em->detach($slot); $cardCodes[] = $slot->getCard()->getCode(); } } // then we count each code occurence $cardCodeCounts = array_count_values($cardCodes); // list of the slots common to every slots, after removing them from every slots $intersection = new ArrayCollection(); foreach ($cardCodeCounts as $cardCode => $occurences) { // if this card cannot be found in every slots, move on if ($occurences < count($list_slots)) { continue; } // we'll get the card later $card = null; // this is the list of where we can find that code in each flatList $indexes = []; // this is the list of the quantities we found in each flatList $quantities = []; // searching all slots for that code foreach ($list_slots as $j => $slots) { // searching the slots foreach ($slots as $k => $slot) { if ($slot->getCard()->getCode() === $cardCode) { $card = $slot->getCard(); $indexes[$j] = $k; $quantities[$j] = $slot->getQuantity(); break; } } } // we need to find the minimum quantity among all SlotCollections $minimum = min($quantities); // we create a slot for this $slot = new Deckslot(); $slot->setCard($card); $slot->setQuantity($minimum); // we add this slot to the list of common slots $intersection->add($slot); // then we remove that many cards from every SlotCollection foreach ($indexes as $j => $index) { $slot = $list_slots[$j][$index]; $slot->setQuantity($slot->getQuantity() - $minimum); } } return new SlotCollectionDecorator($intersection); }
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(); }