djuro95

influence_vision

Mar 21st, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.63 KB | None | 0 0
  1. influence
  2.  
  3. *gedmo - ko i kad je kreirao objekat (dodatna polja u bazi)
  4. gedmo/slug citljivi dio url
  5.  
  6. ---------------------
  7.  
  8. orphanRemoval=true
  9.  
  10. 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.
  11.  
  12. ----------------------------
  13.  
  14. Transitive persistence / Cascade Operations
  15.  
  16. 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.
  17.  
  18. $user = new User();
  19. $myFirstComment = new Comment();
  20. $user->addComment($myFirstComment);
  21.  
  22. $em->persist($user);
  23. $em->persist($myFirstComment); // required, if `cascade: persist` is not set
  24. $em->flush();
  25.  
  26. Glavni slucaj koriscenja za kaskadu: persist je da se izbjegne "exposing" pridruzenih entiteta vasoj PHP aplikaciji.
  27. Persist nam omogucava da sakrijemo entitet neke klase od kontrolera tako sto mu pristupamo preko entiteta neke druge klase.
  28.  
  29. **************
  30. Zahvaljujuci kaskadi remove lako mozemo da izbrisemo entitet i sve povezane entitete a da ne morate da prolazite kroz njih
  31. ******************
  32. 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.
  33.  
  34. ---------------------------
  35. ManyToMany relationship
  36.  
  37. /**
  38. * @var ArrayCollection
  39. *
  40. * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Campaign\Country", cascade={"all"}, orphanRemoval=true)
  41. * @ORM\JoinTable(name="campaign_campaign_audience_country")
  42. */
  43. ----------------------------
  44.  
  45. @Assert\Valid() - validno polje
  46. @Assert\Count(min=1, minMessage = "campaign.platforms.not_blank") - poruka ako je manje od 1
  47. @Assert\NotBlank(message = "campaign.gender.not_blank") -poruka ukoliko izvrsimo submit a ostavimo prazno polje
  48. @Assert\Choice(callback={"AppBundle\Enum\Gender", "all"}) - padajuci meni na osnovu enumeracije
  49. @Assert\GreaterThanOrEqual(value = 16) - ocekivana vrijednost veca od 16
  50. @Assert\LessThanOrEqual(value = 77) - ocekivana vrijednost manja od 77
  51. @Assert\Type(type="float") - ocekivati tip float, string ...
  52. @Assert\NotNull()
  53.  
  54. poruke za ispis greske se nalaze u app/Resources/translations/validators
  55.  
  56. ---------------------------
  57. fetch="EXTRA_LAZY" -brzi upit
  58. ----------------------------------
  59. use TimestampableEntity;
  60. use BlameableEntity;
  61.  
  62. sluzi da se kreiraju polja u kada je kreiran entitet, kada je poslednja izmjena entitta.....
  63.  
  64. -----------------------
  65.  
  66. /**
  67. * @var HttpFile
  68. *
  69. * @Vich\UploadableField(mapping="campaign_image", fileNameProperty="name", size="size")
  70. */
  71. koristi se za upload dokumenata, slika pdf...
  72.  
  73. -----------------------------
  74. @ORM\Embedded(class="AppBundle\Entity\User\Clothing", columnPrefix="clothing_")
  75.  
  76.  
  77.  
  78.  
  79. *****************************************
  80. Enum
  81.  
  82. primjer
  83.  
  84.  
  85. final class BrandType
  86. {
  87. const BRAND = 'brand';
  88. const AGENCY = 'agency';
  89.  
  90. private function __construct() { /* noop */ }
  91.  
  92. public static function all()
  93. {
  94. return (new \ReflectionClass(self::class))->getConstants();
  95. }
  96. }
  97.  
  98. ************************************************
  99. Forma
  100.  
  101. forma za prikaz podataka
  102. class AmbassadorType extends AbstractType
  103. {
  104. public function buildForm(FormBuilderInterface $builder, array $options)
  105. {
  106. $builder
  107. ->add('name', TextType::class, [
  108. 'required' => true,
  109. 'label' => false,
  110. ])
  111. ->add('email', EmailType::class, [
  112. 'required' => true,
  113. 'label' => false,
  114. ])
  115. ->add('country', CountryType::class, [
  116. 'required' => true,
  117. 'label' => false,
  118. ]);
  119. }
  120.  
  121. /**
  122. * {@inheritdoc}
  123. */
  124. public function setDefaultOptions(OptionsResolver $resolver)
  125. {
  126. $resolver->setDefaults(array(
  127. 'data_class' => Ambassador::class,
  128. 'error_bubbling' => true,
  129. ));
  130. }
  131.  
  132.  
  133. /**
  134. * {@inheritdoc}
  135. */
  136. public function getName()
  137. {
  138. return 'ambassador_form';
  139. }
  140. }
  141.  
  142. ----------------------------------
  143. Filter type za unos podataka
  144. class AmbassadorFilterType extends AbstractType
  145. {
  146.  
  147. public function buildForm(FormBuilderInterface $builder, array $options)
  148. {
  149. $builder->add('name', Filters\TextFilterType::class, [
  150. 'required' => false,
  151. 'condition_pattern' => FilterOperands::STRING_CONTAINS,
  152. ])
  153. ->add('email', Filters\TextFilterType::class, [
  154. 'required' => false,
  155. 'condition_pattern' => FilterOperands::STRING_CONTAINS,
  156. ]);
  157.  
  158. }
  159.  
  160. public function configureOptions(OptionsResolver $resolver)
  161. {
  162. $resolver
  163. ->setDefault('method', 'GET')
  164. ->setDefault('csrf_protection', false);
  165. }
  166. }
  167. --------------------------
  168. *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
  169.  
  170. *multiple - ako je true korisnik ce moci da izabere vise opcija, Vracena vrijednost ce biti niz
  171.  
  172. *placeholder - ova opcija se prikazuje samo ako je multiple postavljeno na false
  173.  
  174. *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.
  175.  
  176. *expanded - ako je postavljen na true radio button ili checkboxes ce biti prikazan ako je postavljen na false element za selekciju ce biti prikazan
  177.  
  178. *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
  179.  
  180. *choices - nacin da odredimo izbore u ovom polju, choices je niz
  181.  
  182. *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.
  183. closure ima 3 parametra:
  184. 1) Objekat koji implementira Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface iz koga mozemo dobiti query builder i expression class
  185. 2)ime polja
  186. 3)niz vrednosti koje sadrze vrednost polja i neke druge podatke
  187.  
  188. *choice_label -
  189. tekst koji je prikazan korisniku.
  190.  
  191. https://symfony.com/doc/current/reference/forms/types/choice.html
  192.  
  193. ******************************************************************
  194. Form Type
  195.  
  196. Invoice/InvoiceFilterType - 'apply_filter' //to do
  197.  
  198.  
  199. class CampaignTypeFilterType extends AbstractType
  200. {
  201. use CampaignTypeTrait;
  202.  
  203. public function getParent()
  204. {
  205. return ChoiceFilterType::class;
  206. }
  207. }
  208.  
  209.  
  210. **************************************************************************
  211.  
  212. Repository
  213.  
  214. class AmbassadorRepository extends EntityRepository
  215. {
  216.  
  217.  
  218. /**
  219. * Ambassador query builder
  220. *
  221. * @return mixed
  222. */
  223. public function buildAmbassadors()
  224. {
  225. $qb = $this->createQueryBuilder('ambassador');
  226. $qb->select('ambassador');
  227.  
  228. return $qb;
  229.  
  230. }
  231.  
  232.  
  233. }
  234.  
  235. ****************************************************
  236. Event
  237.  
  238. class AmbassadorEvent extends Event
  239. {
  240.  
  241. /**
  242. * @var Ambassador $_ambassador
  243. */
  244. private $_ambassador;
  245.  
  246. public function __construct(Ambassador $ambassador)
  247. {
  248. $this->_ambassador = $ambassador;
  249. }
  250.  
  251. /**
  252. * @return Ambassador
  253. */
  254. public function getAmbassador(): Ambassador
  255. {
  256. return $this->_ambassador;
  257. }
  258.  
  259. }
  260.  
  261. ---------------------------
  262.  
  263. final class AmbassadorEvents
  264. {
  265. const SUBMITTED = 'influence.ambassador.submitted';
  266. }
  267. **********************************************************
  268. Listener
  269.  
  270. class AmbassadorEventListener
  271. {
  272. /**
  273. * @var MailTwigEnvironment|\Twig_Environment
  274. */
  275. protected $twig;
  276.  
  277. /**
  278. * @var \Swift_Mailer
  279. */
  280. protected $mailer;
  281.  
  282. /**
  283. * @var string
  284. */
  285. protected $from;
  286.  
  287. /**
  288. * @var string
  289. */
  290. protected $appName;
  291.  
  292. public function __construct(MailTwigEnvironment $twig, \Swift_Mailer $mailer, $from, $appName)
  293. {
  294. $this->twig = $twig;
  295. $this->mailer = $mailer;
  296. $this->from = $from;
  297. $this->appName = $appName;
  298. }
  299.  
  300. public function onSubmited(AmbassadorEvent $event)
  301. {
  302.  
  303. $template = ':email/ambassador:submited.html.twig';
  304. $this->sendMail($template, $event);
  305.  
  306. }
  307.  
  308.  
  309. /**
  310. * Sends a mail
  311. *
  312. * @param $template
  313. * @param AmbassadorEvent $event
  314. */
  315. private function sendMail($template, AmbassadorEvent $event)
  316. {
  317.  
  318.  
  319. $subject = $this->twig->renderBlock($template, 'subject', [
  320. 'name' => $event->getAmbassador()->getName(),
  321. ]);
  322. $body = $this->twig->renderBlock($template, 'body', [
  323. 'ambassador' => $event->getAmbassador(),
  324. ]);
  325.  
  326. $message = \Swift_Message::newInstance()
  327. //->setTo("florian@influencevision.com")
  328. ->setTo("stefan.itmedia@gmail.com")
  329. ->setSubject($subject)
  330. ->setBody($body)
  331. ->setFrom([$this->from => '[NoReply] ' . $this->appName])
  332. ->setContentType("text/html");
  333.  
  334. $this->mailer->send($message);
  335.  
  336.  
  337. }
  338.  
  339.  
  340. }
  341.  
  342. *******************************************************************************
  343.  
  344. /**
  345. * Edit article in admin
  346. *
  347. * @param Request $request
  348. *
  349. * @return Response
  350. */
  351. public function formAction(Request $request)
  352. {
  353.  
  354. $ambassador = $this->getAmbassador($request);
  355.  
  356. $form = $this->createForm(AmbassadorType::class, $ambassador);
  357. $form->handleRequest($request);
  358.  
  359. if ($form->isSubmitted() && $form->isValid()) {
  360.  
  361. $em = $this->getDoctrine()->getManager();
  362. $em->persist($ambassador);
  363. $em->flush();
  364.  
  365. $this->addFlash('success', 'flash.saved');
  366.  
  367. return $this->redirectToRoute('admin_ambassador_edit', ['id' => $ambassador->getId()]);
  368.  
  369. }
  370.  
  371.  
  372.  
  373. return $this->render(':admin/ambassador:form.html.twig', [
  374. 'form' => $form->createView(),
  375. 'ambassador' => $ambassador,
  376. ]);
  377.  
  378. }
  379.  
  380. /**
  381. * Get place from request
  382. *
  383. * @param Request $request
  384. * @return Ambassador|null|object
  385. */
  386. private function getAmbassador(Request $request)
  387. {
  388. if (null !== ($id = $request->get('id'))) {
  389. $ambassador = $this->getDoctrine()->getRepository(Ambassador::class)->findOneBy(['id' => $id]);
  390.  
  391. if (null === $ambassador) {
  392. throw $this->createNotFoundException();
  393. }
  394.  
  395. return $ambassador;
  396. }
  397.  
  398. $ambassador = new Ambassador();
  399.  
  400. return $ambassador;
  401. }
  402.  
  403. **********************************************************************
  404. {% extends 'admin_base.html.twig' %}
  405. {% form_theme form 'bootstrap_3_layout.html.twig' %}
  406.  
  407. {% block bodyHeader %} {% include ':admin/ambassador:_breadcrumb.html.twig' %} {% endblock %}
  408.  
  409. {% block body %}
  410.  
  411. <div class="container-fluid page-content">
  412. <div class="row">
  413. <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
  414.  
  415. <div class="panel panel-flat">
  416.  
  417. <div class="panel-heading">
  418. <form method="get">
  419. <div class="row">
  420. <div class="col-md-5">{{ form_row(form.name) }}</div>
  421. <div class="col-md-5">{{ form_row(form.email) }}</div>
  422.  
  423. <div class="col-md-2" style="margin-top: 24px;">
  424. <button type="submit" class="btn btn-primary" name="submit-filter">
  425. <i class="fa fa-search"></i> Search
  426. </button>
  427. </div>
  428. </div>
  429. {{ form_rest(form) }}
  430. </form>
  431. </div>
  432.  
  433. <table class="table datatable datatable-column-search-inputs">
  434. <thead>
  435. <tr>
  436. <th width="30">ID</th>
  437. <th>Name</th>
  438. <th>Email</th>
  439. <th>Country</th>
  440. <th width="200">Action</th>
  441. </tr>
  442. </thead>
  443.  
  444. <tbody>
  445.  
  446. {% for ambassador in ambassadors %}
  447.  
  448. <tr>
  449. <td>{{ ambassador.id }}</td>
  450. <td>{{ ambassador.name }}</td>
  451. <td>{{ ambassador.email }}</td>
  452. <td>{{ ambassador.country }}</td>
  453. <td>
  454. <a href="{{ path('admin_ambassador_edit', { 'id': ambassador.id }) }}">
  455. <i class="icon-pencil6"></i> {{ 'admin.edit'|trans|raw }}
  456. </a> &nbsp;
  457. <a href="{{ path('admin_ambassador_delete', { 'ambassador': ambassador.id }) }}">
  458. <i class="icon-trash"></i> {{ 'admin.delete'|trans|raw }}
  459. </a>
  460. </td>
  461. </tr>
  462.  
  463. {% endfor %}
  464.  
  465. </tbody>
  466. </table>
  467. </div>
  468.  
  469. <ul class="pagination">
  470. {{ knp_pagination_render(ambassadors) }}
  471. </ul>
  472. </div>
  473. </div>
  474. </div>
  475. {% endblock %}
  476.  
  477. -------------------------------------
  478.  
  479. app/config/services/listeners/email_notifications.yml
  480.  
  481. influence.listener.ambassador:
  482. class: AppBundle\Listener\EmailNotification\AmbassadorEventListener
  483. arguments: ['@influence.mail.twig', '@mailer', '%influence.activity_log.mail.from%', '%influence.app_name%']
  484. public: false
  485. tags:
  486. - { name: kernel.event_listener, event: influence.ambassador.submitted, method: onSubmited }
Add Comment
Please, Sign In to add comment