Merge branch 'master' into tax

This commit is contained in:
Etienne Roudeix
2013-09-13 14:02:39 +02:00
39 changed files with 1318 additions and 246 deletions

View File

@@ -22,10 +22,14 @@
/*************************************************************************************/
namespace Thelia\Action;
use Propel\Runtime\Exception\PropelException;
use Propel\Runtime\Propel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Thelia\Core\Event\AddressCreateOrUpdateEvent;
use Thelia\Core\Event\AddressEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Model\Address as AddressModel;
use Thelia\Model\Map\AddressTableMap;
/**
* Class Address
@@ -49,31 +53,51 @@ class Address extends BaseAction implements EventSubscriberInterface
$this->createOrUpdate($addressModel, $event);
}
public function delete(AddressEvent $event)
{
$address = $event->getAddress();
$address->delete();
}
protected function createOrUpdate(AddressModel $addressModel, AddressCreateOrUpdateEvent $event)
{
$addressModel->setDispatcher($this->getDispatcher());
$con = Propel::getWriteConnection(AddressTableMap::DATABASE_NAME);
$con->beginTransaction();
try {
if ($addressModel->isNew()) {
$addressModel->setLabel($event->getLabel());
}
if ($addressModel->isNew()) {
$addressModel->setLabel($event->getLabel());
$addressModel
->setTitleId($event->getTitle())
->setFirstname($event->getFirstname())
->setLastname($event->getLastname())
->setAddress1($event->getAddress1())
->setAddress2($event->getAddress2())
->setAddress3($event->getAddress3())
->setZipcode($event->getZipcode())
->setCity($event->getCity())
->setCountryId($event->getCountry())
->setCellphone($event->getCellphone())
->setPhone($event->getPhone())
->setCompany($event->getCompany())
->save()
;
if($event->getIsDefault()) {
$addressModel->makeItDefault();
}
$event->setAddress($addressModel);
$con->commit();
} catch(PropelException $e) {
$con->rollback();
throw $e;
}
$addressModel
->setTitleId($event->getTitle())
->setFirstname($event->getFirstname())
->setLastname($event->getLastname())
->setAddress1($event->getAddress1())
->setAddress2($event->getAddress2())
->setAddress3($event->getAddress3())
->setZipcode($event->getZipcode())
->setCity($event->getCity())
->setCountryId($event->getCountry())
->setCellphone($event->getCellphone())
->setPhone($event->getPhone())
->setCompany($event->getCompany())
->save()
;
$event->setAddress($addressModel);
}
/**
@@ -100,7 +124,8 @@ class Address extends BaseAction implements EventSubscriberInterface
{
return array(
TheliaEvents::ADDRESS_CREATE => array("create", 128),
TheliaEvents::ADDRESS_UPDATE => array("update", 128)
TheliaEvents::ADDRESS_UPDATE => array("update", 128),
TheliaEvents::ADDRESS_DELETE => array("delete", 128)
);
}
}

View File

@@ -37,6 +37,8 @@ use Thelia\Model\ConfigQuery;
use Thelia\Model\AttributeAv;
use Thelia\Model\AttributeAvQuery;
use Thelia\Core\Event\UpdatePositionEvent;
use Thelia\Core\Event\CategoryEvent;
use Thelia\Core\Event\AttributeEvent;
class Attribute extends BaseAction implements EventSubscriberInterface
{
@@ -133,6 +135,24 @@ class Attribute extends BaseAction implements EventSubscriberInterface
}
}
public function addToAllTemplates(AttributeEvent $event)
{
$templates = ProductTemplateAttributeQuery::create()->find();
foreach($templates as $template) {
$pat = new ProductTemplateAttribute();
$pat->setTemplate($template->getId())
->setAttributeId($event->getAttribute()->getId())
->save();
}
}
public function removeFromAllTemplates(AttributeEvent $event)
{
// Delete this attribute from all product templates
ProductTemplateAttributeQuery::create()->filterByAttributeId($event->getAttribute()->getId())->delete();
}
/**
* {@inheritDoc}
@@ -144,6 +164,10 @@ class Attribute extends BaseAction implements EventSubscriberInterface
TheliaEvents::ATTRIBUTE_UPDATE => array("update", 128),
TheliaEvents::ATTRIBUTE_DELETE => array("delete", 128),
TheliaEvents::ATTRIBUTE_UPDATE_POSITION => array("updatePosition", 128),
TheliaEvents::ATTRIBUTE_REMOVE_FROM_ALL_TEMPLATES => array("removeFromAllTemplates", 128),
TheliaEvents::ATTRIBUTE_ADD_TO_ALL_TEMPLATES => array("addToAllTemplates", 128),
);
}
}

View File

@@ -236,6 +236,14 @@
<default key="_controller">Thelia\Controller\Admin\AttributeController::updatePositionAction</default>
</route>
<route id="admin.configuration.attributes.rem-from-all" path="/admin/configuration/attributes/remove-from-all-templates">
<default key="_controller">Thelia\Controller\Admin\AttributeController::removeFromAllTemplates</default>
</route>
<route id="admin.configuration.attributes.add-to-all" path="/admin/configuration/attributes/add-to-all-templates">
<default key="_controller">Thelia\Controller\Admin\AttributeController::addToAllTemplates</default>
</route>
<route id="admin.configuration.attributes-av.create" path="/admin/configuration/attributes-av/create">
<default key="_controller">Thelia\Controller\Admin\AttributeAvController::createAction</default>

View File

@@ -59,18 +59,29 @@
<!-- end customer routes -->
<!-- customer address routes -->
<route id="address.create" path="/address/create" >
<route id="address.create.view" path="/address/create" methods="get">
<default key="_controller">Thelia\Controller\Front\DefaultController::noAction</default>
<default key="_view">address</default>
</route>
<route id="address.create" path="/address/create" methods="post" >
<default key="_controller">Thelia\Controller\Front\AddressController::createAction</default>
<default key="_view">address</default>
</route>
<route id="address.edit" path="/address/edit/{address_id}">
<default key="_controller">Thelia\Controller\Front\DefaultController::noAction</default>
<default key="_view">address-edit</default>
<route id="address.edit" path="/address/update/{address_id}" methods="get">
<default key="_controller">Thelia\Controller\Front\AddressController::updateViewAction</default>
<default key="_view">address-update</default>
</route>
<route id="address.update" path="/address/update" >
<default key="_controller">Thelia\Controller\Front\AddressController::updateAction</default>
<route id="address.update" path="/address/update/{address_id}" methods="post" >
<default key="_controller">Thelia\Controller\Front\AddressController::processUpdateAction</default>
<default key="_view">address-update</default>
</route>
<route id="address.delete" path="/address/delete/{address_id}">
<default key="_controller">Thelia\Controller\Front\AddressController::deleteAction</default>
<default key="_view">account</default>
</route>
<route id="address.generateModal" path="/address/modal/{address_id}" methods="get">

View File

@@ -38,6 +38,7 @@ abstract class AbstractCrudController extends BaseAdminController
// List ordering
protected $defaultListOrder;
protected $orderRequestParameterName;
// Permissions
protected $viewPermissionIdentifier;
@@ -74,6 +75,7 @@ abstract class AbstractCrudController extends BaseAdminController
$objectName,
$defaultListOrder = null,
$orderRequestParameterName = null,
$viewPermissionIdentifier,
$createPermissionIdentifier,
@@ -89,8 +91,9 @@ abstract class AbstractCrudController extends BaseAdminController
$this->objectName = $objectName;
$this->defaultListOrder = $defaultListOrder;
$this->orderRequestParameterName = $orderRequestParameterName;
$this->viewPermissionIdentifier = $viewPermissionIdentifier;
$this->viewPermissionIdentifier = $viewPermissionIdentifier;
$this->createPermissionIdentifier = $createPermissionIdentifier;
$this->updatePermissionIdentifier = $updatePermissionIdentifier;
$this->deletePermissionIdentifier = $deletePermissionIdentifier;
@@ -194,36 +197,56 @@ abstract class AbstractCrudController extends BaseAdminController
protected abstract function redirectToListTemplate();
protected function createUpdatePositionEvent($positionChangeMode, $positionValue) {
protected function createUpdatePositionEvent($positionChangeMode, $positionValue)
{
throw new \LogicException ("Position Update is not supported for this object");
}
protected function createToggleVisibilityEvent() {
protected function createToggleVisibilityEvent()
{
throw new \LogicException ("Toggle Visibility is not supported for this object");
}
/**
* Put in this method post object creation processing if required.
*
* @param unknown $createdObject the created object
*/
protected function performAdditionalCreateAction($createdObject)
{
// Nothing to do
}
/**
* Put in this method post object update processing if required.
*
* @param unknown $updatedObject the updated object
*/
protected function performAdditionalUpdateAction($updatedObject)
{
// Nothing to do
}
/**
* Put in this method post object delete processing if required.
*
* @param unknown $deletedObject the deleted object
*/
protected function performAdditionalDeleteAction($deletedObject)
{
// Nothing to do
}
/**
* Return the current list order identifier, updating it in the same time.
*/
protected function getCurrentListOrder($update_session = true) {
$order = null;
if ($this->defaultListOrder) {
$orderSessionIdentifier = sprintf("admin.%s.currentListOrder", $this->objectName);
// Find the current order
$order = $this->getRequest()->get(
'order',
$this->getSession()->get($orderSessionIdentifier, $this->defaultListOrder)
);
if ($update_session) $this->getSession()->set($orderSessionIdentifier, $order);
}
return $order;
protected function getCurrentListOrder($update_session = true)
{
return $this->getListOrderFromSession(
$this->objectName,
$this->orderRequestParameterName,
$this->defaultListOrder
);
}
/**
@@ -283,6 +306,8 @@ abstract class AbstractCrudController extends BaseAdminController
$this->adminLogAppend(sprintf("%s %s (ID %s) created", ucfirst($this->objectName), $this->getObjectLabel($createdObject), $this->getObjectId($createdObject)));
}
$this->performAdditionalCreateAction($createdObject);
// Substitute _ID_ in the URL with the ID of the created object
$successUrl = str_replace('_ID_', $this->getObjectId($createdObject), $creationForm->getSuccessUrl());
@@ -317,7 +342,7 @@ abstract class AbstractCrudController extends BaseAdminController
if (null !== $response = $this->checkAuth($this->updatePermissionIdentifier)) return $response;
// Load the object
$object = $this->getExistingObject($this->getRequest());
$object = $this->getExistingObject();
if ($object != null) {
@@ -368,6 +393,8 @@ abstract class AbstractCrudController extends BaseAdminController
$this->adminLogAppend(sprintf("%s %s (ID %s) modified", ucfirst($this->objectName), $this->getObjectLabel($changedObject), $this->getObjectId($changedObject)));
}
$this->performAdditionalUpdateAction($changedObject);
// If we have to stay on the same page, do not redirect to the succesUrl,
// just redirect to the edit page again.
if ($this->getRequest()->get('save_mode') == 'stay') {
@@ -467,6 +494,7 @@ abstract class AbstractCrudController extends BaseAdminController
$this->adminLogAppend(
sprintf("%s %s (ID %s) deleted", ucfirst($this->objectName), $this->getObjectLabel($deletedObject), $this->getObjectId($deletedObject)));
}
$this->performAdditionalDeleteAction($deletedObject);
$this->redirectToListTemplate();
}

View File

@@ -39,10 +39,12 @@ use Thelia\Core\Event\UpdatePositionEvent;
*/
class AttributeAvController extends AbstractCrudController
{
public function __construct() {
public function __construct()
{
parent::__construct(
'attribute',
'attributeav',
'manual',
'order',
'admin.configuration.attributes-av.view',
'admin.configuration.attributes-av.create',
@@ -57,15 +59,18 @@ class AttributeAvController extends AbstractCrudController
);
}
protected function getCreationForm() {
protected function getCreationForm()
{
return new AttributeAvCreationForm($this->getRequest());
}
protected function getUpdateForm() {
protected function getUpdateForm()
{
return new AttributeAvModificationForm($this->getRequest());
}
protected function getCreationEvent($formData) {
protected function getCreationEvent($formData)
{
$createEvent = new AttributeAvCreateEvent();
$createEvent
@@ -77,8 +82,8 @@ class AttributeAvController extends AbstractCrudController
return $createEvent;
}
protected function getUpdateEvent($formData) {
protected function getUpdateEvent($formData)
{
$changeEvent = new AttributeAvUpdateEvent($formData['id']);
// Create and dispatch the change event
@@ -93,8 +98,8 @@ class AttributeAvController extends AbstractCrudController
return $changeEvent;
}
protected function createUpdatePositionEvent($positionChangeMode, $positionValue) {
protected function createUpdatePositionEvent($positionChangeMode, $positionValue)
{
return new UpdatePositionEvent(
$this->getRequest()->get('attributeav_id', null),
$positionChangeMode,
@@ -102,16 +107,18 @@ class AttributeAvController extends AbstractCrudController
);
}
protected function getDeleteEvent() {
protected function getDeleteEvent()
{
return new AttributeAvDeleteEvent($this->getRequest()->get('attributeav_id'));
}
protected function eventContainsObject($event) {
protected function eventContainsObject($event)
{
return $event->hasAttributeAv();
}
protected function hydrateObjectForm($object) {
protected function hydrateObjectForm($object)
{
$data = array(
'id' => $object->getId(),
'locale' => $object->getLocale(),
@@ -125,32 +132,38 @@ class AttributeAvController extends AbstractCrudController
return new AttributeAvModificationForm($this->getRequest(), "form", $data);
}
protected function getObjectFromEvent($event) {
protected function getObjectFromEvent($event)
{
return $event->hasAttributeAv() ? $event->getAttributeAv() : null;
}
protected function getExistingObject() {
protected function getExistingObject()
{
return AttributeAvQuery::create()
->joinWithI18n($this->getCurrentEditionLocale())
->findOneById($this->getRequest()->get('attributeav_id'));
}
protected function getObjectLabel($object) {
protected function getObjectLabel($object)
{
return $object->getTitle();
}
protected function getObjectId($object) {
protected function getObjectId($object)
{
return $object->getId();
}
protected function getViewArguments() {
protected function getViewArguments()
{
return array(
'attribute_id' => $this->getRequest()->get('attribute_id'),
'order' => $this->getCurrentListOrder()
);
}
protected function renderListTemplate($currentOrder) {
protected function renderListTemplate($currentOrder)
{
// We always return to the attribute edition form
return $this->render(
'attribute-edit',
@@ -158,12 +171,14 @@ class AttributeAvController extends AbstractCrudController
);
}
protected function renderEditionTemplate() {
protected function renderEditionTemplate()
{
// We always return to the attribute edition form
return $this->render('attribute-edit', $this->getViewArguments());
}
protected function redirectToEditionTemplate() {
protected function redirectToEditionTemplate()
{
// We always return to the attribute edition form
$this->redirectToRoute(
"admin.configuration.attributes.update",
@@ -171,7 +186,8 @@ class AttributeAvController extends AbstractCrudController
);
}
protected function redirectToListTemplate() {
protected function redirectToListTemplate()
{
$this->redirectToRoute(
"admin.configuration.attributes.update",
$this->getViewArguments()

View File

@@ -31,6 +31,10 @@ use Thelia\Model\AttributeQuery;
use Thelia\Form\AttributeModificationForm;
use Thelia\Form\AttributeCreationForm;
use Thelia\Core\Event\UpdatePositionEvent;
use Thelia\Model\AttributeAv;
use Thelia\Model\AttributeAvQuery;
use Thelia\Core\Event\AttributeAvUpdateEvent;
use Thelia\Core\Event\AttributeEvent;
/**
* Manages attributes sent by mail
@@ -39,10 +43,12 @@ use Thelia\Core\Event\UpdatePositionEvent;
*/
class AttributeController extends AbstractCrudController
{
public function __construct() {
public function __construct()
{
parent::__construct(
'attribute',
'manual',
'order',
'admin.configuration.attributes.view',
'admin.configuration.attributes.create',
@@ -57,15 +63,18 @@ class AttributeController extends AbstractCrudController
);
}
protected function getCreationForm() {
protected function getCreationForm()
{
return new AttributeCreationForm($this->getRequest());
}
protected function getUpdateForm() {
protected function getUpdateForm()
{
return new AttributeModificationForm($this->getRequest());
}
protected function getCreationEvent($formData) {
protected function getCreationEvent($formData)
{
$createEvent = new AttributeCreateEvent();
$createEvent
@@ -77,8 +86,8 @@ class AttributeController extends AbstractCrudController
return $createEvent;
}
protected function getUpdateEvent($formData) {
protected function getUpdateEvent($formData)
{
$changeEvent = new AttributeUpdateEvent($formData['id']);
// Create and dispatch the change event
@@ -93,8 +102,31 @@ class AttributeController extends AbstractCrudController
return $changeEvent;
}
protected function createUpdatePositionEvent($positionChangeMode, $positionValue) {
/**
* Process the attributes values (fix it in future version to integrate it in the attribute form as a collection)
*
* @see \Thelia\Controller\Admin\AbstractCrudController::performAdditionalUpdateAction()
*/
protected function performAdditionalUpdateAction($updatedObject)
{
$attr_values = $this->getRequest()->get('attribute_values', null);
if ($attr_values !== null) {
foreach($attr_values as $id => $value) {
$event = new AttributeAvUpdateEvent($id);
$event->setTitle($value);
$event->setLocale($this->getCurrentEditionLocale());
$this->dispatch(TheliaEvents::ATTRIBUTE_AV_UPDATE, $event);
}
}
}
protected function createUpdatePositionEvent($positionChangeMode, $positionValue)
{
return new UpdatePositionEvent(
$this->getRequest()->get('attribute_id', null),
$positionChangeMode,
@@ -102,15 +134,18 @@ class AttributeController extends AbstractCrudController
);
}
protected function getDeleteEvent() {
protected function getDeleteEvent()
{
return new AttributeDeleteEvent($this->getRequest()->get('attribute_id'));
}
protected function eventContainsObject($event) {
protected function eventContainsObject($event)
{
return $event->hasAttribute();
}
protected function hydrateObjectForm($object) {
protected function hydrateObjectForm($object)
{
$data = array(
'id' => $object->getId(),
@@ -121,44 +156,132 @@ class AttributeController extends AbstractCrudController
'postscriptum' => $object->getPostscriptum()
);
// Setup attributes values
/*
* FIXME : doesn't work. "We get a This form should not contain extra fields." error
$attr_av_list = AttributeAvQuery::create()
->joinWithI18n($this->getCurrentEditionLocale())
->filterByAttributeId($object->getId())
->find();
$attr_array = array();
foreach($attr_av_list as $attr_av) {
$attr_array[$attr_av->getId()] = $attr_av->getTitle();
}
$data['attribute_values'] = $attr_array;
*/
// Setup the object form
return new AttributeModificationForm($this->getRequest(), "form", $data);
}
protected function getObjectFromEvent($event) {
protected function getObjectFromEvent($event)
{
return $event->hasAttribute() ? $event->getAttribute() : null;
}
protected function getExistingObject() {
protected function getExistingObject()
{
return AttributeQuery::create()
->joinWithI18n($this->getCurrentEditionLocale())
->findOneById($this->getRequest()->get('attribute_id'));
}
protected function getObjectLabel($object) {
protected function getObjectLabel($object)
{
return $object->getTitle();
}
protected function getObjectId($object) {
protected function getObjectId($object)
{
return $object->getId();
}
protected function renderListTemplate($currentOrder) {
protected function renderListTemplate($currentOrder)
{
return $this->render('attributes', array('order' => $currentOrder));
}
protected function renderEditionTemplate() {
return $this->render('attribute-edit', array('attribute_id' => $this->getRequest()->get('attribute_id')));
}
protected function redirectToEditionTemplate() {
$this->redirectToRoute(
"admin.configuration.attributes.update",
array('attribute_id' => $this->getRequest()->get('attribute_id'))
protected function renderEditionTemplate()
{
return $this->render(
'attribute-edit',
array(
'attribute_id' => $this->getRequest()->get('attribute_id'),
'attributeav_order' => $this->getAttributeAvListOrder()
)
);
}
protected function redirectToListTemplate() {
protected function redirectToEditionTemplate()
{
$this->redirectToRoute(
"admin.configuration.attributes.update",
array(
'attribute_id' => $this->getRequest()->get('attribute_id'),
'attributeav_order' => $this->getAttributeAvListOrder()
)
);
}
protected function redirectToListTemplate()
{
$this->redirectToRoute('admin.configuration.attributes.default');
}
/**
* Get the Attribute value list order.
*
* @return string the current list order
*/
protected function getAttributeAvListOrder()
{
return $this->getListOrderFromSession(
'attributeav',
'attributeav_order',
'manual'
);
}
/**
* Add or Remove from all product templates
*/
protected function addRemoveFromAllTemplates($eventType)
{
// Check current user authorization
if (null !== $response = $this->checkAuth("admin.configuration.attributes.update")) return $response;
try {
if (null !== $object = $this->getExistingObject()) {
$event = new AttributeEvent($object);
$this->dispatch($eventType, $event);
}
}
catch (\Exception $ex) {
// Any error
return $this->errorPage($ex);
}
$this->redirectToListTemplate();
}
/**
* Remove from all product templates
*/
public function removeFromAllTemplates()
{
return $this->addRemoveFromAllTemplates(TheliaEvents::ATTRIBUTE_REMOVE_FROM_ALL_TEMPLATES);
}
/**
* Add to all product templates
*/
public function addToAllTemplates()
{
return $this->addRemoveFromAllTemplates(TheliaEvents::ATTRIBUTE_ADD_TO_ALL_TEMPLATES);
}
}

View File

@@ -97,7 +97,7 @@ class BaseAdminController extends BaseController
protected function errorPage($message)
{
if ($message instanceof \Exception) {
$message = sprintf($this->getTranslator()->trans("Sorry, an error occured: %msg"), array('msg' => $message->getMessage()));
$message = $this->getTranslator()->trans("Sorry, an error occured: %msg", array('%msg' => $message->getMessage()));
}
return $this->render('general_error', array(
@@ -273,6 +273,35 @@ class BaseAdminController extends BaseController
return $this->getCurrentEditionLang()->getLocale();
}
/**
* Return the current list order identifier for a given object name,
* updating in using the current request.
*
* @param unknown $objectName the object name (e.g. 'attribute', 'message')
* @param unknown $requestParameterName the name of the request parameter that defines the list order
* @param unknown $defaultListOrder the default order to use, if none is defined
* @param string $updateSession if true, the session will be updated with the current order.
*
* @return String the current liste order.
*/
protected function getListOrderFromSession($objectName, $requestParameterName, $defaultListOrder, $updateSession = true) {
$order = $defaultListOrder;
$orderSessionIdentifier = sprintf("admin.%s.currentListOrder", $objectName);
// Find the current order
$order = $this->getRequest()->get(
$requestParameterName,
$this->getSession()->get($orderSessionIdentifier, $defaultListOrder)
);
if ($updateSession) $this->getSession()->set($orderSessionIdentifier, $order);
return $order;
}
/**
* Render the given template, and returns the result as an Http Response.
*
@@ -314,7 +343,7 @@ class BaseAdminController extends BaseController
'edit_language_id' => $edition_language->getId(),
'edit_language_locale' => $edition_language->getLocale(),
'current_url' => htmlspecialchars($this->getRequest()->getUri())
'current_url' => $this->getRequest()->getUri()
));
// Update the current edition language in session

View File

@@ -43,6 +43,7 @@ class ConfigController extends AbstractCrudController
parent::__construct(
'variable',
'name',
'order',
'admin.configuration.variables.view',
'admin.configuration.variables.create',

View File

@@ -43,6 +43,7 @@ class CurrencyController extends AbstractCrudController
parent::__construct(
'currency',
'manual',
'order',
'admin.configuration.currencies.view',
'admin.configuration.currencies.create',

View File

@@ -37,10 +37,12 @@ use Thelia\Form\MessageCreationForm;
*/
class MessageController extends AbstractCrudController
{
public function __construct() {
public function __construct()
{
parent::__construct(
'message',
null,
null, // no sort order change
null, // no sort order change
'admin.configuration.messages.view',
'admin.configuration.messages.create',
@@ -55,15 +57,18 @@ class MessageController extends AbstractCrudController
);
}
protected function getCreationForm() {
protected function getCreationForm()
{
return new MessageCreationForm($this->getRequest());
}
protected function getUpdateForm() {
protected function getUpdateForm()
{
return new MessageModificationForm($this->getRequest());
}
protected function getCreationEvent($formData) {
protected function getCreationEvent($formData)
{
$createEvent = new MessageCreateEvent();
$createEvent
@@ -76,7 +81,8 @@ class MessageController extends AbstractCrudController
return $createEvent;
}
protected function getUpdateEvent($formData) {
protected function getUpdateEvent($formData)
{
$changeEvent = new MessageUpdateEvent($formData['id']);
// Create and dispatch the change event
@@ -93,16 +99,18 @@ class MessageController extends AbstractCrudController
return $changeEvent;
}
protected function getDeleteEvent() {
protected function getDeleteEvent()
{
return new MessageDeleteEvent($this->getRequest()->get('message_id'));
}
protected function eventContainsObject($event) {
protected function eventContainsObject($event)
{
return $event->hasMessage();
}
protected function hydrateObjectForm($object) {
protected function hydrateObjectForm($object)
{
// Prepare the data that will hydrate the form
$data = array(
'id' => $object->getId(),
@@ -119,40 +127,48 @@ class MessageController extends AbstractCrudController
return new MessageModificationForm($this->getRequest(), "form", $data);
}
protected function getObjectFromEvent($event) {
protected function getObjectFromEvent($event)
{
return $event->hasMessage() ? $event->getMessage() : null;
}
protected function getExistingObject() {
protected function getExistingObject()
{
return MessageQuery::create()
->joinWithI18n($this->getCurrentEditionLocale())
->findOneById($this->getRequest()->get('message_id'));
}
protected function getObjectLabel($object) {
protected function getObjectLabel($object)
{
return $object->getName();
}
protected function getObjectId($object) {
protected function getObjectId($object)
{
return $object->getId();
}
protected function renderListTemplate($currentOrder) {
protected function renderListTemplate($currentOrder)
{
return $this->render('messages');
}
protected function renderEditionTemplate() {
protected function renderEditionTemplate()
{
return $this->render('message-edit', array('message_id' => $this->getRequest()->get('message_id')));
}
protected function redirectToEditionTemplate() {
protected function redirectToEditionTemplate()
{
$this->redirectToRoute(
"admin.configuration.messages.update",
array('message_id' => $this->getRequest()->get('message_id'))
);
}
protected function redirectToListTemplate() {
protected function redirectToListTemplate()
{
$this->redirectToRoute('admin.configuration.messages.default');
}
}

View File

@@ -23,11 +23,12 @@
namespace Thelia\Controller\Front;
use Thelia\Core\Event\AddressCreateOrUpdateEvent;
use Thelia\Core\Event\AddressEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Form\AddressCreateForm;
use Thelia\Form\AddressUpdateForm;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Model\Base\AddressQuery;
use Thelia\Model\AddressQuery;
use Thelia\Model\Customer;
use Thelia\Tools\URL;
@@ -46,14 +47,13 @@ class AddressController extends BaseFrontController
*/
public function generateModalAction($address_id)
{
if ($this->getSecurityContext()->hasCustomerUser() === false) {
$this->accessDenied();
}
$this->checkAuth();
$this->checkXmlHttpRequest();
}
/**
* Create controller.
* Check if customer is logged in
@@ -62,9 +62,7 @@ class AddressController extends BaseFrontController
*/
public function createAction()
{
if ($this->getSecurityContext()->hasCustomerUser() === false) {
$this->accessDenied()
}
$this->checkAuth();
$addressCreate = new AddressCreateForm($this->getRequest());
@@ -96,20 +94,28 @@ class AddressController extends BaseFrontController
}
}
public function updateAction()
public function updateViewAction($address_id)
{
$this->checkAuth();
$customer = $this->getSecurityContext()->getCustomerUser();
$address = AddressQuery::create()->findPk($address_id);
if(!$address || $customer->getId() != $address->getCustomerId()) {
$this->redirectToRoute("home");
}
$this->getParserContext()->set("address_id", $address_id);
}
public function processUpdateAction($address_id)
{
$this->checkAuth();
$request = $this->getRequest();
if ($this->getSecurityContext()->hasCustomerUser() === false) {
$this->redirectToRoute("home");
}
if (null === $address_id = $request->get("address_id")) {
$this->redirectToRoute("home");
}
$addressUpdate = new AddressUpdateForm($request);
try {
$customer = $this->getSecurityContext()->getCustomerUser();
@@ -136,7 +142,7 @@ class AddressController extends BaseFrontController
} catch (\Exception $e) {
$message = sprintf("Sorry, an error occured: %s", $e->getMessage());
}
$this->getParserContext()->set("address_id", $address_id);
if ($message !== false) {
\Thelia\Log\Tlog::getInstance()->error(sprintf("Error during address creation process : %s", $message));
@@ -149,6 +155,22 @@ class AddressController extends BaseFrontController
}
}
public function deleteAction($address_id)
{
$this->checkAuth();
$customer = $this->getSecurityContext()->getCustomerUser();
$address = AddressQuery::create()->findPk($address_id);
if(!$address || $customer->getId() != $address->getCustomerId()) {
$this->redirectToRoute("home");
}
$this->dispatch(TheliaEvents::ADDRESS_DELETE, new AddressEvent($address));
$this->redirectToRoute("customer.account.view");
}
protected function createAddressEvent($form)
{
return new AddressCreateOrUpdateEvent(
@@ -164,7 +186,8 @@ class AddressController extends BaseFrontController
$form->get("country")->getData(),
$form->get("cellphone")->getData(),
$form->get("phone")->getData(),
$form->get("company")->getData()
$form->get("company")->getData(),
$form->get("is_default")->getData()
);
}
}

View File

@@ -50,4 +50,11 @@ class BaseFrontController extends BaseController
{
$this->redirect(URL::getInstance()->absoluteUrl($this->getRoute($routeId, array(), $referenceType), $urlParameters));
}
public function checkAuth()
{
if($this->getSecurityContext()->hasCustomerUser() === false) {
$this->redirectToRoute("customer.login.view");
}
}
}

View File

@@ -108,7 +108,12 @@ class AddressCreateOrUpdateEvent extends ActionEvent
*/
protected $address;
public function __construct($label, $title, $firstname, $lastname, $address1, $address2, $address3, $zipcode, $city, $country, $cellphone, $phone, $company)
/**
* @var int
*/
protected $isDefault;
public function __construct($label, $title, $firstname, $lastname, $address1, $address2, $address3, $zipcode, $city, $country, $cellphone, $phone, $company, $isDefault = 0)
{
$this->address1 = $address1;
$this->address2 = $address2;
@@ -123,6 +128,7 @@ class AddressCreateOrUpdateEvent extends ActionEvent
$this->phone = $phone;
$this->title = $title;
$this->zipcode = $zipcode;
$this->isDefault = $isDefault;
}
/**
@@ -229,6 +235,16 @@ class AddressCreateOrUpdateEvent extends ActionEvent
return $this->zipcode;
}
/**
* @return int
*/
public function getIsDefault()
{
return $this->isDefault;
}
/**
* @param \Thelia\Model\Customer $customer
*/

View File

@@ -129,6 +129,11 @@ final class TheliaEvents
*/
const ADDRESS_UPDATE = "action.updateAddress";
/**
* sent on address removal
*/
const ADDRESS_DELETE = "action.deleteAddress";
const BEFORE_CREATEADDRESS = "action.before_createAddress";
const AFTER_CREATEADDRESS = "action.after_createAddress";
@@ -369,6 +374,9 @@ final class TheliaEvents
const ATTRIBUTE_DELETE = "action.deleteAttribute";
const ATTRIBUTE_UPDATE_POSITION = "action.updateAttributePosition";
const ATTRIBUTE_REMOVE_FROM_ALL_TEMPLATES = "action.addAttributeToAllTemplate";
const ATTRIBUTE_ADD_TO_ALL_TEMPLATES = "action.removeAttributeFromAllTemplate";
const BEFORE_CREATEATTRIBUTE = "action.before_createAttribute";
const AFTER_CREATEATTRIBUTE = "action.after_createAttribute";

View File

@@ -0,0 +1,46 @@
<?php
/*************************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/*************************************************************************************/
namespace Thelia\Core\HttpKernel\Exceptions;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException as BaseNotFountHttpException;
/**
* Class NotFountHttpException
* @author Manuel Raynaud <mraynaud@openstudio.fr>
*/
class NotFountHttpException extends BaseNotFountHttpException {
protected $adminContext = false;
public function __construct($message = null, \Exception $previous = null, $code = 0, $adminContext = false)
{
$this->adminContext = $adminContext;
parent::__construct($message, $previous, $code);
}
public function isAdminContext()
{
return $this->adminContext === true;
}
}

View File

@@ -59,7 +59,7 @@ class AttributeAvailability extends BaseI18nLoop
new Argument(
'order',
new TypeCollection(
new Type\EnumListType(array('alpha', 'alpha_reverse', 'manual', 'manual_reverse'))
new Type\EnumListType(array('id', 'id_reverse', 'alpha', 'alpha_reverse', 'manual', 'manual_reverse'))
),
'manual'
)
@@ -100,6 +100,12 @@ class AttributeAvailability extends BaseI18nLoop
foreach ($orders as $order) {
switch ($order) {
case 'id':
$search->orderById(Criteria::ASC);
break;
case 'id_reverse':
$search->orderById(Criteria::DESC);
break;
case "alpha":
$search->addAscendingOrderByColumn('i18n_TITLE');
break;

View File

@@ -106,6 +106,9 @@ class AdminUtilities extends AbstractSmartyPlugin
// The column label
$label = $this->getParam($params, 'label');
// The request parameter
$request_parameter_name = $this->getParam($params, 'request_parameter_name', 'order');
if ($current_order == $order) {
$icon = 'up';
$order_change = $reverse_order;
@@ -121,7 +124,7 @@ class AdminUtilities extends AbstractSmartyPlugin
else
$output = '';
return sprintf('%s<a href="%s">%s</a>', $output, URL::getInstance()->absoluteUrl($path, array('order' => $order_change)), $label);
return sprintf('%s<a href="%s">%s</a>', $output, URL::getInstance()->absoluteUrl($path, array($request_parameter_name => $order_change)), $label);
}
/**

View File

@@ -112,6 +112,37 @@ class Form extends AbstractSmartyPlugin
}
}
protected function assignFieldValues($template, $fieldName, $fieldValue, $fieldVars)
{
$template->assign("name", $fieldName);
$template->assign("value", $fieldValue);
// If Checkbox input type
if ($fieldVars['checked'] !== null) {
$this->renderFormFieldCheckBox($template, $formFieldView['checked']);
}
$template->assign("label", $fieldVars["label"]);
$template->assign("label_attr", $fieldVars["label_attr"]);
$errors = $fieldVars["errors"];
$template->assign("error", empty($errors) ? false : true);
if (! empty($errors)) {
$this->assignFieldErrorVars($template, $errors);
}
$attr = array();
foreach ($fieldVars["attr"] as $key => $value) {
$attr[] = sprintf('%s="%s"', $key, $value);
}
$template->assign("attr", implode(" ", $attr));
}
public function renderFormField($params, $content, \Smarty_Internal_Template $template, &$repeat)
{
if ($repeat) {
@@ -120,32 +151,29 @@ class Form extends AbstractSmartyPlugin
$template->assign("options", $formFieldView->vars);
$template->assign("name", $formFieldView->vars["full_name"]);
$template->assign("value", $formFieldView->vars["value"]);
$value = $formFieldView->vars["value"];
/* FIXME: doesnt work. We got "This form should not contain extra fields." error.
// We have a collection
if (is_array($value)) {
// If Checkbox input type
if ($formFieldView->vars['checked'] !== null) {
$this->renderFormFieldCheckBox($template, $formFieldView);
$key = $this->getParam($params, 'value_key');
if ($key != null) {
if (isset($value[$key])) {
$name = sprintf("%s[%s]", $formFieldView->vars["full_name"], $key);
$val = $value[$key];
$this->assignFieldValues($template, $name, $val, $formFieldView->vars);
}
}
}
$template->assign("label", $formFieldView->vars["label"]);
$template->assign("label_attr", $formFieldView->vars["label_attr"]);
$errors = $formFieldView->vars["errors"];
$template->assign("error", empty($errors) ? false : true);
if (! empty($errors)) {
$this->assignFieldErrorVars($template, $errors);
else {
$this->assignFieldValues($template, $formFieldView->vars["full_name"], $fieldVars["value"], $formFieldView->vars);
}
$attr = array();
foreach ($formFieldView->vars["attr"] as $key => $value) {
$attr[] = sprintf('%s="%s"', $key, $value);
}
$template->assign("attr", implode(" ", $attr));
*/
$this->assignFieldValues($template, $formFieldView->vars["full_name"], $formFieldView->vars["value"], $formFieldView->vars);
$formFieldView->setRendered();
} else {
@@ -275,12 +303,12 @@ class Form extends AbstractSmartyPlugin
* @param \Smarty_Internal_Template $template
* @param $formFieldView
*/
public function renderFormFieldCheckBox(\Smarty_Internal_Template $template, $formFieldView)
public function renderFormFieldCheckBox(\Smarty_Internal_Template $template, $isChecked)
{
$template->assign("value", 0);
if ($formFieldView->vars['checked']) {
if ($isChecked) {
$template->assign("value", 1);
}
$template->assign("value", $formFieldView->vars['checked']);
$template->assign("value", $isChecked);
}
}

View File

@@ -54,6 +54,7 @@ class UrlGenerator extends AbstractSmartyPlugin
$url = URL::getInstance()->absoluteUrl($path, $this->getArgsFromParam($params, array('path', 'target')));
if ($target != null) $url .= '#'.$target;
return $url;
}

View File

@@ -60,7 +60,7 @@ class AddressCreateForm extends BaseForm
"constraints" => array(
new NotBlank()
),
"label" => Translator::getInstance()->trans("Address label *"),
"label" => Translator::getInstance()->trans("Address label"),
"label_attr" => array(
"for" => "label_create"
),
@@ -154,11 +154,17 @@ class AddressCreateForm extends BaseForm
)
))
->add("company", "text", array(
"label" => Translator::getInstance()->trans("Compagny"),
"label" => Translator::getInstance()->trans("Company"),
"label_attr" => array(
"for" => "company_create"
)
))
->add("is_default", "integer", array(
"label" => Translator::getInstance()->trans("Make this address has my primary address"),
"label_attr" => array(
"for" => "default_address"
)
))
;
}

View File

@@ -43,10 +43,12 @@ class AttributeModificationForm extends AttributeCreationForm
)
)
))
/* FIXME: doesn't work
->add('attribute_values', 'collection', array(
'type' => 'text',
'options' => array('required' => false)
))
*/
;
// Add standard description fields

View File

@@ -7,10 +7,24 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Thelia\Core\Event\AddressEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Model\Base\Address as BaseAddress;
use Thelia\Model\AddressQuery;
class Address extends BaseAddress {
use \Thelia\Model\Tools\ModelEventDispatcherTrait;
/**
* put the the current address as default one
*/
public function makeItDefault()
{
AddressQuery::create()->filterByCustomerId($this->getCustomerId())
->update(array('IsDefault' => '0'));
$this->setIsDefault(1);
$this->save();
}
/**
* Code to be run before inserting to database
* @param ConnectionInterface $con
@@ -58,6 +72,10 @@ class Address extends BaseAddress {
*/
public function preDelete(ConnectionInterface $con = null)
{
if($this->getIsDefault()) {
return false;
}
$this->dispatchEvent(TheliaEvents::BEFORE_DELETEADDRESS, new AddressEvent($this));
return true;
}
@@ -71,14 +89,4 @@ class Address extends BaseAddress {
$this->dispatchEvent(TheliaEvents::AFTER_DELETEADDRESS, new AddressEvent($this));
}
public function preSave()
{
$valid = true;
if($this->getIsDefault()) {
$valid = false;
}
return $valid;
}
}

View File

@@ -86,6 +86,8 @@ class CustomerTest extends \PHPUnit_Framework_TestCase
$addressCreated = $customerCreated->getDefaultAddress();
$this->assertInstanceOf("Thelia\Model\Address", $addressCreated);
$this->assertEquals($customerCreateEvent->getFirstname(), $addressCreated->getFirstname());
$this->assertEquals($customerCreateEvent->getLastname(), $addressCreated->getLastname());
$this->assertEquals($customerCreateEvent->getTitle(), $addressCreated->getTitleId());

View File

@@ -140,6 +140,10 @@ class URL
if (! is_null($parameters)) {
foreach ($parameters as $name => $value) {
// Remove this parameter from base URL to prevent duplicate parameters
$base = preg_replace('/([?&])'.$name.'=([^&])*(&|$)/', '$1', $base);
$queryString .= sprintf("%s=%s&", urlencode($name), urlencode($value));
}
}