Refactored back-office customer management

This commit is contained in:
Franck Allimant
2013-11-09 18:28:01 +01:00
parent 85ea937570
commit ac74c1d61d
17 changed files with 748 additions and 600 deletions

View File

@@ -42,7 +42,7 @@ class AddressController extends AbstractCrudController
public function __construct()
{
parent::__construct(
'address',
'registration_date',
null,
null,
@@ -50,10 +50,7 @@ class AddressController extends AbstractCrudController
TheliaEvents::ADDRESS_CREATE,
TheliaEvents::ADDRESS_UPDATE,
TheliaEvents::ADDRESS_DELETE,
null,
null
TheliaEvents::ADDRESS_DELETE
);
}
@@ -79,7 +76,7 @@ class AddressController extends AbstractCrudController
\Thelia\Log\Tlog::getInstance()->error(sprintf("error during address setting as default with message %s", $e->getMessage()));
}
$this->redirectToRoute('admin.customer.update.view', array(), array('customer_id' => $address->getCustomerId()));
$this->redirectToEditionTemplate();
}
/**
@@ -99,13 +96,14 @@ class AddressController extends AbstractCrudController
}
/**
* Hydrate the update form for this object, before passing it to the update template
* Fills in the form data array
*
* @param \Thelia\Model\Address $object
* @param unknown $object
* @return multitype:NULL
*/
protected function hydrateObjectForm($object)
protected function createFormDataArray($object)
{
$data = array(
return array(
"label" => $object->getLabel(),
"title" => $object->getTitleId(),
"firstname" => $object->getFirstname(),
@@ -120,8 +118,16 @@ class AddressController extends AbstractCrudController
"phone" => $object->getPhone(),
"company" => $object->getCompany()
);
}
return new AddressUpdateForm($this->getRequest(), "form", $data);
/**
* Hydrate the update form for this object, before passing it to the update template
*
* @param \Thelia\Model\Address $object
*/
protected function hydrateObjectForm($object)
{
return new AddressUpdateForm($this->getRequest(), "form", $this->createFormDataArray($object));
}
/**
@@ -240,7 +246,8 @@ class AddressController extends AbstractCrudController
*/
protected function renderListTemplate($currentOrder)
{
// TODO: Implement renderListTemplate() method.
// We render here the customer edit template.
return $this->renderEditionTemplate();
}
/**
@@ -248,9 +255,10 @@ class AddressController extends AbstractCrudController
*/
protected function renderEditionTemplate()
{
return $this->render('ajax/address-update-modal', array(
"address_id" => $this->getRequest()->get('address_id'),
"customer_id" => $this->getExistingObject()->getCustomerId()
return $this->render('customer-edit', array(
"address_id" => $this->getRequest()->get('address_id'),
"page" => $this->getRequest()->get('page'),
"customer_id" => $this->getCustomerId()
));
}
@@ -259,8 +267,11 @@ class AddressController extends AbstractCrudController
*/
protected function redirectToEditionTemplate()
{
$address = $this->getExistingObject();
$this->redirectToRoute('admin.customer.update.view', array(), array('customer_id' => $address->getCustomerId()));
// We display here the custromer edition template
$this->redirectToRoute('admin.customer.update.view', array(
"page" => $this->getRequest()->get('page'),
"customer_id" => $this->getCustomerId()
));
}
/**
@@ -279,8 +290,7 @@ class AddressController extends AbstractCrudController
*/
protected function performAdditionalDeleteAction($deleteEvent)
{
$address = $deleteEvent->getAddress();
$this->redirectToRoute('admin.customer.update.view', array(), array('customer_id' => $address->getCustomerId()));
$this->redirectToEditionTemplate();
}
/**
@@ -298,4 +308,11 @@ class AddressController extends AbstractCrudController
{
$this->redirectToEditionTemplate();
}
protected function getCustomerId() {
if (null !== $address = $this->getExistingObject())
return $address->getCustomerId();
else
return $this->getRequest()->get('customer_id', 0);
}
}

View File

@@ -35,171 +35,96 @@ use Thelia\Form\Exception\FormValidationException;
use Thelia\Model\CustomerQuery;
use Thelia\Core\Translation\Translator;
use Thelia\Tools\Password;
use Thelia\Model\AddressQuery;
use Thelia\Model\Address;
/**
* Class CustomerController
* @package Thelia\Controller\Admin
* @author Manuel Raynaud <mraynaud@openstudio.fr>
*/
class CustomerController extends BaseAdminController
class CustomerController extends AbstractCrudController
{
public function indexAction()
public function __construct()
{
if (null !== $response = $this->checkAuth(AdminResources::CUSTOMER, AccessManager::VIEW)) return $response;
return $this->render("customers", array("display_customer" => 20));
parent::__construct(
'customer',
'lastname',
'customer_order',
AdminResources::CUSTOMER,
TheliaEvents::CUSTOMER_CREATEACCOUNT,
TheliaEvents::CUSTOMER_UPDATEACCOUNT,
TheliaEvents::CUSTOMER_DELETEACCOUNT
);
}
public function viewAction($customer_id)
protected function getCreationForm()
{
if (null !== $response = $this->checkAuth(AdminResources::CUSTOMER, AccessManager::VIEW)) return $response;
return $this->render("customer-edit", array(
"customer_id" => $customer_id
));
return new CustomerCreateForm($this->getRequest());
}
/**
* update customer action
*
* @param $customer_id
* @return mixed|\Thelia\Core\HttpFoundation\Response
*/
public function updateAction($customer_id)
protected function getUpdateForm()
{
if (null !== $response = $this->checkAuth(AdminResources::CUSTOMER, AccessManager::UPDATE)) return $response;
$message = false;
$customerUpdateForm = new CustomerUpdateForm($this->getRequest());
try {
$customer = CustomerQuery::create()->findPk($customer_id);
if (null === $customer) {
throw new \InvalidArgumentException(sprintf("%d customer id does not exist", $customer_id));
}
$form = $this->validateForm($customerUpdateForm);
$event = $this->createEventInstance($form->getData());
$event->setCustomer($customer);
$this->dispatch(TheliaEvents::CUSTOMER_UPDATEACCOUNT, $event);
$customerUpdated = $event->getCustomer();
$this->adminLogAppend(AdminResources::CUSTOMER, AccessManager::UPDATE, sprintf("Customer with Ref %s (ID %d) modified", $customerUpdated->getRef() , $customerUpdated->getId()));
if ($this->getRequest()->get("save_mode") == "close") {
$this->redirectToRoute("admin.customers");
} else {
$this->redirectSuccess($customerUpdateForm);
}
} catch (FormValidationException $e) {
$message = sprintf("Please check your input: %s", $e->getMessage());
} catch (PropelException $e) {
$message = $e->getMessage();
} catch (\Exception $e) {
$message = sprintf("Sorry, an error occured: %s", $e->getMessage()." ".$e->getFile());
}
if ($message !== false) {
\Thelia\Log\Tlog::getInstance()->error(sprintf("Error during customer update process : %s.", $message));
$customerUpdateForm->setErrorMessage($message);
$this->getParserContext()
->addForm($customerUpdateForm)
->setGeneralError($message)
;
}
return $this->render("customer-edit", array(
"customer_id" => $customer_id
));
return new CustomerUpdateForm($this->getRequest());
}
public function createAction()
protected function getCreationEvent($formData)
{
if (null !== $response = $this->checkAuth(AdminResources::CUSTOMER, AccessManager::CREATE)) return $response;
$message = null;
$customerCreateForm = new CustomerCreateForm($this->getRequest());
try {
$form = $this->validateForm($customerCreateForm);
$data = $form->getData();
$data["password"] = Password::generateRandom();
$event = $this->createEventInstance($form->getData());
$this->dispatch(TheliaEvents::CUSTOMER_CREATEACCOUNT, $event);
$successUrl = $customerCreateForm->getSuccessUrl();
$successUrl = str_replace('_ID_', $event->getCustomer()->getId(), $successUrl);
$this->redirect($successUrl);
}catch (FormValidationException $e) {
$message = sprintf("Please check your input: %s", $e->getMessage());
} catch (PropelException $e) {
$message = $e->getMessage();
} catch (\Exception $e) {
$message = sprintf("Sorry, an error occured: %s", $e->getMessage()." ".$e->getFile());
}
if ($message !== false) {
\Thelia\Log\Tlog::getInstance()->error(sprintf("Error during customer creation process : %s.", $message));
$customerCreateForm->setErrorMessage($message);
$this->getParserContext()
->addForm($customerCreateForm)
->setGeneralError($message)
;
}
return $this->render("customers", array("display_customer" => 20));
return $this->createEventInstance($formData);
}
public function deleteAction()
protected function getUpdateEvent($formData)
{
if (null !== $response = $this->checkAuth(AdminResources::CUSTOMER, AccessManager::DELETE)) return $response;
$event = $this->createEventInstance($formData);
$message = null;
$event->setCustomer($this->getExistingObject());
try {
$customer_id = $this->getRequest()->get("customer_id");
$customer = CustomerQuery::create()->findPk($customer_id);
return $event;
}
if (null === $customer) {
throw new \InvalidArgumentException(Translator::getInstance("The customer you want to delete does not exist"));
}
protected function getDeleteEvent()
{
return new CustomerEvent($this->getExistingObject());
}
$event = new CustomerEvent($customer);
protected function eventContainsObject($event)
{
return $event->hasCustomer();
}
$this->dispatch(TheliaEvents::CUSTOMER_DELETEACCOUNT, $event);
} catch (\Exception $e) {
$message = $e->getMessage();
}
protected function hydrateObjectForm($object)
{
// Get default adress of the customer
$address = $object->getDefaultAddress();
$params = array(
"customer_page" => $this->getRequest()->get("customer_page", 1)
// Prepare the data that will hydrate the form
$data = array(
'id' => $object->getId(),
'firstname' => $object->getFirstname(),
'lastname' => $object->getLastname(),
'email' => $object->getEmail(),
'title' => $object->getTitleId(),
'company' => $address->getCompany(),
'address1' => $address->getAddress1(),
'address2' => $address->getAddress2(),
'address3' => $address->getAddress3(),
'phone' => $address->getPhone(),
'cellphone' => $address->getCellphone(),
'zipcode' => $address->getZipcode(),
'city' => $address->getCity(),
'country' => $address->getCountryId(),
);
if ($message) {
$params["delete_error_message"] = $message;
}
$this->redirectToRoute("admin.customers", $params);
// A loop is used in the template
return new CustomerUpdateForm($this->getRequest(), 'form', $data);
}
protected function getObjectFromEvent($event)
{
return $event->hasCustomer() ? $event->getCustomer() : null;
}
/**
@@ -209,26 +134,75 @@ class CustomerController extends BaseAdminController
private function createEventInstance($data)
{
$customerCreateEvent = new CustomerCreateOrUpdateEvent(
$data["title"],
$data["firstname"],
$data["lastname"],
$data["address1"],
$data["address2"],
$data["address3"],
$data["phone"],
$data["cellphone"],
$data["zipcode"],
$data["city"],
$data["country"],
isset($data["email"])?$data["email"]:null,
isset($data["password"]) ? $data["password"]:null,
$this->getRequest()->getSession()->getLang()->getId(),
isset($data["reseller"])?$data["reseller"]:null,
isset($data["sponsor"])?$data["sponsor"]:null,
isset($data["discount"])?$data["discount"]:null,
isset($data["company"])?$data["company"]:null
$data["title"],
$data["firstname"],
$data["lastname"],
$data["address1"],
$data["address2"],
$data["address3"],
$data["phone"],
$data["cellphone"],
$data["zipcode"],
$data["city"],
$data["country"],
isset($data["email"])?$data["email"]:null,
isset($data["password"]) && ! empty($data["password"]) ? $data["password"]:null,
$this->getRequest()->getSession()->getLang()->getId(),
isset($data["reseller"])?$data["reseller"]:null,
isset($data["sponsor"])?$data["sponsor"]:null,
isset($data["discount"])?$data["discount"]:null,
isset($data["company"])?$data["company"]:null
);
return $customerCreateEvent;
}
}
protected function getExistingObject()
{
return CustomerQuery::create()->findPk($this->getRequest()->get('customer_id', 0));
}
protected function getObjectLabel($object)
{
return $object->getRef() . "(".$object->getLastname()." ".$object->getFirstname().")";
}
protected function getObjectId($object)
{
return $object->getId();
}
protected function getEditionArguments()
{
return array(
'customer_id' => $this->getRequest()->get('customer_id', 0),
'page' => $this->getRequest()->get('page', 1)
);
}
protected function renderListTemplate($currentOrder)
{
return $this->render('customers', array(
'customer_order' => $currentOrder,
'display_customer' => 20,
'page' => $this->getRequest()->get('page', 1)
));
}
protected function redirectToListTemplate()
{
$this->redirectToRoute('admin.customers', array(
'page' => $this->getRequest()->get('page', 1))
);
}
protected function renderEditionTemplate()
{
return $this->render('customer-edit', $this->getEditionArguments());
}
protected function redirectToEditionTemplate()
{
$this->redirectToRoute("admin.customer.update.view", $this->getEditionArguments());
}
}