Skip to content

Instantly share code, notes, and snippets.

@lightsuner
Created May 20, 2014 11:31
Show Gist options
  • Save lightsuner/57fd5ca1edae219f74a7 to your computer and use it in GitHub Desktop.
Save lightsuner/57fd5ca1edae219f74a7 to your computer and use it in GitHub Desktop.
<?php
namespace Domain\BrandBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Domain\BrandBundle\Form\Type\ColorType;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
class LookType extends AbstractType
{
protected $brand;
protected $brand_account;
public function __construct(\Domain\CoreBundle\Entity\Brand $brand = null, \Domain\CoreBundle\Entity\BrandAccount $brand_account = null){
$this->brand = $brand;
$this->brand_account = $brand_account;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$brand = $this->brand;
$brand_account = $this->brand_account;
$builder
->add('number', 'text', [
'label' => 'Style #',
'attr' => ['class' => 'validate[required]'],
'error_bubbling' => true,
])
->add('title', 'text', [
'label' => 'Style Title',
'required' => false,
'error_bubbling' => true,
])
->add('price', 'text', [
'label' => 'Wholesale Price $',
'attr' => ['class' => 'validate[required]'],
'error_bubbling' => true,
])
->add('retail', 'text', [
'label' => 'Suggested Retail $',
'required' => false,
'error_bubbling' => true,
])
->add('comments', 'textarea', [
'label' => 'Comments',
'required' => false,
'error_bubbling' => true,
])
->add('description', 'textarea', [
'label' => 'Description',
'required' => false,
'error_bubbling' => true,
])
->add('star', null, [
'label' => 'Click here to indicate a star seller',
'required' => false,
'error_bubbling' => true,
])
->add('logo_id', 'hidden', [
'error_bubbling' => true
])
->add('qnty', null, [
'label' => 'Do you want to add inventory quantity to this look?',
'required' => false,
'error_bubbling' => true,
])
->add('categories', 'entity', [
'label' => 'Select Category',
'class' => 'CoreBundle:Category',
'property' => 'NameByLvl',
'query_builder' => function(EntityRepository $er) use($brand_account) {
return $er->generateByBrandAccount($brand_account);
},
'multiple' => true,
'expanded' => false,
'attr' => [
'class' => 'selectpicker show-tick show-menu-arrow validate[required] validate-force',
'data-size' => 'auto',
'data-style' => ' btn-info',
'data-selected-text-format' => "count>1"
],
'error_bubbling' => true,
])
->add('sizes', 'entity', [
'label' => 'Select Size',
'class' => 'CoreBundle:Size',
'group_by' => 'department.name',
'query_builder' => function(EntityRepository $er) use($brand) {
$departments = $brand->getDepartments();
return $er->generateByDepartments($departments);
},
'property' => 'name',
'multiple' => true,
'expanded' => true,
'attr' => ['class' => 'inner-float validate[required]'],
'error_bubbling' => true,
])
->add('colors', 'collection',[
'label' => 'Add Color (10 char allowed for name)',
'type' => new ColorType(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
'error_bubbling' => true,
'attr' => ['class' => 'validate[required]']
] )
;
$factory = $builder->getFormFactory();
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) use($factory){
$this->addImagesField($factory, $event);
});
$builder->addEventListener(FormEvents::PRE_BIND, function(FormEvent $event) use($factory){
$this->addImagesField($factory, $event, true);
});
}
protected function addImagesField($factory, FormEvent $event){
$form = $event->getForm();
$data = $event->getData();
$images_data = [
'label' => "Look's gallery",
'class' => 'CoreBundle:Images',
'property' => 'JSONImageDataForLook',
'multiple' => true,
'expanded' => true,
'attr' => ['class' => ''],
'error_bubbling' => true,
'required' => true
];
if(is_array($data)){
$images_data['query_builder'] = function(EntityRepository $er) use($data) {
$image_ids = !empty($data['images'])? $data['images'] : array();
return $er->getBuilderByIds($image_ids);
};
} elseif(is_object($data)){
$images_data['query_builder'] = function(EntityRepository $er) use($data) {
return $er->getBuilderByLook($data);
};
}
$form->add($factory->createNamed('images', 'entity', null, $images_data));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Domain\CoreBundle\Entity\Look',
'error_bubbling' => true,
'cascade_validation' => true
));
}
public function getName()
{
return 'brandlook';
}
}
@lightsuner
Copy link
Author

/**
     * Displays a form to edit an existing Look entity.
     *
     */
    public function editAction(Request $request,$id)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('CoreBundle:Look')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Look entity.');
        }

        if(!$this->isBelong($entity)){
            throw $this->createNotFoundException('Unable to find Look.');
        }

        $originalColors = clone $entity->getColors();

        //$entity->getImages();

        if(!$entity->getColors()->count()){
            $entity->addColor( new Color );
        }

        $original_qnty = $entity->getQnty();

        $editForm = $this->createForm(new LookType($this->current_brand, $this->current_brand_account), $entity);

        if ($request->isMethod('POST')) {
            $editForm->bind($request);

            if ($editForm->isValid()) {
                $_new_qnty = $entity->getQnty();

                // remove qnty
                if($original_qnty != $_new_qnty && !$_new_qnty){
                    foreach($entity->getLookQnties() as $_lookQnty) {
                        $entity->removeLookQnty($_lookQnty);
                        $em->remove($_lookQnty);
                    }
                } elseif($_new_qnty){
                    // remove by size
                    foreach($entity->getLookQnties() as $LookQnty) {
                        if( !$entity->getSizes()->contains($LookQnty->getSize()) ){
                            $entity->removeLookQnty($LookQnty);
                            $em->remove($LookQnty);
                        }
                    }

                }

                // filter $originalTags to contain tags no longer present
                foreach ($entity->getColors() as $_color) {
                    if($originalColors->contains($_color)){
                        $originalColors->removeElement($_color);
                    }
                }

                foreach($originalColors as $_color_to_delete){
                    $entity->removeColor($_color_to_delete);
                    $em->remove($_color_to_delete);
                }



                $em->persist($entity);
                $em->flush();

                $this->get('session')->getFlashBag()->set('success', 'Look was successfully updated!');

                if($original_qnty != $_new_qnty && $_new_qnty){
                    $this->get('session')->getFlashBag()->set('success', 'Please set up qnty for look');
                    return $this->redirect($this->generateUrl('brand_look_qnty', array('id' => $entity->getId())));
                }

                return $this->redirect($this->generateUrl('brand_look_edit', array('id' => $entity->getId())));
            }
        }


        $uploaderStaticFilesLoader = $this->get('uploaderFilesLoader');
        $blueImpCss = $uploaderStaticFilesLoader->getCss();
        $blueImpJs = $uploaderStaticFilesLoader->getJs();

        $cropperStaticFilesLoader = $this->get('cropperFilesLoader');
        $cropperCss = $cropperStaticFilesLoader->getCss();
        $cropperJs = $cropperStaticFilesLoader->getJs();

        return $this->render('BrandBundle:look:edit.html.twig', array(
            'entity'      => $entity,
            'linesheet' => $entity->getLinesheet(),
            'form'   => $editForm->createView(),
            'blueImpCss' => $blueImpCss,
            'blueImpJs' => $blueImpJs,
            'cropperCss' => $cropperCss,
            'cropperJs' => $cropperJs,
        ));
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment