Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- influence
- *gedmo - ko i kad je kreirao objekat (dodatna polja u bazi)
- gedmo/slug citljivi dio url
- ---------------------
- orphanRemoval=true
- doctrine pravi pretpostavku da su entiteti u privatnom vlasnistvu i nece biti koristeni od strane drugih entiteta. Ako zanemarimo ovu pretpostavku, entiteti ce biti izbrisani od strane Doctrine cak i ako ste ustupili entitet bez roditelja drugom entitetu.
- ----------------------------
- Transitive persistence / Cascade Operations
- Svaka asocijacija na drugi entitet ili skup entiteta moze se konfigurirati da automatksi kaskadira (poveznica) sledece operacije pridruzenim entitetima: persist, remove, merge, detach, refresh or all.
- $user = new User();
- $myFirstComment = new Comment();
- $user->addComment($myFirstComment);
- $em->persist($user);
- $em->persist($myFirstComment); // required, if `cascade: persist` is not set
- $em->flush();
- Glavni slucaj koriscenja za kaskadu: persist je da se izbjegne "exposing" pridruzenih entiteta vasoj PHP aplikaciji.
- Persist nam omogucava da sakrijemo entitet neke klase od kontrolera tako sto mu pristupamo preko entiteta neke druge klase.
- **************
- Zahvaljujuci kaskadi remove lako mozemo da izbrisemo entitet i sve povezane entitete a da ne morate da prolazite kroz njih
- ******************
- kaskada all: za svaku operaciju kaskade koja se aktivira,Doctrine takodje primjenjuje tu operaciju na asocijaciju(zajednicu) bilo da je ona pojedinacna ili zbirna vrijednost.
- ---------------------------
- ManyToMany relationship
- /**
- * @var ArrayCollection
- *
- * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Campaign\Country", cascade={"all"}, orphanRemoval=true)
- * @ORM\JoinTable(name="campaign_campaign_audience_country")
- */
- ----------------------------
- @Assert\Valid() - validno polje
- @Assert\Count(min=1, minMessage = "campaign.platforms.not_blank") - poruka ako je manje od 1
- @Assert\NotBlank(message = "campaign.gender.not_blank") -poruka ukoliko izvrsimo submit a ostavimo prazno polje
- @Assert\Choice(callback={"AppBundle\Enum\Gender", "all"}) - padajuci meni na osnovu enumeracije
- @Assert\GreaterThanOrEqual(value = 16) - ocekivana vrijednost veca od 16
- @Assert\LessThanOrEqual(value = 77) - ocekivana vrijednost manja od 77
- @Assert\Type(type="float") - ocekivati tip float, string ...
- @Assert\NotNull()
- poruke za ispis greske se nalaze u app/Resources/translations/validators
- ---------------------------
- fetch="EXTRA_LAZY" -brzi upit
- ----------------------------------
- use TimestampableEntity;
- use BlameableEntity;
- sluzi da se kreiraju polja u kada je kreiran entitet, kada je poslednja izmjena entitta.....
- -----------------------
- /**
- * @var HttpFile
- *
- * @Vich\UploadableField(mapping="campaign_image", fileNameProperty="name", size="size")
- */
- koristi se za upload dokumenata, slika pdf...
- -----------------------------
- @ORM\Embedded(class="AppBundle\Entity\User\Clothing", columnPrefix="clothing_")
- *****************************************
- Enum
- primjer
- final class BrandType
- {
- const BRAND = 'brand';
- const AGENCY = 'agency';
- private function __construct() { /* noop */ }
- public static function all()
- {
- return (new \ReflectionClass(self::class))->getConstants();
- }
- }
- ************************************************
- Forma
- forma za prikaz podataka
- class AmbassadorType extends AbstractType
- {
- public function buildForm(FormBuilderInterface $builder, array $options)
- {
- $builder
- ->add('name', TextType::class, [
- 'required' => true,
- 'label' => false,
- ])
- ->add('email', EmailType::class, [
- 'required' => true,
- 'label' => false,
- ])
- ->add('country', CountryType::class, [
- 'required' => true,
- 'label' => false,
- ]);
- }
- /**
- * {@inheritdoc}
- */
- public function setDefaultOptions(OptionsResolver $resolver)
- {
- $resolver->setDefaults(array(
- 'data_class' => Ambassador::class,
- 'error_bubbling' => true,
- ));
- }
- /**
- * {@inheritdoc}
- */
- public function getName()
- {
- return 'ambassador_form';
- }
- }
- ----------------------------------
- Filter type za unos podataka
- class AmbassadorFilterType extends AbstractType
- {
- public function buildForm(FormBuilderInterface $builder, array $options)
- {
- $builder->add('name', Filters\TextFilterType::class, [
- 'required' => false,
- 'condition_pattern' => FilterOperands::STRING_CONTAINS,
- ])
- ->add('email', Filters\TextFilterType::class, [
- 'required' => false,
- 'condition_pattern' => FilterOperands::STRING_CONTAINS,
- ]);
- }
- public function configureOptions(OptionsResolver $resolver)
- {
- $resolver
- ->setDefault('method', 'GET')
- ->setDefault('csrf_protection', false);
- }
- }
- --------------------------
- *mapped - kada mapiramo formu na objekte mapiraju se sva polja. Bilo koja polja koja ne ne postoje na formi ce izazvati izuzetak. Ukoliko su vam potrebna dodatna polja onda mapped postavljamo na false
- *multiple - ako je true korisnik ce moci da izabere vise opcija, Vracena vrijednost ce biti niz
- *placeholder - ova opcija se prikazuje samo ako je multiple postavljeno na false
- *preferred_choices - ova opcija vam omogucava da odredjene izbore premjestite na vrh liste sa vizuelnim separatorom izmedju njih i ostalih opcija. Mozete navesti najpopularnije na vrh.
- *expanded - ako je postavljen na true radio button ili checkboxes ce biti prikazan ako je postavljen na false element za selekciju ce biti prikazan
- *translation_domain - u slucaju choice_translation_domain da je postavljen na true ili null ovo konfigurise tacan domen prevoda koji ce se koristiti za sve oznake ili opcije koje se prikazuju za ovo polje
- *choices - nacin da odredimo izbore u ovom polju, choices je niz
- *apply_filter - sve vrste opcija imaju apply_filter koja je zatvorena. Ako ova opcija definisana QueryBuilderUpdater nece pokrenuti nijedan dogadjaj vec ce biti pozvan odredjeni closure.
- closure ima 3 parametra:
- 1) Objekat koji implementira Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface iz koga mozemo dobiti query builder i expression class
- 2)ime polja
- 3)niz vrednosti koje sadrze vrednost polja i neke druge podatke
- *choice_label -
- tekst koji je prikazan korisniku.
- https://symfony.com/doc/current/reference/forms/types/choice.html
- ******************************************************************
- Form Type
- Invoice/InvoiceFilterType - 'apply_filter' //to do
- class CampaignTypeFilterType extends AbstractType
- {
- use CampaignTypeTrait;
- public function getParent()
- {
- return ChoiceFilterType::class;
- }
- }
- **************************************************************************
- Repository
- class AmbassadorRepository extends EntityRepository
- {
- /**
- * Ambassador query builder
- *
- * @return mixed
- */
- public function buildAmbassadors()
- {
- $qb = $this->createQueryBuilder('ambassador');
- $qb->select('ambassador');
- return $qb;
- }
- }
- ****************************************************
- Event
- class AmbassadorEvent extends Event
- {
- /**
- * @var Ambassador $_ambassador
- */
- private $_ambassador;
- public function __construct(Ambassador $ambassador)
- {
- $this->_ambassador = $ambassador;
- }
- /**
- * @return Ambassador
- */
- public function getAmbassador(): Ambassador
- {
- return $this->_ambassador;
- }
- }
- ---------------------------
- final class AmbassadorEvents
- {
- const SUBMITTED = 'influence.ambassador.submitted';
- }
- **********************************************************
- Listener
- class AmbassadorEventListener
- {
- /**
- * @var MailTwigEnvironment|\Twig_Environment
- */
- protected $twig;
- /**
- * @var \Swift_Mailer
- */
- protected $mailer;
- /**
- * @var string
- */
- protected $from;
- /**
- * @var string
- */
- protected $appName;
- public function __construct(MailTwigEnvironment $twig, \Swift_Mailer $mailer, $from, $appName)
- {
- $this->twig = $twig;
- $this->mailer = $mailer;
- $this->from = $from;
- $this->appName = $appName;
- }
- public function onSubmited(AmbassadorEvent $event)
- {
- $template = ':email/ambassador:submited.html.twig';
- $this->sendMail($template, $event);
- }
- /**
- * Sends a mail
- *
- * @param $template
- * @param AmbassadorEvent $event
- */
- private function sendMail($template, AmbassadorEvent $event)
- {
- $subject = $this->twig->renderBlock($template, 'subject', [
- 'name' => $event->getAmbassador()->getName(),
- ]);
- $body = $this->twig->renderBlock($template, 'body', [
- 'ambassador' => $event->getAmbassador(),
- ]);
- $message = \Swift_Message::newInstance()
- //->setTo("florian@influencevision.com")
- ->setTo("stefan.itmedia@gmail.com")
- ->setSubject($subject)
- ->setBody($body)
- ->setFrom([$this->from => '[NoReply] ' . $this->appName])
- ->setContentType("text/html");
- $this->mailer->send($message);
- }
- }
- *******************************************************************************
- /**
- * Edit article in admin
- *
- * @param Request $request
- *
- * @return Response
- */
- public function formAction(Request $request)
- {
- $ambassador = $this->getAmbassador($request);
- $form = $this->createForm(AmbassadorType::class, $ambassador);
- $form->handleRequest($request);
- if ($form->isSubmitted() && $form->isValid()) {
- $em = $this->getDoctrine()->getManager();
- $em->persist($ambassador);
- $em->flush();
- $this->addFlash('success', 'flash.saved');
- return $this->redirectToRoute('admin_ambassador_edit', ['id' => $ambassador->getId()]);
- }
- return $this->render(':admin/ambassador:form.html.twig', [
- 'form' => $form->createView(),
- 'ambassador' => $ambassador,
- ]);
- }
- /**
- * Get place from request
- *
- * @param Request $request
- * @return Ambassador|null|object
- */
- private function getAmbassador(Request $request)
- {
- if (null !== ($id = $request->get('id'))) {
- $ambassador = $this->getDoctrine()->getRepository(Ambassador::class)->findOneBy(['id' => $id]);
- if (null === $ambassador) {
- throw $this->createNotFoundException();
- }
- return $ambassador;
- }
- $ambassador = new Ambassador();
- return $ambassador;
- }
- **********************************************************************
- {% extends 'admin_base.html.twig' %}
- {% form_theme form 'bootstrap_3_layout.html.twig' %}
- {% block bodyHeader %} {% include ':admin/ambassador:_breadcrumb.html.twig' %} {% endblock %}
- {% block body %}
- <div class="container-fluid page-content">
- <div class="row">
- <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
- <div class="panel panel-flat">
- <div class="panel-heading">
- <form method="get">
- <div class="row">
- <div class="col-md-5">{{ form_row(form.name) }}</div>
- <div class="col-md-5">{{ form_row(form.email) }}</div>
- <div class="col-md-2" style="margin-top: 24px;">
- <button type="submit" class="btn btn-primary" name="submit-filter">
- <i class="fa fa-search"></i> Search
- </button>
- </div>
- </div>
- {{ form_rest(form) }}
- </form>
- </div>
- <table class="table datatable datatable-column-search-inputs">
- <thead>
- <tr>
- <th width="30">ID</th>
- <th>Name</th>
- <th>Email</th>
- <th>Country</th>
- <th width="200">Action</th>
- </tr>
- </thead>
- <tbody>
- {% for ambassador in ambassadors %}
- <tr>
- <td>{{ ambassador.id }}</td>
- <td>{{ ambassador.name }}</td>
- <td>{{ ambassador.email }}</td>
- <td>{{ ambassador.country }}</td>
- <td>
- <a href="{{ path('admin_ambassador_edit', { 'id': ambassador.id }) }}">
- <i class="icon-pencil6"></i> {{ 'admin.edit'|trans|raw }}
- </a>
- <a href="{{ path('admin_ambassador_delete', { 'ambassador': ambassador.id }) }}">
- <i class="icon-trash"></i> {{ 'admin.delete'|trans|raw }}
- </a>
- </td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- <ul class="pagination">
- {{ knp_pagination_render(ambassadors) }}
- </ul>
- </div>
- </div>
- </div>
- {% endblock %}
- -------------------------------------
- app/config/services/listeners/email_notifications.yml
- influence.listener.ambassador:
- class: AppBundle\Listener\EmailNotification\AmbassadorEventListener
- arguments: ['@influence.mail.twig', '@mailer', '%influence.activity_log.mail.from%', '%influence.app_name%']
- public: false
- tags:
- - { name: kernel.event_listener, event: influence.ambassador.submitted, method: onSubmited }
Add Comment
Please, Sign In to add comment