diff --git a/core/lib/Thelia/Form/CartAdd.php b/core/lib/Thelia/Form/CartAdd.php new file mode 100644 index 000000000..3522d8f83 --- /dev/null +++ b/core/lib/Thelia/Form/CartAdd.php @@ -0,0 +1,134 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Thelia\Form; + +use Propel\Runtime\ActiveQuery\Criteria; +use Symfony\Component\Validator\Constraints; +use Symfony\Component\Validator\ExecutionContextInterface; +use Thelia\Action\Exception\CombinationNotFoundException; +use Thelia\Action\Exception\ProductNotFoundException; +use Thelia\Model\Base\StockQuery; +use Thelia\Model\ProductQuery; + +class CartAdd extends BaseForm +{ + + /** + * + * in this function you add all the fields you need for your Form. + * Form this you have to call add method on $this->formBuilder attribute : + * + * $this->formBuilder->add("name", "text") + * ->add("email", "email", array( + * "attr" => array( + * "class" => "field" + * ), + * "label" => "email", + * "constraints" => array( + * new \Symfony\Component\Validator\Constraints\NotBlank() + * ) + * ) + * ) + * ->add('age', 'integer'); + * + * @return null + */ + protected function buildForm() + { + $this->formBuilder + ->add("product", "hidden", array( + "constraints" => array( + new Constraints\NotBlank(), + new Constraints\Callback(array( + "methods" => array($this, "checkProduct") + )) + ) + )) + ->add("combination", "hidden", array( + "constraints" => array( + new Constraints\Callback(array( + "methods" => array($this, "checkCombination") + )) + ) + + )) + ->add("quantity", "text", array( + "constraints" => array( + new Constraints\NotBlank(), + new Constraints\Callback(array( + "methods" => array($this, "checkStock") + )) + ) + )) + ->add("append", "hidden") + ->add("newness", "hidden") + ; + } + + protected function checkProduct($value, ExecutionContextInterface $context) + { + $product = ProductQuery::create()->findPk($value); + + if (is_null($product)) { + throw new ProductNotFoundException(sprintf("this product id does not exists : %d", $value)); + } + } + + protected function checkCombination($value, ExecutionContextInterface $context) + { + if ($value) { + $data = $context->getRoot()->getData(); + + $stock = StockQuery::create() + ->filterByProductId($data["product"]) + ->filterByCombinationId($value, Criteria::EQUAL) + ->findOne(); + + if (is_null($stock)) { + throw new CombinationNotFoundException(sprintf("This combination id does not exists for this product : %d", $value)); + } + } + } + + protected function checkStock($value, ExecutionContextInterface $context) + { + $data = $context->getRoot()->getData(); + + $product = ProductQuery::create()->findPk($data["product"]); + + if ($product) { + if(false === $product->stockIsValid($value, $data["combination"])) { + $context->addViolation("quantity value is not valid"); + } + } + + } + + /** + * @return string the name of you form. This name must be unique + */ + public function getName() + { + return "thelia_cart_add"; + } +} \ No newline at end of file