diff --git a/core/lib/Thelia/Action/BaseAction.php b/core/lib/Thelia/Action/BaseAction.php index e1edab07d..1f04e12f6 100755 --- a/core/lib/Thelia/Action/BaseAction.php +++ b/core/lib/Thelia/Action/BaseAction.php @@ -23,9 +23,14 @@ namespace Thelia\Action; use Symfony\Component\DependencyInjection\ContainerInterface; -use Thelia\Model\AdminLog; use Propel\Runtime\ActiveQuery\ModelCriteria; + use Thelia\Core\Event\UpdatePositionEvent; +use Thelia\Core\Event\UpdateSeoEvent; + +use Thelia\Exception\UrlRewritingException; +use Thelia\Form\Exception\FormValidationException; +use \Thelia\Model\Tools\UrlRewritingTrait; class BaseAction { @@ -73,4 +78,41 @@ class BaseAction return $object->movePositionDown(); } } + + /** + * Changes SEO Fields for an object. + * + * @param ModelCriteria $query + * @param UpdateSeoEvent $event + * + * @return mixed + */ + protected function genericUpdateSeo(ModelCriteria $query, UpdateSeoEvent $event) + { + if (null !== $object = $query->findPk($event->getObjectId())) { + + $object + ->setDispatcher($this->getDispatcher()) + + ->setLocale($event->getLocale()) + ->setMetaTitle($event->getMetaTitle()) + ->setMetaDescription($event->getMetaDescription()) + ->setMetaKeywords($event->getMetaKeywords()) + + ->save() + ; + + // Update the rewritten URL, if required + try { + $object->setRewrittenUrl($event->getLocale(), $event->getUrl()); + } catch(UrlRewritingException $e) { + throw new FormValidationException($e->getMessage(), $e->getCode()); + } + + $event->setObject($object); + + return $object; + } + } + } diff --git a/core/lib/Thelia/Action/Category.php b/core/lib/Thelia/Action/Category.php index ac68baa6a..9d895c7de 100755 --- a/core/lib/Thelia/Action/Category.php +++ b/core/lib/Thelia/Action/Category.php @@ -25,8 +25,7 @@ namespace Thelia\Action; use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Thelia\Exception\UrlRewritingException; -use Thelia\Form\Exception\FormValidationException; +use Thelia\Core\Event\UpdateSeoEvent; use Thelia\Model\CategoryQuery; use Thelia\Model\Category as CategoryModel; @@ -74,8 +73,6 @@ class Category extends BaseAction implements EventSubscriberInterface */ public function update(CategoryUpdateEvent $event) { - $search = CategoryQuery::create(); - if (null !== $category = CategoryQuery::create()->findPk($event->getCategoryId())) { $category @@ -92,17 +89,22 @@ class Category extends BaseAction implements EventSubscriberInterface ->save(); - // Update the rewritten URL, if required - try { - $category->setRewrittenUrl($event->getLocale(), $event->getUrl()); - } catch(UrlRewritingException $e) { - throw new FormValidationException($e->getMessage(), $e->getCode()); - } - $event->setCategory($category); } } + /** + * Change a Category SEO + * + * @param \Thelia\Core\Event\UpdateSeoEvent $event + * + * @return mixed + */ + public function updateSeo(UpdateSeoEvent $event) + { + return $this->genericUpdateSeo(CategoryQuery::create(), $event); + } + /** * Delete a category entry * @@ -190,6 +192,7 @@ class Category extends BaseAction implements EventSubscriberInterface TheliaEvents::CATEGORY_TOGGLE_VISIBILITY => array("toggleVisibility", 128), TheliaEvents::CATEGORY_UPDATE_POSITION => array("updatePosition", 128), + TheliaEvents::CATEGORY_UPDATE_SEO => array("updateSeo", 128), TheliaEvents::CATEGORY_ADD_CONTENT => array("addContent", 128), TheliaEvents::CATEGORY_REMOVE_CONTENT => array("removeContent", 128), diff --git a/core/lib/Thelia/Action/Content.php b/core/lib/Thelia/Action/Content.php index d3dbdbba8..986698220 100644 --- a/core/lib/Thelia/Action/Content.php +++ b/core/lib/Thelia/Action/Content.php @@ -32,8 +32,7 @@ use Thelia\Core\Event\Content\ContentToggleVisibilityEvent; use Thelia\Core\Event\Content\ContentUpdateEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Core\Event\UpdatePositionEvent; -use Thelia\Exception\UrlRewritingException; -use Thelia\Form\Exception\FormValidationException; +use Thelia\Core\Event\UpdateSeoEvent; use Thelia\Model\ContentFolder; use Thelia\Model\ContentFolderQuery; use Thelia\Model\ContentQuery; @@ -81,19 +80,24 @@ class Content extends BaseAction implements EventSubscriberInterface ->save() ; - // Update the rewritten URL, if required - try { - $content->setRewrittenUrl($event->getLocale(), $event->getUrl()); - } catch(UrlRewritingException $e) { - throw new FormValidationException($e->getMessage(), $e->getCode()); - } - $content->updateDefaultFolder($event->getDefaultFolder()); $event->setContent($content); } } + /** + * Change Content SEO + * + * @param \Thelia\Core\Event\UpdateSeoEvent $event + * + * @return mixed + */ + public function updateSeo(UpdateSeoEvent $event) + { + return $this->genericUpdateSeo(ContentQuery::create(), $event); + } + public function updatePosition(UpdatePositionEvent $event) { if (null !== $content = ContentQuery::create()->findPk($event->getObjectId())) { @@ -203,6 +207,7 @@ class Content extends BaseAction implements EventSubscriberInterface TheliaEvents::CONTENT_TOGGLE_VISIBILITY => array('toggleVisibility', 128), TheliaEvents::CONTENT_UPDATE_POSITION => array('updatePosition', 128), + TheliaEvents::CONTENT_UPDATE_SEO => array('updateSeo', 128), TheliaEvents::CONTENT_ADD_FOLDER => array('addFolder', 128), TheliaEvents::CONTENT_REMOVE_FOLDER => array('removeFolder', 128), diff --git a/core/lib/Thelia/Action/Folder.php b/core/lib/Thelia/Action/Folder.php index df849898c..2eece4095 100644 --- a/core/lib/Thelia/Action/Folder.php +++ b/core/lib/Thelia/Action/Folder.php @@ -29,8 +29,7 @@ use Thelia\Core\Event\Folder\FolderToggleVisibilityEvent; use Thelia\Core\Event\Folder\FolderUpdateEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Core\Event\UpdatePositionEvent; -use Thelia\Exception\UrlRewritingException; -use Thelia\Form\Exception\FormValidationException; +use Thelia\Core\Event\UpdateSeoEvent; use Thelia\Model\FolderQuery; use Thelia\Model\Folder as FolderModel; @@ -58,17 +57,22 @@ class Folder extends BaseAction implements EventSubscriberInterface ->save(); ; - // Update the rewritten URL, if required - try { - $folder->setRewrittenUrl($event->getLocale(), $event->getUrl()); - } catch(UrlRewritingException $e) { - throw new FormValidationException($e->getMessage(), $e->getCode()); - } - $event->setFolder($folder); } } + /** + * Change Folder SEO + * + * @param \Thelia\Core\Event\UpdateSeoEvent $event + * + * @return mixed + */ + public function updateSeo(UpdateSeoEvent $event) + { + return $this->genericUpdateSeo(FolderQuery::create(), $event); + } + public function delete(FolderDeleteEvent $event) { if (null !== $folder = FolderQuery::create()->findPk($event->getFolderId())) { @@ -158,6 +162,7 @@ class Folder extends BaseAction implements EventSubscriberInterface TheliaEvents::FOLDER_TOGGLE_VISIBILITY => array("toggleVisibility", 128), TheliaEvents::FOLDER_UPDATE_POSITION => array("updatePosition", 128), + TheliaEvents::FOLDER_UPDATE_SEO => array('updateSeo', 128) ); } } diff --git a/core/lib/Thelia/Action/Product.php b/core/lib/Thelia/Action/Product.php index ff32921b6..6d477855b 100644 --- a/core/lib/Thelia/Action/Product.php +++ b/core/lib/Thelia/Action/Product.php @@ -25,38 +25,37 @@ namespace Thelia\Action; use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Thelia\Exception\UrlRewritingException; -use Thelia\Form\Exception\FormValidationException; +use Thelia\Model\Map\ProductTableMap; use Thelia\Model\ProductQuery; use Thelia\Model\Product as ProductModel; - -use Thelia\Core\Event\TheliaEvents; - -use Thelia\Core\Event\Product\ProductUpdateEvent; -use Thelia\Core\Event\Product\ProductCreateEvent; -use Thelia\Core\Event\Product\ProductDeleteEvent; -use Thelia\Core\Event\UpdatePositionEvent; -use Thelia\Core\Event\Product\ProductToggleVisibilityEvent; -use Thelia\Core\Event\Product\ProductAddContentEvent; -use Thelia\Core\Event\Product\ProductDeleteContentEvent; use Thelia\Model\ProductAssociatedContent; use Thelia\Model\ProductAssociatedContentQuery; use Thelia\Model\ProductCategory; use Thelia\Model\TaxRuleQuery; use Thelia\Model\AccessoryQuery; use Thelia\Model\Accessory; -use Thelia\Core\Event\FeatureProduct\FeatureProductUpdateEvent; use Thelia\Model\FeatureProduct; -use Thelia\Core\Event\FeatureProduct\FeatureProductDeleteEvent; use Thelia\Model\FeatureProductQuery; use Thelia\Model\ProductCategoryQuery; -use Thelia\Core\Event\Product\ProductSetTemplateEvent; use Thelia\Model\ProductSaleElementsQuery; + +use Thelia\Core\Event\TheliaEvents; +use Thelia\Core\Event\Product\ProductUpdateEvent; +use Thelia\Core\Event\Product\ProductCreateEvent; +use Thelia\Core\Event\Product\ProductDeleteEvent; +use Thelia\Core\Event\Product\ProductToggleVisibilityEvent; +use Thelia\Core\Event\Product\ProductAddContentEvent; +use Thelia\Core\Event\Product\ProductDeleteContentEvent; +use Thelia\Core\Event\UpdatePositionEvent; +use Thelia\Core\Event\UpdateSeoEvent; +use Thelia\Core\Event\FeatureProduct\FeatureProductUpdateEvent; +use Thelia\Core\Event\FeatureProduct\FeatureProductDeleteEvent; +use Thelia\Core\Event\Product\ProductSetTemplateEvent; use Thelia\Core\Event\Product\ProductDeleteCategoryEvent; use Thelia\Core\Event\Product\ProductAddCategoryEvent; use Thelia\Core\Event\Product\ProductAddAccessoryEvent; use Thelia\Core\Event\Product\ProductDeleteAccessoryEvent; -use Thelia\Model\Map\ProductTableMap; + use Propel\Runtime\Propel; class Product extends BaseAction implements EventSubscriberInterface @@ -115,13 +114,6 @@ class Product extends BaseAction implements EventSubscriberInterface ->save() ; - // Update the rewritten URL, if required - try { - $product->setRewrittenUrl($event->getLocale(), $event->getUrl()); - } catch(UrlRewritingException $e) { - throw new FormValidationException($e->getMessage(), $e->getCode()); - } - // Update default category (ifd required) $product->updateDefaultCategory($event->getDefaultCategory()); @@ -129,6 +121,17 @@ class Product extends BaseAction implements EventSubscriberInterface } } + /** + * Change a product SEO + * + * @param \Thelia\Core\Event\UpdateSeoEvent $event + */ + public function updateSeo(UpdateSeoEvent $event) + { + return $this->genericUpdateSeo(ProductQuery::create(), $event); + } + + /** * Delete a product entry * @@ -389,12 +392,13 @@ class Product extends BaseAction implements EventSubscriberInterface public static function getSubscribedEvents() { return array( - TheliaEvents::PRODUCT_CREATE => array("create", 128), - TheliaEvents::PRODUCT_UPDATE => array("update", 128), - TheliaEvents::PRODUCT_DELETE => array("delete", 128), - TheliaEvents::PRODUCT_TOGGLE_VISIBILITY => array("toggleVisibility", 128), + TheliaEvents::PRODUCT_CREATE => array("create", 128), + TheliaEvents::PRODUCT_UPDATE => array("update", 128), + TheliaEvents::PRODUCT_DELETE => array("delete", 128), + TheliaEvents::PRODUCT_TOGGLE_VISIBILITY => array("toggleVisibility", 128), - TheliaEvents::PRODUCT_UPDATE_POSITION => array("updatePosition", 128), + TheliaEvents::PRODUCT_UPDATE_POSITION => array("updatePosition", 128), + TheliaEvents::PRODUCT_UPDATE_SEO => array("updateSeo", 128), TheliaEvents::PRODUCT_ADD_CONTENT => array("addContent", 128), TheliaEvents::PRODUCT_REMOVE_CONTENT => array("removeContent", 128), @@ -404,13 +408,13 @@ class Product extends BaseAction implements EventSubscriberInterface TheliaEvents::PRODUCT_REMOVE_ACCESSORY => array("removeAccessory", 128), TheliaEvents::PRODUCT_UPDATE_ACCESSORY_POSITION => array("updateAccessoryPosition", 128), - TheliaEvents::PRODUCT_ADD_CATEGORY => array("addCategory", 128), - TheliaEvents::PRODUCT_REMOVE_CATEGORY => array("removeCategory", 128), + TheliaEvents::PRODUCT_ADD_CATEGORY => array("addCategory", 128), + TheliaEvents::PRODUCT_REMOVE_CATEGORY => array("removeCategory", 128), - TheliaEvents::PRODUCT_SET_TEMPLATE => array("setProductTemplate", 128), + TheliaEvents::PRODUCT_SET_TEMPLATE => array("setProductTemplate", 128), - TheliaEvents::PRODUCT_FEATURE_UPDATE_VALUE => array("updateFeatureProductValue", 128), - TheliaEvents::PRODUCT_FEATURE_DELETE_VALUE => array("deleteFeatureProductValue", 128), + TheliaEvents::PRODUCT_FEATURE_UPDATE_VALUE => array("updateFeatureProductValue", 128), + TheliaEvents::PRODUCT_FEATURE_DELETE_VALUE => array("deleteFeatureProductValue", 128), ); } } diff --git a/core/lib/Thelia/Config/Resources/form.xml b/core/lib/Thelia/Config/Resources/form.xml index cf9ccd489..ec281266e 100644 --- a/core/lib/Thelia/Config/Resources/form.xml +++ b/core/lib/Thelia/Config/Resources/form.xml @@ -17,6 +17,7 @@
+ @@ -39,7 +40,6 @@ - diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index 88866682c..f5adc68aa 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -221,6 +221,10 @@ Thelia\Controller\Admin\CategoryController::processUpdateAction + + Thelia\Controller\Admin\CategoryController::processUpdateSeoAction + + Thelia\Controller\Admin\CategoryController::setToggleVisibilityAction @@ -237,7 +241,7 @@ Thelia\Controller\Admin\CategoryController::addRelatedContentAction - + Thelia\Controller\Admin\CategoryController::addRelatedPictureAction @@ -273,6 +277,10 @@ Thelia\Controller\Admin\ProductController::processUpdateAction + + Thelia\Controller\Admin\ProductController::processUpdateSeoAction + + Thelia\Controller\Admin\ProductController::setToggleVisibilityAction @@ -424,6 +432,10 @@ Thelia\Controller\Admin\FolderController::processUpdateAction + + Thelia\Controller\Admin\FolderController::processUpdateSeoAction + + Thelia\Controller\Admin\FolderController::deleteAction @@ -446,6 +458,10 @@ Thelia\Controller\Admin\ContentController::processUpdateAction + + Thelia\Controller\Admin\ContentController::processUpdateSeoAction + + Thelia\Controller\Admin\ContentController::updatePositionAction diff --git a/core/lib/Thelia/Controller/Admin/AbstractCrudController.php b/core/lib/Thelia/Controller/Admin/AbstractCrudController.php index dd6d19bcd..028d5ab15 100644 --- a/core/lib/Thelia/Controller/Admin/AbstractCrudController.php +++ b/core/lib/Thelia/Controller/Admin/AbstractCrudController.php @@ -34,7 +34,7 @@ use Thelia\Core\Event\UpdatePositionEvent; */ abstract class AbstractCrudController extends BaseAdminController { - protected $objectName; + protected $objectName; // List ordering protected $defaultListOrder; @@ -139,7 +139,7 @@ abstract class AbstractCrudController extends BaseAdminController /** * Get the created object from an event. * - * @param unknown $createEvent + * @param unknown $event */ abstract protected function getObjectFromEvent($event); @@ -230,7 +230,7 @@ abstract class AbstractCrudController extends BaseAdminController /** * Put in this method post object position change processing if required. * - * @param unknown $deleteEvent the delete event + * @param unknown $positionChangeEvent the delete event * @return Response a response, or null to continue normal processing */ protected function performAdditionalUpdatePositionAction($positionChangeEvent) @@ -267,7 +267,10 @@ abstract class AbstractCrudController extends BaseAdminController */ public function defaultAction() { - if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::VIEW)) return $response; + // Check current user authorization + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::VIEW)) + return $response; + return $this->renderList(); } @@ -279,8 +282,10 @@ abstract class AbstractCrudController extends BaseAdminController public function createAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::CREATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::CREATE)) + return $response; + // Error (Default: false) $error_msg = false; // Create the Creation Form @@ -288,24 +293,29 @@ abstract class AbstractCrudController extends BaseAdminController try { - // Validate the form, create the event and dispatch it. + // Check the form against constraints violations $form = $this->validateForm($creationForm, "POST"); + // Get the form field values $data = $form->getData(); + // Create a new event object with the modified fields $createEvent = $this->getCreationEvent($data); + // Dispatch Create Event $this->dispatch($this->createEventIdentifier, $createEvent); + // Check if object exist if (! $this->eventContainsObject($createEvent)) throw new \LogicException( - $this->getTranslator()->trans("No %obj was created.", array('%obj', $this->objectName))); + $this->getTranslator()->trans("No %obj was created.", array('%obj', $this->objectName))); + // Log object creation if (null !== $createdObject = $this->getObjectFromEvent($createEvent)) { - // Log object creation $this->adminLogAppend($this->resourceCode, AccessManager::CREATE, sprintf("%s %s (ID %s) created", ucfirst($this->objectName), $this->getObjectLabel($createdObject), $this->getObjectId($createdObject))); } + // Execute additional Action $response = $this->performAdditionalCreateAction($createEvent); if ($response == null) { @@ -326,7 +336,11 @@ abstract class AbstractCrudController extends BaseAdminController } $this->setupFormErrorContext( - $this->getTranslator()->trans("%obj creation", array('%obj' => $this->objectName)), $error_msg, $creationForm, $ex); + $this->getTranslator()->trans("%obj creation", array('%obj' => $this->objectName)), + $error_msg, + $creationForm, + $ex + ); // At this point, the form has error, and should be redisplayed. return $this->renderList(); @@ -340,12 +354,11 @@ abstract class AbstractCrudController extends BaseAdminController public function updateAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) + return $response; - // Load the object - $object = $this->getExistingObject(); - - if ($object != null) { + // Load object if exist + if (null !== $object = $this->getExistingObject()) { // Hydrate the form abd pass it to the parser $changeForm = $this->hydrateObjectForm($object); @@ -366,11 +379,13 @@ abstract class AbstractCrudController extends BaseAdminController public function processUpdateAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) + return $response; + // Error (Default: false) $error_msg = false; - // Create the form from the request + // Create the Form from the request $changeForm = $this->getUpdateForm($this->getRequest()); try { @@ -381,23 +396,27 @@ abstract class AbstractCrudController extends BaseAdminController // Get the form field values $data = $form->getData(); + // Create a new event object with the modified fields $changeEvent = $this->getUpdateEvent($data); + // Dispatch Update Event $this->dispatch($this->updateEventIdentifier, $changeEvent); + // Check if object exist if (! $this->eventContainsObject($changeEvent)) throw new \LogicException( - $this->getTranslator()->trans("No %obj was updated.", array('%obj', $this->objectName))); + $this->getTranslator()->trans("No %obj was updated.", array('%obj', $this->objectName))); // Log object modification if (null !== $changedObject = $this->getObjectFromEvent($changeEvent)) { $this->adminLogAppend($this->resourceCode, AccessManager::UPDATE, sprintf("%s %s (ID %s) modified", ucfirst($this->objectName), $this->getObjectLabel($changedObject), $this->getObjectId($changedObject))); } + // Execute additional Action $response = $this->performAdditionalUpdateAction($changeEvent); if ($response == null) { - // If we have to stay on the same page, do not redirect to the succesUrl, + // If we have to stay on the same page, do not redirect to the successUrl, // just redirect to the edit page again. if ($this->getRequest()->get('save_mode') == 'stay') { $this->redirectToEditionTemplate($this->getRequest()); @@ -416,11 +435,16 @@ abstract class AbstractCrudController extends BaseAdminController $error_msg = $ex->getMessage();*/ } - $this->setupFormErrorContext( - $this->getTranslator()->trans("%obj modification", array('%obj' => $this->objectName)), $error_msg, $changeForm, $ex); - // At this point, the form has errors, and should be redisplayed. - return $this->renderEditionTemplate(); + $this->setupFormErrorContext( + $this->getTranslator()->trans("%obj modification", array('%obj' => $this->objectName)), + $error_msg, + $changeForm, + $ex + ); + + + //return $this->renderEditionTemplate(); } /** @@ -431,7 +455,8 @@ abstract class AbstractCrudController extends BaseAdminController public function updatePositionAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) + return $response; try { $mode = $this->getRequest()->get('mode', null); @@ -448,6 +473,7 @@ abstract class AbstractCrudController extends BaseAdminController $event = $this->createUpdatePositionEvent($mode, $position); $this->dispatch($this->changePositionEventIdentifier, $event); + } catch (\Exception $ex) { // Any error return $this->errorPage($ex); @@ -465,7 +491,8 @@ abstract class AbstractCrudController extends BaseAdminController protected function genericUpdatePositionAction($object, $eventName, $doFinalRedirect = true) { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) + return $response; if ($object != null) { @@ -499,7 +526,8 @@ abstract class AbstractCrudController extends BaseAdminController public function setToggleVisibilityAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) + return $response; $changeEvent = $this->createToggleVisibilityEvent($this->getRequest()); @@ -521,7 +549,8 @@ abstract class AbstractCrudController extends BaseAdminController public function deleteAction() { // Check current user authorization - if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::DELETE)) return $response; + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::DELETE)) + return $response; // Get the currency id, and dispatch the delet request $deleteEvent = $this->getDeleteEvent(); diff --git a/core/lib/Thelia/Controller/Admin/AbstractSeoCrudController.php b/core/lib/Thelia/Controller/Admin/AbstractSeoCrudController.php new file mode 100644 index 000000000..9918f8a2f --- /dev/null +++ b/core/lib/Thelia/Controller/Admin/AbstractSeoCrudController.php @@ -0,0 +1,235 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Controller\Admin; + +use Thelia\Core\Event\UpdateSeoEvent; +use Thelia\Core\Security\AccessManager; + +use Thelia\Form\Exception\FormValidationException; +use Thelia\Form\SeoForm; + +/** + * Extend abstract CRUD controller to manage basic CRUD + SEO operations on a given object. + * + * @author Christophe Laffont + */ +abstract class AbstractSeoCrudController extends AbstractCrudController +{ + // Events + protected $updateSeoEventIdentifier; + + /** + * @param string $objectName the lower case object name. Example. "message" + * + * @param string $defaultListOrder the default object list order, or null if list is not sortable. Example: manual + * @param string $orderRequestParameterName Name of the request parameter that set the list order (null if list is not sortable) + * + * @param string $resourceCode the 'resource' code. Example: "admin.configuration.message" + * + * @param string $createEventIdentifier the dispatched create TheliaEvent identifier. Example: TheliaEvents::MESSAGE_CREATE + * @param string $updateEventIdentifier the dispatched update TheliaEvent identifier. Example: TheliaEvents::MESSAGE_UPDATE + * @param string $deleteEventIdentifier the dispatched delete TheliaEvent identifier. Example: TheliaEvents::MESSAGE_DELETE + * + * @param string $visibilityToggleEventIdentifier the dispatched visibility toggle TheliaEvent identifier, or null if the object has no visible options. Example: TheliaEvents::MESSAGE_TOGGLE_VISIBILITY + * @param string $changePositionEventIdentifier the dispatched position change TheliaEvent identifier, or null if the object has no position. Example: TheliaEvents::MESSAGE_UPDATE_POSITION + * @param string $updateSeoEventIdentifier the dispatched update SEO change TheliaEvent identifier, or null if the object has no SEO. Example: TheliaEvents::MESSAGE_UPDATE_SEO + */ + public function __construct( + $objectName, + + $defaultListOrder = null, + $orderRequestParameterName = null, + + $resourceCode, + + $createEventIdentifier, + $updateEventIdentifier, + $deleteEventIdentifier, + $visibilityToggleEventIdentifier = null, + $changePositionEventIdentifier = null, + $updateSeoEventIdentifier = null + ) + { + parent::__construct( + $objectName, + $defaultListOrder, + $orderRequestParameterName, + $resourceCode, + $createEventIdentifier, + $updateEventIdentifier, + $deleteEventIdentifier, + $visibilityToggleEventIdentifier, + $changePositionEventIdentifier + ); + + $this->updateSeoEventIdentifier = $updateSeoEventIdentifier; + + } + + /** + * Put in this method post object update SEO processing if required. + * + * @param unknown $updateSeoEvent the update event + * @return Response a response, or null to continue normal processing + */ + protected function performAdditionalUpdateSeoAction($updateSeoEvent) + { + return null; + } + + /** + * Return the update SEO form for this object + */ + protected function getUpdateSeoForm() + { + return new SeoForm($this->getRequest()); + } + + /** + * Creates the update SEO event with the provided form data + * + * @param $formData + * @return UpdateSeoEvent + */ + protected function getUpdateSeoEvent($formData) + { + + $updateSeoEvent = new UpdateSeoEvent($formData['id']); + + $updateSeoEvent + ->setLocale($formData['locale']) + ->setMetaTitle($formData['meta_title']) + ->setMetaDescription($formData['meta_description']) + ->setMetaKeywords($formData['meta_keywords']) + ->setUrl($formData['url']) + ; + + // Create and dispatch the change event + return $updateSeoEvent; + } + + /** + * Hydrate the SEO form for this object, before passing it to the update template + * + * @param unknown $object + */ + protected function hydrateSeoForm($object){ + // The "SEO" tab form + $locale = $object->getLocale(); + $data = array( + 'id' => $object->getId(), + 'locale' => $locale, + 'url' => $object->getRewrittenUrl($locale), + 'meta_title' => $object->getMetaTitle(), + 'meta_description' => $object->getMetaDescription(), + 'meta_keywords' => $object->getMetaKeywords() + ); + + $seoForm = new SeoForm($this->getRequest(), "form", $data); + $this->getParserContext()->addForm($seoForm); + + // URL based on the language + $this->getParserContext()->set('url_language', $this->getUrlLanguage($locale)); + } + + /** + * Update SEO modification, and either go back to the object list, or stay on the edition page. + * + * @return Thelia\Core\HttpFoundation\Response the response + */ + public function processUpdateSeoAction() + { + // Check current user authorization + if (null !== $response = $this->checkAuth($this->resourceCode, array(), AccessManager::UPDATE)) + return $response; + + // Error (Default: false) + $error_msg = false; + + // Create the Form from the request + $updateSeoForm = $this->getUpdateSeoForm($this->getRequest()); + + // Pass the object id to the request + $this->getRequest()->attributes->set($this->objectName . '_id', $this->getRequest()->get('current_id')); + + try { + + // Check the form against constraints violations + $form = $this->validateForm($updateSeoForm, "POST"); + + // Get the form field values + $data = $form->getData(); + + // Create a new event object with the modified fields + $updateSeoEvent = $this->getUpdateSeoEvent($data); + + // Dispatch Update SEO Event + $this->dispatch($this->updateSeoEventIdentifier, $updateSeoEvent); + + // Execute additional Action + $response = $this->performAdditionalUpdateSeoAction($updateSeoEvent); + + if ($response == null) { + // If we have to stay on the same page, do not redirect to the successUrl, + // just redirect to the edit page again. + if ($this->getRequest()->get('save_mode') == 'stay') { + $this->redirectToEditionTemplate($this->getRequest()); + } + + // Redirect to the success URL + $this->redirect($updateSeoForm->getSuccessUrl()); + } else { + return $response; + } + } catch (FormValidationException $ex) { + // Form cannot be validated + $error_msg = $this->createStandardFormValidationErrorMessage($ex); + /*} catch (\Exception $ex) { + // Any other error + $error_msg = $ex->getMessage();*/ + } + + // Load object if exist + if (null !== $object = $this->getExistingObject()) { + + // Hydrate the form abd pass it to the parser + $changeForm = $this->hydrateObjectForm($object); + + // Pass it to the parser + $this->getParserContext()->addForm($changeForm); + } + + $this->setupFormErrorContext( + $this->getTranslator()->trans("%obj SEO modification", array('%obj' => $this->objectName)), + $error_msg, + $updateSeoForm, + $ex + ); + + + + // At this point, the form has errors, and should be redisplayed. + return $this->renderEditionTemplate(); + } +} diff --git a/core/lib/Thelia/Controller/Admin/BaseAdminController.php b/core/lib/Thelia/Controller/Admin/BaseAdminController.php index 304ca09da..abb9665f9 100755 --- a/core/lib/Thelia/Controller/Admin/BaseAdminController.php +++ b/core/lib/Thelia/Controller/Admin/BaseAdminController.php @@ -302,6 +302,23 @@ class BaseAdminController extends BaseController return $this->getCurrentEditionLang()->getLocale(); } + /** + * A simple helper to get the URL based on the language. + */ + protected function getUrlLanguage($locale = null) + { + // Check if the functionality is activated + if(!ConfigQuery::read("one_domain_foreach_lang", false)) + return; + + // If we don't have a locale value, use the locale value in the session + if(!$locale) + $locale = $this->getCurrentEditionLocale(); + + return LangQuery::create()->findOneByLocale($locale)->getUrl(); + } + + /** * Return the current list order identifier for a given object name, * updating in using the current request. diff --git a/core/lib/Thelia/Controller/Admin/CategoryController.php b/core/lib/Thelia/Controller/Admin/CategoryController.php index 3a8428766..4f789244b 100755 --- a/core/lib/Thelia/Controller/Admin/CategoryController.php +++ b/core/lib/Thelia/Controller/Admin/CategoryController.php @@ -47,7 +47,7 @@ use Thelia\Model\CategoryAssociatedContentQuery; * * @author Franck Allimant */ -class CategoryController extends AbstractCrudController +class CategoryController extends AbstractSeoCrudController { public function __construct() { @@ -62,7 +62,8 @@ class CategoryController extends AbstractCrudController TheliaEvents::CATEGORY_UPDATE, TheliaEvents::CATEGORY_DELETE, TheliaEvents::CATEGORY_TOGGLE_VISIBILITY, - TheliaEvents::CATEGORY_UPDATE_POSITION + TheliaEvents::CATEGORY_UPDATE_POSITION, + TheliaEvents::CATEGORY_UPDATE_SEO ); } @@ -102,7 +103,6 @@ class CategoryController extends AbstractCrudController ->setDescription($formData['description']) ->setPostscriptum($formData['postscriptum']) ->setVisible($formData['visible']) - ->setUrl($formData['url']) ->setParent($formData['parent']) ; @@ -130,7 +130,10 @@ class CategoryController extends AbstractCrudController protected function hydrateObjectForm($object) { - // Prepare the data that will hydrate the form + // Hydrate the "SEO" tab form + $this->hydrateSeoForm($object); + + // The "General" tab form $data = array( 'id' => $object->getId(), 'locale' => $object->getLocale(), @@ -139,7 +142,6 @@ class CategoryController extends AbstractCrudController 'description' => $object->getDescription(), 'postscriptum' => $object->getPostscriptum(), 'visible' => $object->getVisible(), - 'url' => $object->getRewrittenUrl($this->getCurrentEditionLocale()), 'parent' => $object->getParent() ); @@ -193,10 +195,25 @@ class CategoryController extends AbstractCrudController protected function redirectToListTemplate() { - $this->redirectToRoute( + $category_id = $this->getRequest()->get('category_id', 0); + $this->redirectToListTemplateWithId($category_id); + } + + protected function redirectToListTemplateWithId($category_id) + { + if($category_id > 0) + { + $this->redirectToRoute( 'admin.categories.default', - array('category_id' => $this->getRequest()->get('category_id', 0)) - ); + array('category_id' => $category_id) + ); + } + else + { + $this->redirectToRoute( + 'admin.catalog' + ); + } } protected function renderEditionTemplate() @@ -233,21 +250,16 @@ class CategoryController extends AbstractCrudController protected function performAdditionalDeleteAction($deleteEvent) { // Redirect to parent category list - $this->redirectToRoute( - 'admin.categories.default', - array('category_id' => $deleteEvent->getCategory()->getParent()) - ); + $category_id = $deleteEvent->getCategory()->getParent(); + $this->redirectToListTemplateWithId($category_id); } protected function performAdditionalUpdateAction($updateEvent) { if ($this->getRequest()->get('save_mode') != 'stay') { - // Redirect to parent category list - $this->redirectToRoute( - 'admin.categories.default', - array('category_id' => $updateEvent->getCategory()->getParent()) - ); + $category_id = $updateEvent->getCategory()->getParent(); + $this->redirectToListTemplateWithId($category_id); } } @@ -258,10 +270,8 @@ class CategoryController extends AbstractCrudController if ($category != null) { // Redirect to parent category list - $this->redirectToRoute( - 'admin.categories.default', - array('category_id' => $category->getParent()) - ); + $category_id = $category->getParent(); + $this->redirectToListTemplateWithId($category_id); } return null; diff --git a/core/lib/Thelia/Controller/Admin/ContentController.php b/core/lib/Thelia/Controller/Admin/ContentController.php index 82d9ec8bd..bcb588800 100644 --- a/core/lib/Thelia/Controller/Admin/ContentController.php +++ b/core/lib/Thelia/Controller/Admin/ContentController.php @@ -41,7 +41,7 @@ use Thelia\Model\ContentQuery; * @package Thelia\Controller\Admin * @author manuel raynaud */ -class ContentController extends AbstractCrudController +class ContentController extends AbstractSeoCrudController { public function __construct() @@ -57,7 +57,8 @@ class ContentController extends AbstractCrudController TheliaEvents::CONTENT_UPDATE, TheliaEvents::CONTENT_DELETE, TheliaEvents::CONTENT_TOGGLE_VISIBILITY, - TheliaEvents::CONTENT_UPDATE_POSITION + TheliaEvents::CONTENT_UPDATE_POSITION, + TheliaEvents::CONTENT_UPDATE_SEO ); } @@ -140,6 +141,9 @@ class ContentController extends AbstractCrudController */ protected function hydrateObjectForm($object) { + // Hydrate the "SEO" tab form + $this->hydrateSeoForm($object); + // Prepare the data that will hydrate the form $data = array( 'id' => $object->getId(), @@ -148,8 +152,7 @@ class ContentController extends AbstractCrudController 'chapo' => $object->getChapo(), 'description' => $object->getDescription(), 'postscriptum' => $object->getPostscriptum(), - 'visible' => $object->getVisible(), - 'url' => $object->getRewrittenUrl($this->getCurrentEditionLocale()), + 'visible' => $object->getVisible() ); // Setup the object form @@ -191,7 +194,6 @@ class ContentController extends AbstractCrudController ->setDescription($formData['description']) ->setPostscriptum($formData['postscriptum']) ->setVisible($formData['visible']) - ->setUrl($formData['url']) ->setDefaultFolder($formData['default_folder']); return $contentUpdateEvent; diff --git a/core/lib/Thelia/Controller/Admin/FolderController.php b/core/lib/Thelia/Controller/Admin/FolderController.php index e35d659d1..d34ebf283 100644 --- a/core/lib/Thelia/Controller/Admin/FolderController.php +++ b/core/lib/Thelia/Controller/Admin/FolderController.php @@ -22,6 +22,7 @@ /*************************************************************************************/ namespace Thelia\Controller\Admin; +use Thelia\Core\HttpFoundation\Request; use Thelia\Core\Security\Resource\AdminResources; use Thelia\Core\Event\Folder\FolderCreateEvent; use Thelia\Core\Event\Folder\FolderDeleteEvent; @@ -38,7 +39,7 @@ use Thelia\Model\FolderQuery; * @package Thelia\Controller\Admin * @author Manuel Raynaud */ -class FolderController extends AbstractCrudController +class FolderController extends AbstractSeoCrudController { public function __construct() @@ -54,7 +55,8 @@ class FolderController extends AbstractCrudController TheliaEvents::FOLDER_UPDATE, TheliaEvents::FOLDER_DELETE, TheliaEvents::FOLDER_TOGGLE_VISIBILITY, - TheliaEvents::FOLDER_UPDATE_POSITION + TheliaEvents::FOLDER_UPDATE_POSITION, + TheliaEvents::FOLDER_UPDATE_SEO ); } @@ -81,6 +83,9 @@ class FolderController extends AbstractCrudController */ protected function hydrateObjectForm($object) { + // Hydrate the "SEO" tab form + $this->hydrateSeoForm($object); + // Prepare the data that will hydrate the form $data = array( 'id' => $object->getId(), @@ -90,7 +95,6 @@ class FolderController extends AbstractCrudController 'description' => $object->getDescription(), 'postscriptum' => $object->getPostscriptum(), 'visible' => $object->getVisible(), - 'url' => $object->getRewrittenUrl($this->getCurrentEditionLocale()), 'parent' => $object->getParent() ); @@ -132,7 +136,6 @@ class FolderController extends AbstractCrudController ->setDescription($formData['description']) ->setPostscriptum($formData['postscriptum']) ->setVisible($formData['visible']) - ->setUrl($formData['url']) ->setParent($formData['parent']) ; @@ -247,11 +250,15 @@ class FolderController extends AbstractCrudController return $this->render('folder-edit', $this->getEditionArguments()); } - protected function getEditionArguments() + protected function getEditionArguments(Request $request = null) { + if (null === $request) { + $request = $this->getRequest(); + } + return array( - 'folder_id' => $this->getRequest()->get('folder_id', 0), - 'current_tab' => $this->getRequest()->get('current_tab', 'general') + 'folder_id' => $request->get('folder_id', 0), + 'current_tab' => $request->get('current_tab', 'general') ); } @@ -309,9 +316,9 @@ class FolderController extends AbstractCrudController /** * Redirect to the edition template */ - protected function redirectToEditionTemplate() + protected function redirectToEditionTemplate(Request $request = null) { - $this->redirect($this->getRoute('admin.folders.update', $this->getEditionArguments())); + $this->redirect($this->getRoute('admin.folders.update', $this->getEditionArguments($request))); } /** diff --git a/core/lib/Thelia/Controller/Admin/ProductController.php b/core/lib/Thelia/Controller/Admin/ProductController.php index 461517896..57ceb8fb4 100644 --- a/core/lib/Thelia/Controller/Admin/ProductController.php +++ b/core/lib/Thelia/Controller/Admin/ProductController.php @@ -23,57 +23,62 @@ namespace Thelia\Controller\Admin; -use Thelia\Core\Security\Resource\AdminResources; -use Thelia\Core\Event\Product\ProductAddCategoryEvent; -use Thelia\Core\Event\Product\ProductDeleteCategoryEvent; -use Thelia\Core\Event\Product\ProductDeleteEvent; +use Symfony\Component\HttpFoundation\JsonResponse; +use Propel\Runtime\ActiveQuery\Criteria; + use Thelia\Core\Event\TheliaEvents; use Thelia\Core\Event\Product\ProductUpdateEvent; use Thelia\Core\Event\Product\ProductCreateEvent; -use Thelia\Core\Security\AccessManager; -use Thelia\Model\ProductQuery; -use Thelia\Form\ProductModificationForm; -use Thelia\Form\ProductCreationForm; -use Thelia\Core\Event\UpdatePositionEvent; +use Thelia\Core\Event\Product\ProductAddCategoryEvent; +use Thelia\Core\Event\Product\ProductDeleteCategoryEvent; +use Thelia\Core\Event\Product\ProductDeleteEvent; use Thelia\Core\Event\Product\ProductToggleVisibilityEvent; use Thelia\Core\Event\Product\ProductDeleteContentEvent; use Thelia\Core\Event\Product\ProductAddContentEvent; -use Thelia\Model\FolderQuery; -use Thelia\Model\ContentQuery; -use Propel\Runtime\ActiveQuery\Criteria; -use Thelia\Model\ProductAssociatedContentQuery; -use Thelia\Model\AccessoryQuery; -use Thelia\Model\CategoryQuery; - use Thelia\Core\Event\Product\ProductAddAccessoryEvent; use Thelia\Core\Event\Product\ProductDeleteAccessoryEvent; -use Thelia\Model\ProductSaleElementsQuery; +use Thelia\Core\Event\Product\ProductCombinationGenerationEvent; +use Thelia\Core\Event\Product\ProductSetTemplateEvent; +use Thelia\Core\Event\UpdatePositionEvent; use Thelia\Core\Event\ProductSaleElement\ProductSaleElementDeleteEvent; use Thelia\Core\Event\ProductSaleElement\ProductSaleElementUpdateEvent; use Thelia\Core\Event\ProductSaleElement\ProductSaleElementCreateEvent; + +use Thelia\Core\Security\Resource\AdminResources; +use Thelia\Core\Security\AccessManager; + +use Thelia\Model\AccessoryQuery; +use Thelia\Model\CategoryQuery; +use Thelia\Model\FolderQuery; +use Thelia\Model\ContentQuery; use Thelia\Model\AttributeQuery; use Thelia\Model\AttributeAvQuery; -use Thelia\Form\ProductSaleElementUpdateForm; +use Thelia\Model\ProductQuery; +use Thelia\Model\ProductAssociatedContentQuery; +use Thelia\Model\ProductSaleElementsQuery; use Thelia\Model\ProductPriceQuery; -use Thelia\Form\ProductDefaultSaleElementUpdateForm; use Thelia\Model\ProductPrice; use Thelia\Model\Currency; -use Symfony\Component\HttpFoundation\JsonResponse; -use Thelia\TaxEngine\Calculator; -use Thelia\Model\Country; -use Thelia\Tools\NumberFormat; -use Thelia\Model\Product; use Thelia\Model\CurrencyQuery; +use Thelia\Model\Country; +use Thelia\Model\Product; + +use Thelia\Form\ProductCreationForm; +use Thelia\Form\ProductModificationForm; +use Thelia\Form\ProductSaleElementUpdateForm; +use Thelia\Form\ProductDefaultSaleElementUpdateForm; use Thelia\Form\ProductCombinationGenerationForm; -use Thelia\Core\Event\Product\ProductCombinationGenerationEvent; -use Thelia\Core\Event\Product\ProductSetTemplateEvent; + +use Thelia\TaxEngine\Calculator; +use Thelia\Tools\NumberFormat; + /** * Manages products * * @author Franck Allimant */ -class ProductController extends AbstractCrudController +class ProductController extends AbstractSeoCrudController { public function __construct() { @@ -89,7 +94,8 @@ class ProductController extends AbstractCrudController TheliaEvents::PRODUCT_DELETE, TheliaEvents::PRODUCT_TOGGLE_VISIBILITY, - TheliaEvents::PRODUCT_UPDATE_POSITION + TheliaEvents::PRODUCT_UPDATE_POSITION, + TheliaEvents::PRODUCT_UPDATE_SEO ); } @@ -153,9 +159,9 @@ class ProductController extends AbstractCrudController protected function getUpdateEvent($formData) { + $changeEvent = new ProductUpdateEvent($formData['id']); - // Create and dispatch the change event $changeEvent ->setLocale($formData['locale']) ->setTitle($formData['title']) @@ -163,10 +169,10 @@ class ProductController extends AbstractCrudController ->setDescription($formData['description']) ->setPostscriptum($formData['postscriptum']) ->setVisible($formData['visible']) - ->setUrl($formData['url']) ->setDefaultCategory($formData['default_category']) - ; + ; + // Create and dispatch the change event return $changeEvent; } @@ -307,6 +313,9 @@ class ProductController extends AbstractCrudController $this->getParserContext()->addForm($combinationPseForm); } + // Hydrate the "SEO" tab form + $this->hydrateSeoForm($object); + // The "General" tab form $data = array( 'id' => $object->getId(), @@ -317,7 +326,6 @@ class ProductController extends AbstractCrudController 'description' => $object->getDescription(), 'postscriptum' => $object->getPostscriptum(), 'visible' => $object->getVisible(), - 'url' => $object->getRewrittenUrl($this->getCurrentEditionLocale()), 'default_category' => $object->getDefaultCategoryId() ); diff --git a/core/lib/Thelia/Core/Event/Category/CategoryUpdateEvent.php b/core/lib/Thelia/Core/Event/Category/CategoryUpdateEvent.php index d04e8da08..1ed2c5fe4 100644 --- a/core/lib/Thelia/Core/Event/Category/CategoryUpdateEvent.php +++ b/core/lib/Thelia/Core/Event/Category/CategoryUpdateEvent.php @@ -33,7 +33,6 @@ class CategoryUpdateEvent extends CategoryCreateEvent protected $description; protected $postscriptum; - protected $url; protected $parent; public function __construct($category_id) @@ -89,18 +88,6 @@ class CategoryUpdateEvent extends CategoryCreateEvent return $this; } - public function getUrl() - { - return $this->url; - } - - public function setUrl($url) - { - $this->url = $url; - - return $this; - } - public function getParent() { return $this->parent; diff --git a/core/lib/Thelia/Core/Event/Content/ContentUpdateEvent.php b/core/lib/Thelia/Core/Event/Content/ContentUpdateEvent.php index fb5bdfb5e..3cab32425 100644 --- a/core/lib/Thelia/Core/Event/Content/ContentUpdateEvent.php +++ b/core/lib/Thelia/Core/Event/Content/ContentUpdateEvent.php @@ -36,8 +36,6 @@ class ContentUpdateEvent extends ContentCreateEvent protected $description; protected $postscriptum; - protected $url; - public function __construct($content_id) { $this->content_id = $content_id; @@ -123,24 +121,4 @@ class ContentUpdateEvent extends ContentCreateEvent return $this->postscriptum; } - /** - * @param mixed $url - * - * @return $this - */ - public function setUrl($url) - { - $this->url = $url; - - return $this; - } - - /** - * @return mixed - */ - public function getUrl() - { - return $this->url; - } - } diff --git a/core/lib/Thelia/Core/Event/Folder/FolderUpdateEvent.php b/core/lib/Thelia/Core/Event/Folder/FolderUpdateEvent.php index bb4234d6c..e88026b85 100644 --- a/core/lib/Thelia/Core/Event/Folder/FolderUpdateEvent.php +++ b/core/lib/Thelia/Core/Event/Folder/FolderUpdateEvent.php @@ -37,8 +37,6 @@ class FolderUpdateEvent extends FolderCreateEvent protected $description; protected $postscriptum; - protected $url; - public function __construct($folder_id) { $this->folder_id = $folder_id; @@ -116,22 +114,4 @@ class FolderUpdateEvent extends FolderCreateEvent return $this->postscriptum; } - /** - * @param mixed $url - */ - public function setUrl($url) - { - $this->url = $url; - - return $this; - } - - /** - * @return mixed - */ - public function getUrl() - { - return $this->url; - } - } diff --git a/core/lib/Thelia/Core/Event/Product/ProductUpdateEvent.php b/core/lib/Thelia/Core/Event/Product/ProductUpdateEvent.php index 535f04462..7d0f9469c 100644 --- a/core/lib/Thelia/Core/Event/Product/ProductUpdateEvent.php +++ b/core/lib/Thelia/Core/Event/Product/ProductUpdateEvent.php @@ -33,7 +33,6 @@ class ProductUpdateEvent extends ProductCreateEvent protected $description; protected $postscriptum; - protected $url; protected $parent; public function __construct($product_id) @@ -89,18 +88,6 @@ class ProductUpdateEvent extends ProductCreateEvent return $this; } - public function getUrl() - { - return $this->url; - } - - public function setUrl($url) - { - $this->url = $url; - - return $this; - } - public function getParent() { return $this->parent; diff --git a/core/lib/Thelia/Core/Event/TheliaEvents.php b/core/lib/Thelia/Core/Event/TheliaEvents.php index f7228f7f1..b761cf775 100755 --- a/core/lib/Thelia/Core/Event/TheliaEvents.php +++ b/core/lib/Thelia/Core/Event/TheliaEvents.php @@ -160,6 +160,7 @@ final class TheliaEvents const CATEGORY_DELETE = "action.deleteCategory"; const CATEGORY_TOGGLE_VISIBILITY = "action.toggleCategoryVisibility"; const CATEGORY_UPDATE_POSITION = "action.updateCategoryPosition"; + const CATEGORY_UPDATE_SEO = "action.updateCategorySeo"; const CATEGORY_ADD_CONTENT = "action.categoryAddContent"; const CATEGORY_REMOVE_CONTENT = "action.categoryRemoveContent"; @@ -180,6 +181,7 @@ final class TheliaEvents const FOLDER_DELETE = "action.deleteFolder"; const FOLDER_TOGGLE_VISIBILITY = "action.toggleFolderVisibility"; const FOLDER_UPDATE_POSITION = "action.updateFolderPosition"; + const FOLDER_UPDATE_SEO = "action.updateFolderSeo"; const BEFORE_CREATEFOLDER = "action.before_createFolder"; const AFTER_CREATEFOLDER = "action.after_createFolder"; @@ -197,6 +199,7 @@ final class TheliaEvents const CONTENT_DELETE = "action.deleteContent"; const CONTENT_TOGGLE_VISIBILITY = "action.toggleContentVisibility"; const CONTENT_UPDATE_POSITION = "action.updateContentPosition"; + const CONTENT_UPDATE_SEO = "action.updateContentSeo"; const CONTENT_ADD_FOLDER = "action.contentAddFolder"; const CONTENT_REMOVE_FOLDER = "action.contentRemoveFolder"; @@ -269,6 +272,7 @@ final class TheliaEvents const PRODUCT_DELETE = "action.deleteProduct"; const PRODUCT_TOGGLE_VISIBILITY = "action.toggleProductVisibility"; const PRODUCT_UPDATE_POSITION = "action.updateProductPosition"; + const PRODUCT_UPDATE_SEO = "action.updateProductSeo"; const PRODUCT_ADD_CONTENT = "action.productAddContent"; const PRODUCT_REMOVE_CONTENT = "action.productRemoveContent"; diff --git a/core/lib/Thelia/Core/Event/UpdateSeoEvent.php b/core/lib/Thelia/Core/Event/UpdateSeoEvent.php new file mode 100644 index 000000000..caf46c1aa --- /dev/null +++ b/core/lib/Thelia/Core/Event/UpdateSeoEvent.php @@ -0,0 +1,188 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Event; + +class UpdateSeoEvent extends ActionEvent +{ + protected $object_id; + protected $locale; + protected $url; + protected $meta_title; + protected $meta_description; + protected $meta_keywords; + + protected $object; + + /** + * @param $object_id + * @param null $locale + * @param null $url + * @param null $meta_title + * @param null $meta_description + * @param null $meta_keywords + */ + public function __construct($object_id, $locale = null, $url = null, $meta_title = null, $meta_description = null, $meta_keywords = null) + { + $this->object_id = $object_id; + $this->locale = $locale; + $this->url = $url; + $this->meta_title = $meta_title; + $this->meta_description = $meta_description; + $this->meta_keywords = $meta_keywords; + } + + /** + * @return mixed + */ + public function getObjectId() + { + return $this->object_id; + } + + /** + * @param $object_id + * @return $this + */ + public function setObjectId($object_id) + { + $this->object_id = $object_id; + + return $this; + } + + /** + * @return null + */ + public function getLocale() + { + return $this->locale; + } + + /** + * @param $locale + * @return $this + */ + public function setLocale($locale) + { + $this->locale = $locale; + + return $this; + } + + /** + * @return null + */ + public function getUrl() + { + return $this->url; + } + + /** + * @param $url + * @return $this + */ + public function setUrl($url) + { + $this->url = $url; + + return $this; + } + + /** + * @return null + */ + public function getMetaTitle() + { + return $this->meta_title; + } + + /** + * @param $meta_title + * @return $this + */ + public function setMetaTitle($meta_title) + { + $this->meta_title = $meta_title; + + return $this; + } + + /** + * @return null + */ + public function getMetaDescription() + { + return $this->meta_description; + } + + /** + * @param $meta_description + * @return $this + */ + public function setMetaDescription($meta_description) + { + $this->meta_description = $meta_description; + + return $this; + } + + /** + * @return null + */ + public function getMetaKeywords() + { + return $this->meta_keywords; + } + + /** + * @param $meta_keywords + * @return $this + */ + public function setMetaKeywords($meta_keywords) + { + $this->meta_keywords = $meta_keywords; + + return $this; + } + + /** + * @param mixed $object + */ + public function setObject($object) + { + $this->object = $object; + + return $this; + } + + /** + * @return mixed + */ + public function getObject() + { + return $this->object; + } + + +} diff --git a/core/lib/Thelia/Core/Template/Loop/Category.php b/core/lib/Thelia/Core/Template/Loop/Category.php index b03f6dbb0..922f3161b 100755 --- a/core/lib/Thelia/Core/Template/Loop/Category.php +++ b/core/lib/Thelia/Core/Template/Loop/Category.php @@ -96,7 +96,7 @@ class Category extends BaseI18nLoop implements PropelSearchLoopInterface $search = CategoryQuery::create(); /* manage translations */ - $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search, array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM', 'META_TITLE', 'META_DESCRIPTION', 'META_KEYWORDS')); $id = $this->getId(); @@ -213,25 +213,28 @@ class Category extends BaseI18nLoop implements PropelSearchLoopInterface $loopResultRow = new LoopResultRow($category); $loopResultRow - ->set("ID", $category->getId()) - ->set("IS_TRANSLATED",$category->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$this->locale) - ->set("TITLE", $category->getVirtualColumn('i18n_TITLE')) - ->set("CHAPO", $category->getVirtualColumn('i18n_CHAPO')) - ->set("DESCRIPTION", $category->getVirtualColumn('i18n_DESCRIPTION')) - ->set("POSTSCRIPTUM", $category->getVirtualColumn('i18n_POSTSCRIPTUM')) - ->set("PARENT", $category->getParent()) - ->set("URL", $category->getUrl($this->locale)) - ->set("PRODUCT_COUNT", $category->countAllProducts()) - ->set("CHILD_COUNT", $category->countChild()) - ->set("VISIBLE", $category->getVisible() ? "1" : "0") - ->set("POSITION", $category->getPosition()) + ->set("ID" , $category->getId()) + ->set("IS_TRANSLATED" ,$category->getVirtualColumn('IS_TRANSLATED')) + ->set("LOCALE" ,$this->locale) + ->set("TITLE" , $category->getVirtualColumn('i18n_TITLE')) + ->set("CHAPO" , $category->getVirtualColumn('i18n_CHAPO')) + ->set("DESCRIPTION" , $category->getVirtualColumn('i18n_DESCRIPTION')) + ->set("POSTSCRIPTUM" , $category->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set("PARENT" , $category->getParent()) + ->set("URL" , $category->getUrl($this->locale)) + ->set("META_TITLE" , $category->getVirtualColumn('i18n_META_TITLE')) + ->set("META_DESCRIPTION" , $category->getVirtualColumn('i18n_META_DESCRIPTION')) + ->set("META_KEYWORDS" , $category->getVirtualColumn('i18n_META_KEYWORDS')) + ->set("PRODUCT_COUNT" , $category->countAllProducts()) + ->set("CHILD_COUNT" , $category->countChild()) + ->set("VISIBLE" , $category->getVisible() ? "1" : "0") + ->set("POSITION" , $category->getPosition()) - ->set("HAS_PREVIOUS", $previous != null ? 1 : 0) - ->set("HAS_NEXT" , $next != null ? 1 : 0) + ->set("HAS_PREVIOUS" , $previous != null ? 1 : 0) + ->set("HAS_NEXT" , $next != null ? 1 : 0) - ->set("PREVIOUS", $previous != null ? $previous->getId() : -1) - ->set("NEXT" , $next != null ? $next->getId() : -1) + ->set("PREVIOUS" , $previous != null ? $previous->getId() : -1) + ->set("NEXT" , $next != null ? $next->getId() : -1) ; $loopResult->addRow($loopResultRow); diff --git a/core/lib/Thelia/Core/Template/Loop/Content.php b/core/lib/Thelia/Core/Template/Loop/Content.php index bbf9e2c78..ee028e16d 100755 --- a/core/lib/Thelia/Core/Template/Loop/Content.php +++ b/core/lib/Thelia/Core/Template/Loop/Content.php @@ -85,7 +85,7 @@ class Content extends BaseI18nLoop implements PropelSearchLoopInterface $search = ContentQuery::create(); /* manage translations */ - $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search, array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM', 'META_TITLE', 'META_DESCRIPTION', 'META_KEYWORDS')); $id = $this->getId(); @@ -215,17 +215,21 @@ class Content extends BaseI18nLoop implements PropelSearchLoopInterface foreach ($loopResult->getResultDataCollection() as $content) { $loopResultRow = new LoopResultRow($content); - $loopResultRow->set("ID", $content->getId()) - ->set("IS_TRANSLATED",$content->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$this->locale) - ->set("TITLE",$content->getVirtualColumn('i18n_TITLE')) - ->set("CHAPO", $content->getVirtualColumn('i18n_CHAPO')) - ->set("DESCRIPTION", $content->getVirtualColumn('i18n_DESCRIPTION')) - ->set("POSTSCRIPTUM", $content->getVirtualColumn('i18n_POSTSCRIPTUM')) - ->set("POSITION", $content->getPosition()) - ->set("DEFAULT_FOLDER", $content->getDefaultFolderId()) - ->set("URL", $content->getUrl($this->locale)) - ->set("VISIBLE", $content->getVisible()) + $loopResultRow->set("ID" , $content->getId()) + ->set("IS_TRANSLATED" , $content->getVirtualColumn('IS_TRANSLATED')) + ->set("LOCALE" , $this->locale) + ->set("TITLE" , $content->getVirtualColumn('i18n_TITLE')) + ->set("CHAPO" , $content->getVirtualColumn('i18n_CHAPO')) + ->set("DESCRIPTION" , $content->getVirtualColumn('i18n_DESCRIPTION')) + ->set("POSTSCRIPTUM" , $content->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set("URL" , $content->getUrl($this->locale)) + ->set("META_TITLE" , $content->getVirtualColumn('i18n_META_TITLE')) + ->set("META_DESCRIPTION" , $content->getVirtualColumn('i18n_META_DESCRIPTION')) + ->set("META_KEYWORDS" , $content->getVirtualColumn('i18n_META_KEYWORDS')) + ->set("POSITION" , $content->getPosition()) + ->set("DEFAULT_FOLDER" , $content->getDefaultFolderId()) + + ->set("VISIBLE" , $content->getVisible()) ; $loopResult->addRow($loopResultRow); diff --git a/core/lib/Thelia/Core/Template/Loop/Folder.php b/core/lib/Thelia/Core/Template/Loop/Folder.php index 539436983..84dee9f82 100755 --- a/core/lib/Thelia/Core/Template/Loop/Folder.php +++ b/core/lib/Thelia/Core/Template/Loop/Folder.php @@ -78,7 +78,7 @@ class Folder extends BaseI18nLoop implements PropelSearchLoopInterface $search = FolderQuery::create(); /* manage translations */ - $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search, array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM', 'META_TITLE', 'META_DESCRIPTION', 'META_KEYWORDS')); $id = $this->getId(); @@ -164,19 +164,22 @@ class Folder extends BaseI18nLoop implements PropelSearchLoopInterface $loopResultRow = new LoopResultRow($folder); $loopResultRow - ->set("ID", $folder->getId()) - ->set("IS_TRANSLATED",$folder->getVirtualColumn('IS_TRANSLATED')) - ->set("LOCALE",$this->locale) - ->set("TITLE",$folder->getVirtualColumn('i18n_TITLE')) - ->set("CHAPO", $folder->getVirtualColumn('i18n_CHAPO')) - ->set("DESCRIPTION", $folder->getVirtualColumn('i18n_DESCRIPTION')) - ->set("POSTSCRIPTUM", $folder->getVirtualColumn('i18n_POSTSCRIPTUM')) - ->set("PARENT", $folder->getParent()) - ->set("URL", $folder->getUrl($this->locale)) - ->set("CHILD_COUNT", $folder->countChild()) - ->set("CONTENT_COUNT", $folder->countAllContents()) - ->set("VISIBLE", $folder->getVisible() ? "1" : "0") - ->set("POSITION", $folder->getPosition()) + ->set("ID" , $folder->getId()) + ->set("IS_TRANSLATED" , $folder->getVirtualColumn('IS_TRANSLATED')) + ->set("LOCALE" , $this->locale) + ->set("TITLE" , $folder->getVirtualColumn('i18n_TITLE')) + ->set("CHAPO" , $folder->getVirtualColumn('i18n_CHAPO')) + ->set("DESCRIPTION" , $folder->getVirtualColumn('i18n_DESCRIPTION')) + ->set("POSTSCRIPTUM" , $folder->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set("PARENT" , $folder->getParent()) + ->set("URL" , $folder->getUrl($this->locale)) + ->set("META_TITLE" , $folder->getVirtualColumn('i18n_META_TITLE')) + ->set("META_DESCRIPTION" , $folder->getVirtualColumn('i18n_META_DESCRIPTION')) + ->set("META_KEYWORDS" , $folder->getVirtualColumn('i18n_META_KEYWORDS')) + ->set("CHILD_COUNT" , $folder->countChild()) + ->set("CONTENT_COUNT" , $folder->countAllContents()) + ->set("VISIBLE" , $folder->getVisible() ? "1" : "0") + ->set("POSITION" , $folder->getPosition()) ; $loopResult->addRow($loopResultRow); diff --git a/core/lib/Thelia/Core/Template/Loop/Product.php b/core/lib/Thelia/Core/Template/Loop/Product.php index 031a37560..0668df260 100755 --- a/core/lib/Thelia/Core/Template/Loop/Product.php +++ b/core/lib/Thelia/Core/Template/Loop/Product.php @@ -223,7 +223,7 @@ class Product extends BaseI18nLoop implements PropelSearchLoopInterface, SearchL } /* manage translations */ - $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search, array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM', 'META_TITLE', 'META_DESCRIPTION', 'META_KEYWORDS')); $id = $this->getId(); @@ -519,6 +519,9 @@ class Product extends BaseI18nLoop implements PropelSearchLoopInterface, SearchL ->set("DESCRIPTION" , $product->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM" , $product->getVirtualColumn('i18n_POSTSCRIPTUM')) ->set("URL" , $product->getUrl($this->locale)) + ->set("META_TITLE" , $product->getVirtualColumn('i18n_META_TITLE')) + ->set("META_DESCRIPTION" , $product->getVirtualColumn('i18n_META_DESCRIPTION')) + ->set("META_KEYWORDS" , $product->getVirtualColumn('i18n_META_KEYWORDS')) ->set("BEST_PRICE" , $product->getVirtualColumn('is_promo') ? $promoPrice : $price) ->set("BEST_PRICE_TAX" , $taxedPrice - $product->getVirtualColumn('is_promo') ? $taxedPromoPrice - $promoPrice : $taxedPrice - $price) ->set("BEST_TAXED_PRICE" , $product->getVirtualColumn('is_promo') ? $taxedPromoPrice : $taxedPrice) @@ -570,7 +573,7 @@ class Product extends BaseI18nLoop implements PropelSearchLoopInterface, SearchL $search = ProductQuery::create(); /* manage translations */ - $this->configureI18nProcessing($search); + $this->configureI18nProcessing($search, array('TITLE', 'CHAPO', 'DESCRIPTION', 'POSTSCRIPTUM', 'META_TITLE', 'META_DESCRIPTION', 'META_KEYWORDS')); $attributeNonStrictMatch = $this->getAttribute_non_strict_match(); $isPSELeftJoinList = array(); @@ -1026,6 +1029,9 @@ class Product extends BaseI18nLoop implements PropelSearchLoopInterface, SearchL ->set("DESCRIPTION" , $product->getVirtualColumn('i18n_DESCRIPTION')) ->set("POSTSCRIPTUM" , $product->getVirtualColumn('i18n_POSTSCRIPTUM')) ->set("URL" , $product->getUrl($this->locale)) + ->set("META_TITLE" , $product->getVirtualColumn('i18n_META_TITLE')) + ->set("META_DESCRIPTION" , $product->getVirtualColumn('i18n_META_DESCRIPTION')) + ->set("META_KEYWORDS" , $product->getVirtualColumn('i18n_META_KEYWORDS')) ->set("BEST_PRICE" , $price) ->set("BEST_PRICE_TAX" , $taxedPrice - $price) ->set("BEST_TAXED_PRICE" , $taxedPrice) diff --git a/core/lib/Thelia/Form/CategoryModificationForm.php b/core/lib/Thelia/Form/CategoryModificationForm.php index 567f9e41f..1ce877803 100644 --- a/core/lib/Thelia/Form/CategoryModificationForm.php +++ b/core/lib/Thelia/Form/CategoryModificationForm.php @@ -23,8 +23,6 @@ namespace Thelia\Form; use Symfony\Component\Validator\Constraints\GreaterThan; -use Thelia\Core\Translation\Translator; -use Symfony\Component\Validator\Constraints\NotBlank; class CategoryModificationForm extends CategoryCreationForm { @@ -35,17 +33,15 @@ class CategoryModificationForm extends CategoryCreationForm parent::buildForm(true); $this->formBuilder - ->add("id", "hidden", array("constraints" => array(new GreaterThan(array('value' => 0))))) - - ->add("url", "text", array( - "label" => Translator::getInstance()->trans("Rewritten URL *"), - "constraints" => array(new NotBlank()), - "label_attr" => array("for" => "rewriten_url") - )) + ->add("id", "hidden", array( + "constraints" => array( + new GreaterThan(array('value' => 0)) + ) + )) ; - // Add standard description fields, excluding title and locale, which a re defined in parent class - $this->addStandardDescFields(array('title', 'locale')); + // Add standard description fields, excluding title which is defined in parent class + $this->addStandardDescFields(array('title')); } public function getName() diff --git a/core/lib/Thelia/Form/ContentModificationForm.php b/core/lib/Thelia/Form/ContentModificationForm.php index c3887b88e..b0130b2d2 100644 --- a/core/lib/Thelia/Form/ContentModificationForm.php +++ b/core/lib/Thelia/Form/ContentModificationForm.php @@ -24,8 +24,6 @@ namespace Thelia\Form; use Symfony\Component\Validator\Constraints\GreaterThan; -use Symfony\Component\Validator\Constraints\NotBlank; -use Thelia\Core\Translation\Translator; use Thelia\Form\StandardDescriptionFieldsTrait; /** @@ -43,12 +41,6 @@ class ContentModificationForm extends ContentCreationForm $this->formBuilder ->add("id", "hidden", array("constraints" => array(new GreaterThan(array('value' => 0))))) - - ->add("url", "text", array( - "label" => Translator::getInstance()->trans("Rewritten URL *"), - "constraints" => array(new NotBlank()), - "label_attr" => array("for" => "rewritten_url") - )) ; // Add standard description fields, excluding title and locale, which a re defined in parent class diff --git a/core/lib/Thelia/Form/FolderModificationForm.php b/core/lib/Thelia/Form/FolderModificationForm.php index 9c4e4c601..daab3b5ad 100644 --- a/core/lib/Thelia/Form/FolderModificationForm.php +++ b/core/lib/Thelia/Form/FolderModificationForm.php @@ -23,8 +23,6 @@ namespace Thelia\Form; use Symfony\Component\Validator\Constraints\GreaterThan; -use Thelia\Core\Translation\Translator; -use Symfony\Component\Validator\Constraints\NotBlank; class FolderModificationForm extends FolderCreationForm { @@ -36,12 +34,6 @@ class FolderModificationForm extends FolderCreationForm $this->formBuilder ->add("id", "hidden", array("constraints" => array(new GreaterThan(array('value' => 0))))) - - ->add("url", "text", array( - "label" => Translator::getInstance()->trans("Rewritten URL *"), - "constraints" => array(new NotBlank()), - "label_attr" => array("for" => "rewriten_url") - )) ; // Add standard description fields, excluding title and locale, which a re defined in parent class diff --git a/core/lib/Thelia/Form/ProductModificationForm.php b/core/lib/Thelia/Form/ProductModificationForm.php index 15a629302..9dce2e4e5 100644 --- a/core/lib/Thelia/Form/ProductModificationForm.php +++ b/core/lib/Thelia/Form/ProductModificationForm.php @@ -24,7 +24,7 @@ namespace Thelia\Form; use Symfony\Component\Validator\Constraints\GreaterThan; use Thelia\Core\Translation\Translator; -use Symfony\Component\Validator\Constraints\NotBlank; + class ProductModificationForm extends ProductCreationForm { @@ -39,17 +39,10 @@ class ProductModificationForm extends ProductCreationForm "label" => Translator::getInstance()->trans("Prodcut ID *"), "label_attr" => array("for" => "product_id_field"), "constraints" => array(new GreaterThan(array('value' => 0))) - )) ->add("template_id", "integer", array( "label" => Translator::getInstance()->trans("Product template"), "label_attr" => array("for" => "product_template_field") - - )) - ->add("url", "text", array( - "label" => Translator::getInstance()->trans("Rewritten URL *"), - "constraints" => array(new NotBlank()), - "label_attr" => array("for" => "rewriten_url_field") )) ; diff --git a/core/lib/Thelia/Form/SeoFieldsTrait.php b/core/lib/Thelia/Form/SeoFieldsTrait.php new file mode 100644 index 000000000..5b3270793 --- /dev/null +++ b/core/lib/Thelia/Form/SeoFieldsTrait.php @@ -0,0 +1,89 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Thelia\Form; + +use Symfony\Component\Validator\Constraints\NotBlank; +use Thelia\Core\Translation\Translator; + +/** + * A trait to add standard localized description fields to a form. + * + * @author Christophe Laffont + */ +trait SeoFieldsTrait +{ + /** + * Add seo meta title, meta description and meta keywords fields + * + * @param array $exclude name of the fields that should not be added to the form + */ + protected function addSeoFields($exclude = array()) + { + + if (! in_array('url', $exclude)) + $this->formBuilder + ->add('url', 'text', array( + 'label' => Translator::getInstance()->trans('Rewriten URL'), + 'label_attr' => array( + 'for' => 'rewriten_url_field' + ), + 'required' => false + ) + ); + + if (! in_array('meta_title', $exclude)) + $this->formBuilder + ->add('meta_title', 'text', array( + 'constraints' => array( + new NotBlank() + ), + 'label' => Translator::getInstance()->trans('Page Title'), + 'label_attr' => array( + 'for' => 'meta_title' + ) + ) + ); + + if (! in_array('meta_description', $exclude)) + $this->formBuilder + ->add('meta_description', 'text', array( + 'label' => Translator::getInstance()->trans('Meta Description'), + 'label_attr' => array( + 'for' => 'meta_description' + ), + 'required' => false + ) + ); + + if (! in_array('meta_keywords', $exclude)) + $this->formBuilder + ->add('meta_keywords', 'text', array( + 'label' => Translator::getInstance()->trans('Meta Keywords'), + 'label_attr' => array( + 'for' => 'meta_keywords' + ), + 'required' => false + ) + ); + } +} diff --git a/core/lib/Thelia/Form/SeoForm.php b/core/lib/Thelia/Form/SeoForm.php new file mode 100644 index 000000000..28c90c9ba --- /dev/null +++ b/core/lib/Thelia/Form/SeoForm.php @@ -0,0 +1,81 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Thelia\Form; + +use Symfony\Component\Validator\Constraints\GreaterThan; +use Symfony\Component\Validator\Constraints\NotBlank; + +/** + * Class SeoForm + * @package Thelia\Form + * @author Christophe Laffont + */ +class SeoForm extends BaseForm +{ + use SeoFieldsTrait; + + /** + * + * in this function you add all the fields you need for your Form. + * Form this you have to call add method on $this->formBuilder attribute : + * + * $this->formBuilder->add("name", "text") + * ->add("email", "email", array( + * "attr" => array( + * "class" => "field" + * ), + * "label" => "email", + * "constraints" => array( + * new \Symfony\Component\Validator\Constraints\NotBlank() + * ) + * ) + * ) + * ->add('age', 'integer'); + * + * @return null + */ + protected function buildForm() + { + + $this->formBuilder + ->add("id", "hidden", array( + "constraints" => array( + new GreaterThan(array('value' => 0)) + ) + )) + ->add("locale", "hidden", array( + "constraints" => array( + new NotBlank() + ) + )) + ; + + // Add SEO Fields + $this->addSeoFields(); + } + + public function getName() + { + return "thelia_seo"; + } +} diff --git a/core/lib/Thelia/Model/Base/Category.php b/core/lib/Thelia/Model/Base/Category.php index d5272d1e4..aacf774c0 100644 --- a/core/lib/Thelia/Model/Base/Category.php +++ b/core/lib/Thelia/Model/Base/Category.php @@ -3651,6 +3651,78 @@ abstract class Category implements ActiveRecordInterface return $this; } + + /** + * Get the [meta_title] column value. + * + * @return string + */ + public function getMetaTitle() + { + return $this->getCurrentTranslation()->getMetaTitle(); + } + + + /** + * Set the value of [meta_title] column. + * + * @param string $v new value + * @return \Thelia\Model\CategoryI18n The current object (for fluent API support) + */ + public function setMetaTitle($v) + { $this->getCurrentTranslation()->setMetaTitle($v); + + return $this; + } + + + /** + * Get the [meta_description] column value. + * + * @return string + */ + public function getMetaDescription() + { + return $this->getCurrentTranslation()->getMetaDescription(); + } + + + /** + * Set the value of [meta_description] column. + * + * @param string $v new value + * @return \Thelia\Model\CategoryI18n The current object (for fluent API support) + */ + public function setMetaDescription($v) + { $this->getCurrentTranslation()->setMetaDescription($v); + + return $this; + } + + + /** + * Get the [meta_keywords] column value. + * + * @return string + */ + public function getMetaKeywords() + { + return $this->getCurrentTranslation()->getMetaKeywords(); + } + + + /** + * Set the value of [meta_keywords] column. + * + * @param string $v new value + * @return \Thelia\Model\CategoryI18n The current object (for fluent API support) + */ + public function setMetaKeywords($v) + { $this->getCurrentTranslation()->setMetaKeywords($v); + + return $this; + } + // versionable behavior /** diff --git a/core/lib/Thelia/Model/Base/CategoryI18n.php b/core/lib/Thelia/Model/Base/CategoryI18n.php index bd9bf2608..0eb196d29 100644 --- a/core/lib/Thelia/Model/Base/CategoryI18n.php +++ b/core/lib/Thelia/Model/Base/CategoryI18n.php @@ -90,6 +90,24 @@ abstract class CategoryI18n implements ActiveRecordInterface */ protected $postscriptum; + /** + * The value for the meta_title field. + * @var string + */ + protected $meta_title; + + /** + * The value for the meta_description field. + * @var string + */ + protected $meta_description; + + /** + * The value for the meta_keywords field. + * @var string + */ + protected $meta_keywords; + /** * @var Category */ @@ -440,6 +458,39 @@ abstract class CategoryI18n implements ActiveRecordInterface return $this->postscriptum; } + /** + * Get the [meta_title] column value. + * + * @return string + */ + public function getMetaTitle() + { + + return $this->meta_title; + } + + /** + * Get the [meta_description] column value. + * + * @return string + */ + public function getMetaDescription() + { + + return $this->meta_description; + } + + /** + * Get the [meta_keywords] column value. + * + * @return string + */ + public function getMetaKeywords() + { + + return $this->meta_keywords; + } + /** * Set the value of [id] column. * @@ -570,6 +621,69 @@ abstract class CategoryI18n implements ActiveRecordInterface return $this; } // setPostscriptum() + /** + * Set the value of [meta_title] column. + * + * @param string $v new value + * @return \Thelia\Model\CategoryI18n The current object (for fluent API support) + */ + public function setMetaTitle($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->meta_title !== $v) { + $this->meta_title = $v; + $this->modifiedColumns[] = CategoryI18nTableMap::META_TITLE; + } + + + return $this; + } // setMetaTitle() + + /** + * Set the value of [meta_description] column. + * + * @param string $v new value + * @return \Thelia\Model\CategoryI18n The current object (for fluent API support) + */ + public function setMetaDescription($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->meta_description !== $v) { + $this->meta_description = $v; + $this->modifiedColumns[] = CategoryI18nTableMap::META_DESCRIPTION; + } + + + return $this; + } // setMetaDescription() + + /** + * Set the value of [meta_keywords] column. + * + * @param string $v new value + * @return \Thelia\Model\CategoryI18n The current object (for fluent API support) + */ + public function setMetaKeywords($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->meta_keywords !== $v) { + $this->meta_keywords = $v; + $this->modifiedColumns[] = CategoryI18nTableMap::META_KEYWORDS; + } + + + return $this; + } // setMetaKeywords() + /** * Indicates whether the columns in this object are only set to default values. * @@ -628,6 +742,15 @@ abstract class CategoryI18n implements ActiveRecordInterface $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : CategoryI18nTableMap::translateFieldName('Postscriptum', TableMap::TYPE_PHPNAME, $indexType)]; $this->postscriptum = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : CategoryI18nTableMap::translateFieldName('MetaTitle', TableMap::TYPE_PHPNAME, $indexType)]; + $this->meta_title = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 7 + $startcol : CategoryI18nTableMap::translateFieldName('MetaDescription', TableMap::TYPE_PHPNAME, $indexType)]; + $this->meta_description = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 8 + $startcol : CategoryI18nTableMap::translateFieldName('MetaKeywords', TableMap::TYPE_PHPNAME, $indexType)]; + $this->meta_keywords = (null !== $col) ? (string) $col : null; $this->resetModified(); $this->setNew(false); @@ -636,7 +759,7 @@ abstract class CategoryI18n implements ActiveRecordInterface $this->ensureConsistency(); } - return $startcol + 6; // 6 = CategoryI18nTableMap::NUM_HYDRATE_COLUMNS. + return $startcol + 9; // 9 = CategoryI18nTableMap::NUM_HYDRATE_COLUMNS. } catch (Exception $e) { throw new PropelException("Error populating \Thelia\Model\CategoryI18n object", 0, $e); @@ -875,6 +998,15 @@ abstract class CategoryI18n implements ActiveRecordInterface if ($this->isColumnModified(CategoryI18nTableMap::POSTSCRIPTUM)) { $modifiedColumns[':p' . $index++] = 'POSTSCRIPTUM'; } + if ($this->isColumnModified(CategoryI18nTableMap::META_TITLE)) { + $modifiedColumns[':p' . $index++] = 'META_TITLE'; + } + if ($this->isColumnModified(CategoryI18nTableMap::META_DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = 'META_DESCRIPTION'; + } + if ($this->isColumnModified(CategoryI18nTableMap::META_KEYWORDS)) { + $modifiedColumns[':p' . $index++] = 'META_KEYWORDS'; + } $sql = sprintf( 'INSERT INTO category_i18n (%s) VALUES (%s)', @@ -904,6 +1036,15 @@ abstract class CategoryI18n implements ActiveRecordInterface case 'POSTSCRIPTUM': $stmt->bindValue($identifier, $this->postscriptum, PDO::PARAM_STR); break; + case 'META_TITLE': + $stmt->bindValue($identifier, $this->meta_title, PDO::PARAM_STR); + break; + case 'META_DESCRIPTION': + $stmt->bindValue($identifier, $this->meta_description, PDO::PARAM_STR); + break; + case 'META_KEYWORDS': + $stmt->bindValue($identifier, $this->meta_keywords, PDO::PARAM_STR); + break; } } $stmt->execute(); @@ -977,6 +1118,15 @@ abstract class CategoryI18n implements ActiveRecordInterface case 5: return $this->getPostscriptum(); break; + case 6: + return $this->getMetaTitle(); + break; + case 7: + return $this->getMetaDescription(); + break; + case 8: + return $this->getMetaKeywords(); + break; default: return null; break; @@ -1012,6 +1162,9 @@ abstract class CategoryI18n implements ActiveRecordInterface $keys[3] => $this->getDescription(), $keys[4] => $this->getChapo(), $keys[5] => $this->getPostscriptum(), + $keys[6] => $this->getMetaTitle(), + $keys[7] => $this->getMetaDescription(), + $keys[8] => $this->getMetaKeywords(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -1074,6 +1227,15 @@ abstract class CategoryI18n implements ActiveRecordInterface case 5: $this->setPostscriptum($value); break; + case 6: + $this->setMetaTitle($value); + break; + case 7: + $this->setMetaDescription($value); + break; + case 8: + $this->setMetaKeywords($value); + break; } // switch() } @@ -1104,6 +1266,9 @@ abstract class CategoryI18n implements ActiveRecordInterface if (array_key_exists($keys[3], $arr)) $this->setDescription($arr[$keys[3]]); if (array_key_exists($keys[4], $arr)) $this->setChapo($arr[$keys[4]]); if (array_key_exists($keys[5], $arr)) $this->setPostscriptum($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setMetaTitle($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setMetaDescription($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setMetaKeywords($arr[$keys[8]]); } /** @@ -1121,6 +1286,9 @@ abstract class CategoryI18n implements ActiveRecordInterface if ($this->isColumnModified(CategoryI18nTableMap::DESCRIPTION)) $criteria->add(CategoryI18nTableMap::DESCRIPTION, $this->description); if ($this->isColumnModified(CategoryI18nTableMap::CHAPO)) $criteria->add(CategoryI18nTableMap::CHAPO, $this->chapo); if ($this->isColumnModified(CategoryI18nTableMap::POSTSCRIPTUM)) $criteria->add(CategoryI18nTableMap::POSTSCRIPTUM, $this->postscriptum); + if ($this->isColumnModified(CategoryI18nTableMap::META_TITLE)) $criteria->add(CategoryI18nTableMap::META_TITLE, $this->meta_title); + if ($this->isColumnModified(CategoryI18nTableMap::META_DESCRIPTION)) $criteria->add(CategoryI18nTableMap::META_DESCRIPTION, $this->meta_description); + if ($this->isColumnModified(CategoryI18nTableMap::META_KEYWORDS)) $criteria->add(CategoryI18nTableMap::META_KEYWORDS, $this->meta_keywords); return $criteria; } @@ -1197,6 +1365,9 @@ abstract class CategoryI18n implements ActiveRecordInterface $copyObj->setDescription($this->getDescription()); $copyObj->setChapo($this->getChapo()); $copyObj->setPostscriptum($this->getPostscriptum()); + $copyObj->setMetaTitle($this->getMetaTitle()); + $copyObj->setMetaDescription($this->getMetaDescription()); + $copyObj->setMetaKeywords($this->getMetaKeywords()); if ($makeNew) { $copyObj->setNew(true); } @@ -1286,6 +1457,9 @@ abstract class CategoryI18n implements ActiveRecordInterface $this->description = null; $this->chapo = null; $this->postscriptum = null; + $this->meta_title = null; + $this->meta_description = null; + $this->meta_keywords = null; $this->alreadyInSave = false; $this->clearAllReferences(); $this->applyDefaultValues(); diff --git a/core/lib/Thelia/Model/Base/CategoryI18nQuery.php b/core/lib/Thelia/Model/Base/CategoryI18nQuery.php index 595a72aa9..44ef90de3 100644 --- a/core/lib/Thelia/Model/Base/CategoryI18nQuery.php +++ b/core/lib/Thelia/Model/Base/CategoryI18nQuery.php @@ -27,6 +27,9 @@ use Thelia\Model\Map\CategoryI18nTableMap; * @method ChildCategoryI18nQuery orderByDescription($order = Criteria::ASC) Order by the description column * @method ChildCategoryI18nQuery orderByChapo($order = Criteria::ASC) Order by the chapo column * @method ChildCategoryI18nQuery orderByPostscriptum($order = Criteria::ASC) Order by the postscriptum column + * @method ChildCategoryI18nQuery orderByMetaTitle($order = Criteria::ASC) Order by the meta_title column + * @method ChildCategoryI18nQuery orderByMetaDescription($order = Criteria::ASC) Order by the meta_description column + * @method ChildCategoryI18nQuery orderByMetaKeywords($order = Criteria::ASC) Order by the meta_keywords column * * @method ChildCategoryI18nQuery groupById() Group by the id column * @method ChildCategoryI18nQuery groupByLocale() Group by the locale column @@ -34,6 +37,9 @@ use Thelia\Model\Map\CategoryI18nTableMap; * @method ChildCategoryI18nQuery groupByDescription() Group by the description column * @method ChildCategoryI18nQuery groupByChapo() Group by the chapo column * @method ChildCategoryI18nQuery groupByPostscriptum() Group by the postscriptum column + * @method ChildCategoryI18nQuery groupByMetaTitle() Group by the meta_title column + * @method ChildCategoryI18nQuery groupByMetaDescription() Group by the meta_description column + * @method ChildCategoryI18nQuery groupByMetaKeywords() Group by the meta_keywords column * * @method ChildCategoryI18nQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method ChildCategoryI18nQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -52,6 +58,9 @@ use Thelia\Model\Map\CategoryI18nTableMap; * @method ChildCategoryI18n findOneByDescription(string $description) Return the first ChildCategoryI18n filtered by the description column * @method ChildCategoryI18n findOneByChapo(string $chapo) Return the first ChildCategoryI18n filtered by the chapo column * @method ChildCategoryI18n findOneByPostscriptum(string $postscriptum) Return the first ChildCategoryI18n filtered by the postscriptum column + * @method ChildCategoryI18n findOneByMetaTitle(string $meta_title) Return the first ChildCategoryI18n filtered by the meta_title column + * @method ChildCategoryI18n findOneByMetaDescription(string $meta_description) Return the first ChildCategoryI18n filtered by the meta_description column + * @method ChildCategoryI18n findOneByMetaKeywords(string $meta_keywords) Return the first ChildCategoryI18n filtered by the meta_keywords column * * @method array findById(int $id) Return ChildCategoryI18n objects filtered by the id column * @method array findByLocale(string $locale) Return ChildCategoryI18n objects filtered by the locale column @@ -59,6 +68,9 @@ use Thelia\Model\Map\CategoryI18nTableMap; * @method array findByDescription(string $description) Return ChildCategoryI18n objects filtered by the description column * @method array findByChapo(string $chapo) Return ChildCategoryI18n objects filtered by the chapo column * @method array findByPostscriptum(string $postscriptum) Return ChildCategoryI18n objects filtered by the postscriptum column + * @method array findByMetaTitle(string $meta_title) Return ChildCategoryI18n objects filtered by the meta_title column + * @method array findByMetaDescription(string $meta_description) Return ChildCategoryI18n objects filtered by the meta_description column + * @method array findByMetaKeywords(string $meta_keywords) Return ChildCategoryI18n objects filtered by the meta_keywords column * */ abstract class CategoryI18nQuery extends ModelCriteria @@ -147,7 +159,7 @@ abstract class CategoryI18nQuery extends ModelCriteria */ protected function findPkSimple($key, $con) { - $sql = 'SELECT ID, LOCALE, TITLE, DESCRIPTION, CHAPO, POSTSCRIPTUM FROM category_i18n WHERE ID = :p0 AND LOCALE = :p1'; + $sql = 'SELECT ID, LOCALE, TITLE, DESCRIPTION, CHAPO, POSTSCRIPTUM, META_TITLE, META_DESCRIPTION, META_KEYWORDS FROM category_i18n WHERE ID = :p0 AND LOCALE = :p1'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key[0], PDO::PARAM_INT); @@ -436,6 +448,93 @@ abstract class CategoryI18nQuery extends ModelCriteria return $this->addUsingAlias(CategoryI18nTableMap::POSTSCRIPTUM, $postscriptum, $comparison); } + /** + * Filter the query on the meta_title column + * + * Example usage: + * + * $query->filterByMetaTitle('fooValue'); // WHERE meta_title = 'fooValue' + * $query->filterByMetaTitle('%fooValue%'); // WHERE meta_title LIKE '%fooValue%' + * + * + * @param string $metaTitle The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCategoryI18nQuery The current query, for fluid interface + */ + public function filterByMetaTitle($metaTitle = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($metaTitle)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $metaTitle)) { + $metaTitle = str_replace('*', '%', $metaTitle); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CategoryI18nTableMap::META_TITLE, $metaTitle, $comparison); + } + + /** + * Filter the query on the meta_description column + * + * Example usage: + * + * $query->filterByMetaDescription('fooValue'); // WHERE meta_description = 'fooValue' + * $query->filterByMetaDescription('%fooValue%'); // WHERE meta_description LIKE '%fooValue%' + * + * + * @param string $metaDescription The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCategoryI18nQuery The current query, for fluid interface + */ + public function filterByMetaDescription($metaDescription = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($metaDescription)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $metaDescription)) { + $metaDescription = str_replace('*', '%', $metaDescription); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CategoryI18nTableMap::META_DESCRIPTION, $metaDescription, $comparison); + } + + /** + * Filter the query on the meta_keywords column + * + * Example usage: + * + * $query->filterByMetaKeywords('fooValue'); // WHERE meta_keywords = 'fooValue' + * $query->filterByMetaKeywords('%fooValue%'); // WHERE meta_keywords LIKE '%fooValue%' + * + * + * @param string $metaKeywords The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildCategoryI18nQuery The current query, for fluid interface + */ + public function filterByMetaKeywords($metaKeywords = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($metaKeywords)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $metaKeywords)) { + $metaKeywords = str_replace('*', '%', $metaKeywords); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CategoryI18nTableMap::META_KEYWORDS, $metaKeywords, $comparison); + } + /** * Filter the query by a related \Thelia\Model\Category object * diff --git a/core/lib/Thelia/Model/Base/Content.php b/core/lib/Thelia/Model/Base/Content.php index bb7299f17..6618ae9c7 100644 --- a/core/lib/Thelia/Model/Base/Content.php +++ b/core/lib/Thelia/Model/Base/Content.php @@ -3904,6 +3904,78 @@ abstract class Content implements ActiveRecordInterface return $this; } + + /** + * Get the [meta_title] column value. + * + * @return string + */ + public function getMetaTitle() + { + return $this->getCurrentTranslation()->getMetaTitle(); + } + + + /** + * Set the value of [meta_title] column. + * + * @param string $v new value + * @return \Thelia\Model\ContentI18n The current object (for fluent API support) + */ + public function setMetaTitle($v) + { $this->getCurrentTranslation()->setMetaTitle($v); + + return $this; + } + + + /** + * Get the [meta_description] column value. + * + * @return string + */ + public function getMetaDescription() + { + return $this->getCurrentTranslation()->getMetaDescription(); + } + + + /** + * Set the value of [meta_description] column. + * + * @param string $v new value + * @return \Thelia\Model\ContentI18n The current object (for fluent API support) + */ + public function setMetaDescription($v) + { $this->getCurrentTranslation()->setMetaDescription($v); + + return $this; + } + + + /** + * Get the [meta_keywords] column value. + * + * @return string + */ + public function getMetaKeywords() + { + return $this->getCurrentTranslation()->getMetaKeywords(); + } + + + /** + * Set the value of [meta_keywords] column. + * + * @param string $v new value + * @return \Thelia\Model\ContentI18n The current object (for fluent API support) + */ + public function setMetaKeywords($v) + { $this->getCurrentTranslation()->setMetaKeywords($v); + + return $this; + } + // versionable behavior /** diff --git a/core/lib/Thelia/Model/Base/ContentI18n.php b/core/lib/Thelia/Model/Base/ContentI18n.php index e5de214c8..5b5dd2459 100644 --- a/core/lib/Thelia/Model/Base/ContentI18n.php +++ b/core/lib/Thelia/Model/Base/ContentI18n.php @@ -90,6 +90,24 @@ abstract class ContentI18n implements ActiveRecordInterface */ protected $postscriptum; + /** + * The value for the meta_title field. + * @var string + */ + protected $meta_title; + + /** + * The value for the meta_description field. + * @var string + */ + protected $meta_description; + + /** + * The value for the meta_keywords field. + * @var string + */ + protected $meta_keywords; + /** * @var Content */ @@ -440,6 +458,39 @@ abstract class ContentI18n implements ActiveRecordInterface return $this->postscriptum; } + /** + * Get the [meta_title] column value. + * + * @return string + */ + public function getMetaTitle() + { + + return $this->meta_title; + } + + /** + * Get the [meta_description] column value. + * + * @return string + */ + public function getMetaDescription() + { + + return $this->meta_description; + } + + /** + * Get the [meta_keywords] column value. + * + * @return string + */ + public function getMetaKeywords() + { + + return $this->meta_keywords; + } + /** * Set the value of [id] column. * @@ -570,6 +621,69 @@ abstract class ContentI18n implements ActiveRecordInterface return $this; } // setPostscriptum() + /** + * Set the value of [meta_title] column. + * + * @param string $v new value + * @return \Thelia\Model\ContentI18n The current object (for fluent API support) + */ + public function setMetaTitle($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->meta_title !== $v) { + $this->meta_title = $v; + $this->modifiedColumns[] = ContentI18nTableMap::META_TITLE; + } + + + return $this; + } // setMetaTitle() + + /** + * Set the value of [meta_description] column. + * + * @param string $v new value + * @return \Thelia\Model\ContentI18n The current object (for fluent API support) + */ + public function setMetaDescription($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->meta_description !== $v) { + $this->meta_description = $v; + $this->modifiedColumns[] = ContentI18nTableMap::META_DESCRIPTION; + } + + + return $this; + } // setMetaDescription() + + /** + * Set the value of [meta_keywords] column. + * + * @param string $v new value + * @return \Thelia\Model\ContentI18n The current object (for fluent API support) + */ + public function setMetaKeywords($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->meta_keywords !== $v) { + $this->meta_keywords = $v; + $this->modifiedColumns[] = ContentI18nTableMap::META_KEYWORDS; + } + + + return $this; + } // setMetaKeywords() + /** * Indicates whether the columns in this object are only set to default values. * @@ -628,6 +742,15 @@ abstract class ContentI18n implements ActiveRecordInterface $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : ContentI18nTableMap::translateFieldName('Postscriptum', TableMap::TYPE_PHPNAME, $indexType)]; $this->postscriptum = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : ContentI18nTableMap::translateFieldName('MetaTitle', TableMap::TYPE_PHPNAME, $indexType)]; + $this->meta_title = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 7 + $startcol : ContentI18nTableMap::translateFieldName('MetaDescription', TableMap::TYPE_PHPNAME, $indexType)]; + $this->meta_description = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 8 + $startcol : ContentI18nTableMap::translateFieldName('MetaKeywords', TableMap::TYPE_PHPNAME, $indexType)]; + $this->meta_keywords = (null !== $col) ? (string) $col : null; $this->resetModified(); $this->setNew(false); @@ -636,7 +759,7 @@ abstract class ContentI18n implements ActiveRecordInterface $this->ensureConsistency(); } - return $startcol + 6; // 6 = ContentI18nTableMap::NUM_HYDRATE_COLUMNS. + return $startcol + 9; // 9 = ContentI18nTableMap::NUM_HYDRATE_COLUMNS. } catch (Exception $e) { throw new PropelException("Error populating \Thelia\Model\ContentI18n object", 0, $e); @@ -875,6 +998,15 @@ abstract class ContentI18n implements ActiveRecordInterface if ($this->isColumnModified(ContentI18nTableMap::POSTSCRIPTUM)) { $modifiedColumns[':p' . $index++] = 'POSTSCRIPTUM'; } + if ($this->isColumnModified(ContentI18nTableMap::META_TITLE)) { + $modifiedColumns[':p' . $index++] = 'META_TITLE'; + } + if ($this->isColumnModified(ContentI18nTableMap::META_DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = 'META_DESCRIPTION'; + } + if ($this->isColumnModified(ContentI18nTableMap::META_KEYWORDS)) { + $modifiedColumns[':p' . $index++] = 'META_KEYWORDS'; + } $sql = sprintf( 'INSERT INTO content_i18n (%s) VALUES (%s)', @@ -904,6 +1036,15 @@ abstract class ContentI18n implements ActiveRecordInterface case 'POSTSCRIPTUM': $stmt->bindValue($identifier, $this->postscriptum, PDO::PARAM_STR); break; + case 'META_TITLE': + $stmt->bindValue($identifier, $this->meta_title, PDO::PARAM_STR); + break; + case 'META_DESCRIPTION': + $stmt->bindValue($identifier, $this->meta_description, PDO::PARAM_STR); + break; + case 'META_KEYWORDS': + $stmt->bindValue($identifier, $this->meta_keywords, PDO::PARAM_STR); + break; } } $stmt->execute(); @@ -977,6 +1118,15 @@ abstract class ContentI18n implements ActiveRecordInterface case 5: return $this->getPostscriptum(); break; + case 6: + return $this->getMetaTitle(); + break; + case 7: + return $this->getMetaDescription(); + break; + case 8: + return $this->getMetaKeywords(); + break; default: return null; break; @@ -1012,6 +1162,9 @@ abstract class ContentI18n implements ActiveRecordInterface $keys[3] => $this->getDescription(), $keys[4] => $this->getChapo(), $keys[5] => $this->getPostscriptum(), + $keys[6] => $this->getMetaTitle(), + $keys[7] => $this->getMetaDescription(), + $keys[8] => $this->getMetaKeywords(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -1074,6 +1227,15 @@ abstract class ContentI18n implements ActiveRecordInterface case 5: $this->setPostscriptum($value); break; + case 6: + $this->setMetaTitle($value); + break; + case 7: + $this->setMetaDescription($value); + break; + case 8: + $this->setMetaKeywords($value); + break; } // switch() } @@ -1104,6 +1266,9 @@ abstract class ContentI18n implements ActiveRecordInterface if (array_key_exists($keys[3], $arr)) $this->setDescription($arr[$keys[3]]); if (array_key_exists($keys[4], $arr)) $this->setChapo($arr[$keys[4]]); if (array_key_exists($keys[5], $arr)) $this->setPostscriptum($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setMetaTitle($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setMetaDescription($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setMetaKeywords($arr[$keys[8]]); } /** @@ -1121,6 +1286,9 @@ abstract class ContentI18n implements ActiveRecordInterface if ($this->isColumnModified(ContentI18nTableMap::DESCRIPTION)) $criteria->add(ContentI18nTableMap::DESCRIPTION, $this->description); if ($this->isColumnModified(ContentI18nTableMap::CHAPO)) $criteria->add(ContentI18nTableMap::CHAPO, $this->chapo); if ($this->isColumnModified(ContentI18nTableMap::POSTSCRIPTUM)) $criteria->add(ContentI18nTableMap::POSTSCRIPTUM, $this->postscriptum); + if ($this->isColumnModified(ContentI18nTableMap::META_TITLE)) $criteria->add(ContentI18nTableMap::META_TITLE, $this->meta_title); + if ($this->isColumnModified(ContentI18nTableMap::META_DESCRIPTION)) $criteria->add(ContentI18nTableMap::META_DESCRIPTION, $this->meta_description); + if ($this->isColumnModified(ContentI18nTableMap::META_KEYWORDS)) $criteria->add(ContentI18nTableMap::META_KEYWORDS, $this->meta_keywords); return $criteria; } @@ -1197,6 +1365,9 @@ abstract class ContentI18n implements ActiveRecordInterface $copyObj->setDescription($this->getDescription()); $copyObj->setChapo($this->getChapo()); $copyObj->setPostscriptum($this->getPostscriptum()); + $copyObj->setMetaTitle($this->getMetaTitle()); + $copyObj->setMetaDescription($this->getMetaDescription()); + $copyObj->setMetaKeywords($this->getMetaKeywords()); if ($makeNew) { $copyObj->setNew(true); } @@ -1286,6 +1457,9 @@ abstract class ContentI18n implements ActiveRecordInterface $this->description = null; $this->chapo = null; $this->postscriptum = null; + $this->meta_title = null; + $this->meta_description = null; + $this->meta_keywords = null; $this->alreadyInSave = false; $this->clearAllReferences(); $this->applyDefaultValues(); diff --git a/core/lib/Thelia/Model/Base/ContentI18nQuery.php b/core/lib/Thelia/Model/Base/ContentI18nQuery.php index cfd638318..ed844f4c2 100644 --- a/core/lib/Thelia/Model/Base/ContentI18nQuery.php +++ b/core/lib/Thelia/Model/Base/ContentI18nQuery.php @@ -27,6 +27,9 @@ use Thelia\Model\Map\ContentI18nTableMap; * @method ChildContentI18nQuery orderByDescription($order = Criteria::ASC) Order by the description column * @method ChildContentI18nQuery orderByChapo($order = Criteria::ASC) Order by the chapo column * @method ChildContentI18nQuery orderByPostscriptum($order = Criteria::ASC) Order by the postscriptum column + * @method ChildContentI18nQuery orderByMetaTitle($order = Criteria::ASC) Order by the meta_title column + * @method ChildContentI18nQuery orderByMetaDescription($order = Criteria::ASC) Order by the meta_description column + * @method ChildContentI18nQuery orderByMetaKeywords($order = Criteria::ASC) Order by the meta_keywords column * * @method ChildContentI18nQuery groupById() Group by the id column * @method ChildContentI18nQuery groupByLocale() Group by the locale column @@ -34,6 +37,9 @@ use Thelia\Model\Map\ContentI18nTableMap; * @method ChildContentI18nQuery groupByDescription() Group by the description column * @method ChildContentI18nQuery groupByChapo() Group by the chapo column * @method ChildContentI18nQuery groupByPostscriptum() Group by the postscriptum column + * @method ChildContentI18nQuery groupByMetaTitle() Group by the meta_title column + * @method ChildContentI18nQuery groupByMetaDescription() Group by the meta_description column + * @method ChildContentI18nQuery groupByMetaKeywords() Group by the meta_keywords column * * @method ChildContentI18nQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method ChildContentI18nQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -52,6 +58,9 @@ use Thelia\Model\Map\ContentI18nTableMap; * @method ChildContentI18n findOneByDescription(string $description) Return the first ChildContentI18n filtered by the description column * @method ChildContentI18n findOneByChapo(string $chapo) Return the first ChildContentI18n filtered by the chapo column * @method ChildContentI18n findOneByPostscriptum(string $postscriptum) Return the first ChildContentI18n filtered by the postscriptum column + * @method ChildContentI18n findOneByMetaTitle(string $meta_title) Return the first ChildContentI18n filtered by the meta_title column + * @method ChildContentI18n findOneByMetaDescription(string $meta_description) Return the first ChildContentI18n filtered by the meta_description column + * @method ChildContentI18n findOneByMetaKeywords(string $meta_keywords) Return the first ChildContentI18n filtered by the meta_keywords column * * @method array findById(int $id) Return ChildContentI18n objects filtered by the id column * @method array findByLocale(string $locale) Return ChildContentI18n objects filtered by the locale column @@ -59,6 +68,9 @@ use Thelia\Model\Map\ContentI18nTableMap; * @method array findByDescription(string $description) Return ChildContentI18n objects filtered by the description column * @method array findByChapo(string $chapo) Return ChildContentI18n objects filtered by the chapo column * @method array findByPostscriptum(string $postscriptum) Return ChildContentI18n objects filtered by the postscriptum column + * @method array findByMetaTitle(string $meta_title) Return ChildContentI18n objects filtered by the meta_title column + * @method array findByMetaDescription(string $meta_description) Return ChildContentI18n objects filtered by the meta_description column + * @method array findByMetaKeywords(string $meta_keywords) Return ChildContentI18n objects filtered by the meta_keywords column * */ abstract class ContentI18nQuery extends ModelCriteria @@ -147,7 +159,7 @@ abstract class ContentI18nQuery extends ModelCriteria */ protected function findPkSimple($key, $con) { - $sql = 'SELECT ID, LOCALE, TITLE, DESCRIPTION, CHAPO, POSTSCRIPTUM FROM content_i18n WHERE ID = :p0 AND LOCALE = :p1'; + $sql = 'SELECT ID, LOCALE, TITLE, DESCRIPTION, CHAPO, POSTSCRIPTUM, META_TITLE, META_DESCRIPTION, META_KEYWORDS FROM content_i18n WHERE ID = :p0 AND LOCALE = :p1'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key[0], PDO::PARAM_INT); @@ -436,6 +448,93 @@ abstract class ContentI18nQuery extends ModelCriteria return $this->addUsingAlias(ContentI18nTableMap::POSTSCRIPTUM, $postscriptum, $comparison); } + /** + * Filter the query on the meta_title column + * + * Example usage: + * + * $query->filterByMetaTitle('fooValue'); // WHERE meta_title = 'fooValue' + * $query->filterByMetaTitle('%fooValue%'); // WHERE meta_title LIKE '%fooValue%' + * + * + * @param string $metaTitle The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildContentI18nQuery The current query, for fluid interface + */ + public function filterByMetaTitle($metaTitle = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($metaTitle)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $metaTitle)) { + $metaTitle = str_replace('*', '%', $metaTitle); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ContentI18nTableMap::META_TITLE, $metaTitle, $comparison); + } + + /** + * Filter the query on the meta_description column + * + * Example usage: + * + * $query->filterByMetaDescription('fooValue'); // WHERE meta_description = 'fooValue' + * $query->filterByMetaDescription('%fooValue%'); // WHERE meta_description LIKE '%fooValue%' + * + * + * @param string $metaDescription The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildContentI18nQuery The current query, for fluid interface + */ + public function filterByMetaDescription($metaDescription = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($metaDescription)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $metaDescription)) { + $metaDescription = str_replace('*', '%', $metaDescription); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ContentI18nTableMap::META_DESCRIPTION, $metaDescription, $comparison); + } + + /** + * Filter the query on the meta_keywords column + * + * Example usage: + * + * $query->filterByMetaKeywords('fooValue'); // WHERE meta_keywords = 'fooValue' + * $query->filterByMetaKeywords('%fooValue%'); // WHERE meta_keywords LIKE '%fooValue%' + * + * + * @param string $metaKeywords The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildContentI18nQuery The current query, for fluid interface + */ + public function filterByMetaKeywords($metaKeywords = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($metaKeywords)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $metaKeywords)) { + $metaKeywords = str_replace('*', '%', $metaKeywords); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(ContentI18nTableMap::META_KEYWORDS, $metaKeywords, $comparison); + } + /** * Filter the query by a related \Thelia\Model\Content object * diff --git a/core/lib/Thelia/Model/Base/Folder.php b/core/lib/Thelia/Model/Base/Folder.php index e62e9b71e..20a7e8dbc 100644 --- a/core/lib/Thelia/Model/Base/Folder.php +++ b/core/lib/Thelia/Model/Base/Folder.php @@ -3368,6 +3368,78 @@ abstract class Folder implements ActiveRecordInterface return $this; } + + /** + * Get the [meta_title] column value. + * + * @return string + */ + public function getMetaTitle() + { + return $this->getCurrentTranslation()->getMetaTitle(); + } + + + /** + * Set the value of [meta_title] column. + * + * @param string $v new value + * @return \Thelia\Model\FolderI18n The current object (for fluent API support) + */ + public function setMetaTitle($v) + { $this->getCurrentTranslation()->setMetaTitle($v); + + return $this; + } + + + /** + * Get the [meta_description] column value. + * + * @return string + */ + public function getMetaDescription() + { + return $this->getCurrentTranslation()->getMetaDescription(); + } + + + /** + * Set the value of [meta_description] column. + * + * @param string $v new value + * @return \Thelia\Model\FolderI18n The current object (for fluent API support) + */ + public function setMetaDescription($v) + { $this->getCurrentTranslation()->setMetaDescription($v); + + return $this; + } + + + /** + * Get the [meta_keywords] column value. + * + * @return string + */ + public function getMetaKeywords() + { + return $this->getCurrentTranslation()->getMetaKeywords(); + } + + + /** + * Set the value of [meta_keywords] column. + * + * @param string $v new value + * @return \Thelia\Model\FolderI18n The current object (for fluent API support) + */ + public function setMetaKeywords($v) + { $this->getCurrentTranslation()->setMetaKeywords($v); + + return $this; + } + // versionable behavior /** diff --git a/core/lib/Thelia/Model/Base/FolderI18n.php b/core/lib/Thelia/Model/Base/FolderI18n.php index 8e972b307..ec57cff1d 100644 --- a/core/lib/Thelia/Model/Base/FolderI18n.php +++ b/core/lib/Thelia/Model/Base/FolderI18n.php @@ -90,6 +90,24 @@ abstract class FolderI18n implements ActiveRecordInterface */ protected $postscriptum; + /** + * The value for the meta_title field. + * @var string + */ + protected $meta_title; + + /** + * The value for the meta_description field. + * @var string + */ + protected $meta_description; + + /** + * The value for the meta_keywords field. + * @var string + */ + protected $meta_keywords; + /** * @var Folder */ @@ -440,6 +458,39 @@ abstract class FolderI18n implements ActiveRecordInterface return $this->postscriptum; } + /** + * Get the [meta_title] column value. + * + * @return string + */ + public function getMetaTitle() + { + + return $this->meta_title; + } + + /** + * Get the [meta_description] column value. + * + * @return string + */ + public function getMetaDescription() + { + + return $this->meta_description; + } + + /** + * Get the [meta_keywords] column value. + * + * @return string + */ + public function getMetaKeywords() + { + + return $this->meta_keywords; + } + /** * Set the value of [id] column. * @@ -570,6 +621,69 @@ abstract class FolderI18n implements ActiveRecordInterface return $this; } // setPostscriptum() + /** + * Set the value of [meta_title] column. + * + * @param string $v new value + * @return \Thelia\Model\FolderI18n The current object (for fluent API support) + */ + public function setMetaTitle($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->meta_title !== $v) { + $this->meta_title = $v; + $this->modifiedColumns[] = FolderI18nTableMap::META_TITLE; + } + + + return $this; + } // setMetaTitle() + + /** + * Set the value of [meta_description] column. + * + * @param string $v new value + * @return \Thelia\Model\FolderI18n The current object (for fluent API support) + */ + public function setMetaDescription($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->meta_description !== $v) { + $this->meta_description = $v; + $this->modifiedColumns[] = FolderI18nTableMap::META_DESCRIPTION; + } + + + return $this; + } // setMetaDescription() + + /** + * Set the value of [meta_keywords] column. + * + * @param string $v new value + * @return \Thelia\Model\FolderI18n The current object (for fluent API support) + */ + public function setMetaKeywords($v) + { + if ($v !== null) { + $v = (string) $v; + } + + if ($this->meta_keywords !== $v) { + $this->meta_keywords = $v; + $this->modifiedColumns[] = FolderI18nTableMap::META_KEYWORDS; + } + + + return $this; + } // setMetaKeywords() + /** * Indicates whether the columns in this object are only set to default values. * @@ -628,6 +742,15 @@ abstract class FolderI18n implements ActiveRecordInterface $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : FolderI18nTableMap::translateFieldName('Postscriptum', TableMap::TYPE_PHPNAME, $indexType)]; $this->postscriptum = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : FolderI18nTableMap::translateFieldName('MetaTitle', TableMap::TYPE_PHPNAME, $indexType)]; + $this->meta_title = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 7 + $startcol : FolderI18nTableMap::translateFieldName('MetaDescription', TableMap::TYPE_PHPNAME, $indexType)]; + $this->meta_description = (null !== $col) ? (string) $col : null; + + $col = $row[TableMap::TYPE_NUM == $indexType ? 8 + $startcol : FolderI18nTableMap::translateFieldName('MetaKeywords', TableMap::TYPE_PHPNAME, $indexType)]; + $this->meta_keywords = (null !== $col) ? (string) $col : null; $this->resetModified(); $this->setNew(false); @@ -636,7 +759,7 @@ abstract class FolderI18n implements ActiveRecordInterface $this->ensureConsistency(); } - return $startcol + 6; // 6 = FolderI18nTableMap::NUM_HYDRATE_COLUMNS. + return $startcol + 9; // 9 = FolderI18nTableMap::NUM_HYDRATE_COLUMNS. } catch (Exception $e) { throw new PropelException("Error populating \Thelia\Model\FolderI18n object", 0, $e); @@ -875,6 +998,15 @@ abstract class FolderI18n implements ActiveRecordInterface if ($this->isColumnModified(FolderI18nTableMap::POSTSCRIPTUM)) { $modifiedColumns[':p' . $index++] = 'POSTSCRIPTUM'; } + if ($this->isColumnModified(FolderI18nTableMap::META_TITLE)) { + $modifiedColumns[':p' . $index++] = 'META_TITLE'; + } + if ($this->isColumnModified(FolderI18nTableMap::META_DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = 'META_DESCRIPTION'; + } + if ($this->isColumnModified(FolderI18nTableMap::META_KEYWORDS)) { + $modifiedColumns[':p' . $index++] = 'META_KEYWORDS'; + } $sql = sprintf( 'INSERT INTO folder_i18n (%s) VALUES (%s)', @@ -904,6 +1036,15 @@ abstract class FolderI18n implements ActiveRecordInterface case 'POSTSCRIPTUM': $stmt->bindValue($identifier, $this->postscriptum, PDO::PARAM_STR); break; + case 'META_TITLE': + $stmt->bindValue($identifier, $this->meta_title, PDO::PARAM_STR); + break; + case 'META_DESCRIPTION': + $stmt->bindValue($identifier, $this->meta_description, PDO::PARAM_STR); + break; + case 'META_KEYWORDS': + $stmt->bindValue($identifier, $this->meta_keywords, PDO::PARAM_STR); + break; } } $stmt->execute(); @@ -977,6 +1118,15 @@ abstract class FolderI18n implements ActiveRecordInterface case 5: return $this->getPostscriptum(); break; + case 6: + return $this->getMetaTitle(); + break; + case 7: + return $this->getMetaDescription(); + break; + case 8: + return $this->getMetaKeywords(); + break; default: return null; break; @@ -1012,6 +1162,9 @@ abstract class FolderI18n implements ActiveRecordInterface $keys[3] => $this->getDescription(), $keys[4] => $this->getChapo(), $keys[5] => $this->getPostscriptum(), + $keys[6] => $this->getMetaTitle(), + $keys[7] => $this->getMetaDescription(), + $keys[8] => $this->getMetaKeywords(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -1074,6 +1227,15 @@ abstract class FolderI18n implements ActiveRecordInterface case 5: $this->setPostscriptum($value); break; + case 6: + $this->setMetaTitle($value); + break; + case 7: + $this->setMetaDescription($value); + break; + case 8: + $this->setMetaKeywords($value); + break; } // switch() } @@ -1104,6 +1266,9 @@ abstract class FolderI18n implements ActiveRecordInterface if (array_key_exists($keys[3], $arr)) $this->setDescription($arr[$keys[3]]); if (array_key_exists($keys[4], $arr)) $this->setChapo($arr[$keys[4]]); if (array_key_exists($keys[5], $arr)) $this->setPostscriptum($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setMetaTitle($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setMetaDescription($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setMetaKeywords($arr[$keys[8]]); } /** @@ -1121,6 +1286,9 @@ abstract class FolderI18n implements ActiveRecordInterface if ($this->isColumnModified(FolderI18nTableMap::DESCRIPTION)) $criteria->add(FolderI18nTableMap::DESCRIPTION, $this->description); if ($this->isColumnModified(FolderI18nTableMap::CHAPO)) $criteria->add(FolderI18nTableMap::CHAPO, $this->chapo); if ($this->isColumnModified(FolderI18nTableMap::POSTSCRIPTUM)) $criteria->add(FolderI18nTableMap::POSTSCRIPTUM, $this->postscriptum); + if ($this->isColumnModified(FolderI18nTableMap::META_TITLE)) $criteria->add(FolderI18nTableMap::META_TITLE, $this->meta_title); + if ($this->isColumnModified(FolderI18nTableMap::META_DESCRIPTION)) $criteria->add(FolderI18nTableMap::META_DESCRIPTION, $this->meta_description); + if ($this->isColumnModified(FolderI18nTableMap::META_KEYWORDS)) $criteria->add(FolderI18nTableMap::META_KEYWORDS, $this->meta_keywords); return $criteria; } @@ -1197,6 +1365,9 @@ abstract class FolderI18n implements ActiveRecordInterface $copyObj->setDescription($this->getDescription()); $copyObj->setChapo($this->getChapo()); $copyObj->setPostscriptum($this->getPostscriptum()); + $copyObj->setMetaTitle($this->getMetaTitle()); + $copyObj->setMetaDescription($this->getMetaDescription()); + $copyObj->setMetaKeywords($this->getMetaKeywords()); if ($makeNew) { $copyObj->setNew(true); } @@ -1286,6 +1457,9 @@ abstract class FolderI18n implements ActiveRecordInterface $this->description = null; $this->chapo = null; $this->postscriptum = null; + $this->meta_title = null; + $this->meta_description = null; + $this->meta_keywords = null; $this->alreadyInSave = false; $this->clearAllReferences(); $this->applyDefaultValues(); diff --git a/core/lib/Thelia/Model/Base/FolderI18nQuery.php b/core/lib/Thelia/Model/Base/FolderI18nQuery.php index bc1e5adf4..5a95c3689 100644 --- a/core/lib/Thelia/Model/Base/FolderI18nQuery.php +++ b/core/lib/Thelia/Model/Base/FolderI18nQuery.php @@ -27,6 +27,9 @@ use Thelia\Model\Map\FolderI18nTableMap; * @method ChildFolderI18nQuery orderByDescription($order = Criteria::ASC) Order by the description column * @method ChildFolderI18nQuery orderByChapo($order = Criteria::ASC) Order by the chapo column * @method ChildFolderI18nQuery orderByPostscriptum($order = Criteria::ASC) Order by the postscriptum column + * @method ChildFolderI18nQuery orderByMetaTitle($order = Criteria::ASC) Order by the meta_title column + * @method ChildFolderI18nQuery orderByMetaDescription($order = Criteria::ASC) Order by the meta_description column + * @method ChildFolderI18nQuery orderByMetaKeywords($order = Criteria::ASC) Order by the meta_keywords column * * @method ChildFolderI18nQuery groupById() Group by the id column * @method ChildFolderI18nQuery groupByLocale() Group by the locale column @@ -34,6 +37,9 @@ use Thelia\Model\Map\FolderI18nTableMap; * @method ChildFolderI18nQuery groupByDescription() Group by the description column * @method ChildFolderI18nQuery groupByChapo() Group by the chapo column * @method ChildFolderI18nQuery groupByPostscriptum() Group by the postscriptum column + * @method ChildFolderI18nQuery groupByMetaTitle() Group by the meta_title column + * @method ChildFolderI18nQuery groupByMetaDescription() Group by the meta_description column + * @method ChildFolderI18nQuery groupByMetaKeywords() Group by the meta_keywords column * * @method ChildFolderI18nQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method ChildFolderI18nQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -52,6 +58,9 @@ use Thelia\Model\Map\FolderI18nTableMap; * @method ChildFolderI18n findOneByDescription(string $description) Return the first ChildFolderI18n filtered by the description column * @method ChildFolderI18n findOneByChapo(string $chapo) Return the first ChildFolderI18n filtered by the chapo column * @method ChildFolderI18n findOneByPostscriptum(string $postscriptum) Return the first ChildFolderI18n filtered by the postscriptum column + * @method ChildFolderI18n findOneByMetaTitle(string $meta_title) Return the first ChildFolderI18n filtered by the meta_title column + * @method ChildFolderI18n findOneByMetaDescription(string $meta_description) Return the first ChildFolderI18n filtered by the meta_description column + * @method ChildFolderI18n findOneByMetaKeywords(string $meta_keywords) Return the first ChildFolderI18n filtered by the meta_keywords column * * @method array findById(int $id) Return ChildFolderI18n objects filtered by the id column * @method array findByLocale(string $locale) Return ChildFolderI18n objects filtered by the locale column @@ -59,6 +68,9 @@ use Thelia\Model\Map\FolderI18nTableMap; * @method array findByDescription(string $description) Return ChildFolderI18n objects filtered by the description column * @method array findByChapo(string $chapo) Return ChildFolderI18n objects filtered by the chapo column * @method array findByPostscriptum(string $postscriptum) Return ChildFolderI18n objects filtered by the postscriptum column + * @method array findByMetaTitle(string $meta_title) Return ChildFolderI18n objects filtered by the meta_title column + * @method array findByMetaDescription(string $meta_description) Return ChildFolderI18n objects filtered by the meta_description column + * @method array findByMetaKeywords(string $meta_keywords) Return ChildFolderI18n objects filtered by the meta_keywords column * */ abstract class FolderI18nQuery extends ModelCriteria @@ -147,7 +159,7 @@ abstract class FolderI18nQuery extends ModelCriteria */ protected function findPkSimple($key, $con) { - $sql = 'SELECT ID, LOCALE, TITLE, DESCRIPTION, CHAPO, POSTSCRIPTUM FROM folder_i18n WHERE ID = :p0 AND LOCALE = :p1'; + $sql = 'SELECT ID, LOCALE, TITLE, DESCRIPTION, CHAPO, POSTSCRIPTUM, META_TITLE, META_DESCRIPTION, META_KEYWORDS FROM folder_i18n WHERE ID = :p0 AND LOCALE = :p1'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key[0], PDO::PARAM_INT); @@ -436,6 +448,93 @@ abstract class FolderI18nQuery extends ModelCriteria return $this->addUsingAlias(FolderI18nTableMap::POSTSCRIPTUM, $postscriptum, $comparison); } + /** + * Filter the query on the meta_title column + * + * Example usage: + * + * $query->filterByMetaTitle('fooValue'); // WHERE meta_title = 'fooValue' + * $query->filterByMetaTitle('%fooValue%'); // WHERE meta_title LIKE '%fooValue%' + * + * + * @param string $metaTitle The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildFolderI18nQuery The current query, for fluid interface + */ + public function filterByMetaTitle($metaTitle = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($metaTitle)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $metaTitle)) { + $metaTitle = str_replace('*', '%', $metaTitle); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(FolderI18nTableMap::META_TITLE, $metaTitle, $comparison); + } + + /** + * Filter the query on the meta_description column + * + * Example usage: + * + * $query->filterByMetaDescription('fooValue'); // WHERE meta_description = 'fooValue' + * $query->filterByMetaDescription('%fooValue%'); // WHERE meta_description LIKE '%fooValue%' + * + * + * @param string $metaDescription The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildFolderI18nQuery The current query, for fluid interface + */ + public function filterByMetaDescription($metaDescription = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($metaDescription)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $metaDescription)) { + $metaDescription = str_replace('*', '%', $metaDescription); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(FolderI18nTableMap::META_DESCRIPTION, $metaDescription, $comparison); + } + + /** + * Filter the query on the meta_keywords column + * + * Example usage: + * + * $query->filterByMetaKeywords('fooValue'); // WHERE meta_keywords = 'fooValue' + * $query->filterByMetaKeywords('%fooValue%'); // WHERE meta_keywords LIKE '%fooValue%' + * + * + * @param string $metaKeywords The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildFolderI18nQuery The current query, for fluid interface + */ + public function filterByMetaKeywords($metaKeywords = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($metaKeywords)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $metaKeywords)) { + $metaKeywords = str_replace('*', '%', $metaKeywords); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(FolderI18nTableMap::META_KEYWORDS, $metaKeywords, $comparison); + } + /** * Filter the query by a related \Thelia\Model\Folder object * diff --git a/core/lib/Thelia/Model/Base/Product.php b/core/lib/Thelia/Model/Base/Product.php index e850d2acf..50d8e96a3 100644 --- a/core/lib/Thelia/Model/Base/Product.php +++ b/core/lib/Thelia/Model/Base/Product.php @@ -5916,24 +5916,24 @@ abstract class Product implements ActiveRecordInterface /** - * Get the [meta_keyword] column value. + * Get the [meta_keywords] column value. * * @return string */ - public function getMetaKeyword() + public function getMetaKeywords() { - return $this->getCurrentTranslation()->getMetaKeyword(); + return $this->getCurrentTranslation()->getMetaKeywords(); } /** - * Set the value of [meta_keyword] column. + * Set the value of [meta_keywords] column. * * @param string $v new value * @return \Thelia\Model\ProductI18n The current object (for fluent API support) */ - public function setMetaKeyword($v) - { $this->getCurrentTranslation()->setMetaKeyword($v); + public function setMetaKeywords($v) + { $this->getCurrentTranslation()->setMetaKeywords($v); return $this; } diff --git a/core/lib/Thelia/Model/Base/ProductI18n.php b/core/lib/Thelia/Model/Base/ProductI18n.php index a72f07c83..44f67373d 100644 --- a/core/lib/Thelia/Model/Base/ProductI18n.php +++ b/core/lib/Thelia/Model/Base/ProductI18n.php @@ -103,10 +103,10 @@ abstract class ProductI18n implements ActiveRecordInterface protected $meta_description; /** - * The value for the meta_keyword field. + * The value for the meta_keywords field. * @var string */ - protected $meta_keyword; + protected $meta_keywords; /** * @var Product @@ -481,14 +481,14 @@ abstract class ProductI18n implements ActiveRecordInterface } /** - * Get the [meta_keyword] column value. + * Get the [meta_keywords] column value. * * @return string */ - public function getMetaKeyword() + public function getMetaKeywords() { - return $this->meta_keyword; + return $this->meta_keywords; } /** @@ -664,25 +664,25 @@ abstract class ProductI18n implements ActiveRecordInterface } // setMetaDescription() /** - * Set the value of [meta_keyword] column. + * Set the value of [meta_keywords] column. * * @param string $v new value * @return \Thelia\Model\ProductI18n The current object (for fluent API support) */ - public function setMetaKeyword($v) + public function setMetaKeywords($v) { if ($v !== null) { $v = (string) $v; } - if ($this->meta_keyword !== $v) { - $this->meta_keyword = $v; - $this->modifiedColumns[] = ProductI18nTableMap::META_KEYWORD; + if ($this->meta_keywords !== $v) { + $this->meta_keywords = $v; + $this->modifiedColumns[] = ProductI18nTableMap::META_KEYWORDS; } return $this; - } // setMetaKeyword() + } // setMetaKeywords() /** * Indicates whether the columns in this object are only set to default values. @@ -749,8 +749,8 @@ abstract class ProductI18n implements ActiveRecordInterface $col = $row[TableMap::TYPE_NUM == $indexType ? 7 + $startcol : ProductI18nTableMap::translateFieldName('MetaDescription', TableMap::TYPE_PHPNAME, $indexType)]; $this->meta_description = (null !== $col) ? (string) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 8 + $startcol : ProductI18nTableMap::translateFieldName('MetaKeyword', TableMap::TYPE_PHPNAME, $indexType)]; - $this->meta_keyword = (null !== $col) ? (string) $col : null; + $col = $row[TableMap::TYPE_NUM == $indexType ? 8 + $startcol : ProductI18nTableMap::translateFieldName('MetaKeywords', TableMap::TYPE_PHPNAME, $indexType)]; + $this->meta_keywords = (null !== $col) ? (string) $col : null; $this->resetModified(); $this->setNew(false); @@ -1004,8 +1004,8 @@ abstract class ProductI18n implements ActiveRecordInterface if ($this->isColumnModified(ProductI18nTableMap::META_DESCRIPTION)) { $modifiedColumns[':p' . $index++] = 'META_DESCRIPTION'; } - if ($this->isColumnModified(ProductI18nTableMap::META_KEYWORD)) { - $modifiedColumns[':p' . $index++] = 'META_KEYWORD'; + if ($this->isColumnModified(ProductI18nTableMap::META_KEYWORDS)) { + $modifiedColumns[':p' . $index++] = 'META_KEYWORDS'; } $sql = sprintf( @@ -1042,8 +1042,8 @@ abstract class ProductI18n implements ActiveRecordInterface case 'META_DESCRIPTION': $stmt->bindValue($identifier, $this->meta_description, PDO::PARAM_STR); break; - case 'META_KEYWORD': - $stmt->bindValue($identifier, $this->meta_keyword, PDO::PARAM_STR); + case 'META_KEYWORDS': + $stmt->bindValue($identifier, $this->meta_keywords, PDO::PARAM_STR); break; } } @@ -1125,7 +1125,7 @@ abstract class ProductI18n implements ActiveRecordInterface return $this->getMetaDescription(); break; case 8: - return $this->getMetaKeyword(); + return $this->getMetaKeywords(); break; default: return null; @@ -1164,7 +1164,7 @@ abstract class ProductI18n implements ActiveRecordInterface $keys[5] => $this->getPostscriptum(), $keys[6] => $this->getMetaTitle(), $keys[7] => $this->getMetaDescription(), - $keys[8] => $this->getMetaKeyword(), + $keys[8] => $this->getMetaKeywords(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -1234,7 +1234,7 @@ abstract class ProductI18n implements ActiveRecordInterface $this->setMetaDescription($value); break; case 8: - $this->setMetaKeyword($value); + $this->setMetaKeywords($value); break; } // switch() } @@ -1268,7 +1268,7 @@ abstract class ProductI18n implements ActiveRecordInterface if (array_key_exists($keys[5], $arr)) $this->setPostscriptum($arr[$keys[5]]); if (array_key_exists($keys[6], $arr)) $this->setMetaTitle($arr[$keys[6]]); if (array_key_exists($keys[7], $arr)) $this->setMetaDescription($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setMetaKeyword($arr[$keys[8]]); + if (array_key_exists($keys[8], $arr)) $this->setMetaKeywords($arr[$keys[8]]); } /** @@ -1288,7 +1288,7 @@ abstract class ProductI18n implements ActiveRecordInterface if ($this->isColumnModified(ProductI18nTableMap::POSTSCRIPTUM)) $criteria->add(ProductI18nTableMap::POSTSCRIPTUM, $this->postscriptum); if ($this->isColumnModified(ProductI18nTableMap::META_TITLE)) $criteria->add(ProductI18nTableMap::META_TITLE, $this->meta_title); if ($this->isColumnModified(ProductI18nTableMap::META_DESCRIPTION)) $criteria->add(ProductI18nTableMap::META_DESCRIPTION, $this->meta_description); - if ($this->isColumnModified(ProductI18nTableMap::META_KEYWORD)) $criteria->add(ProductI18nTableMap::META_KEYWORD, $this->meta_keyword); + if ($this->isColumnModified(ProductI18nTableMap::META_KEYWORDS)) $criteria->add(ProductI18nTableMap::META_KEYWORDS, $this->meta_keywords); return $criteria; } @@ -1367,7 +1367,7 @@ abstract class ProductI18n implements ActiveRecordInterface $copyObj->setPostscriptum($this->getPostscriptum()); $copyObj->setMetaTitle($this->getMetaTitle()); $copyObj->setMetaDescription($this->getMetaDescription()); - $copyObj->setMetaKeyword($this->getMetaKeyword()); + $copyObj->setMetaKeywords($this->getMetaKeywords()); if ($makeNew) { $copyObj->setNew(true); } @@ -1459,7 +1459,7 @@ abstract class ProductI18n implements ActiveRecordInterface $this->postscriptum = null; $this->meta_title = null; $this->meta_description = null; - $this->meta_keyword = null; + $this->meta_keywords = null; $this->alreadyInSave = false; $this->clearAllReferences(); $this->applyDefaultValues(); diff --git a/core/lib/Thelia/Model/Base/ProductI18nQuery.php b/core/lib/Thelia/Model/Base/ProductI18nQuery.php index 01d3af9d4..c9eae20ad 100644 --- a/core/lib/Thelia/Model/Base/ProductI18nQuery.php +++ b/core/lib/Thelia/Model/Base/ProductI18nQuery.php @@ -29,7 +29,7 @@ use Thelia\Model\Map\ProductI18nTableMap; * @method ChildProductI18nQuery orderByPostscriptum($order = Criteria::ASC) Order by the postscriptum column * @method ChildProductI18nQuery orderByMetaTitle($order = Criteria::ASC) Order by the meta_title column * @method ChildProductI18nQuery orderByMetaDescription($order = Criteria::ASC) Order by the meta_description column - * @method ChildProductI18nQuery orderByMetaKeyword($order = Criteria::ASC) Order by the meta_keyword column + * @method ChildProductI18nQuery orderByMetaKeywords($order = Criteria::ASC) Order by the meta_keywords column * * @method ChildProductI18nQuery groupById() Group by the id column * @method ChildProductI18nQuery groupByLocale() Group by the locale column @@ -39,7 +39,7 @@ use Thelia\Model\Map\ProductI18nTableMap; * @method ChildProductI18nQuery groupByPostscriptum() Group by the postscriptum column * @method ChildProductI18nQuery groupByMetaTitle() Group by the meta_title column * @method ChildProductI18nQuery groupByMetaDescription() Group by the meta_description column - * @method ChildProductI18nQuery groupByMetaKeyword() Group by the meta_keyword column + * @method ChildProductI18nQuery groupByMetaKeywords() Group by the meta_keywords column * * @method ChildProductI18nQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method ChildProductI18nQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -60,7 +60,7 @@ use Thelia\Model\Map\ProductI18nTableMap; * @method ChildProductI18n findOneByPostscriptum(string $postscriptum) Return the first ChildProductI18n filtered by the postscriptum column * @method ChildProductI18n findOneByMetaTitle(string $meta_title) Return the first ChildProductI18n filtered by the meta_title column * @method ChildProductI18n findOneByMetaDescription(string $meta_description) Return the first ChildProductI18n filtered by the meta_description column - * @method ChildProductI18n findOneByMetaKeyword(string $meta_keyword) Return the first ChildProductI18n filtered by the meta_keyword column + * @method ChildProductI18n findOneByMetaKeywords(string $meta_keywords) Return the first ChildProductI18n filtered by the meta_keywords column * * @method array findById(int $id) Return ChildProductI18n objects filtered by the id column * @method array findByLocale(string $locale) Return ChildProductI18n objects filtered by the locale column @@ -70,7 +70,7 @@ use Thelia\Model\Map\ProductI18nTableMap; * @method array findByPostscriptum(string $postscriptum) Return ChildProductI18n objects filtered by the postscriptum column * @method array findByMetaTitle(string $meta_title) Return ChildProductI18n objects filtered by the meta_title column * @method array findByMetaDescription(string $meta_description) Return ChildProductI18n objects filtered by the meta_description column - * @method array findByMetaKeyword(string $meta_keyword) Return ChildProductI18n objects filtered by the meta_keyword column + * @method array findByMetaKeywords(string $meta_keywords) Return ChildProductI18n objects filtered by the meta_keywords column * */ abstract class ProductI18nQuery extends ModelCriteria @@ -159,7 +159,7 @@ abstract class ProductI18nQuery extends ModelCriteria */ protected function findPkSimple($key, $con) { - $sql = 'SELECT ID, LOCALE, TITLE, DESCRIPTION, CHAPO, POSTSCRIPTUM, META_TITLE, META_DESCRIPTION, META_KEYWORD FROM product_i18n WHERE ID = :p0 AND LOCALE = :p1'; + $sql = 'SELECT ID, LOCALE, TITLE, DESCRIPTION, CHAPO, POSTSCRIPTUM, META_TITLE, META_DESCRIPTION, META_KEYWORDS FROM product_i18n WHERE ID = :p0 AND LOCALE = :p1'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key[0], PDO::PARAM_INT); @@ -507,32 +507,32 @@ abstract class ProductI18nQuery extends ModelCriteria } /** - * Filter the query on the meta_keyword column + * Filter the query on the meta_keywords column * * Example usage: * - * $query->filterByMetaKeyword('fooValue'); // WHERE meta_keyword = 'fooValue' - * $query->filterByMetaKeyword('%fooValue%'); // WHERE meta_keyword LIKE '%fooValue%' + * $query->filterByMetaKeywords('fooValue'); // WHERE meta_keywords = 'fooValue' + * $query->filterByMetaKeywords('%fooValue%'); // WHERE meta_keywords LIKE '%fooValue%' * * - * @param string $metaKeyword The value to use as filter. + * @param string $metaKeywords The value to use as filter. * Accepts wildcards (* and % trigger a LIKE) * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL * * @return ChildProductI18nQuery The current query, for fluid interface */ - public function filterByMetaKeyword($metaKeyword = null, $comparison = null) + public function filterByMetaKeywords($metaKeywords = null, $comparison = null) { if (null === $comparison) { - if (is_array($metaKeyword)) { + if (is_array($metaKeywords)) { $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $metaKeyword)) { - $metaKeyword = str_replace('*', '%', $metaKeyword); + } elseif (preg_match('/[\%\*]/', $metaKeywords)) { + $metaKeywords = str_replace('*', '%', $metaKeywords); $comparison = Criteria::LIKE; } } - return $this->addUsingAlias(ProductI18nTableMap::META_KEYWORD, $metaKeyword, $comparison); + return $this->addUsingAlias(ProductI18nTableMap::META_KEYWORDS, $metaKeywords, $comparison); } /** diff --git a/core/lib/Thelia/Model/Map/CategoryI18nTableMap.php b/core/lib/Thelia/Model/Map/CategoryI18nTableMap.php index 8c52aa7b2..4fe5adb5d 100644 --- a/core/lib/Thelia/Model/Map/CategoryI18nTableMap.php +++ b/core/lib/Thelia/Model/Map/CategoryI18nTableMap.php @@ -57,7 +57,7 @@ class CategoryI18nTableMap extends TableMap /** * The total number of columns */ - const NUM_COLUMNS = 6; + const NUM_COLUMNS = 9; /** * The number of lazy-loaded columns @@ -67,7 +67,7 @@ class CategoryI18nTableMap extends TableMap /** * The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ - const NUM_HYDRATE_COLUMNS = 6; + const NUM_HYDRATE_COLUMNS = 9; /** * the column name for the ID field @@ -99,6 +99,21 @@ class CategoryI18nTableMap extends TableMap */ const POSTSCRIPTUM = 'category_i18n.POSTSCRIPTUM'; + /** + * the column name for the META_TITLE field + */ + const META_TITLE = 'category_i18n.META_TITLE'; + + /** + * the column name for the META_DESCRIPTION field + */ + const META_DESCRIPTION = 'category_i18n.META_DESCRIPTION'; + + /** + * the column name for the META_KEYWORDS field + */ + const META_KEYWORDS = 'category_i18n.META_KEYWORDS'; + /** * The default string format for model objects of the related table */ @@ -111,12 +126,12 @@ class CategoryI18nTableMap extends TableMap * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - self::TYPE_PHPNAME => array('Id', 'Locale', 'Title', 'Description', 'Chapo', 'Postscriptum', ), - self::TYPE_STUDLYPHPNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', ), - self::TYPE_COLNAME => array(CategoryI18nTableMap::ID, CategoryI18nTableMap::LOCALE, CategoryI18nTableMap::TITLE, CategoryI18nTableMap::DESCRIPTION, CategoryI18nTableMap::CHAPO, CategoryI18nTableMap::POSTSCRIPTUM, ), - self::TYPE_RAW_COLNAME => array('ID', 'LOCALE', 'TITLE', 'DESCRIPTION', 'CHAPO', 'POSTSCRIPTUM', ), - self::TYPE_FIELDNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', ), - self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, ) + self::TYPE_PHPNAME => array('Id', 'Locale', 'Title', 'Description', 'Chapo', 'Postscriptum', 'MetaTitle', 'MetaDescription', 'MetaKeywords', ), + self::TYPE_STUDLYPHPNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', 'metaTitle', 'metaDescription', 'metaKeywords', ), + self::TYPE_COLNAME => array(CategoryI18nTableMap::ID, CategoryI18nTableMap::LOCALE, CategoryI18nTableMap::TITLE, CategoryI18nTableMap::DESCRIPTION, CategoryI18nTableMap::CHAPO, CategoryI18nTableMap::POSTSCRIPTUM, CategoryI18nTableMap::META_TITLE, CategoryI18nTableMap::META_DESCRIPTION, CategoryI18nTableMap::META_KEYWORDS, ), + self::TYPE_RAW_COLNAME => array('ID', 'LOCALE', 'TITLE', 'DESCRIPTION', 'CHAPO', 'POSTSCRIPTUM', 'META_TITLE', 'META_DESCRIPTION', 'META_KEYWORDS', ), + self::TYPE_FIELDNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', 'meta_title', 'meta_description', 'meta_keywords', ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, ) ); /** @@ -126,12 +141,12 @@ class CategoryI18nTableMap extends TableMap * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - self::TYPE_PHPNAME => array('Id' => 0, 'Locale' => 1, 'Title' => 2, 'Description' => 3, 'Chapo' => 4, 'Postscriptum' => 5, ), - self::TYPE_STUDLYPHPNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, ), - self::TYPE_COLNAME => array(CategoryI18nTableMap::ID => 0, CategoryI18nTableMap::LOCALE => 1, CategoryI18nTableMap::TITLE => 2, CategoryI18nTableMap::DESCRIPTION => 3, CategoryI18nTableMap::CHAPO => 4, CategoryI18nTableMap::POSTSCRIPTUM => 5, ), - self::TYPE_RAW_COLNAME => array('ID' => 0, 'LOCALE' => 1, 'TITLE' => 2, 'DESCRIPTION' => 3, 'CHAPO' => 4, 'POSTSCRIPTUM' => 5, ), - self::TYPE_FIELDNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, ), - self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, ) + self::TYPE_PHPNAME => array('Id' => 0, 'Locale' => 1, 'Title' => 2, 'Description' => 3, 'Chapo' => 4, 'Postscriptum' => 5, 'MetaTitle' => 6, 'MetaDescription' => 7, 'MetaKeywords' => 8, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, 'metaTitle' => 6, 'metaDescription' => 7, 'metaKeywords' => 8, ), + self::TYPE_COLNAME => array(CategoryI18nTableMap::ID => 0, CategoryI18nTableMap::LOCALE => 1, CategoryI18nTableMap::TITLE => 2, CategoryI18nTableMap::DESCRIPTION => 3, CategoryI18nTableMap::CHAPO => 4, CategoryI18nTableMap::POSTSCRIPTUM => 5, CategoryI18nTableMap::META_TITLE => 6, CategoryI18nTableMap::META_DESCRIPTION => 7, CategoryI18nTableMap::META_KEYWORDS => 8, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'LOCALE' => 1, 'TITLE' => 2, 'DESCRIPTION' => 3, 'CHAPO' => 4, 'POSTSCRIPTUM' => 5, 'META_TITLE' => 6, 'META_DESCRIPTION' => 7, 'META_KEYWORDS' => 8, ), + self::TYPE_FIELDNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, 'meta_title' => 6, 'meta_description' => 7, 'meta_keywords' => 8, ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, ) ); /** @@ -156,6 +171,9 @@ class CategoryI18nTableMap extends TableMap $this->addColumn('DESCRIPTION', 'Description', 'CLOB', false, null, null); $this->addColumn('CHAPO', 'Chapo', 'LONGVARCHAR', false, null, null); $this->addColumn('POSTSCRIPTUM', 'Postscriptum', 'LONGVARCHAR', false, null, null); + $this->addColumn('META_TITLE', 'MetaTitle', 'VARCHAR', false, 255, null); + $this->addColumn('META_DESCRIPTION', 'MetaDescription', 'LONGVARCHAR', false, null, null); + $this->addColumn('META_KEYWORDS', 'MetaKeywords', 'LONGVARCHAR', false, null, null); } // initialize() /** @@ -359,6 +377,9 @@ class CategoryI18nTableMap extends TableMap $criteria->addSelectColumn(CategoryI18nTableMap::DESCRIPTION); $criteria->addSelectColumn(CategoryI18nTableMap::CHAPO); $criteria->addSelectColumn(CategoryI18nTableMap::POSTSCRIPTUM); + $criteria->addSelectColumn(CategoryI18nTableMap::META_TITLE); + $criteria->addSelectColumn(CategoryI18nTableMap::META_DESCRIPTION); + $criteria->addSelectColumn(CategoryI18nTableMap::META_KEYWORDS); } else { $criteria->addSelectColumn($alias . '.ID'); $criteria->addSelectColumn($alias . '.LOCALE'); @@ -366,6 +387,9 @@ class CategoryI18nTableMap extends TableMap $criteria->addSelectColumn($alias . '.DESCRIPTION'); $criteria->addSelectColumn($alias . '.CHAPO'); $criteria->addSelectColumn($alias . '.POSTSCRIPTUM'); + $criteria->addSelectColumn($alias . '.META_TITLE'); + $criteria->addSelectColumn($alias . '.META_DESCRIPTION'); + $criteria->addSelectColumn($alias . '.META_KEYWORDS'); } } diff --git a/core/lib/Thelia/Model/Map/CategoryTableMap.php b/core/lib/Thelia/Model/Map/CategoryTableMap.php index cd0ca3799..de74d53ae 100644 --- a/core/lib/Thelia/Model/Map/CategoryTableMap.php +++ b/core/lib/Thelia/Model/Map/CategoryTableMap.php @@ -208,7 +208,7 @@ class CategoryTableMap extends TableMap public function getBehaviors() { return array( - 'i18n' => array('i18n_table' => '%TABLE%_i18n', 'i18n_phpname' => '%PHPNAME%I18n', 'i18n_columns' => 'title, description, chapo, postscriptum', 'locale_column' => 'locale', 'locale_length' => '5', 'default_locale' => '', 'locale_alias' => '', ), + 'i18n' => array('i18n_table' => '%TABLE%_i18n', 'i18n_phpname' => '%PHPNAME%I18n', 'i18n_columns' => 'title, description, chapo, postscriptum, meta_title, meta_description, meta_keywords', 'locale_column' => 'locale', 'locale_length' => '5', 'default_locale' => '', 'locale_alias' => '', ), 'versionable' => array('version_column' => 'version', 'version_table' => '', 'log_created_at' => 'true', 'log_created_by' => 'true', 'log_comment' => 'false', 'version_created_at_column' => 'version_created_at', 'version_created_by_column' => 'version_created_by', 'version_comment_column' => 'version_comment', ), 'timestampable' => array('create_column' => 'created_at', 'update_column' => 'updated_at', ), ); diff --git a/core/lib/Thelia/Model/Map/ContentI18nTableMap.php b/core/lib/Thelia/Model/Map/ContentI18nTableMap.php index f718623b0..a69ac957e 100644 --- a/core/lib/Thelia/Model/Map/ContentI18nTableMap.php +++ b/core/lib/Thelia/Model/Map/ContentI18nTableMap.php @@ -57,7 +57,7 @@ class ContentI18nTableMap extends TableMap /** * The total number of columns */ - const NUM_COLUMNS = 6; + const NUM_COLUMNS = 9; /** * The number of lazy-loaded columns @@ -67,7 +67,7 @@ class ContentI18nTableMap extends TableMap /** * The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ - const NUM_HYDRATE_COLUMNS = 6; + const NUM_HYDRATE_COLUMNS = 9; /** * the column name for the ID field @@ -99,6 +99,21 @@ class ContentI18nTableMap extends TableMap */ const POSTSCRIPTUM = 'content_i18n.POSTSCRIPTUM'; + /** + * the column name for the META_TITLE field + */ + const META_TITLE = 'content_i18n.META_TITLE'; + + /** + * the column name for the META_DESCRIPTION field + */ + const META_DESCRIPTION = 'content_i18n.META_DESCRIPTION'; + + /** + * the column name for the META_KEYWORDS field + */ + const META_KEYWORDS = 'content_i18n.META_KEYWORDS'; + /** * The default string format for model objects of the related table */ @@ -111,12 +126,12 @@ class ContentI18nTableMap extends TableMap * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - self::TYPE_PHPNAME => array('Id', 'Locale', 'Title', 'Description', 'Chapo', 'Postscriptum', ), - self::TYPE_STUDLYPHPNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', ), - self::TYPE_COLNAME => array(ContentI18nTableMap::ID, ContentI18nTableMap::LOCALE, ContentI18nTableMap::TITLE, ContentI18nTableMap::DESCRIPTION, ContentI18nTableMap::CHAPO, ContentI18nTableMap::POSTSCRIPTUM, ), - self::TYPE_RAW_COLNAME => array('ID', 'LOCALE', 'TITLE', 'DESCRIPTION', 'CHAPO', 'POSTSCRIPTUM', ), - self::TYPE_FIELDNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', ), - self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, ) + self::TYPE_PHPNAME => array('Id', 'Locale', 'Title', 'Description', 'Chapo', 'Postscriptum', 'MetaTitle', 'MetaDescription', 'MetaKeywords', ), + self::TYPE_STUDLYPHPNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', 'metaTitle', 'metaDescription', 'metaKeywords', ), + self::TYPE_COLNAME => array(ContentI18nTableMap::ID, ContentI18nTableMap::LOCALE, ContentI18nTableMap::TITLE, ContentI18nTableMap::DESCRIPTION, ContentI18nTableMap::CHAPO, ContentI18nTableMap::POSTSCRIPTUM, ContentI18nTableMap::META_TITLE, ContentI18nTableMap::META_DESCRIPTION, ContentI18nTableMap::META_KEYWORDS, ), + self::TYPE_RAW_COLNAME => array('ID', 'LOCALE', 'TITLE', 'DESCRIPTION', 'CHAPO', 'POSTSCRIPTUM', 'META_TITLE', 'META_DESCRIPTION', 'META_KEYWORDS', ), + self::TYPE_FIELDNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', 'meta_title', 'meta_description', 'meta_keywords', ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, ) ); /** @@ -126,12 +141,12 @@ class ContentI18nTableMap extends TableMap * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - self::TYPE_PHPNAME => array('Id' => 0, 'Locale' => 1, 'Title' => 2, 'Description' => 3, 'Chapo' => 4, 'Postscriptum' => 5, ), - self::TYPE_STUDLYPHPNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, ), - self::TYPE_COLNAME => array(ContentI18nTableMap::ID => 0, ContentI18nTableMap::LOCALE => 1, ContentI18nTableMap::TITLE => 2, ContentI18nTableMap::DESCRIPTION => 3, ContentI18nTableMap::CHAPO => 4, ContentI18nTableMap::POSTSCRIPTUM => 5, ), - self::TYPE_RAW_COLNAME => array('ID' => 0, 'LOCALE' => 1, 'TITLE' => 2, 'DESCRIPTION' => 3, 'CHAPO' => 4, 'POSTSCRIPTUM' => 5, ), - self::TYPE_FIELDNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, ), - self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, ) + self::TYPE_PHPNAME => array('Id' => 0, 'Locale' => 1, 'Title' => 2, 'Description' => 3, 'Chapo' => 4, 'Postscriptum' => 5, 'MetaTitle' => 6, 'MetaDescription' => 7, 'MetaKeywords' => 8, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, 'metaTitle' => 6, 'metaDescription' => 7, 'metaKeywords' => 8, ), + self::TYPE_COLNAME => array(ContentI18nTableMap::ID => 0, ContentI18nTableMap::LOCALE => 1, ContentI18nTableMap::TITLE => 2, ContentI18nTableMap::DESCRIPTION => 3, ContentI18nTableMap::CHAPO => 4, ContentI18nTableMap::POSTSCRIPTUM => 5, ContentI18nTableMap::META_TITLE => 6, ContentI18nTableMap::META_DESCRIPTION => 7, ContentI18nTableMap::META_KEYWORDS => 8, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'LOCALE' => 1, 'TITLE' => 2, 'DESCRIPTION' => 3, 'CHAPO' => 4, 'POSTSCRIPTUM' => 5, 'META_TITLE' => 6, 'META_DESCRIPTION' => 7, 'META_KEYWORDS' => 8, ), + self::TYPE_FIELDNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, 'meta_title' => 6, 'meta_description' => 7, 'meta_keywords' => 8, ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, ) ); /** @@ -156,6 +171,9 @@ class ContentI18nTableMap extends TableMap $this->addColumn('DESCRIPTION', 'Description', 'CLOB', false, null, null); $this->addColumn('CHAPO', 'Chapo', 'LONGVARCHAR', false, null, null); $this->addColumn('POSTSCRIPTUM', 'Postscriptum', 'LONGVARCHAR', false, null, null); + $this->addColumn('META_TITLE', 'MetaTitle', 'VARCHAR', false, 255, null); + $this->addColumn('META_DESCRIPTION', 'MetaDescription', 'LONGVARCHAR', false, null, null); + $this->addColumn('META_KEYWORDS', 'MetaKeywords', 'LONGVARCHAR', false, null, null); } // initialize() /** @@ -359,6 +377,9 @@ class ContentI18nTableMap extends TableMap $criteria->addSelectColumn(ContentI18nTableMap::DESCRIPTION); $criteria->addSelectColumn(ContentI18nTableMap::CHAPO); $criteria->addSelectColumn(ContentI18nTableMap::POSTSCRIPTUM); + $criteria->addSelectColumn(ContentI18nTableMap::META_TITLE); + $criteria->addSelectColumn(ContentI18nTableMap::META_DESCRIPTION); + $criteria->addSelectColumn(ContentI18nTableMap::META_KEYWORDS); } else { $criteria->addSelectColumn($alias . '.ID'); $criteria->addSelectColumn($alias . '.LOCALE'); @@ -366,6 +387,9 @@ class ContentI18nTableMap extends TableMap $criteria->addSelectColumn($alias . '.DESCRIPTION'); $criteria->addSelectColumn($alias . '.CHAPO'); $criteria->addSelectColumn($alias . '.POSTSCRIPTUM'); + $criteria->addSelectColumn($alias . '.META_TITLE'); + $criteria->addSelectColumn($alias . '.META_DESCRIPTION'); + $criteria->addSelectColumn($alias . '.META_KEYWORDS'); } } diff --git a/core/lib/Thelia/Model/Map/ContentTableMap.php b/core/lib/Thelia/Model/Map/ContentTableMap.php index ae9b908c0..b9d859da3 100644 --- a/core/lib/Thelia/Model/Map/ContentTableMap.php +++ b/core/lib/Thelia/Model/Map/ContentTableMap.php @@ -204,7 +204,7 @@ class ContentTableMap extends TableMap { return array( 'timestampable' => array('create_column' => 'created_at', 'update_column' => 'updated_at', ), - 'i18n' => array('i18n_table' => '%TABLE%_i18n', 'i18n_phpname' => '%PHPNAME%I18n', 'i18n_columns' => 'title, description, chapo, postscriptum', 'locale_column' => 'locale', 'locale_length' => '5', 'default_locale' => '', 'locale_alias' => '', ), + 'i18n' => array('i18n_table' => '%TABLE%_i18n', 'i18n_phpname' => '%PHPNAME%I18n', 'i18n_columns' => 'title, description, chapo, postscriptum, meta_title, meta_description, meta_keywords', 'locale_column' => 'locale', 'locale_length' => '5', 'default_locale' => '', 'locale_alias' => '', ), 'versionable' => array('version_column' => 'version', 'version_table' => '', 'log_created_at' => 'true', 'log_created_by' => 'true', 'log_comment' => 'false', 'version_created_at_column' => 'version_created_at', 'version_created_by_column' => 'version_created_by', 'version_comment_column' => 'version_comment', ), ); } // getBehaviors() diff --git a/core/lib/Thelia/Model/Map/FolderI18nTableMap.php b/core/lib/Thelia/Model/Map/FolderI18nTableMap.php index d10344811..a09b9ef01 100644 --- a/core/lib/Thelia/Model/Map/FolderI18nTableMap.php +++ b/core/lib/Thelia/Model/Map/FolderI18nTableMap.php @@ -57,7 +57,7 @@ class FolderI18nTableMap extends TableMap /** * The total number of columns */ - const NUM_COLUMNS = 6; + const NUM_COLUMNS = 9; /** * The number of lazy-loaded columns @@ -67,7 +67,7 @@ class FolderI18nTableMap extends TableMap /** * The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ - const NUM_HYDRATE_COLUMNS = 6; + const NUM_HYDRATE_COLUMNS = 9; /** * the column name for the ID field @@ -99,6 +99,21 @@ class FolderI18nTableMap extends TableMap */ const POSTSCRIPTUM = 'folder_i18n.POSTSCRIPTUM'; + /** + * the column name for the META_TITLE field + */ + const META_TITLE = 'folder_i18n.META_TITLE'; + + /** + * the column name for the META_DESCRIPTION field + */ + const META_DESCRIPTION = 'folder_i18n.META_DESCRIPTION'; + + /** + * the column name for the META_KEYWORDS field + */ + const META_KEYWORDS = 'folder_i18n.META_KEYWORDS'; + /** * The default string format for model objects of the related table */ @@ -111,12 +126,12 @@ class FolderI18nTableMap extends TableMap * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - self::TYPE_PHPNAME => array('Id', 'Locale', 'Title', 'Description', 'Chapo', 'Postscriptum', ), - self::TYPE_STUDLYPHPNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', ), - self::TYPE_COLNAME => array(FolderI18nTableMap::ID, FolderI18nTableMap::LOCALE, FolderI18nTableMap::TITLE, FolderI18nTableMap::DESCRIPTION, FolderI18nTableMap::CHAPO, FolderI18nTableMap::POSTSCRIPTUM, ), - self::TYPE_RAW_COLNAME => array('ID', 'LOCALE', 'TITLE', 'DESCRIPTION', 'CHAPO', 'POSTSCRIPTUM', ), - self::TYPE_FIELDNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', ), - self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, ) + self::TYPE_PHPNAME => array('Id', 'Locale', 'Title', 'Description', 'Chapo', 'Postscriptum', 'MetaTitle', 'MetaDescription', 'MetaKeywords', ), + self::TYPE_STUDLYPHPNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', 'metaTitle', 'metaDescription', 'metaKeywords', ), + self::TYPE_COLNAME => array(FolderI18nTableMap::ID, FolderI18nTableMap::LOCALE, FolderI18nTableMap::TITLE, FolderI18nTableMap::DESCRIPTION, FolderI18nTableMap::CHAPO, FolderI18nTableMap::POSTSCRIPTUM, FolderI18nTableMap::META_TITLE, FolderI18nTableMap::META_DESCRIPTION, FolderI18nTableMap::META_KEYWORDS, ), + self::TYPE_RAW_COLNAME => array('ID', 'LOCALE', 'TITLE', 'DESCRIPTION', 'CHAPO', 'POSTSCRIPTUM', 'META_TITLE', 'META_DESCRIPTION', 'META_KEYWORDS', ), + self::TYPE_FIELDNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', 'meta_title', 'meta_description', 'meta_keywords', ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, ) ); /** @@ -126,12 +141,12 @@ class FolderI18nTableMap extends TableMap * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - self::TYPE_PHPNAME => array('Id' => 0, 'Locale' => 1, 'Title' => 2, 'Description' => 3, 'Chapo' => 4, 'Postscriptum' => 5, ), - self::TYPE_STUDLYPHPNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, ), - self::TYPE_COLNAME => array(FolderI18nTableMap::ID => 0, FolderI18nTableMap::LOCALE => 1, FolderI18nTableMap::TITLE => 2, FolderI18nTableMap::DESCRIPTION => 3, FolderI18nTableMap::CHAPO => 4, FolderI18nTableMap::POSTSCRIPTUM => 5, ), - self::TYPE_RAW_COLNAME => array('ID' => 0, 'LOCALE' => 1, 'TITLE' => 2, 'DESCRIPTION' => 3, 'CHAPO' => 4, 'POSTSCRIPTUM' => 5, ), - self::TYPE_FIELDNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, ), - self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, ) + self::TYPE_PHPNAME => array('Id' => 0, 'Locale' => 1, 'Title' => 2, 'Description' => 3, 'Chapo' => 4, 'Postscriptum' => 5, 'MetaTitle' => 6, 'MetaDescription' => 7, 'MetaKeywords' => 8, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, 'metaTitle' => 6, 'metaDescription' => 7, 'metaKeywords' => 8, ), + self::TYPE_COLNAME => array(FolderI18nTableMap::ID => 0, FolderI18nTableMap::LOCALE => 1, FolderI18nTableMap::TITLE => 2, FolderI18nTableMap::DESCRIPTION => 3, FolderI18nTableMap::CHAPO => 4, FolderI18nTableMap::POSTSCRIPTUM => 5, FolderI18nTableMap::META_TITLE => 6, FolderI18nTableMap::META_DESCRIPTION => 7, FolderI18nTableMap::META_KEYWORDS => 8, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'LOCALE' => 1, 'TITLE' => 2, 'DESCRIPTION' => 3, 'CHAPO' => 4, 'POSTSCRIPTUM' => 5, 'META_TITLE' => 6, 'META_DESCRIPTION' => 7, 'META_KEYWORDS' => 8, ), + self::TYPE_FIELDNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, 'meta_title' => 6, 'meta_description' => 7, 'meta_keywords' => 8, ), + self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, ) ); /** @@ -156,6 +171,9 @@ class FolderI18nTableMap extends TableMap $this->addColumn('DESCRIPTION', 'Description', 'CLOB', false, null, null); $this->addColumn('CHAPO', 'Chapo', 'LONGVARCHAR', false, null, null); $this->addColumn('POSTSCRIPTUM', 'Postscriptum', 'LONGVARCHAR', false, null, null); + $this->addColumn('META_TITLE', 'MetaTitle', 'VARCHAR', false, 255, null); + $this->addColumn('META_DESCRIPTION', 'MetaDescription', 'LONGVARCHAR', false, null, null); + $this->addColumn('META_KEYWORDS', 'MetaKeywords', 'LONGVARCHAR', false, null, null); } // initialize() /** @@ -359,6 +377,9 @@ class FolderI18nTableMap extends TableMap $criteria->addSelectColumn(FolderI18nTableMap::DESCRIPTION); $criteria->addSelectColumn(FolderI18nTableMap::CHAPO); $criteria->addSelectColumn(FolderI18nTableMap::POSTSCRIPTUM); + $criteria->addSelectColumn(FolderI18nTableMap::META_TITLE); + $criteria->addSelectColumn(FolderI18nTableMap::META_DESCRIPTION); + $criteria->addSelectColumn(FolderI18nTableMap::META_KEYWORDS); } else { $criteria->addSelectColumn($alias . '.ID'); $criteria->addSelectColumn($alias . '.LOCALE'); @@ -366,6 +387,9 @@ class FolderI18nTableMap extends TableMap $criteria->addSelectColumn($alias . '.DESCRIPTION'); $criteria->addSelectColumn($alias . '.CHAPO'); $criteria->addSelectColumn($alias . '.POSTSCRIPTUM'); + $criteria->addSelectColumn($alias . '.META_TITLE'); + $criteria->addSelectColumn($alias . '.META_DESCRIPTION'); + $criteria->addSelectColumn($alias . '.META_KEYWORDS'); } } diff --git a/core/lib/Thelia/Model/Map/FolderTableMap.php b/core/lib/Thelia/Model/Map/FolderTableMap.php index b35f63ae3..0346ee0d3 100644 --- a/core/lib/Thelia/Model/Map/FolderTableMap.php +++ b/core/lib/Thelia/Model/Map/FolderTableMap.php @@ -208,7 +208,7 @@ class FolderTableMap extends TableMap { return array( 'timestampable' => array('create_column' => 'created_at', 'update_column' => 'updated_at', ), - 'i18n' => array('i18n_table' => '%TABLE%_i18n', 'i18n_phpname' => '%PHPNAME%I18n', 'i18n_columns' => 'title, description, chapo, postscriptum', 'locale_column' => 'locale', 'locale_length' => '5', 'default_locale' => '', 'locale_alias' => '', ), + 'i18n' => array('i18n_table' => '%TABLE%_i18n', 'i18n_phpname' => '%PHPNAME%I18n', 'i18n_columns' => 'title, description, chapo, postscriptum, meta_title, meta_description, meta_keywords', 'locale_column' => 'locale', 'locale_length' => '5', 'default_locale' => '', 'locale_alias' => '', ), 'versionable' => array('version_column' => 'version', 'version_table' => '', 'log_created_at' => 'true', 'log_created_by' => 'true', 'log_comment' => 'false', 'version_created_at_column' => 'version_created_at', 'version_created_by_column' => 'version_created_by', 'version_comment_column' => 'version_comment', ), ); } // getBehaviors() diff --git a/core/lib/Thelia/Model/Map/ProductI18nTableMap.php b/core/lib/Thelia/Model/Map/ProductI18nTableMap.php index e082ebccb..1954654e8 100644 --- a/core/lib/Thelia/Model/Map/ProductI18nTableMap.php +++ b/core/lib/Thelia/Model/Map/ProductI18nTableMap.php @@ -110,9 +110,9 @@ class ProductI18nTableMap extends TableMap const META_DESCRIPTION = 'product_i18n.META_DESCRIPTION'; /** - * the column name for the META_KEYWORD field + * the column name for the META_KEYWORDS field */ - const META_KEYWORD = 'product_i18n.META_KEYWORD'; + const META_KEYWORDS = 'product_i18n.META_KEYWORDS'; /** * The default string format for model objects of the related table @@ -126,11 +126,11 @@ class ProductI18nTableMap extends TableMap * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - self::TYPE_PHPNAME => array('Id', 'Locale', 'Title', 'Description', 'Chapo', 'Postscriptum', 'MetaTitle', 'MetaDescription', 'MetaKeyword', ), - self::TYPE_STUDLYPHPNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', 'metaTitle', 'metaDescription', 'metaKeyword', ), - self::TYPE_COLNAME => array(ProductI18nTableMap::ID, ProductI18nTableMap::LOCALE, ProductI18nTableMap::TITLE, ProductI18nTableMap::DESCRIPTION, ProductI18nTableMap::CHAPO, ProductI18nTableMap::POSTSCRIPTUM, ProductI18nTableMap::META_TITLE, ProductI18nTableMap::META_DESCRIPTION, ProductI18nTableMap::META_KEYWORD, ), - self::TYPE_RAW_COLNAME => array('ID', 'LOCALE', 'TITLE', 'DESCRIPTION', 'CHAPO', 'POSTSCRIPTUM', 'META_TITLE', 'META_DESCRIPTION', 'META_KEYWORD', ), - self::TYPE_FIELDNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', 'meta_title', 'meta_description', 'meta_keyword', ), + self::TYPE_PHPNAME => array('Id', 'Locale', 'Title', 'Description', 'Chapo', 'Postscriptum', 'MetaTitle', 'MetaDescription', 'MetaKeywords', ), + self::TYPE_STUDLYPHPNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', 'metaTitle', 'metaDescription', 'metaKeywords', ), + self::TYPE_COLNAME => array(ProductI18nTableMap::ID, ProductI18nTableMap::LOCALE, ProductI18nTableMap::TITLE, ProductI18nTableMap::DESCRIPTION, ProductI18nTableMap::CHAPO, ProductI18nTableMap::POSTSCRIPTUM, ProductI18nTableMap::META_TITLE, ProductI18nTableMap::META_DESCRIPTION, ProductI18nTableMap::META_KEYWORDS, ), + self::TYPE_RAW_COLNAME => array('ID', 'LOCALE', 'TITLE', 'DESCRIPTION', 'CHAPO', 'POSTSCRIPTUM', 'META_TITLE', 'META_DESCRIPTION', 'META_KEYWORDS', ), + self::TYPE_FIELDNAME => array('id', 'locale', 'title', 'description', 'chapo', 'postscriptum', 'meta_title', 'meta_description', 'meta_keywords', ), self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, ) ); @@ -141,11 +141,11 @@ class ProductI18nTableMap extends TableMap * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - self::TYPE_PHPNAME => array('Id' => 0, 'Locale' => 1, 'Title' => 2, 'Description' => 3, 'Chapo' => 4, 'Postscriptum' => 5, 'MetaTitle' => 6, 'MetaDescription' => 7, 'MetaKeyword' => 8, ), - self::TYPE_STUDLYPHPNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, 'metaTitle' => 6, 'metaDescription' => 7, 'metaKeyword' => 8, ), - self::TYPE_COLNAME => array(ProductI18nTableMap::ID => 0, ProductI18nTableMap::LOCALE => 1, ProductI18nTableMap::TITLE => 2, ProductI18nTableMap::DESCRIPTION => 3, ProductI18nTableMap::CHAPO => 4, ProductI18nTableMap::POSTSCRIPTUM => 5, ProductI18nTableMap::META_TITLE => 6, ProductI18nTableMap::META_DESCRIPTION => 7, ProductI18nTableMap::META_KEYWORD => 8, ), - self::TYPE_RAW_COLNAME => array('ID' => 0, 'LOCALE' => 1, 'TITLE' => 2, 'DESCRIPTION' => 3, 'CHAPO' => 4, 'POSTSCRIPTUM' => 5, 'META_TITLE' => 6, 'META_DESCRIPTION' => 7, 'META_KEYWORD' => 8, ), - self::TYPE_FIELDNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, 'meta_title' => 6, 'meta_description' => 7, 'meta_keyword' => 8, ), + self::TYPE_PHPNAME => array('Id' => 0, 'Locale' => 1, 'Title' => 2, 'Description' => 3, 'Chapo' => 4, 'Postscriptum' => 5, 'MetaTitle' => 6, 'MetaDescription' => 7, 'MetaKeywords' => 8, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, 'metaTitle' => 6, 'metaDescription' => 7, 'metaKeywords' => 8, ), + self::TYPE_COLNAME => array(ProductI18nTableMap::ID => 0, ProductI18nTableMap::LOCALE => 1, ProductI18nTableMap::TITLE => 2, ProductI18nTableMap::DESCRIPTION => 3, ProductI18nTableMap::CHAPO => 4, ProductI18nTableMap::POSTSCRIPTUM => 5, ProductI18nTableMap::META_TITLE => 6, ProductI18nTableMap::META_DESCRIPTION => 7, ProductI18nTableMap::META_KEYWORDS => 8, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'LOCALE' => 1, 'TITLE' => 2, 'DESCRIPTION' => 3, 'CHAPO' => 4, 'POSTSCRIPTUM' => 5, 'META_TITLE' => 6, 'META_DESCRIPTION' => 7, 'META_KEYWORDS' => 8, ), + self::TYPE_FIELDNAME => array('id' => 0, 'locale' => 1, 'title' => 2, 'description' => 3, 'chapo' => 4, 'postscriptum' => 5, 'meta_title' => 6, 'meta_description' => 7, 'meta_keywords' => 8, ), self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, ) ); @@ -173,7 +173,7 @@ class ProductI18nTableMap extends TableMap $this->addColumn('POSTSCRIPTUM', 'Postscriptum', 'LONGVARCHAR', false, null, null); $this->addColumn('META_TITLE', 'MetaTitle', 'VARCHAR', false, 255, null); $this->addColumn('META_DESCRIPTION', 'MetaDescription', 'LONGVARCHAR', false, null, null); - $this->addColumn('META_KEYWORD', 'MetaKeyword', 'LONGVARCHAR', false, null, null); + $this->addColumn('META_KEYWORDS', 'MetaKeywords', 'LONGVARCHAR', false, null, null); } // initialize() /** @@ -379,7 +379,7 @@ class ProductI18nTableMap extends TableMap $criteria->addSelectColumn(ProductI18nTableMap::POSTSCRIPTUM); $criteria->addSelectColumn(ProductI18nTableMap::META_TITLE); $criteria->addSelectColumn(ProductI18nTableMap::META_DESCRIPTION); - $criteria->addSelectColumn(ProductI18nTableMap::META_KEYWORD); + $criteria->addSelectColumn(ProductI18nTableMap::META_KEYWORDS); } else { $criteria->addSelectColumn($alias . '.ID'); $criteria->addSelectColumn($alias . '.LOCALE'); @@ -389,7 +389,7 @@ class ProductI18nTableMap extends TableMap $criteria->addSelectColumn($alias . '.POSTSCRIPTUM'); $criteria->addSelectColumn($alias . '.META_TITLE'); $criteria->addSelectColumn($alias . '.META_DESCRIPTION'); - $criteria->addSelectColumn($alias . '.META_KEYWORD'); + $criteria->addSelectColumn($alias . '.META_KEYWORDS'); } } diff --git a/core/lib/Thelia/Model/Map/ProductTableMap.php b/core/lib/Thelia/Model/Map/ProductTableMap.php index 3cf8d3925..35ce5c3b3 100644 --- a/core/lib/Thelia/Model/Map/ProductTableMap.php +++ b/core/lib/Thelia/Model/Map/ProductTableMap.php @@ -230,7 +230,7 @@ class ProductTableMap extends TableMap { return array( 'timestampable' => array('create_column' => 'created_at', 'update_column' => 'updated_at', ), - 'i18n' => array('i18n_table' => '%TABLE%_i18n', 'i18n_phpname' => '%PHPNAME%I18n', 'i18n_columns' => 'title, description, chapo, postscriptum, meta_title, meta_description, meta_keyword', 'locale_column' => 'locale', 'locale_length' => '5', 'default_locale' => '', 'locale_alias' => '', ), + 'i18n' => array('i18n_table' => '%TABLE%_i18n', 'i18n_phpname' => '%PHPNAME%I18n', 'i18n_columns' => 'title, description, chapo, postscriptum, meta_title, meta_description, meta_keywords', 'locale_column' => 'locale', 'locale_length' => '5', 'default_locale' => '', 'locale_alias' => '', ), 'versionable' => array('version_column' => 'version', 'version_table' => '', 'log_created_at' => 'true', 'log_created_by' => 'true', 'log_comment' => 'false', 'version_created_at_column' => 'version_created_at', 'version_created_by_column' => 'version_created_by', 'version_comment_column' => 'version_comment', ), ); } // getBehaviors() diff --git a/core/lib/Thelia/Model/Tools/UrlRewritingTrait.php b/core/lib/Thelia/Model/Tools/UrlRewritingTrait.php index acabbb51f..d8e699322 100644 --- a/core/lib/Thelia/Model/Tools/UrlRewritingTrait.php +++ b/core/lib/Thelia/Model/Tools/UrlRewritingTrait.php @@ -163,7 +163,7 @@ trait UrlRewritingTrait { public function setRewrittenUrl($locale, $url) { $currentUrl = $this->getRewrittenUrl($locale); - if($currentUrl == $url) { + if($currentUrl == $url || null === $url) { /* no url update */ return $this; } diff --git a/core/lib/Thelia/Tests/Action/ContentTest.php b/core/lib/Thelia/Tests/Action/ContentTest.php index a9b61e1db..8db9c08dc 100644 --- a/core/lib/Thelia/Tests/Action/ContentTest.php +++ b/core/lib/Thelia/Tests/Action/ContentTest.php @@ -44,7 +44,6 @@ use Thelia\Tests\TestCaseWithURLToolSetup; */ class ContentTest extends TestCaseWithURLToolSetup { - use RewrittenUrlTestTrait; public function getUpdateEvent(&$content) { @@ -111,7 +110,6 @@ class ContentTest extends TestCaseWithURLToolSetup ->setChapo('test update content short description') ->setDescription('test update content description') ->setPostscriptum('test update content postscriptum') - ->setUrl($content->getRewrittenUrl('en_US')) ->setDefaultFolder($folder->getId()) ; diff --git a/core/lib/Thelia/Tests/Action/FolderTest.php b/core/lib/Thelia/Tests/Action/FolderTest.php index 7be726e4a..83eebc93c 100644 --- a/core/lib/Thelia/Tests/Action/FolderTest.php +++ b/core/lib/Thelia/Tests/Action/FolderTest.php @@ -22,6 +22,7 @@ /*************************************************************************************/ namespace Thelia\Tests\Action; + use Propel\Runtime\ActiveQuery\Criteria; use Thelia\Action\Folder; use Thelia\Core\Event\Folder\FolderCreateEvent; @@ -29,6 +30,7 @@ use Thelia\Core\Event\Folder\FolderDeleteEvent; use Thelia\Core\Event\Folder\FolderToggleVisibilityEvent; use Thelia\Core\Event\Folder\FolderUpdateEvent; use Thelia\Core\Event\UpdatePositionEvent; +use Thelia\Core\Event\UpdateSeoEvent; use Thelia\Model\FolderQuery; use Thelia\Tests\TestCaseWithURLToolSetup; @@ -61,6 +63,29 @@ class FolderTest extends TestCaseWithURLToolSetup return $event; } + public function getUpdateSeoEvent(&$folder) + { + if(!$folder instanceof \Thelia\Model\Folder) { + $folder = $this->getRandomFolder(); + } + + $event = new UpdateSeoEvent($folder->getId()); + + $event + ->setLocale($folder->getLocale()) + ->setMetaTitle($folder->getMetaTitle()) + ->setMetaDescription($folder->getMetaDescription()) + ->setMetaKeywords($folder->getMetaKeywords()); + + return $event; + } + + public function processUpdateSeoAction($event) + { + $contentAction = new Folder($this->getContainer()); + return $contentAction->updateSeo($event); + } + public function processUpdateAction($event) { $contentAction = new Folder($this->getContainer()); @@ -113,7 +138,6 @@ class FolderTest extends TestCaseWithURLToolSetup ->setChapo('test folder update chapo') ->setDescription('update folder description') ->setPostscriptum('update folder postscriptum') - ->setUrl($folder->getRewrittenUrl('en_US')) ->setParent(0) ; diff --git a/core/lib/Thelia/Tests/Action/RewrittenUrlTestTrait.php b/core/lib/Thelia/Tests/Action/RewrittenUrlTestTrait.php index 355248b57..8b5c30398 100644 --- a/core/lib/Thelia/Tests/Action/RewrittenUrlTestTrait.php +++ b/core/lib/Thelia/Tests/Action/RewrittenUrlTestTrait.php @@ -17,7 +17,9 @@ use Thelia\Rewriting\RewritingResolver; trait RewrittenUrlTestTrait { abstract public function getUpdateEvent(&$object); + abstract public function getUpdateSeoEvent(&$object); abstract public function processUpdateAction($event); + abstract public function processUpdateSeoAction($event); /** * @expectedException \Thelia\Form\Exception\FormValidationException @@ -26,7 +28,7 @@ trait RewrittenUrlTestTrait public function testUpdateExistingUrl() { $object = null; - $event = $this->getUpdateEvent($object); + $event = $this->getUpdateSeoEvent($object); /* get an existing url */ $existingUrl = RewritingUrlQuery::create() @@ -41,13 +43,13 @@ trait RewrittenUrlTestTrait $event->setUrl($existingUrl->getUrl()); - $this->processUpdateAction($event); + $this->processUpdateSeoAction($event); } public function testUpdateUrl() { $object = null; - $event = $this->getUpdateEvent($object); + $event = $this->getUpdateSeoEvent($object); $currentUrl = $object->getRewrittenUrl($object->getLocale()); @@ -69,7 +71,7 @@ trait RewrittenUrlTestTrait $event->setUrl($newUrl); - $updatedObject = $this->processUpdateAction($event); + $updatedObject = $this->processUpdateSeoAction($event); /* new URL is updated */ $this->assertEquals($newUrl, $updatedObject->getRewrittenUrl($object->getLocale())); diff --git a/install/thelia.sql b/install/thelia.sql index b399c96d6..1d0ecfb63 100755 --- a/install/thelia.sql +++ b/install/thelia.sql @@ -1635,6 +1635,9 @@ CREATE TABLE `category_i18n` `description` LONGTEXT, `chapo` TEXT, `postscriptum` TEXT, + `meta_title` VARCHAR(255), + `meta_description` TEXT, + `meta_keywords` TEXT, PRIMARY KEY (`id`,`locale`), CONSTRAINT `category_i18n_FK_1` FOREIGN KEY (`id`) @@ -1658,7 +1661,7 @@ CREATE TABLE `product_i18n` `postscriptum` TEXT, `meta_title` VARCHAR(255), `meta_description` TEXT, - `meta_keyword` TEXT, + `meta_keywords` TEXT, PRIMARY KEY (`id`,`locale`), CONSTRAINT `product_i18n_FK_1` FOREIGN KEY (`id`) @@ -1863,6 +1866,9 @@ CREATE TABLE `folder_i18n` `description` LONGTEXT, `chapo` TEXT, `postscriptum` TEXT, + `meta_title` VARCHAR(255), + `meta_description` TEXT, + `meta_keywords` TEXT, PRIMARY KEY (`id`,`locale`), CONSTRAINT `folder_i18n_FK_1` FOREIGN KEY (`id`) @@ -1884,6 +1890,9 @@ CREATE TABLE `content_i18n` `description` LONGTEXT, `chapo` TEXT, `postscriptum` TEXT, + `meta_title` VARCHAR(255), + `meta_description` TEXT, + `meta_keywords` TEXT, PRIMARY KEY (`id`,`locale`), CONSTRAINT `content_i18n_FK_1` FOREIGN KEY (`id`) diff --git a/local/config/schema.xml b/local/config/schema.xml index 785483704..1613abafc 100755 --- a/local/config/schema.xml +++ b/local/config/schema.xml @@ -1,1271 +1,1280 @@ - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
- - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -
- - - - - - - - - - -
-
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
diff --git a/templates/backOffice/default/admin-layout.tpl b/templates/backOffice/default/admin-layout.tpl index da4cdc3e6..6876b5dd5 100755 --- a/templates/backOffice/default/admin-layout.tpl +++ b/templates/backOffice/default/admin-layout.tpl @@ -267,6 +267,6 @@ {* Modules scripts are included now *} {module_include location='footer_js'} - + {block name="javascript-last-call"}{/block} diff --git a/templates/backOffice/default/admin-logs.html b/templates/backOffice/default/admin-logs.html index 80eadbbe5..5ca9f9399 100755 --- a/templates/backOffice/default/admin-logs.html +++ b/templates/backOffice/default/admin-logs.html @@ -231,4 +231,8 @@ }); +{/block} + +{block name="javascript-last-call"} + {module_include location='admin-logs-js'} {/block} \ No newline at end of file diff --git a/templates/backOffice/default/administrators.html b/templates/backOffice/default/administrators.html index a02846c0f..73fd9724d 100755 --- a/templates/backOffice/default/administrators.html +++ b/templates/backOffice/default/administrators.html @@ -355,4 +355,8 @@ jQuery(function($) { }) +{/block} + +{block name="javascript-last-call"} + {module_include location='administrators-js'} {/block} \ No newline at end of file diff --git a/templates/backOffice/default/attribute-edit.html b/templates/backOffice/default/attribute-edit.html index 5952f8b8f..7c82d8b9d 100755 --- a/templates/backOffice/default/attribute-edit.html +++ b/templates/backOffice/default/attribute-edit.html @@ -317,4 +317,8 @@ }); +{/block} + +{block name="javascript-last-call"} + {module_include location='attribute-edit-js'} {/block} \ No newline at end of file diff --git a/templates/backOffice/default/attributes.html b/templates/backOffice/default/attributes.html index ae86c74f6..2fcb8b0ed 100755 --- a/templates/backOffice/default/attributes.html +++ b/templates/backOffice/default/attributes.html @@ -327,4 +327,8 @@ }); +{/block} + +{block name="javascript-last-call"} + {module_include location='attributes-js'} {/block} \ No newline at end of file diff --git a/templates/backOffice/default/categories.html b/templates/backOffice/default/categories.html index e25b79f1e..ecf8c52ec 100755 --- a/templates/backOffice/default/categories.html +++ b/templates/backOffice/default/categories.html @@ -709,4 +709,8 @@ }); +{/block} + +{block name="javascript-last-call"} + {module_include location='categories-js'} {/block} \ No newline at end of file diff --git a/templates/backOffice/default/category-edit.html b/templates/backOffice/default/category-edit.html index 35a442e37..4bd5d81ad 100755 --- a/templates/backOffice/default/category-edit.html +++ b/templates/backOffice/default/category-edit.html @@ -6,296 +6,293 @@ {block name="page-title"}{intl l='Edit category'}{/block} {block name="main-content"} -
-
- {include file="includes/catalog-breadcrumb.html" editing_category="true"} +
+
-
- {loop name="category_edit" type="category" visible="*" id="{$category_id}" backend_context="1" lang="$edit_language_id"} -
-
-
- {intl l='Edit category %title' title=$TITLE} -
+ {include file="includes/catalog-breadcrumb.html" editing_category="true"} -
+
+ {loop name="category_edit" type="category" visible="*" id="{$category_id}" backend_context="1" lang="$edit_language_id"} - {if $HAS_PREVIOUS != 0} - - {else} - - {/if} + {* Define close url *} + {if $PARENT gt 0} + {assign var='close_url' value="{url path='/admin/categories' category_id=$PARENT}"} + {else} + {assign var='close_url' value="{url path='/admin/catalog'}"} + {/if} - - {if $HAS_NEXT != 0} - - {else} - - {/if} -
-
+
+
+
+ {intl l='Edit category %title' title=$TITLE} +
-
-
+
+ + + +
+
- +
+
-
+ -
+
-
+
- {form name="thelia.admin.category.modification"} - +
- {include file="includes/inner-form-toolbar.html" close_url="{url path='/admin/categories' category_id=$PARENT}"} + {form name="thelia.admin.category.modification"} + - {* Be sure to get the category ID, even if the form could not be validated *} - + {include + file="includes/inner-form-toolbar.html" + close_url=$close_url + } - + {* Be sure to get the category ID, even if the form could not be validated *} + + - {form_hidden_fields form=$form} + {form_hidden_fields form=$form} - {form_field form=$form field='success_url'} - - {/form_field} + {form_field form=$form field='success_url'} + + {/form_field} - {form_field form=$form field='locale'} - - {/form_field} + {* Display error message if exist *} + {include file='includes/notifications.html' message=$form_error_message} - {if $form_error}
{$form_error_message}
{/if} +
+
+ {include file="includes/standard-description-form-fields.html"} +
- {include file="includes/standard-description-form-fields.html"} +
+ {form_field form=$form field='parent'} +
- {form_field form=$form field='url'} -
- + - -
- {/form_field} + +
+ {/form_field} - -
- {/form_field} -
- -
- {form_field form=$form field='visible'} -
- -
- -
-
- {/form_field} + {form_field form=$form field='visible'} +
+ +
+ +
+
+ {/form_field} +
-
-
-
-
-   -
-

{intl l='Category created on %date_create. Last modification: %date_change' date_create="{format_date date=$CREATE_DATE}" date_change="{format_date date=$UPDATE_DATE}"}

+ {include + file="includes/inner-form-toolbar.html" + hide_submit_buttons = false + hide_flags = true + close_url=$close_url + } + + {intl l='Category created on %date_create. Last modification: %date_change' date_create="{format_date date=$CREATE_DATE}" date_change="{format_date date=$UPDATE_DATE}"} + + + {/form} +
+
+ +
+ {form name="thelia.admin.seo"} + {include file="includes/seo-tab.html" + form = $form + formAction = "{url path='/admin/categories/seo/save'}" + current_id=$ID + closeUrl = $close_url + } + {/form} +
+ +
+
+
+
+ +
+
+
+ + + + +
+ + {intl l='Select a content and click (+) to add it to this category'} +
+ +
+
+ {intl l="No available content in this folder"} +
+
+
+ +
+ {/ifloop} + + {elseloop rel="folders"} +
{intl l="No folders found"}
+ {/elseloop} + +
- - {/form} -
-
+
+ + + + -
-
-
- +
- {include - file="includes/inner-form-toolbar.html" - hide_submit_buttons=true - close_url="{url path='/admin/categories' category_id=$PARENT}" - } + {module_include location='category_contents_table_header'} -

{intl l='Related content'}

-

{intl l='You can attach here some content to this category'}

+ + + - - + + {loop name="assigned_contents" type="associated_content" category="$ID" backend_context="1" lang="$edit_language_id"} + + - {ifloop rel="folders"} -
+
-
-
- -
- {intl l='Select a folder to get its content'} -
+ {module_include location='category_contents_table_row'} -
-
-
- - - - -
+
+ + {/loop} - {intl l='Select a content and click (+) to add it to this category'} - + {elseloop rel="assigned_contents"} + + + + {/elseloop} + +
{intl l='ID'}{intl l='Content title'}{intl l="Actions"}
{$ID}{$TITLE} +
+ {loop type="auth" name="can_create" role="ADMIN" resource="admin.configuration.category" access="UPDATE"} + + + + {/loop} +
+
+
+ {intl l="This category contains no contents"} +
+
+
+
+
-
-
- {intl l="No available content in this folder"} -
-
-
+
+ {include file='includes/image-upload-form.html' imageType='category' parentId=$ID} +
-
- {/ifloop} +
+ {include file='includes/document-upload-form.html' documentType='category' parentId=$ID} +
- {elseloop rel="folders"} -
{intl l="No folders found"}
- {/elseloop} - - -
- -
- - - - - - - - {module_include location='category_contents_table_header'} - - - - - - - {loop name="assigned_contents" type="associated_content" category="$category_id" backend_context="1" lang="$edit_language_id"} - - - - - - {module_include location='category_contents_table_row'} - - - - {/loop} - - {elseloop rel="assigned_contents"} - - - - {/elseloop} - -
{intl l='ID'}{intl l='Content title'}{intl l="Actions"}
{$ID} - {$TITLE} - -
- {loop type="auth" name="can_create" role="ADMIN" resource="admin.configuration.category" access="UPDATE"} - - - - {/loop} -
-
-
- {intl l="This category contains no contents"} -
-
-
-
-
- -
- {include file='includes/image-upload-form.html' imageType='category' parentId=$category_id} -
- -
- {include file='includes/document-upload-form.html' documentType='category' parentId=$category_id} -
- -
-
-
+
+ {module_include location='category-edit'} +
+
+
-
- {/loop} -
-
-
+ {/loop} + + + -{* Delete related content confirmation dialog *} + {* Delete related content confirmation dialog *} -{capture "delete_content_dialog"} - - - + {capture "delete_content_dialog"} + + + - -{/capture} + + {/capture} -{include - file = "includes/generic-confirm-dialog.html" + {include + file = "includes/generic-confirm-dialog.html" - dialog_id = "delete_content_dialog" - dialog_title = {intl l="Remove related content"} - dialog_message = {intl l="Do you really want to remove this related content ?"} + dialog_id = "delete_content_dialog" + dialog_title = {intl l="Remove related content"} + dialog_message = {intl l="Do you really want to remove this related content ?"} - form_action = {url path='/admin/categories/related-content/delete'} - form_content = {$smarty.capture.delete_content_dialog nofilter} -} + form_action = {url path='/admin/categories/related-content/delete'} + form_content = {$smarty.capture.delete_content_dialog nofilter} + } {/block} {block name="javascript-initialization"} @@ -347,6 +344,9 @@ $(function() { $('#folder_delete_id').val($('#folder_id').val()); }); + // Load active tab + $('.nav-tabs a[href="#{$current_tab}"]').trigger("click"); + // Load content on folder selection $('#folder_id').change(function(event) { @@ -393,4 +393,8 @@ $(function() { }); +{/block} + +{block name="javascript-last-call"} + {module_include location='category-edit-js'} {/block} \ No newline at end of file diff --git a/templates/backOffice/default/config-store.html b/templates/backOffice/default/config-store.html index 2355f3b66..14f4bef81 100755 --- a/templates/backOffice/default/config-store.html +++ b/templates/backOffice/default/config-store.html @@ -168,3 +168,7 @@ {/block} + +{block name="javascript-last-call"} + {module_include location='config-store-js'} +{/block} diff --git a/templates/backOffice/default/configuration.html b/templates/backOffice/default/configuration.html index debaaa6fb..ae6ce634c 100755 --- a/templates/backOffice/default/configuration.html +++ b/templates/backOffice/default/configuration.html @@ -189,4 +189,8 @@ +{/block} + +{block name="javascript-last-call"} + {module_include location='configuration-js'} {/block} \ No newline at end of file diff --git a/templates/backOffice/default/content-edit.html b/templates/backOffice/default/content-edit.html index 73edaa5ac..1014d512c 100755 --- a/templates/backOffice/default/content-edit.html +++ b/templates/backOffice/default/content-edit.html @@ -42,7 +42,7 @@