Generacja Partnercode - kpiorun/symfony2 GitHub Wiki
Założenia:
- Administrator generuje unikalny kod dla każdego z partnerów.
- 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
- Partner może umieścić link z partnerCode do dowolnej strony serwisu.
- 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.
- 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>`