Generacja Partnercode - kpiorun/symfony2 GitHub Wiki

Założenia:

  1. Administrator generuje unikalny kod dla każdego z partnerów.
  2. Partner musi umieścić wygenerowany kod w każdym z linków prowadzących do serwisu w parametrze partnerCode np. http://www.sample.pl/blog/?partnerCode=xxxx
  3. Partner może umieścić link z partnerCode do dowolnej strony serwisu.
  4. Każdy nowy użytkownik, który trafił na serwis poprzez dowolny link zawierający aktywny partnerCode musi podczas rejestracji zostać przypisany do danego partnera.
  5. Każda nowa akcja w istniejących i nowych kontrolerach jest automatycznie śledzona.

Generacja unikalnego kodu jest możliwa w przypadku poprawnego zalogowania do systemu. Do akcji logowania użyty został pakiet FOSUserBundle. Następnie po zalogowaniu klient zostaje przeniesiony na stronę umożliwiającą wygenerowanie kodu partnera.

# Piorun/HomeSiteBundle/Resources/config/routing.yml piorun_home_site_adminpage: pattern: /generuj-kod defaults: { _controller: PiorunHomeSiteBundle:AdminSite:index }

Formularz został wygenerowany na podstawie Encji:

  ` <?php
       namespace Piorun\HomeSiteBundle\Entity;

       use Doctrine\ORM\Mapping as ORM;
       /*** Partnercode */
       
      class Partnercode {

        /** @var string*/
        private $name;

       /*** @var string*/
       private $partnercode;

       /**
       * @var integer
       */
       private $active;

       /**
       * @var \DateTime
       */
       private $creationdate;

       /**
       * @var integer
       */
       private $id;

      /**
      * Set name
      *
      * @param string $name
      * @return Partnercode
      */
      public function setName($name) {
          $this->name = $name;

       return;
      }

     /**
     * Get name
     *
     * @return string 
     */
     public function getName() {
        return $this->name;
     }

    /**
     * Set partnercode
     *
     * @param string $partnercode
     * @return Partnercode
     */
     public function setPartnercode($partnercode) {
         $this->partnercode = $partnercode;

      return $this;
     }

    /**
    * Get partnercode
    *
    * @return string 
    */
    public function getPartnercode() {
       return $this->partnercode;
    }

   /**
   * Set active
   *
   * @param integer $active
   * @return Partnercode
   */
   public function setActive($active) {
      $this->active = $active;

     return $this;
   }

   /**
   * Get active
   *
   * @return integer 
   */
   public function getActive() {
      return $this->active;
   }

  /**
  * Set creationdate
  *
  * @param \DateTime $creationdate
  * @return Partnercode
  */
  public function setCreationdate($creationdate) {
     $this->creationdate = $creationdate;

     return $this;
  }

  /**
  * Get creationdate
  *
  * @return \DateTime 
  */
  public function getCreationdate() {
     return $this->creationdate;
  }

  /**
  * Get id
  *
  * @return integer 
  */
  public function getId() {
     return $this->id;
  }}`

W kontrolerze następuje pobranie danych z formularza oraz jego zapis do bazy danych.

`<?php
   namespace Piorun\HomeSiteBundle\Controller;

   use Piorun\HomeSiteBundle\Entity\Partnercode;
   use Symfony\Component\HttpFoundation\Request;
   use Symfony\Bundle\FrameworkBundle\Controller\Controller;

 class AdminSiteController extends Controller {

    public function indexAction(Request $request) {

    $partnercode = new Partnercode();
    $form = $this->createFormBuilder($partnercode)
            ->add('name', 'text')
            ->add('partnercode', 'text')
            ->add('active', 'text')
            ->add('save', 'submit')
            ->getForm();

    if ($request->isMethod('POST')) {
        /* Pobranie danych z formularza */
        $form->bind($request);
        $name = $form->get('name')->getData();
        $partnercodes = $form->get('partnercode')->getData();
        $active = $form->get('active')->getData();
        
        $this->saveData($name,$partnercodes,$active,$partnercode);
     

        if ($form->isValid()) {

            // perform some action, such as saving the task to the database

            return $this->redirect($this->generateUrl('piorun_home_site_homepage'));
        }
    }

    return $this->render('PiorunHomeSiteBundle:AdminSite:adminsite.html.twig', array('form' => $form->createView()));
}

private function saveData($name,$partnercodes,$active,$partnercode){
    
        $partnercode->setName($name);
        $partnercode->setPartnercode($partnercodes);
        $partnercode->setActive($active);

        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($partnercode);
        $em->flush();

    
 }
}`

Widok formularza:

`<!DOCTYPE HTML>
   <html>
      <head>
          <title>Administracja</title>
          <meta http-equiv="content-type" content="text/html; charset=utf-8" />
          <meta name="description" content="" />
          <meta name="keywords" content="" />
          <script src="{{asset('bundles/piorunhomesite/js/config.js')}}"></script>
          <script src="{{asset('bundles/piorunhomesite/js/html5shiv.js')}}"></script>
          <script src="{{asset('bundles/piorunhomesite/js/jquery.min.js')}}"></script>
          <link href="{{ asset('bundles/piorunhomesite/css/style.css') }}" type="text/css" rel="stylesheet" />

     </head>
    <body>
       <!-- Content -->
       <div id="content-wrapper">
        <div id="content">
            <div class="container">
                <div class="row">
                    <form  method="post" {{ form_enctype(form) }}>
                        {{ form_widget(form) }}

                        <input type="submit" />
                    </form>
                </div>
              </div>
          </div>
        </div>
     </body>
 </html>`

Klient, który rejestruje się na stronie poprzez link zawierający partnercode automatycznie zostaje do niego przypisany.

 `# Piorun/HomeSiteBundle/Resources/config/routing.yml
 piorun_home_site_register_client_page:
 pattern:  /zarejestruj-sie
 defaults: { _controller: PiorunHomeSiteBundle:RegisterClientSite:registerClient }`

Formularz został wygenerowany na podstawie encji:

  `<?php

      namespace Piorun\HomeSiteBundle\Entity;

      use Doctrine\ORM\Mapping as ORM;

     /**
     * Client
     *
     * @ORM\Table(name="client")
     * @ORM\Entity
     */
     class Client
     {
     /**
     * @var string
     *
     * @ORM\Column(name="name", type="text", nullable=false)
     */
     private $name;

     /**
     * @var integer
     *
     * @ORM\Column(name="partnercodeid", type="bigint", nullable=true)
     */
     private $partnercodeid;

     /**
     * @var \DateTime
     *
     * @ORM\Column(name="creationdate", type="datetime", nullable=false)
     */
     private $creationdate;

     /**
     * @var integer
     *
     * @ORM\Column(name="id", type="bigint")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
     private $id;

     /**
     * @var string
     */
     private $lastname;

     /**
     * Set lastname
     *
     * @param string $lastname
     * @return Client
     */
     public function setLastname($lastname)
     {
       $this->lastname = $lastname;

      return $this;
     }

    /**
    * Get lastname
    *
    * @return string 
    */
    public function getLastname()
    {
      return $this->lastname;
    }

    public function setName($name)
    {
      $this->name = $name;
    }
    public function getName()
   {
     return $this->name;
   }
    public function setPartnercodeid($partnercodeid)
   {
     $this->partnercodeid = $partnercodeid;
   }

   /**
   * Get partnercodeid
   *
   * @return integer 
   */
   public function getPartnercodeid()
   {
     return $this->partnercodeid;
   }

   /**
    * Set creationdate
    *
    * @param \DateTime $creationdate
    * @return Client
    */
   public function setCreationdate($creationdate)
   {
     $this->creationdate = $creationdate;

    return $this;
  }

  /**
   * Get creationdate
   *
   * @return \DateTime 
   */
   public function getCreationdate()
   {
      return $this->creationdate;
   }

  /**
   * Get id
   *
   * @return integer 
   */
   public function getId()
   {
     return $this->id;
   }
 }`

W kontrolerze następuje pobranie parametrów z formularza. Sprawdzenie czy istnieje parametr partnercode pobrany z sesji w bazie. Jeżeli tak to następuje zapis klienta do bazy danych. Aby partnercode był dostępny w każdym miejscu należałoby dodatkowo nadpisać klasę Controller i tam umieścić zapis parametru do sesji.

 `<?php

      namespace Piorun\HomeSiteBundle\Controller;

      use Piorun\HomeSiteBundle\Entity\Client;
      use Symfony\Component\HttpFoundation\Request;
      use Symfony\Bundle\FrameworkBundle\Controller\Controller;
      use Symfony\Component\HttpFoundation\Session\Session;

     class RegisterClientSiteController extends Controller {

          public function registerClientAction(Request $request) {

          $client = new Client();
          $form = $this->createFormBuilder($client)
            ->add('name', 'text')
            ->add('lastname', 'text')
            ->add('save', 'submit')
            ->getForm();

         /* Aby uzywac na kazdej stronie nalezy nadpisac klase controller */

         $session = new Session();
          $session->set('partnercode', $request->get('partnercode'));
       /*  * ************************************************************ */

       if ($request->isMethod('POST')) {
         /* Pobranie danych z formularza */
         $form->bind($request);
         $name = $form->get('name')->getData();
         $lastname = $form->get('lastname')->getData();
         $partnercode = $session->get('partnercode');
          if ($form->isValid()) {
            if ($partnercode) {
                $this->getClientPartnersCodeAction($partnercode,$lastname,$name);
            }
            return $this->redirect($this->generateUrl('piorun_home_site_homepage'));
        }
    }

    return $this->render('PiorunHomeSiteBundle:RegisterSite:register.html.twig', array('form' => $form->createView()));
}

public function getClientPartnersCodeAction($partnercode,$lastname,$name) {

    $repository = $this->getDoctrine()
            ->getRepository('PiorunHomeSiteBundle:Partnercode');

    $query = $repository->createQueryBuilder('p')
            ->where('p.partnercode = :partnercode AND p.active=1')
            ->setParameter('partnercode', $partnercode)
            ->getQuery();

    $partnercodes = $query->getResult();


    if ($partnercodes) {
        $this->saveClient($partnercodes[0]->getId(),$lastname,$name);
    } else {
        throw $this->createNotFoundException(
                'Brak kodu klienta o podanym id ' . $partnercode
        );
    }

    return $partnercodes;
}
 /* zapis do bazy danych */
protected function saveClient($partnercode,$lastname,$name) {

    $client = new Client();
    $client->setName($name);
    $client->setLastname($lastname);
    $client->setPartnercodeid($partnercode);

    $em = $this->getDoctrine()->getEntityManager();
    $em->persist($client);
    $em->flush();
   }
  }` 

Widok formularza:

  `<!DOCTYPE HTML>
      <html>
         <head>
             <title>Administracja</title>
             <meta http-equiv="content-type" content="text/html; charset=utf-8" />
             <meta name="description" content="" />
             <meta name="keywords" content="" />
             <script src="{{asset('bundles/piorunhomesite/js/config.js')}}"></script>
             <script src="{{asset('bundles/piorunhomesite/js/html5shiv.js')}}"></script>
             <script src="{{asset('bundles/piorunhomesite/js/jquery.min.js')}}"></script>
             <link href="{{ asset('bundles/piorunhomesite/css/style.css') }}" type="text/css"             rel="stylesheet" />

        </head>
        <body>
             <!-- Content -->
           <div id="content-wrapper">
               <div id="content">
                  <div class="container">
                     <div class="row">
                          <form  method="post" {{ form_enctype(form) }}>
                            {{ form_widget(form) }}
                          <input type="submit" />
                          </form>
                     </div>
                 </div>
              </div>
           </div>
      </body>
  </html>`
⚠️ **GitHub.com Fallback** ⚠️