From 86078d3054ac0927a94d3e09476eb383afb96189 Mon Sep 17 00:00:00 2001 From: mespeche Date: Wed, 18 Sep 2013 19:33:24 +0200 Subject: [PATCH 01/51] - Edit shipping_zone routes - Create shipping_configuration routes --- .../Thelia/Config/Resources/routing/admin.xml | 21 ++++++--- .../Admin/ShippingConfigurationController.php | 46 +++++++++++++++++++ .../Admin/ShippingZoneController.php | 2 +- .../admin/default/shipping-configuration.html | 0 templates/admin/default/shipping-zones.html | 8 ++-- 5 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 core/lib/Thelia/Controller/Admin/ShippingConfigurationController.php create mode 100644 templates/admin/default/shipping-configuration.html diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index 50b622451..af7b7e445 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -405,17 +405,26 @@ - + Thelia\Controller\Admin\ShippingZoneController::indexAction - - Thelia\Controller\Admin\ShippingZoneController::createAction + + Thelia\Controller\Admin\ShippingZoneController::updateAction + \d+ - - Thelia\Controller\Admin\ShippingZoneController::updateAction - \d+ + + + + + + Thelia\Controller\Admin\ShippingConfigurationController::indexAction + + + + Thelia\Controller\Admin\ShippingConfigurationController::updateAction + \d+ diff --git a/core/lib/Thelia/Controller/Admin/ShippingConfigurationController.php b/core/lib/Thelia/Controller/Admin/ShippingConfigurationController.php new file mode 100644 index 000000000..71aa0ba2f --- /dev/null +++ b/core/lib/Thelia/Controller/Admin/ShippingConfigurationController.php @@ -0,0 +1,46 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Controller\Admin; + +/** + * Class ShippingConfigurationController + * @package Thelia\Controller\Admin + * @author Manuel Raynaud + */ +class ShippingConfigurationController extends BaseAdminController +{ + public function indexAction() + { + if (null !== $response = $this->checkAuth("admin.shipping-configuration.view")) return $response; + return $this->render("shipping-configuration", array("display_shipping_configuration" => 20)); + } + + public function updateAction($shipping_configuration_id) + { + + return $this->render("shipping-configuration-edit", array( + "shipping_configuration_id" => $shipping_configuration_id + )); + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Controller/Admin/ShippingZoneController.php b/core/lib/Thelia/Controller/Admin/ShippingZoneController.php index 8be799a73..ee34d11bd 100644 --- a/core/lib/Thelia/Controller/Admin/ShippingZoneController.php +++ b/core/lib/Thelia/Controller/Admin/ShippingZoneController.php @@ -24,7 +24,7 @@ namespace Thelia\Controller\Admin; /** - * Class FolderController + * Class ShippingZoneController * @package Thelia\Controller\Admin * @author Manuel Raynaud */ diff --git a/templates/admin/default/shipping-configuration.html b/templates/admin/default/shipping-configuration.html new file mode 100644 index 000000000..e69de29bb diff --git a/templates/admin/default/shipping-zones.html b/templates/admin/default/shipping-zones.html index 7d9af91fe..9cb7fbc59 100644 --- a/templates/admin/default/shipping-zones.html +++ b/templates/admin/default/shipping-zones.html @@ -44,7 +44,7 @@ {if ! $SECURED}
{loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-zones.change"} - + {/loop}
{else} @@ -61,7 +61,7 @@ {if ! $SECURED}
{loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-zones.change"} - + {/loop}
{else} @@ -78,7 +78,7 @@ {if ! $SECURED}
{loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-zones.change"} - + {/loop}
{else} @@ -113,7 +113,7 @@ dialog_title = {intl l="Delete shipping zone"} dialog_message = {intl l="Do you really want to delete this shipping zone ?"} - form_action = {url path='/admin/configuration/shipping-zones/delete'} + form_action = {url path='/admin/configuration/shipping_zones/delete'} form_content = {$smarty.capture.delete_dialog nofilter} } {/block} \ No newline at end of file From 18d9e0317217afc29075aa1d7b35b63afb521dde Mon Sep 17 00:00:00 2001 From: mespeche Date: Wed, 18 Sep 2013 23:14:29 +0200 Subject: [PATCH 02/51] Finish shipping configuration default view --- .../admin/default/shipping-configuration.html | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) diff --git a/templates/admin/default/shipping-configuration.html b/templates/admin/default/shipping-configuration.html index e69de29bb..ae9090c70 100644 --- a/templates/admin/default/shipping-configuration.html +++ b/templates/admin/default/shipping-configuration.html @@ -0,0 +1,164 @@ +{extends file="admin-layout.tpl"} + +{block name="page-title"}{intl l='Thelia Shipping configuration'}{/block} + +{block name="check-permissions"}admin.configuration.shipping-configuration.view{/block} + +{block name="main-content"} +
+ +
+ + + + {module_include location='shipping_configuration_top'} + +
+
+
+ + + + + + + {module_include location='shipping_configuration_table_header'} + + + + + + + + + + {module_include location='shipping_configuration_table_row'} + + + + + + + {module_include location='shipping_configuration_table_row'} + + + + + + + {module_include location='shipping_configuration_table_row'} + + + + +
+ {intl l='Thelia Shipping configuration'} + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.shipping-configuration.create"} + + + + {/loop} +
{intl l="Description"}{intl l="Actions"}
France + {if ! $SECURED} +
+ {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-configuration.change"} + + {/loop} + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.shipping-configuration.delete"} + + {/loop} +
+ {else} + + {/if} +
Outre-Mer DOM + {if ! $SECURED} +
+ {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-configuration.change"} + + {/loop} + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.shipping-configuration.delete"} + + {/loop} +
+ {else} + + {/if} +
Outre-Mer TOM + {if ! $SECURED} +
+ {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-configuration.change"} + + {/loop} + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.shipping-configuration.delete"} + + {/loop} +
+ {else} + + {/if} +
+
+
+
+ + {module_include location='shipping_configuration_bottom'} + +
+
+ + {* Adding a new Shipping configuration *} + + {* Capture the dialog body, to pass it to the generic dialog *} + {capture "creation_dialog"} + + +
+ + +
+ + + {module_include location='shipping_configuration_create_form'} + + {/capture} + + {include + file = "includes/generic-create-dialog.html" + + dialog_id = "creation_dialog" + dialog_title = {intl l="Create a new shipping configuration"} + dialog_body = {$smarty.capture.creation_dialog nofilter} + + dialog_ok_label = {intl l="Create this shipping configuration"} + dialog_cancel_label = {intl l="Cancel"} + + form_action = {url path='/admin/configuration/configuration/shipping_configuration/create'} + form_enctype = '' + form_error_message = $form_error_message + } + + {* Delete confirmation dialog *} + + {capture "delete_dialog"} + + + {module_include location='shipping_configuration_delete_form'} + + {/capture} + + {include + file = "includes/generic-confirm-dialog.html" + + dialog_id = "delete_dialog" + dialog_title = {intl l="Delete shipping configuration"} + dialog_message = {intl l="Do you really want to delete this shipping configuration ?"} + + form_action = {url path='/admin/configuration/shipping_configuration/delete'} + form_content = {$smarty.capture.delete_dialog nofilter} + } +{/block} \ No newline at end of file From a02ba364bebbc1a5da5e96de862e51e043f45f9b Mon Sep 17 00:00:00 2001 From: mespeche Date: Thu, 19 Sep 2013 10:15:14 +0200 Subject: [PATCH 03/51] Change background image to simple background color --- templates/admin/default/assets/less/thelia/scaffolding.less | 5 +++-- web/install/styles.css | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/templates/admin/default/assets/less/thelia/scaffolding.less b/templates/admin/default/assets/less/thelia/scaffolding.less index 1309638e4..01b6fbaf7 100755 --- a/templates/admin/default/assets/less/thelia/scaffolding.less +++ b/templates/admin/default/assets/less/thelia/scaffolding.less @@ -7,8 +7,9 @@ // ------------------------- body { - background: #FFF url("@{imgDir}/bg.jpg") top left no-repeat; - background-size: cover; + // background: #FFF url("@{imgDir}/bg.jpg") top left no-repeat; + // background-size: cover; + background-color: #eee; } diff --git a/web/install/styles.css b/web/install/styles.css index 98454c60e..192f23559 100755 --- a/web/install/styles.css +++ b/web/install/styles.css @@ -5822,8 +5822,9 @@ fieldset[disabled] .navbar .btn.active { background-color: #fff; } body { - background: #FFF url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAyAAD/4QMtaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6REQxQTRFNjExMUMwMTFFMzgyRkZGOEQ5NUMwQUQyQjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6REQxQTRFNjIxMUMwMTFFMzgyRkZGOEQ5NUMwQUQyQjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpERDFBNEU1RjExQzAxMUUzODJGRkY4RDk1QzBBRDJCOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpERDFBNEU2MDExQzAxMUUzODJGRkY4RDk1QzBBRDJCOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uACFBZG9iZQBkwAAAAAEDABADAwYJAAB+qwAAf6kAAMQb/9sA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JQiiKIoigAAAAAAAAACKIoiiKIoiiKAAAAAAAAAAJQiiKIoigApRSKIqIspKIsAQAAVZQFIoiolAACKqKIokoiiKSKIpZQKIoioiiSqiwSkiiKJQFWKIoiiLAEiiKIoiiKLK1JQAAAAAFIoiiLACKiKIoiligAAIAAAASiKqKIoiiKIoiiKIolAIACpQAAAAAACAAAAAAAAAAAAAFAACLAAAAAAAAAACKIoiiKIoiiKIoiiUEoigAACKIoiiKIoiiKJQAAASiKIoiiKJQiiKIoiiKIoAUBViiKIogSLAAAABQAKWKAQAFiiKIsQCLAoiiUAAAAAIsAIoiiKAAAAAAIoiiKIoiqhSyrAAAAAAgAAABKIoiiAAAFIoiiKIoiiKIoiiKIoiiKIoiiKIoiiKIsCwAKIUiiKIoiiKIoiiKIoiiKIoiiKIoiiUUAIKIogqKIoiiKIoikiliiKIAsAQAAAAAUiiKIoiiKIsAABSLAAoiiKIoiiKIoiiKIpYqIqyKIoiiKIoiiKJSUUAAAASiAiiKIoigBZQAAAAAABKIAAAAUlCKIogAEoiqikiiKWKSKIqWKsgAAAAAAAKoiiKIoiiUAAAAEoiiKIsAAAAAAAAAAAAAAAAAAAACwAAAAAAAFIUiwKIoiiKIoiiKIoiiKIoiiKIoigJQEqopIoiiKIoiiKIogAAAAAAAAAACiKIsCwAAAAAAAFIoiiKIohSKIoiiKIsAAAAAAACgJQAAAAEqosQoiiKIoigJQAAAAAAEqopJQCUAAAACKsiiLAAUiiAFIsAAAAAAAAAKoiiKIoiiKIoiiKIoiiKIogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACiKIoiiKIoiiKIoiiKIoiiKIohSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKIolACKIoiwAAAFIoiiKIsBSKIoiiKIoiiAKIoiiKIoiiKIogAACiKIoiiKIAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIoiiKIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSKIoiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAA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) top left no-repeat; - background-size: cover; + /*background: #FFF url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAyAAD/4QMtaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6REQxQTRFNjExMUMwMTFFMzgyRkZGOEQ5NUMwQUQyQjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6REQxQTRFNjIxMUMwMTFFMzgyRkZGOEQ5NUMwQUQyQjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpERDFBNEU1RjExQzAxMUUzODJGRkY4RDk1QzBBRDJCOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpERDFBNEU2MDExQzAxMUUzODJGRkY4RDk1QzBBRDJCOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uACFBZG9iZQBkwAAAAAEDABADAwYJAAB+qwAAf6kAAMQb/9sA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JQiiKIoigAAAAAAAAACKIoiiKIoiiKAAAAAAAAAAJQiiKIoigApRSKIqIspKIsAQAAVZQFIoiolAACKqKIokoiiKSKIpZQKIoioiiSqiwSkiiKJQFWKIoiiLAEiiKIoiiKLK1JQAAAAAFIoiiLACKiKIoiligAAIAAAASiKqKIoiiKIoiiKIolAIACpQAAAAAACAAAAAAAAAAAAAFAACLAAAAAAAAAACKIoiiKIoiiKIoiiUEoigAACKIoiiKIoiiKJQAAASiKIoiiKJQiiKIoiiKIoAUBViiKIogSLAAAABQAKWKAQAFiiKIsQCLAoiiUAAAAAIsAIoiiKAAAAAAIoiiKIoiqhSyrAAAAAAgAAABKIoiiAAAFIoiiKIoiiKIoiiKIoiiKIoiiKIoiiKIsCwAKIUiiKIoiiKIoiiKIoiiKIoiiKIoiiUUAIKIogqKIoiiKIoikiliiKIAsAQAAAAAUiiKIoiiKIsAABSLAAoiiKIoiiKIoiiKIpYqIqyKIoiiKIoiiKJSUUAAAASiAiiKIoigBZQAAAAAABKIAAAAUlCKIogAEoiqikiiKWKSKIqWKsgAAAAAAAKoiiKIoiiUAAAAEoiiKIsAAAAAAAAAAAAAAAAAAAACwAAAAAAAFIUiwKIoiiKIoiiKIoiiKIoiiKIoigJQEqopIoiiKIoiiKIogAAAAAAAAAACiKIsCwAAAAAAAFIoiiKIohSKIoiiKIsAAAAAAACgJQAAAAEqosQoiiKIoigJQAAAAAAEqopJQCUAAAACKsiiLAAUiiAFIsAAAAAAAAAKoiiKIoiiKIoiiKIoiiKIogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACiKIoiiKIoiiKIoiiKIoiiKIohSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKIolACKIoiwAAAFIoiiKIsBSKIoiiKIoiiAKIoiiKIoiiKIogAACiKIoiiKIAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIoiiKIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSKIoiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAA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) top left no-repeat; + background-size: cover;*/ + background-color: #eee; } a { font-weight: bold; From 96ffe88938786b0175f8a0930d72d7c6d44cec8d Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Thu, 19 Sep 2013 12:30:35 +0200 Subject: [PATCH 04/51] fix loop image argument --- templates/default/product.html | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/templates/default/product.html b/templates/default/product.html index a7cae0d34..329f674cd 100644 --- a/templates/default/product.html +++ b/templates/default/product.html @@ -23,7 +23,8 @@ {/loop} diff --git a/templates/admin/default/currencies.html b/templates/admin/default/currencies.html index fe4cfe882..11b52cd24 100644 --- a/templates/admin/default/currencies.html +++ b/templates/admin/default/currencies.html @@ -23,166 +23,166 @@
- - - - - - - - - - - - - - - - - - - - {module_include location='currencies_table_header'} - - - - - - - {loop name="currencies" type="currency" backend_context="1" lang=$lang_id order=$order} +
+
- {intl l='Currencies'} - {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.currencies.create"} - - - - - - - {/loop} -
- {admin_sortable_header - current_order=$order - order='id' - reverse_order='id_reverse' - path='/admin/configuration/currencies' - label="{intl l='ID'}" - } - - {admin_sortable_header - current_order=$order - order='name' - reverse_order='name_reverse' - path='/admin/configuration/currencies' - label="{intl l='Name'}" - } - - {admin_sortable_header - current_order=$order - order='code' - reverse_order='code_reverse' - path='/admin/configuration/currencies' - label="{intl l="ISO 4217 Code"}" - } - - - {admin_sortable_header - current_order=$order - order='symbol' - reverse_order='symbol_reverse' - path='/admin/configuration/currencies' - label="{intl l="Symbol"}" - } - - {admin_sortable_header - current_order=$order - order='rate' - reverse_order='rate_reverse' - path='/admin/configuration/currencies' - label="{intl l="Rate in €"}" - } - - {admin_sortable_header - current_order=$order - order='manual' - reverse_order='manual_reverse' - path='/admin/configuration/currencies' - label="{intl l="Position"}" - } - - {admin_sortable_header - current_order=$order - order='is_default' - reverse_order='is_default_reverse' - path='/admin/configuration/currencies' - label="{intl l="Default"}" - } - {intl l='Actions'}
+ + - - - - - - - - - - - - + - {module_include location='currencies_table_row'} + - + + + + + + + + {module_include location='currencies_table_header'} + + + + + + + {loop name="currencies" type="currency" backend_context="1" lang=$lang_id order=$order} + + + + - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.currencies.delete"} - - - - {/loop} - - - - {/loop} - {elseloop rel="currencies"} - - - - {/elseloop} - -
+ {intl l='Currencies'} + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.currencies.create"} + + + + + + + {/loop} +
{$ID} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.currencies.change"} - {$NAME} - {/loop} - {elseloop rel="can_change"} - {$NAME} - {/elseloop} - {$ISOCODE}{$SYMBOL}{format_number number="$RATE" decimals="4"} - {admin_position_block - permission="admin.currencies.edit" - path="/admin/configuration/currencies/update-position" - url_parameter="currency_id" - in_place_edit_class="currencyPositionChange" - position="$POSITION" - id="$ID" + + {admin_sortable_header + current_order=$order + order='id' + reverse_order='id_reverse' + path='/admin/configuration/currencies' + label="{intl l='ID'}" } - + -
- -
-
+ {admin_sortable_header + current_order=$order + order='name' + reverse_order='name_reverse' + path='/admin/configuration/currencies' + label="{intl l='Name'}" + } + + {admin_sortable_header + current_order=$order + order='code' + reverse_order='code_reverse' + path='/admin/configuration/currencies' + label="{intl l="ISO 4217 Code"}" + } + + -
+
+ {admin_sortable_header + current_order=$order + order='symbol' + reverse_order='symbol_reverse' + path='/admin/configuration/currencies' + label="{intl l="Symbol"}" + } + + {admin_sortable_header + current_order=$order + order='rate' + reverse_order='rate_reverse' + path='/admin/configuration/currencies' + label="{intl l="Rate in €"}" + } + + {admin_sortable_header + current_order=$order + order='manual' + reverse_order='manual_reverse' + path='/admin/configuration/currencies' + label="{intl l="Position"}" + } + + {admin_sortable_header + current_order=$order + order='is_default' + reverse_order='is_default_reverse' + path='/admin/configuration/currencies' + label="{intl l="Default"}" + } + {intl l='Actions'}
{$ID} {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.currencies.change"} - - - + {$NAME} {/loop} + {elseloop rel="can_change"} + {$NAME} + {/elseloop} +
-
- {intl l="No currency has been created yet. Click the + button to create one."} -
-
+ {$ISOCODE} + {$SYMBOL} + + {format_number number="$RATE" decimals="4"} + + + {admin_position_block + permission="admin.currencies.edit" + path="/admin/configuration/currencies/update-position" + url_parameter="currency_id" + in_place_edit_class="currencyPositionChange" + position="$POSITION" + id="$ID" + } + + + +
+ +
+ + + {module_include location='currencies_table_row'} + + +
+ {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.currencies.change"} + + + + {/loop} + + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.currencies.delete"} + + + + {/loop} +
+ + + {/loop} + {elseloop rel="currencies"} + + +
+ {intl l="No currency has been created yet. Click the + button to create one."} +
+ + + {/elseloop} + + +
diff --git a/templates/admin/default/customer-edit.html b/templates/admin/default/customer-edit.html index 10f4f3abf..9bcba75b9 100644 --- a/templates/admin/default/customer-edit.html +++ b/templates/admin/default/customer-edit.html @@ -142,52 +142,54 @@

+ +
+ + + + + + + + + {loop name="address" type="address" customer="$customer_id" backend_context="1" default="0"} + + + + + {/loop} + +
{intl l="Address"}{intl l="Actions"}
+
+ {loop name="address.title" type="title" id=$TITLE}{$SHORT}{/loop} {$FIRSTNAME} {$LASTNAME}
+ {$ADDRESS1}
+ {$ADDRESS2}
+ {$ADDRESS3}
+ {if $PHONE} + P: {$PHONE}
+ {/if} + {if $CELLPHONE} + P: {$CELLPHONE} + {/if} +
+
+
- - - - - - - - - {loop name="address" type="address" customer="$customer_id" backend_context="1" default="0"} - - - - - {/loop} - -
{intl l="Address"}{intl l="Actions"}
-
- {loop name="address.title" type="title" id=$TITLE}{$SHORT}{/loop} {$FIRSTNAME} {$LASTNAME}
- {$ADDRESS1}
- {$ADDRESS2}
- {$ADDRESS3}
- {if $PHONE} - P: {$PHONE}
- {/if} - {if $CELLPHONE} - P: {$CELLPHONE} - {/if} -
-
- -
+
+
+
diff --git a/templates/admin/default/customers.html b/templates/admin/default/customers.html index 6a10b7801..9d74835d7 100644 --- a/templates/admin/default/customers.html +++ b/templates/admin/default/customers.html @@ -22,121 +22,123 @@
- -
- {intl l="Customers list"} +
+ + + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.customers.create"} + + + + {/loop} + - {ifloop rel="customer_list"} - - - - - - - {module_include location='category_list_header'} - - - - - - - - - - - - - {loop name="customer_list" type="customer" current="false" visible="*" last_order="1" backend_context="1" page={$customer_page} limit={$display_customer}} + {ifloop rel="customer_list"} + - + - + - + {module_include location='category_list_header'} - {module_include location='customer_list_row'} + - + - - + + - {/loop} - - - - + {loop name="customer_list" type="customer" current="false" visible="*" last_order="1" backend_context="1" page={$customer_page} limit={$display_customer}} + + - {else} -
  • {$PAGE}
  • - {/if} + + + + + {module_include location='customer_list_row'} + + + + + + + + {/loop} + + + + - - - {/ifloop} -
    + {intl l="Customers list"} - {module_include location='customer_list_caption'} + {module_include location='customer_list_caption'} - {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.customers.create"} - - - - {/loop} -
    - {intl l="customer ref"} - - {intl l="company"} - - {intl l="firstname & lastname"} - - {intl l="last order"} - {intl l='order amount'}{intl l='Actions'}
    {$REF} + {intl l="customer ref"} + - {$COMPANY} - + {intl l="company"} + - {$FIRSTNAME} {$LASTNAME} - + {intl l="firstname & lastname"} + - {format_date date=$LASTORDER_DATE} - + {intl l="last order"} + - {format_number number=$LASTORDER_AMOUNT} - -
    - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.customer.edit"} - - {/loop} - {loop type="auth" name="can_send_mail" roles="ADMIN" permissions="admin.customer.sendMail"} - - {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.customer.delete"} - - {/loop} -
    -
    {intl l='order amount'}{intl l='Actions'}
    - -
    -
      - {if $customer_page != 1} -
    • «
    • - {else} -
    • «
    • - {/if} + - {pageloop rel="customer_list"} - {if $PAGE != $CURRENT} -
    • {$PAGE}
    • +
    {$REF} + {$COMPANY} + + {$FIRSTNAME} {$LASTNAME} + + {format_date date=$LASTORDER_DATE} + + {format_number number=$LASTORDER_AMOUNT} + +
    + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.customer.edit"} + + {/loop} + {loop type="auth" name="can_send_mail" roles="ADMIN" permissions="admin.customer.sendMail"} + + {/loop} + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.customer.delete"} + + {/loop} +
    +
    + +
    +
      + {if $customer_page != 1} +
    • «
    • + {else} +
    • «
    • + {/if} + + {pageloop rel="customer_list"} + {if $PAGE != $CURRENT} +
    • {$PAGE}
    • + + {else} +
    • {$PAGE}
    • + {/if} - {/pageloop} - {if $PAGE == $LAST && $LAST != $CURRENT} -
    • »
    • - {else} -
    • »
    • - {/if} -
    -
    - -
    + {/pageloop} + {if $PAGE == $LAST && $LAST != $CURRENT} +
  • »
  • + {else} +
  • »
  • + {/if} + +
    + + + + + {/ifloop} +
    +
    diff --git a/templates/admin/default/feature-edit.html b/templates/admin/default/feature-edit.html index 7bbed5965..a21c63f61 100644 --- a/templates/admin/default/feature-edit.html +++ b/templates/admin/default/feature-edit.html @@ -77,95 +77,97 @@
    {intl l="Enter here all possible feature values."}
    + +
    + + + + -
    + {admin_sortable_header + current_order=$featureav_order + order='id' + reverse_order='id_reverse' + request_parameter_name='featureav_order' + path={url path='/admin/configuration/features/update' feature_id=$feature_id} + label="{intl l='ID'}" + } +
    - - - + - + - + {module_include location='features_value_table_header'} - {module_include location='features_value_table_header'} + + + - - - + + {loop name="list" type="feature_availability" feature=$feature_id backend_context="1" lang=$edit_language_id order=$featureav_order} + + - - {loop name="list" type="feature_availability" feature=$feature_id backend_context="1" lang=$edit_language_id order=$featureav_order} - - + - + - + {module_include location='features_value_table_row'} - {module_include location='features_value_table_row'} + + + {/loop} - - - {/loop} - - {elseloop rel="list"} - - - - {/elseloop} - -
    - {admin_sortable_header - current_order=$featureav_order - order='id' - reverse_order='id_reverse' - request_parameter_name='featureav_order' - path={url path='/admin/configuration/features/update' feature_id=$feature_id} - label="{intl l='ID'}" - } - + {admin_sortable_header + current_order=$featureav_order + order='alpha' + reverse_order='alpha_reverse' + request_parameter_name='featureav_order' + path={url path='/admin/configuration/features/update' feature_id=$feature_id} + label="{intl l='Value'}" + } + - {admin_sortable_header - current_order=$featureav_order - order='alpha' - reverse_order='alpha_reverse' - request_parameter_name='featureav_order' - path={url path='/admin/configuration/features/update' feature_id=$feature_id} - label="{intl l='Value'}" - } - + {admin_sortable_header + current_order=$featureav_order + order='manual' + reverse_order='manual_reverse' + request_parameter_name='featureav_order' + path={url path='/admin/configuration/features/update' feature_id=$feature_id} + label="{intl l="Position"}" + } + - {admin_sortable_header - current_order=$featureav_order - order='manual' - reverse_order='manual_reverse' - request_parameter_name='featureav_order' - path={url path='/admin/configuration/features/update' feature_id=$feature_id} - label="{intl l="Position"}" - } - {intl l="Actions"}
    {intl l="Actions"}
    {$ID}
    {$ID} + {* FIXME : integrate this in the encolsing form to provide standard form processing *} + + - {* FIXME : integrate this in the encolsing form to provide standard form processing *} - - + {admin_position_block + permission="admin.features.edit" + path={url path='/admin/configuration/features-av/update-position' feature_id=$feature_id} + url_parameter="featureav_id" + in_place_edit_class="positionChange" + position="$POSITION" + id="$ID" + } + - {admin_position_block - permission="admin.features.edit" - path={url path='/admin/configuration/features-av/update-position' feature_id=$feature_id} - url_parameter="featureav_id" - in_place_edit_class="positionChange" - position="$POSITION" - id="$ID" - } - +
    + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.feature-av.delete"} + + + + {/loop} +
    +
    -
    - {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.feature-av.delete"} - - - - {/loop} -
    -
    -
    - {intl l="No value has been created yet. Click the + button to create one."} -
    -
    + {elseloop rel="list"} + + +
    + {intl l="No value has been created yet. Click the + button to create one."} +
    + + + {/elseloop} + + +
    {/form} diff --git a/templates/admin/default/features.html b/templates/admin/default/features.html index 69ed1d5d4..683374aa8 100644 --- a/templates/admin/default/features.html +++ b/templates/admin/default/features.html @@ -21,117 +21,119 @@
    - - + + + {/elseloop} + +
    - {intl l='Thelia product features'} +
    + + - - - + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.features.create"} + + + + {/loop} + + + + - + - + - {module_include location='features_table_header'} + {module_include location='features_table_header'} - - - + + + - - {loop name="list" type="feature" backend_context="1" lang=$lang_id order=$order} - - + + {loop name="list" type="feature" backend_context="1" lang=$lang_id order=$order} + + - + - + - {module_include location='features_table_row'} + {module_include location='features_table_row'} - - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.features.delete"} + + {/loop} + + + + {/loop} - {elseloop rel="list"} - - - - {/elseloop} - -
    + {intl l='Thelia product features'} - {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.features.create"} - - - - {/loop} -
    - {admin_sortable_header - current_order=$order - order='id' - reverse_order='id_reverse' - path='/admin/configuration/features' - label="{intl l='ID'}" - } -
    + {admin_sortable_header + current_order=$order + order='id' + reverse_order='id_reverse' + path='/admin/configuration/features' + label="{intl l='ID'}" + } + - {admin_sortable_header - current_order=$order - order='alpha' - reverse_order='alpha_reverse' - path='/admin/configuration/features' - label="{intl l='Title'}" - } - + {admin_sortable_header + current_order=$order + order='alpha' + reverse_order='alpha_reverse' + path='/admin/configuration/features' + label="{intl l='Title'}" + } + - {admin_sortable_header - current_order=$order - order='manual' - reverse_order='manual_reverse' - path='/admin/configuration/features' - label="{intl l="Position"}" - } - + {admin_sortable_header + current_order=$order + order='manual' + reverse_order='manual_reverse' + path='/admin/configuration/features' + label="{intl l="Position"}" + } + {intl l="Actions"}
    {intl l="Actions"}
    {$ID}
    {$ID} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.features.change"} - {$TITLE} - {/loop} - {elseloop rel="can_change"} - {$TITLE} - {/elseloop} - + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.features.change"} + {$TITLE} + {/loop} + {elseloop rel="can_change"} + {$TITLE} + {/elseloop} + - {admin_position_block - permission="admin.features.edit" - path="/admin/configuration/features/update-position" - url_parameter="feature_id" - in_place_edit_class="positionChange" - position="$POSITION" - id="$ID" - } - + {admin_position_block + permission="admin.features.edit" + path="/admin/configuration/features/update-position" + url_parameter="feature_id" + in_place_edit_class="positionChange" + position="$POSITION" + id="$ID" + } + - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.features.change"} - - {/loop} + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.features.change"} + + {/loop} -
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.features.change"} - - {/loop} +
    + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.features.change"} + + {/loop} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.features.delete"} - - {/loop} -
    -
    -
    - {intl l="No product feature has been created yet. Click the + button to create one."} -
    -
    + {elseloop rel="list"} +
    +
    + {intl l="No product feature has been created yet. Click the + button to create one."} +
    +
    +
    diff --git a/templates/admin/default/folders.html b/templates/admin/default/folders.html index e836770ab..90646c9bc 100644 --- a/templates/admin/default/folders.html +++ b/templates/admin/default/folders.html @@ -15,163 +15,164 @@
    -
    +
    +
    + +
    + {* display parent folder name, and get current folder ID *} + {loop name="folder_title" type="folder" visible="*" id=$folder_id} + {intl l="Folders in %fold" fold=$TITLE} + {$fold_id = $ID} + {/loop} + {elseloop rel="folder_title"} + {intl l="Top level folders"} + {/elseloop} - - - {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.folders.create"} - - - - {/loop} - + {ifloop rel="folder_list"} + + + - {ifloop rel="folder_list"} + + + + + {module_include location='folder_list_header'} + + + + + + + + + + + {loop name="folder_list" type="folder" visible="*" parent=$folder_id order=$folder_order backend_context="1" lang=$lang_id} + + + + + + + + {module_include location='folder_list_row'} + + + + + + + + {/loop} + + {/ifloop} + + {elseloop rel="folder_list"} - + - - - - {module_include location='folder_list_header'} - - - - - - + {elseloop rel="can_create"} + {intl l="This folder has no sub-folders."} + {/elseloop} + + - - - {loop name="folder_list" type="folder" visible="*" parent=$folder_id order=$folder_order backend_context="1" lang=$lang_id} - - - - - - - - {module_include location='folder_list_row'} - - - - - - - - {/loop} - - {/ifloop} - - {elseloop rel="folder_list"} - - - - - - {/elseloop} -
    - {* display parent folder name, and get current folder ID *} - {loop name="folder_title" type="folder" visible="*" id=$folder_id} - {intl l="Folders in %fold" fold=$TITLE} - {$fold_id = $ID} - {/loop} - {elseloop rel="folder_title"} - {intl l="Top level folders"} - {/elseloop} + {module_include location='folder_list_caption'} - {module_include location='folder_list_caption'} + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.folders.create"} + + + + {/loop} +
    + {admin_sortable_header + current_order=$folder_order + order='id' + reverse_order='id_reverse' + path={url path='/admin/folders' id_folder=$folder_id} + request_parameter_name='folder_order' + label="{intl l='ID'}" + } +   + {admin_sortable_header + current_order=$folder_order + order='alpha' + reverse_order='alpha_reverse' + path={url path='/admin/folders' id_folder=$folder_id} + request_parameter_name='folder_order' + label="{intl l='Folder title'}" + } + + {admin_sortable_header + current_order=$folder_order + order='visible' + reverse_order='visible_reverse' + path={url path='/admin/folders' id_folder=$folder_id} + request_parameter_name='folder_order' + label="{intl l='Online'}" + } + + {admin_sortable_header + current_order=$folder_order + order='manual' + reverse_order='manual_reverse' + path={url path='/admin/folders' id_folder=$folder_id} + request_parameter_name='folder_order' + label="{intl l='Position'}" + } + {intl l='Actions'}
    {$ID} + {loop type="image" name="folder_image" source="folder" source_id="$ID" limit="1" width="50" height="50" resize_mode="crop" backend_context="1"} + {$TITLE} + {/loop} + + + {$TITLE} + + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.folders.edit"} +
    + +
    + {/loop} + + {elseloop rel="can_change"} +
    + +
    + {/elseloop} +
    + {admin_position_block + permission="admin.folders.edit" + path={url path='admin/folders/update-position' folder_id=$ID} + url_parameter="folder_id" + in_place_edit_class="folderPositionChange" + position=$POSITION + id=$ID + } + +
    + + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.folders.edit"} + + {/loop} + + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.folders.delete"} + + {/loop} +
    +
    - {admin_sortable_header - current_order=$folder_order - order='id' - reverse_order='id_reverse' - path={url path='/admin/folders' id_folder=$folder_id} - request_parameter_name='folder_order' - label="{intl l='ID'}" - } - +
    + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.folders.create"} + {intl l="This folder has no sub-folders. To create a new one, click the + button above."} + {/loop} -
      - {admin_sortable_header - current_order=$folder_order - order='alpha' - reverse_order='alpha_reverse' - path={url path='/admin/folders' id_folder=$folder_id} - request_parameter_name='folder_order' - label="{intl l='Folder title'}" - } - - {admin_sortable_header - current_order=$folder_order - order='visible' - reverse_order='visible_reverse' - path={url path='/admin/folders' id_folder=$folder_id} - request_parameter_name='folder_order' - label="{intl l='Online'}" - } - - {admin_sortable_header - current_order=$folder_order - order='manual' - reverse_order='manual_reverse' - path={url path='/admin/folders' id_folder=$folder_id} - request_parameter_name='folder_order' - label="{intl l='Position'}" - } - {intl l='Actions'}
    {$ID} - {loop type="image" name="folder_image" source="folder" source_id="$ID" limit="1" width="50" height="50" resize_mode="crop" backend_context="1"} - {$TITLE} - {/loop} - - - {$TITLE} - - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.folders.edit"} -
    - -
    - {/loop} - - {elseloop rel="can_change"} -
    - -
    - {/elseloop} -
    - {admin_position_block - permission="admin.folders.edit" - path={url path='admin/folders/update-position' folder_id=$ID} - url_parameter="folder_id" - in_place_edit_class="folderPositionChange" - position=$POSITION - id=$ID - } - -
    - - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.folders.edit"} - - {/loop} - - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.folders.delete"} - - {/loop} -
    -
    -
    - {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.folders.create"} - {intl l="This folder has no sub-folders. To create a new one, click the + button above."} - {/loop} - - {elseloop rel="can_create"} - {intl l="This folder has no sub-folders."} - {/elseloop} -
    -
    + {/elseloop} +
    +
    @@ -181,7 +182,7 @@
    - +
    {* display parent folder name *} @@ -314,7 +315,7 @@ {/elseloop}
    - +
    diff --git a/templates/admin/default/home.html b/templates/admin/default/home.html index c5683620f..ea1bd3392 100755 --- a/templates/admin/default/home.html +++ b/templates/admin/default/home.html @@ -48,50 +48,52 @@
    {intl l="Informations site"}
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {intl l="Customers"}1
    {intl l="Sections"}8
    {intl l="Products"}43
    {intl l="Products online"}43
    {intl l="Products offline"}0
    {intl l="Orders"}1
    {intl l="Orders pending"}1
    {intl l="Orders treatment"}0
    {intl l="Shipped orders"}0
    {intl l="Canceled orders"}0
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {intl l="Customers"}1
    {intl l="Sections"}8
    {intl l="Products"}43
    {intl l="Products online"}43
    {intl l="Products offline"}0
    {intl l="Orders"}1
    {intl l="Orders pending"}1
    {intl l="Orders treatment"}0
    {intl l="Shipped orders"}0
    {intl l="Canceled orders"}0
    +
    @@ -107,106 +109,112 @@
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {intl l="C. A. TTC"}2000.00 €
    {intl l="C. A. TTC hors frais de port"}2500.00 €
    {intl l="C. A. TTC précédent"}1700.00 €
    {intl l="Commandes en instance"}4
    {intl l="Commandes en traitement"}52
    {intl l="Commandes annulées"}3
    {intl l="Panier moyen TTC"}25.00 €
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {intl l="C. A. TTC"}2000.00 €
    {intl l="C. A. TTC hors frais de port"}2500.00 €
    {intl l="C. A. TTC précédent"}1700.00 €
    {intl l="Commandes en instance"}4
    {intl l="Commandes en traitement"}52
    {intl l="Commandes annulées"}3
    {intl l="Panier moyen TTC"}25.00 €
    +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {intl l="C. A. TTC"}2000.00 €
    {intl l="C. A. TTC hors frais de port"}2500.00 €
    {intl l="C. A. TTC précédent"}1700.00 €
    {intl l="Commandes en instance"}4
    {intl l="Commandes en traitement"}52
    {intl l="Commandes annulées"}3
    {intl l="Panier moyen TTC"}25.00 €
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {intl l="C. A. TTC"}2000.00 €
    {intl l="C. A. TTC hors frais de port"}2500.00 €
    {intl l="C. A. TTC précédent"}1700.00 €
    {intl l="Commandes en instance"}4
    {intl l="Commandes en traitement"}52
    {intl l="Commandes annulées"}3
    {intl l="Panier moyen TTC"}25.00 €
    +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {intl l="C. A. TTC"}2000.00 €
    {intl l="C. A. TTC hors frais de port"}2500.00 €
    {intl l="C. A. TTC précédent"}1700.00 €
    {intl l="Commandes en instance"}4
    {intl l="Commandes en traitement"}52
    {intl l="Commandes annulées"}3
    {intl l="Panier moyen TTC"}25.00 €
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {intl l="C. A. TTC"}2000.00 €
    {intl l="C. A. TTC hors frais de port"}2500.00 €
    {intl l="C. A. TTC précédent"}1700.00 €
    {intl l="Commandes en instance"}4
    {intl l="Commandes en traitement"}52
    {intl l="Commandes annulées"}3
    {intl l="Panier moyen TTC"}25.00 €
    +
    @@ -215,22 +223,24 @@
    {intl l="Thelia informations"}
    - +
    +
    - - - - - - - - - - - - - -
    {intl l="Current version"}V2.0.0-beta
    {intl l="Latest version available"}V1.5.4.2
    {intl l="News"}{intl l="Click here"}
    + + {intl l="Current version"} + V2.0.0-beta + + + {intl l="Latest version available"} + V1.5.4.2 + + + {intl l="News"} + {intl l="Click here"} + + + +
    diff --git a/templates/admin/default/messages.html b/templates/admin/default/messages.html index afa7764af..cf2a0d9e1 100644 --- a/templates/admin/default/messages.html +++ b/templates/admin/default/messages.html @@ -21,76 +21,78 @@
    - - + + + {/elseloop} + +
    - {intl l='Thelia mailing templates'} - {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.messages.create"} - - - - {/loop} +
    + + - - - - + + + + + - {module_include location='messages_table_header'} + {module_include location='messages_table_header'} - - - + + + - - {loop name="mailing-templates" type="message" secured="*" backend_context="1" lang="$lang_id"} - + + {loop name="mailing-templates" type="message" secured="*" backend_context="1" lang="$lang_id"} + - + - + {/if} + - {module_include location='messages_table_row'} + {module_include location='messages_table_row'} - - - {/loop} - {elseloop rel="mailing-templates"} - - - - {/elseloop} - -
    + {intl l='Thelia mailing templates'} + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.messages.create"} + + + + {/loop} -
    {intl l="Purpose"}{intl l="Name"}
    {intl l="Purpose"}{intl l="Name"} 
     
    {$TITLE}{$TITLE} - {if ! $SECURED} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.messages.change"} - {$NAME} - {/loop} - {elseloop rel="can_change"} + + {if ! $SECURED} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.messages.change"} + {$NAME} + {/loop} + {elseloop rel="can_change"} + {$NAME} + {/elseloop} + {else} {$NAME} - {/elseloop} - {else} - {$NAME} - {/if} - - {if ! $SECURED} -
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.messages.change"} - - {/loop} +
    + {if ! $SECURED} +
    + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.messages.change"} + + {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.messages.delete"} - - {/loop} -
    - {else} - - {/if} -
    -
    - {intl l="No mailing template has been created yet. Click the + button to create one."} -
    -
    + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.messages.delete"} + + {/loop} +
    + {else} + + {/if} + + + {/loop} + {elseloop rel="mailing-templates"} +
    +
    + {intl l="No mailing template has been created yet. Click the + button to create one."} +
    +
    +
    diff --git a/templates/admin/default/modules.html b/templates/admin/default/modules.html index 787e00a5b..8c86c349a 100644 --- a/templates/admin/default/modules.html +++ b/templates/admin/default/modules.html @@ -26,215 +26,219 @@
    - - - - - - - +
    +
    - {intl l='Transport modules'} -
    {intl l="Name"}{intl l="Description"}{intl l="Enable/Disable"}
    + + + + + + - {module_include location='modules_table_header'} + {module_include location='modules_table_header'} - - - + + + - - - - - + + + + + - {module_include location='modules_table_row'} + {module_include location='modules_table_row'} - - - - - - + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} + + {/loop} + + + + + + + - {module_include location='modules_table_row'} + {module_include location='modules_table_row'} - - - - - - + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} + + {/loop} + + + + + + + - {module_include location='modules_table_row'} + {module_include location='modules_table_row'} - - - -
    + {intl l='Transport modules'} +
    {intl l="Name"}{intl l="Description"}{intl l="Enable/Disable"}{intl l="Actions"}
    {intl l="Actions"}
    TinymceEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid! Eius, pariatur accusantium odit quidem laboriosam. -
    - -
    -
    TinymceEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid! Eius, pariatur accusantium odit quidem laboriosam. +
    + +
    +
    -
    - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} +
    +
    + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} + + {/loop} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} + + {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
    -
    So colissimoEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid -
    - -
    -
    So colissimoEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid +
    + +
    +
    -
    - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} +
    +
    + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} + + {/loop} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} + + {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
    -
    Title metaEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid -
    - -
    -
    Title metaEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid +
    + +
    +
    -
    - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} +
    +
    + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} + + {/loop} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} + + {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
    -
    + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} + + {/loop} +
    + + + + +
    - - - - - - - +
    +
    - {intl l='Delivery modules'} -
    {intl l="Name"}{intl l="Description"}{intl l="Enable/Disable"}
    + + + + + + - {module_include location='modules_table_header'} + {module_include location='modules_table_header'} - - - + + + - - - - - + + + + + - {module_include location='modules_table_row'} + {module_include location='modules_table_row'} - - - - - - + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} + + {/loop} + + + + + + + - {module_include location='modules_table_row'} + {module_include location='modules_table_row'} - - - - - - + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} + + {/loop} + + + + + + + - {module_include location='modules_table_row'} + {module_include location='modules_table_row'} - - - -
    + {intl l='Delivery modules'} +
    {intl l="Name"}{intl l="Description"}{intl l="Enable/Disable"}{intl l="Actions"}
    {intl l="Actions"}
    TinymceEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid! Eius, pariatur accusantium odit quidem laboriosam. -
    - -
    -
    TinymceEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid! Eius, pariatur accusantium odit quidem laboriosam. +
    + +
    +
    -
    - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} +
    +
    + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} + + {/loop} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} + + {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
    -
    So colissimoEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid -
    - -
    -
    So colissimoEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid +
    + +
    +
    -
    - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} +
    +
    + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} + + {/loop} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} + + {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
    -
    Title metaEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid -
    - -
    -
    Title metaEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid +
    + +
    +
    -
    - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} +
    +
    + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} + + {/loop} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} + + {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
    -
    + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} + + {/loop} +
    + + + + + diff --git a/templates/admin/default/order-edit.html b/templates/admin/default/order-edit.html index 603176fe6..793414afb 100644 --- a/templates/admin/default/order-edit.html +++ b/templates/admin/default/order-edit.html @@ -30,71 +30,75 @@
    - - - - - - - - - - +
    +
    - {intl l='Information about order 01201303540354'} -
    {intl l="Designation"}{intl l="Price"}{intl l="Quantity"}{intl l="Total"}
    + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - -
    + {intl l='Information about order 01201303540354'} +
    {intl l="Designation"}{intl l="Price"}{intl l="Quantity"}{intl l="Total"}
    T-Shirt F T120.00 €360.00 €
    T-Shirt F T120.00 €360.00 €
    T-Shirt F T120.00 €360.00 €
    Total180.00 €
    + + + T-Shirt F T1 + 20.00 € + 3 + 60.00 € + + + T-Shirt F T1 + 20.00 € + 3 + 60.00 € + + + T-Shirt F T1 + 20.00 € + 3 + 60.00 € + + + + + Total + 180.00 € + + + +
    - - - - - - - - - - +
    +
    - {intl l='Information about the bill'} -
    {intl l="Bill n°"}{intl l="Compagny"}{intl l="Firstname & Lastname"}{intl l="Date & Hour"}
    + + + + + + + + + - - - - - - - - -
    + {intl l='Information about the bill'} +
    {intl l="Bill n°"}{intl l="Compagny"}{intl l="Firstname & Lastname"}{intl l="Date & Hour"}
    0001TheliaDupont Jean11/01/2013 14:11:00
    + + + 0001 + Thelia + Dupont Jean + 11/01/2013 14:11:00 + + + +
    @@ -116,214 +120,219 @@
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - {intl l='Information about the settlement'} -
    {intl l="Type of payment"}Unknown
    {intl l="Transaction reference"}141100
    {intl l="Total order before discount"}60 €
    {intl l="Discount"}10%
    {intl l="Coupon code"}
    {intl l="Total with discount"}50 €
    {intl l="Freight"}6 €
    {intl l="Total"}56 €
    - +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {intl l='Information about the settlement'} +
    {intl l="Type of payment"}Unknown
    {intl l="Transaction reference"}141100
    {intl l="Total order before discount"}60 €
    {intl l="Discount"}10%
    {intl l="Coupon code"}
    {intl l="Total with discount"}50 €
    {intl l="Freight"}6 €
    {intl l="Total"}56 €
    +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - {intl l='Billing address'} - - - -
    {intl l="Title"}Mr
    {intl l="Compagny"}Thelia
    {intl l="Firstname"}Espeche
    {intl l="Lastname"}Michaël
    {intl l="Street address"}5, rue Rochon
    {intl l="Additional address"}Lorem ipsum dolor sit amet
    {intl l="Additional address"}Lorem ipsum dolor sit
    {intl l="Zip code"}63000
    {intl l="City"}Clermont-Fd
    {intl l="Country"}France
    {intl l="Phone"}01 02 03 04 05
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {intl l='Billing address'} + + + +
    {intl l="Title"}Mr
    {intl l="Compagny"}Thelia
    {intl l="Firstname"}Espeche
    {intl l="Lastname"}Michaël
    {intl l="Street address"}5, rue Rochon
    {intl l="Additional address"}Lorem ipsum dolor sit amet
    {intl l="Additional address"}Lorem ipsum dolor sit
    {intl l="Zip code"}63000
    {intl l="City"}Clermont-Fd
    {intl l="Country"}France
    {intl l="Phone"}01 02 03 04 05
    +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - {intl l='Delivery address'} - - - -
    {intl l="Title"}Mr
    {intl l="Compagny"}Thelia
    {intl l="Firstname"}Espeche
    {intl l="Lastname"}Michaël
    {intl l="Street address"}5, rue Rochon
    {intl l="Additional address"}Lorem ipsum dolor sit amet
    {intl l="Additional address"}Lorem ipsum dolor sit
    {intl l="Zip code"}63000
    {intl l="City"}Clermont-Fd
    {intl l="Country"}France
    {intl l="Phone"}01 02 03 04 05
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {intl l='Delivery address'} + + + +
    {intl l="Title"}Mr
    {intl l="Compagny"}Thelia
    {intl l="Firstname"}Espeche
    {intl l="Lastname"}Michaël
    {intl l="Street address"}5, rue Rochon
    {intl l="Additional address"}Lorem ipsum dolor sit amet
    {intl l="Additional address"}Lorem ipsum dolor sit
    {intl l="Zip code"}63000
    {intl l="City"}Clermont-Fd
    {intl l="Country"}France
    {intl l="Phone"}01 02 03 04 05
    +
    - - - - - - - - - - - - - - - - - - - - - - -
    - {intl l='Further information'} -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    - -
    -
    -
    {intl l='Bill'} {intl l='Download bill to pdf'}
    {intl l='Delivery'} {intl l='Download delivery to pdf'}
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + {intl l='Further information'} +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    {intl l='Bill'} {intl l='Download bill to pdf'}
    {intl l='Delivery'} {intl l='Download delivery to pdf'}
    +
    diff --git a/templates/admin/default/orders.html b/templates/admin/default/orders.html index dcf9ef7e3..02bbea458 100644 --- a/templates/admin/default/orders.html +++ b/templates/admin/default/orders.html @@ -19,114 +19,116 @@
    - - - - - - - - - - +
    +
    - {intl l='Orders'} - {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.orders.create"} - - - - {/loop} -
    {intl l="Order n°"}{intl l="Date & Hour"}{intl l="Compagny"}{intl l="Name"}{intl l="Amount"}{intl l="Status"}
    + + + + + + + + + - {module_include location='orders_table_header'} + {module_include location='orders_table_header'} - - - + + + - - + + - - - - - - + + + + + + - {module_include location='orders_table_row'} + {module_include location='orders_table_row'} - - - + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.orders.delete"} + + {/loop} + + + + - - - - - - + + + + + + - {module_include location='orders_table_row'} + {module_include location='orders_table_row'} - - - + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.orders.delete"} + + {/loop} + + + + - - - - - - + + + + + + - {module_include location='orders_table_row'} + {module_include location='orders_table_row'} - - + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.orders.delete"} + + {/loop} + + + - + - -
    + {intl l='Orders'} + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.orders.create"} + + + + {/loop} +
    {intl l="Order n°"}{intl l="Date & Hour"}{intl l="Compagny"}{intl l="Name"}{intl l="Amount"}{intl l="Status"}{intl l="Actions"}
    {intl l="Actions"}
    0123045012304511/09/2013 10:24:31TheliaDupont251 €Paid0123045012304511/09/2013 10:24:31TheliaDupont251 €Paid -
    +
    +
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.orders.edit"} - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.orders.edit"} + + {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.orders.delete"} - - {/loop} -
    -
    0123045012304511/09/2013 10:24:31TheliaDupont251 €Canceled0123045012304511/09/2013 10:24:31TheliaDupont251 €Canceled -
    +
    +
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.orders.edit"} - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.orders.edit"} + + {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.orders.delete"} - - {/loop} -
    -
    0123045012304511/09/2013 10:24:31TheliaDupont251 €Current0123045012304511/09/2013 10:24:31TheliaDupont251 €Current -
    +
    +
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.orders.edit"} - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.orders.edit"} + + {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.orders.delete"} - - {/loop} -
    -
    + + +
    diff --git a/templates/admin/default/shipping-configuration-edit.html b/templates/admin/default/shipping-configuration-edit.html index 39b69dcde..b17dc6de4 100644 --- a/templates/admin/default/shipping-configuration-edit.html +++ b/templates/admin/default/shipping-configuration-edit.html @@ -48,56 +48,58 @@
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {intl l="Country"}{intl l="Actions"}
    Wallis-et-Futuna - - - -
    Polynésie française - - - -
    USA - Alabama - - - -
    -
    - -
    - - - - - -
    -
    -
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {intl l="Country"}{intl l="Actions"}
    Wallis-et-Futuna + + + +
    Polynésie française + + + +
    USA - Alabama + + + +
    +
    + +
    + + + + + +
    +
    +
    +
    diff --git a/templates/admin/default/shipping-configuration.html b/templates/admin/default/shipping-configuration.html index ae9090c70..067256d5f 100644 --- a/templates/admin/default/shipping-configuration.html +++ b/templates/admin/default/shipping-configuration.html @@ -20,88 +20,90 @@
    - - - - - +
    +
    - {intl l='Thelia Shipping configuration'} - {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.shipping-configuration.create"} - - - - {/loop} -
    {intl l="Description"}
    + + + + - {module_include location='shipping_configuration_table_header'} + {module_include location='shipping_configuration_table_header'} - - - + + + - - - + + + - {module_include location='shipping_configuration_table_row'} + {module_include location='shipping_configuration_table_row'} - - - - + + + + - {module_include location='shipping_configuration_table_row'} + {module_include location='shipping_configuration_table_row'} - - - - + + + + - {module_include location='shipping_configuration_table_row'} + {module_include location='shipping_configuration_table_row'} - - - -
    + {intl l='Thelia Shipping configuration'} + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.shipping-configuration.create"} + + + + {/loop} +
    {intl l="Description"}{intl l="Actions"}
    {intl l="Actions"}
    France
    France - {if ! $SECURED} -
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-configuration.change"} - - {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.shipping-configuration.delete"} - - {/loop} -
    - {else} - - {/if} -
    Outre-Mer DOM + {if ! $SECURED} +
    + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-configuration.change"} + + {/loop} + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.shipping-configuration.delete"} + + {/loop} +
    + {else} + + {/if} +
    Outre-Mer DOM - {if ! $SECURED} -
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-configuration.change"} - - {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.shipping-configuration.delete"} - - {/loop} -
    - {else} - - {/if} -
    Outre-Mer TOM + {if ! $SECURED} +
    + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-configuration.change"} + + {/loop} + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.shipping-configuration.delete"} + + {/loop} +
    + {else} + + {/if} +
    Outre-Mer TOM - {if ! $SECURED} -
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-configuration.change"} - - {/loop} - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.shipping-configuration.delete"} - - {/loop} -
    - {else} - - {/if} -
    + + {if ! $SECURED} +
    + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-configuration.change"} + + {/loop} + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.configuration.shipping-configuration.delete"} + + {/loop} +
    + {else} + + {/if} + + + + +
    diff --git a/templates/admin/default/shipping-zones-edit.html b/templates/admin/default/shipping-zones-edit.html index 70ee29a35..c330f9064 100644 --- a/templates/admin/default/shipping-zones-edit.html +++ b/templates/admin/default/shipping-zones-edit.html @@ -48,40 +48,42 @@
    - - - - - - - - - - - - - - - - - - - - - -
    {intl l="Zones"}{intl l="Actions"}
    France - - - -
    Zone 1 - - - -
    Zone 2 - - - -
    +
    + + + + + + + + + + + + + + + + + + + + + +
    {intl l="Zones"}{intl l="Actions"}
    France + + + +
    Zone 1 + + + +
    Zone 2 + + + +
    +
    diff --git a/templates/admin/default/shipping-zones.html b/templates/admin/default/shipping-zones.html index e7c624b52..20ffef799 100644 --- a/templates/admin/default/shipping-zones.html +++ b/templates/admin/default/shipping-zones.html @@ -20,74 +20,76 @@
    - - - - - +
    +
    - {intl l='Thelia Shipping zones'} -
    {intl l="Name"}
    + + + + - {module_include location='shipping_zones_table_header'} + {module_include location='shipping_zones_table_header'} - - - + + + - - - + + + - {module_include location='shipping_zones_table_row'} + {module_include location='shipping_zones_table_row'} - - - - + + + + - {module_include location='shipping_zones_table_row'} + {module_include location='shipping_zones_table_row'} - - - - + + + + - {module_include location='shipping_zones_table_row'} + {module_include location='shipping_zones_table_row'} - - - -
    + {intl l='Thelia Shipping zones'} +
    {intl l="Name"}{intl l="Actions"}
    {intl l="Actions"}
    So Colissimo
    So Colissimo - {if ! $SECURED} -
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-zones.change"} - - {/loop} -
    - {else} - - {/if} -
    Chronopost + {if ! $SECURED} +
    + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-zones.change"} + + {/loop} +
    + {else} + + {/if} +
    Chronopost - {if ! $SECURED} -
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-zones.change"} - - {/loop} -
    - {else} - - {/if} -
    Kiala + {if ! $SECURED} +
    + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-zones.change"} + + {/loop} +
    + {else} + + {/if} +
    Kiala - {if ! $SECURED} -
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-zones.change"} - - {/loop} -
    - {else} - - {/if} -
    + + {if ! $SECURED} +
    + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.shipping-zones.change"} + + {/loop} +
    + {else} + + {/if} + + + + +
    diff --git a/templates/admin/default/templates.html b/templates/admin/default/templates.html index 6f88bed47..f7e912e9c 100644 --- a/templates/admin/default/templates.html +++ b/templates/admin/default/templates.html @@ -25,86 +25,88 @@ {if ! empty($general_error) }
    {$general_error}
    {/if} + +
    + + + + + {/elseloop} + +
    + {intl l='Thelia product templates'} - - + + + - {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.templates.create"} - - - - {/loop} - - - - + - + {module_include location='templates_table_header'} - {module_include location='templates_table_header'} + + + - - - + + {loop name="list" type="template" backend_context="1" lang=$lang_id order=$order} + + - - {loop name="list" type="template" backend_context="1" lang=$lang_id order=$order} - - + - + {module_include location='templates_table_row'} - {module_include location='templates_table_row'} + + + {/loop} - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.templates.delete"} - - {/loop} - - - - {/loop} - - {elseloop rel="list"} - - - - {/elseloop} - -
    - {intl l='Thelia product templates'} + {loop type="auth" name="can_create" roles="ADMIN" permissions="admin.configuration.templates.create"} + + + + {/loop} +
    + {admin_sortable_header + current_order=$order + order='id' + reverse_order='id_reverse' + path='/admin/configuration/templates' + label="{intl l='ID'}" + } +
    - {admin_sortable_header - current_order=$order - order='id' - reverse_order='id_reverse' - path='/admin/configuration/templates' - label="{intl l='ID'}" - } - + {admin_sortable_header + current_order=$order + order='alpha' + reverse_order='alpha_reverse' + path='/admin/configuration/templates' + label="{intl l='Title'}" + } + - {admin_sortable_header - current_order=$order - order='alpha' - reverse_order='alpha_reverse' - path='/admin/configuration/templates' - label="{intl l='Title'}" - } - {intl l="Actions"}
    {intl l="Actions"}
    {$ID}
    {$ID} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.templates.change"} + {$NAME} + {/loop} + {elseloop rel="can_change"} + {$NAME} + {/elseloop} + - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.templates.change"} - {$NAME} - {/loop} - {elseloop rel="can_change"} - {$NAME} - {/elseloop} - +
    + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.templates.change"} + + {/loop} -
    -
    - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.templates.change"} - - {/loop} + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.configuration.templates.delete"} + + {/loop} +
    +
    -
    - {intl l="No product template has been created yet. Click the + button to create one."} -
    -
    + {elseloop rel="list"} +
    +
    + {intl l="No product template has been created yet. Click the + button to create one."} +
    +
    +
    diff --git a/templates/admin/default/variables.html b/templates/admin/default/variables.html index 6100466bd..0ce47727d 100644 --- a/templates/admin/default/variables.html +++ b/templates/admin/default/variables.html @@ -21,6 +21,7 @@
    +
    {intl l='Thelia system variables'} @@ -122,6 +123,7 @@ {/loop}
    +
    From 05aa284f4ba0394685ffbe6c855698f929aeb7b2 Mon Sep 17 00:00:00 2001 From: franck Date: Thu, 19 Sep 2013 17:06:10 +0200 Subject: [PATCH 24/51] Fixed minor UI glithces --- templates/admin/default/categories.html | 8 +- templates/admin/default/category-edit.html | 99 +++++++++++++--------- 2 files changed, 61 insertions(+), 46 deletions(-) diff --git a/templates/admin/default/categories.html b/templates/admin/default/categories.html index 3c2e6f00a..68fd220b5 100755 --- a/templates/admin/default/categories.html +++ b/templates/admin/default/categories.html @@ -266,14 +266,14 @@ {loop type="image" name="cat_image" source="product" source_id="$ID" limit="1" width="50" height="50" resize_mode="crop" backend_context="1"} - + {$TITLE} {/loop} - {$REF} + {$REF} - {$TITLE} + {$TITLE} {module_include location='product_list_row'} @@ -305,7 +305,7 @@
    {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.product.edit"} - + {/loop} {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.product.delete"} diff --git a/templates/admin/default/category-edit.html b/templates/admin/default/category-edit.html index ddf39f5f2..a4a69ff3d 100755 --- a/templates/admin/default/category-edit.html +++ b/templates/admin/default/category-edit.html @@ -40,24 +40,23 @@
    -
    +
    {form name="thelia.admin.category.modification"}
    - {include file="includes/inner-form-toolbar.html" close_url="{url path='/admin/categories' category_id=$category_id}"} + {include file="includes/inner-form-toolbar.html" close_url="{url path='/admin/categories' category_id=$PARENT}"} {* Be sure to get the category ID, even if the form could not be validated *} @@ -141,7 +140,7 @@
    -
    +
    @@ -149,9 +148,12 @@ {include file="includes/inner-form-toolbar.html" hide_submit_buttons=true - close_url="{url path='/admin/categories' category_id=$category_id}" + close_url="{url path='/admin/categories' category_id=$PARENT}" } +

    {intl l='Related content'}

    +

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

    + @@ -162,8 +164,8 @@
    @@ -183,6 +185,12 @@ {intl l='Select a content and click (+) to add it to this category'}
    + +
    +
    + {intl l="No available content in this folder"} +
    +
    @@ -200,7 +208,7 @@ {intl l='ID'} - {intl l='Attribute title'} + {intl l='Content title'} {module_include location='category_contents_table_header'} @@ -245,13 +253,13 @@
    -
    +
    -
    +
    -
    +
    @@ -287,7 +295,7 @@ {block name="javascript-initialization"} - + @@ -317,12 +325,6 @@ $(function() { ev.preventDefault(); }); - // Show proper tab, if defined - {if ! empty($current_tab)} - $('#tabbed-menu a[href="#{$current_tab}"]').tab('show') - {/if} - - // Set proper content ID in delete content from $('a.delete-content').click(function(ev) { $('#content_delete_id').val($(this).data('id')); @@ -331,28 +333,41 @@ $(function() { // Load content on folder selection $('#folder_id').change(function(event) { - $.ajax({ - url : '{url path="/admin/category/$category_id/available-related-content/"}' + $(this).val() + '.xml', - type : 'get', - dataType : 'json', - success : function(json) { - $('#content_id :not(:first-child)').remove(); - var have_content = false; + var val = $(this).val(); - $.each(json, function(idx, value) { - $('#content_id').append($('
    diff --git a/templates/admin/default/profile-edit.html b/templates/admin/default/profile-edit.html new file mode 100644 index 000000000..e69de29bb From 1f5cd1da6231d2b29272ad41c58daeac18a2beb9 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Thu, 19 Sep 2013 17:48:01 +0200 Subject: [PATCH 26/51] create category template --- templates/default/category.html | 19 +++++++++++++++++++ templates/default/product.html | 11 +++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 templates/default/category.html diff --git a/templates/default/category.html b/templates/default/category.html new file mode 100644 index 000000000..8bca4fbde --- /dev/null +++ b/templates/default/category.html @@ -0,0 +1,19 @@ +{extends file='layout.tpl'} + +{block name="breadcrumb"} + +{/block} diff --git a/templates/default/product.html b/templates/default/product.html index fbce6d510..c2135d232 100644 --- a/templates/default/product.html +++ b/templates/default/product.html @@ -4,10 +4,13 @@ {/block} From 1d969e38ec25e952d85ee244b49dc3f2309cf8f1 Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Thu, 19 Sep 2013 18:30:13 +0200 Subject: [PATCH 27/51] order tables --- core/lib/Thelia/Action/Order.php | 31 +- ...duct.php => OrderAttributeCombination.php} | 948 ++++++--------- .../Base/OrderAttributeCombinationQuery.php | 897 +++++++++++++++ .../Thelia/Model/Base/OrderProductQuery.php | 1022 ----------------- ... => OrderAttributeCombinationTableMap.php} | 224 ++-- .../Model/OrderAttributeCombination.php | 10 + ...php => OrderAttributeCombinationQuery.php} | 9 +- core/lib/Thelia/Model/OrderProduct.php | 9 - install/thelia.sql | 28 +- local/config/schema.xml | 24 +- 10 files changed, 1406 insertions(+), 1796 deletions(-) rename core/lib/Thelia/Model/Base/{OrderProduct.php => OrderAttributeCombination.php} (58%) create mode 100644 core/lib/Thelia/Model/Base/OrderAttributeCombinationQuery.php delete mode 100644 core/lib/Thelia/Model/Base/OrderProductQuery.php rename core/lib/Thelia/Model/Map/{OrderProductTableMap.php => OrderAttributeCombinationTableMap.php} (51%) create mode 100644 core/lib/Thelia/Model/OrderAttributeCombination.php rename core/lib/Thelia/Model/{OrderProductQuery.php => OrderAttributeCombinationQuery.php} (55%) mode change 100755 => 100644 delete mode 100755 core/lib/Thelia/Model/OrderProduct.php diff --git a/core/lib/Thelia/Action/Order.php b/core/lib/Thelia/Action/Order.php index 4a982673a..c5926acea 100755 --- a/core/lib/Thelia/Action/Order.php +++ b/core/lib/Thelia/Action/Order.php @@ -30,6 +30,7 @@ use Thelia\Core\Event\OrderEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Model\Base\AddressQuery; use Thelia\Model\ModuleQuery; +use Thelia\Model\OrderProduct; use Thelia\Model\OrderStatus; use Thelia\Model\Map\OrderTableMap; use Thelia\Model\OrderAddress; @@ -108,14 +109,17 @@ class Order extends BaseAction implements EventSubscriberInterface /* use a copy to avoid errored reccord in session */ $placedOrder = $sessionOrder->copy(); + $placedOrder->setDispatcher($this->getDispatcher()); $customer = $this->getSecurityContext()->getCustomerUser(); $currency = $this->getSession()->getCurrency(); $lang = $this->getSession()->getLang(); $deliveryAddress = AddressQuery::create()->findPk($sessionOrder->chosenDeliveryAddress); $invoiceAddress = AddressQuery::create()->findPk($sessionOrder->chosenInvoiceAddress); + $cart = $this->getSession()->getCart(); + $cartItems = $cart->getCartItems(); - $paymentModule = ModuleQuery::findPk($placedOrder->getPaymentModuleId()); + $paymentModule = ModuleQuery::create()->findPk($placedOrder->getPaymentModuleId()); /* fulfill order */ $placedOrder->setCustomerId($customer->getId()); @@ -163,7 +167,16 @@ class Order extends BaseAction implements EventSubscriberInterface $placedOrder->save($con); - /* fulfill order_products and decrease stock // @todo dispatch event */ + /* fulfill order_products and decrease stock // @todo + dispatch event */ + + foreach($cartItems as $cartItem) { + $orderProduct = new OrderProduct(); + $orderProduct + ->setOrderId($placedOrder->getId()) + ; + + $in = true; + } /* discount @todo */ @@ -171,14 +184,15 @@ class Order extends BaseAction implements EventSubscriberInterface /* T1style : dispatch mail event ? */ - /* clear session ? */ + /* clear session @todo : remove comment below + test */ + //$sessionOrder = new \Thelia\Model\Order(); /* call pay method */ $paymentModuleReflection = new \ReflectionClass($paymentModule->getFullNamespace()); $paymentModuleInstance = $paymentModuleReflection->newInstance(); - $paymentModuleInstance->setRequest($this->request); - $paymentModuleInstance->setDispatcher($this->dispatcher); + $paymentModuleInstance->setRequest($this->getRequest()); + $paymentModuleInstance->setDispatcher($this->getDispatcher()); $paymentModuleInstance->pay(); } @@ -188,14 +202,13 @@ class Order extends BaseAction implements EventSubscriberInterface */ public function setReference(OrderEvent $event) { - $x = true; - - $this->setRef($this->generateRef()); + $event->getOrder()->setRef($this->generateRef()); } public function generateRef() { - return sprintf('O', uniqid('', true), $this->getId()); + /* order addresses are unique */ + return uniqid('ORD', true); } /** diff --git a/core/lib/Thelia/Model/Base/OrderProduct.php b/core/lib/Thelia/Model/Base/OrderAttributeCombination.php similarity index 58% rename from core/lib/Thelia/Model/Base/OrderProduct.php rename to core/lib/Thelia/Model/Base/OrderAttributeCombination.php index 2bf9c7ace..09bd77c28 100644 --- a/core/lib/Thelia/Model/Base/OrderProduct.php +++ b/core/lib/Thelia/Model/Base/OrderAttributeCombination.php @@ -10,27 +10,24 @@ use Propel\Runtime\ActiveQuery\Criteria; use Propel\Runtime\ActiveQuery\ModelCriteria; use Propel\Runtime\ActiveRecord\ActiveRecordInterface; use Propel\Runtime\Collection\Collection; -use Propel\Runtime\Collection\ObjectCollection; use Propel\Runtime\Connection\ConnectionInterface; use Propel\Runtime\Exception\BadMethodCallException; use Propel\Runtime\Exception\PropelException; use Propel\Runtime\Map\TableMap; use Propel\Runtime\Parser\AbstractParser; use Propel\Runtime\Util\PropelDateTime; -use Thelia\Model\Order as ChildOrder; -use Thelia\Model\OrderFeature as ChildOrderFeature; -use Thelia\Model\OrderFeatureQuery as ChildOrderFeatureQuery; +use Thelia\Model\OrderAttributeCombination as ChildOrderAttributeCombination; +use Thelia\Model\OrderAttributeCombinationQuery as ChildOrderAttributeCombinationQuery; use Thelia\Model\OrderProduct as ChildOrderProduct; use Thelia\Model\OrderProductQuery as ChildOrderProductQuery; -use Thelia\Model\OrderQuery as ChildOrderQuery; -use Thelia\Model\Map\OrderProductTableMap; +use Thelia\Model\Map\OrderAttributeCombinationTableMap; -abstract class OrderProduct implements ActiveRecordInterface +abstract class OrderAttributeCombination implements ActiveRecordInterface { /** * TableMap class name */ - const TABLE_MAP = '\\Thelia\\Model\\Map\\OrderProductTableMap'; + const TABLE_MAP = '\\Thelia\\Model\\Map\\OrderAttributeCombinationTableMap'; /** @@ -66,58 +63,58 @@ abstract class OrderProduct implements ActiveRecordInterface protected $id; /** - * The value for the order_id field. + * The value for the order_product_id field. * @var int */ - protected $order_id; + protected $order_product_id; /** - * The value for the product_ref field. + * The value for the attribute_title field. * @var string */ - protected $product_ref; + protected $attribute_title; /** - * The value for the title field. + * The value for the attribute_chapo field. * @var string */ - protected $title; + protected $attribute_chapo; /** - * The value for the description field. + * The value for the attribute_description field. * @var string */ - protected $description; + protected $attribute_description; /** - * The value for the chapo field. + * The value for the attribute_postscriptumn field. * @var string */ - protected $chapo; + protected $attribute_postscriptumn; /** - * The value for the quantity field. - * @var double + * The value for the attribute_av_title field. + * @var string */ - protected $quantity; + protected $attribute_av_title; /** - * The value for the price field. - * @var double + * The value for the attribute_av_chapo field. + * @var string */ - protected $price; + protected $attribute_av_chapo; /** - * The value for the tax field. - * @var double + * The value for the attribute_av_description field. + * @var string */ - protected $tax; + protected $attribute_av_description; /** - * The value for the parent field. - * @var int + * The value for the attribute_av_postscriptum field. + * @var string */ - protected $parent; + protected $attribute_av_postscriptum; /** * The value for the created_at field. @@ -132,15 +129,9 @@ abstract class OrderProduct implements ActiveRecordInterface protected $updated_at; /** - * @var Order + * @var OrderProduct */ - protected $aOrder; - - /** - * @var ObjectCollection|ChildOrderFeature[] Collection to store aggregation of ChildOrderFeature objects. - */ - protected $collOrderFeatures; - protected $collOrderFeaturesPartial; + protected $aOrderProduct; /** * Flag to prevent endless save loop, if this object is referenced @@ -151,13 +142,7 @@ abstract class OrderProduct implements ActiveRecordInterface protected $alreadyInSave = false; /** - * An array of objects scheduled for deletion. - * @var ObjectCollection - */ - protected $orderFeaturesScheduledForDeletion = null; - - /** - * Initializes internal state of Thelia\Model\Base\OrderProduct object. + * Initializes internal state of Thelia\Model\Base\OrderAttributeCombination object. */ public function __construct() { @@ -252,9 +237,9 @@ abstract class OrderProduct implements ActiveRecordInterface } /** - * Compares this with another OrderProduct instance. If - * obj is an instance of OrderProduct, delegates to - * equals(OrderProduct). Otherwise, returns false. + * Compares this with another OrderAttributeCombination instance. If + * obj is an instance of OrderAttributeCombination, delegates to + * equals(OrderAttributeCombination). Otherwise, returns false. * * @param obj The object to compare to. * @return Whether equal to the object specified. @@ -335,7 +320,7 @@ abstract class OrderProduct implements ActiveRecordInterface * @param string $name The virtual column name * @param mixed $value The value to give to the virtual column * - * @return OrderProduct The current object, for fluid interface + * @return OrderAttributeCombination The current object, for fluid interface */ public function setVirtualColumn($name, $value) { @@ -367,7 +352,7 @@ abstract class OrderProduct implements ActiveRecordInterface * or a format name ('XML', 'YAML', 'JSON', 'CSV') * @param string $data The source data to import from * - * @return OrderProduct The current object, for fluid interface + * @return OrderAttributeCombination The current object, for fluid interface */ public function importFrom($parser, $data) { @@ -422,102 +407,102 @@ abstract class OrderProduct implements ActiveRecordInterface } /** - * Get the [order_id] column value. + * Get the [order_product_id] column value. * * @return int */ - public function getOrderId() + public function getOrderProductId() { - return $this->order_id; + return $this->order_product_id; } /** - * Get the [product_ref] column value. + * Get the [attribute_title] column value. * * @return string */ - public function getProductRef() + public function getAttributeTitle() { - return $this->product_ref; + return $this->attribute_title; } /** - * Get the [title] column value. + * Get the [attribute_chapo] column value. * * @return string */ - public function getTitle() + public function getAttributeChapo() { - return $this->title; + return $this->attribute_chapo; } /** - * Get the [description] column value. + * Get the [attribute_description] column value. * * @return string */ - public function getDescription() + public function getAttributeDescription() { - return $this->description; + return $this->attribute_description; } /** - * Get the [chapo] column value. + * Get the [attribute_postscriptumn] column value. * * @return string */ - public function getChapo() + public function getAttributePostscriptumn() { - return $this->chapo; + return $this->attribute_postscriptumn; } /** - * Get the [quantity] column value. + * Get the [attribute_av_title] column value. * - * @return double + * @return string */ - public function getQuantity() + public function getAttributeAvTitle() { - return $this->quantity; + return $this->attribute_av_title; } /** - * Get the [price] column value. + * Get the [attribute_av_chapo] column value. * - * @return double + * @return string */ - public function getPrice() + public function getAttributeAvChapo() { - return $this->price; + return $this->attribute_av_chapo; } /** - * Get the [tax] column value. + * Get the [attribute_av_description] column value. * - * @return double + * @return string */ - public function getTax() + public function getAttributeAvDescription() { - return $this->tax; + return $this->attribute_av_description; } /** - * Get the [parent] column value. + * Get the [attribute_av_postscriptum] column value. * - * @return int + * @return string */ - public function getParent() + public function getAttributeAvPostscriptum() { - return $this->parent; + return $this->attribute_av_postscriptum; } /** @@ -564,7 +549,7 @@ abstract class OrderProduct implements ActiveRecordInterface * Set the value of [id] column. * * @param int $v new value - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ public function setId($v) { @@ -574,7 +559,7 @@ abstract class OrderProduct implements ActiveRecordInterface if ($this->id !== $v) { $this->id = $v; - $this->modifiedColumns[] = OrderProductTableMap::ID; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ID; } @@ -582,204 +567,204 @@ abstract class OrderProduct implements ActiveRecordInterface } // setId() /** - * Set the value of [order_id] column. + * Set the value of [order_product_id] column. * * @param int $v new value - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ - public function setOrderId($v) + public function setOrderProductId($v) { if ($v !== null) { $v = (int) $v; } - if ($this->order_id !== $v) { - $this->order_id = $v; - $this->modifiedColumns[] = OrderProductTableMap::ORDER_ID; + if ($this->order_product_id !== $v) { + $this->order_product_id = $v; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID; } - if ($this->aOrder !== null && $this->aOrder->getId() !== $v) { - $this->aOrder = null; + if ($this->aOrderProduct !== null && $this->aOrderProduct->getId() !== $v) { + $this->aOrderProduct = null; } return $this; - } // setOrderId() + } // setOrderProductId() /** - * Set the value of [product_ref] column. + * Set the value of [attribute_title] column. * * @param string $v new value - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ - public function setProductRef($v) + public function setAttributeTitle($v) { if ($v !== null) { $v = (string) $v; } - if ($this->product_ref !== $v) { - $this->product_ref = $v; - $this->modifiedColumns[] = OrderProductTableMap::PRODUCT_REF; + if ($this->attribute_title !== $v) { + $this->attribute_title = $v; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ATTRIBUTE_TITLE; } return $this; - } // setProductRef() + } // setAttributeTitle() /** - * Set the value of [title] column. + * Set the value of [attribute_chapo] column. * * @param string $v new value - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ - public function setTitle($v) + public function setAttributeChapo($v) { if ($v !== null) { $v = (string) $v; } - if ($this->title !== $v) { - $this->title = $v; - $this->modifiedColumns[] = OrderProductTableMap::TITLE; + if ($this->attribute_chapo !== $v) { + $this->attribute_chapo = $v; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ATTRIBUTE_CHAPO; } return $this; - } // setTitle() + } // setAttributeChapo() /** - * Set the value of [description] column. + * Set the value of [attribute_description] column. * * @param string $v new value - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ - public function setDescription($v) + public function setAttributeDescription($v) { if ($v !== null) { $v = (string) $v; } - if ($this->description !== $v) { - $this->description = $v; - $this->modifiedColumns[] = OrderProductTableMap::DESCRIPTION; + if ($this->attribute_description !== $v) { + $this->attribute_description = $v; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ATTRIBUTE_DESCRIPTION; } return $this; - } // setDescription() + } // setAttributeDescription() /** - * Set the value of [chapo] column. + * Set the value of [attribute_postscriptumn] column. * * @param string $v new value - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ - public function setChapo($v) + public function setAttributePostscriptumn($v) { if ($v !== null) { $v = (string) $v; } - if ($this->chapo !== $v) { - $this->chapo = $v; - $this->modifiedColumns[] = OrderProductTableMap::CHAPO; + if ($this->attribute_postscriptumn !== $v) { + $this->attribute_postscriptumn = $v; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ATTRIBUTE_POSTSCRIPTUMN; } return $this; - } // setChapo() + } // setAttributePostscriptumn() /** - * Set the value of [quantity] column. + * Set the value of [attribute_av_title] column. * - * @param double $v new value - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @param string $v new value + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ - public function setQuantity($v) + public function setAttributeAvTitle($v) { if ($v !== null) { - $v = (double) $v; + $v = (string) $v; } - if ($this->quantity !== $v) { - $this->quantity = $v; - $this->modifiedColumns[] = OrderProductTableMap::QUANTITY; + if ($this->attribute_av_title !== $v) { + $this->attribute_av_title = $v; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ATTRIBUTE_AV_TITLE; } return $this; - } // setQuantity() + } // setAttributeAvTitle() /** - * Set the value of [price] column. + * Set the value of [attribute_av_chapo] column. * - * @param double $v new value - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @param string $v new value + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ - public function setPrice($v) + public function setAttributeAvChapo($v) { if ($v !== null) { - $v = (double) $v; + $v = (string) $v; } - if ($this->price !== $v) { - $this->price = $v; - $this->modifiedColumns[] = OrderProductTableMap::PRICE; + if ($this->attribute_av_chapo !== $v) { + $this->attribute_av_chapo = $v; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ATTRIBUTE_AV_CHAPO; } return $this; - } // setPrice() + } // setAttributeAvChapo() /** - * Set the value of [tax] column. + * Set the value of [attribute_av_description] column. * - * @param double $v new value - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @param string $v new value + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ - public function setTax($v) + public function setAttributeAvDescription($v) { if ($v !== null) { - $v = (double) $v; + $v = (string) $v; } - if ($this->tax !== $v) { - $this->tax = $v; - $this->modifiedColumns[] = OrderProductTableMap::TAX; + if ($this->attribute_av_description !== $v) { + $this->attribute_av_description = $v; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ATTRIBUTE_AV_DESCRIPTION; } return $this; - } // setTax() + } // setAttributeAvDescription() /** - * Set the value of [parent] column. + * Set the value of [attribute_av_postscriptum] column. * - * @param int $v new value - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @param string $v new value + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ - public function setParent($v) + public function setAttributeAvPostscriptum($v) { if ($v !== null) { - $v = (int) $v; + $v = (string) $v; } - if ($this->parent !== $v) { - $this->parent = $v; - $this->modifiedColumns[] = OrderProductTableMap::PARENT; + if ($this->attribute_av_postscriptum !== $v) { + $this->attribute_av_postscriptum = $v; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ATTRIBUTE_AV_POSTSCRIPTUM; } return $this; - } // setParent() + } // setAttributeAvPostscriptum() /** * Sets the value of [created_at] column to a normalized version of the date/time value specified. * * @param mixed $v string, integer (timestamp), or \DateTime value. * Empty strings are treated as NULL. - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ public function setCreatedAt($v) { @@ -787,7 +772,7 @@ abstract class OrderProduct implements ActiveRecordInterface if ($this->created_at !== null || $dt !== null) { if ($dt !== $this->created_at) { $this->created_at = $dt; - $this->modifiedColumns[] = OrderProductTableMap::CREATED_AT; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::CREATED_AT; } } // if either are not null @@ -800,7 +785,7 @@ abstract class OrderProduct implements ActiveRecordInterface * * @param mixed $v string, integer (timestamp), or \DateTime value. * Empty strings are treated as NULL. - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) */ public function setUpdatedAt($v) { @@ -808,7 +793,7 @@ abstract class OrderProduct implements ActiveRecordInterface if ($this->updated_at !== null || $dt !== null) { if ($dt !== $this->updated_at) { $this->updated_at = $dt; - $this->modifiedColumns[] = OrderProductTableMap::UPDATED_AT; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::UPDATED_AT; } } // if either are not null @@ -853,43 +838,43 @@ abstract class OrderProduct implements ActiveRecordInterface try { - $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : OrderProductTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; + $col = $row[TableMap::TYPE_NUM == $indexType ? 0 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)]; $this->id = (null !== $col) ? (int) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : OrderProductTableMap::translateFieldName('OrderId', TableMap::TYPE_PHPNAME, $indexType)]; - $this->order_id = (null !== $col) ? (int) $col : null; + $col = $row[TableMap::TYPE_NUM == $indexType ? 1 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('OrderProductId', TableMap::TYPE_PHPNAME, $indexType)]; + $this->order_product_id = (null !== $col) ? (int) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : OrderProductTableMap::translateFieldName('ProductRef', TableMap::TYPE_PHPNAME, $indexType)]; - $this->product_ref = (null !== $col) ? (string) $col : null; + $col = $row[TableMap::TYPE_NUM == $indexType ? 2 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('AttributeTitle', TableMap::TYPE_PHPNAME, $indexType)]; + $this->attribute_title = (null !== $col) ? (string) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : OrderProductTableMap::translateFieldName('Title', TableMap::TYPE_PHPNAME, $indexType)]; - $this->title = (null !== $col) ? (string) $col : null; + $col = $row[TableMap::TYPE_NUM == $indexType ? 3 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('AttributeChapo', TableMap::TYPE_PHPNAME, $indexType)]; + $this->attribute_chapo = (null !== $col) ? (string) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : OrderProductTableMap::translateFieldName('Description', TableMap::TYPE_PHPNAME, $indexType)]; - $this->description = (null !== $col) ? (string) $col : null; + $col = $row[TableMap::TYPE_NUM == $indexType ? 4 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('AttributeDescription', TableMap::TYPE_PHPNAME, $indexType)]; + $this->attribute_description = (null !== $col) ? (string) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : OrderProductTableMap::translateFieldName('Chapo', TableMap::TYPE_PHPNAME, $indexType)]; - $this->chapo = (null !== $col) ? (string) $col : null; + $col = $row[TableMap::TYPE_NUM == $indexType ? 5 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('AttributePostscriptumn', TableMap::TYPE_PHPNAME, $indexType)]; + $this->attribute_postscriptumn = (null !== $col) ? (string) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : OrderProductTableMap::translateFieldName('Quantity', TableMap::TYPE_PHPNAME, $indexType)]; - $this->quantity = (null !== $col) ? (double) $col : null; + $col = $row[TableMap::TYPE_NUM == $indexType ? 6 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('AttributeAvTitle', TableMap::TYPE_PHPNAME, $indexType)]; + $this->attribute_av_title = (null !== $col) ? (string) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 7 + $startcol : OrderProductTableMap::translateFieldName('Price', TableMap::TYPE_PHPNAME, $indexType)]; - $this->price = (null !== $col) ? (double) $col : null; + $col = $row[TableMap::TYPE_NUM == $indexType ? 7 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('AttributeAvChapo', TableMap::TYPE_PHPNAME, $indexType)]; + $this->attribute_av_chapo = (null !== $col) ? (string) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 8 + $startcol : OrderProductTableMap::translateFieldName('Tax', TableMap::TYPE_PHPNAME, $indexType)]; - $this->tax = (null !== $col) ? (double) $col : null; + $col = $row[TableMap::TYPE_NUM == $indexType ? 8 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('AttributeAvDescription', TableMap::TYPE_PHPNAME, $indexType)]; + $this->attribute_av_description = (null !== $col) ? (string) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 9 + $startcol : OrderProductTableMap::translateFieldName('Parent', TableMap::TYPE_PHPNAME, $indexType)]; - $this->parent = (null !== $col) ? (int) $col : null; + $col = $row[TableMap::TYPE_NUM == $indexType ? 9 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('AttributeAvPostscriptum', TableMap::TYPE_PHPNAME, $indexType)]; + $this->attribute_av_postscriptum = (null !== $col) ? (string) $col : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 10 + $startcol : OrderProductTableMap::translateFieldName('CreatedAt', TableMap::TYPE_PHPNAME, $indexType)]; + $col = $row[TableMap::TYPE_NUM == $indexType ? 10 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('CreatedAt', TableMap::TYPE_PHPNAME, $indexType)]; if ($col === '0000-00-00 00:00:00') { $col = null; } $this->created_at = (null !== $col) ? PropelDateTime::newInstance($col, null, '\DateTime') : null; - $col = $row[TableMap::TYPE_NUM == $indexType ? 11 + $startcol : OrderProductTableMap::translateFieldName('UpdatedAt', TableMap::TYPE_PHPNAME, $indexType)]; + $col = $row[TableMap::TYPE_NUM == $indexType ? 11 + $startcol : OrderAttributeCombinationTableMap::translateFieldName('UpdatedAt', TableMap::TYPE_PHPNAME, $indexType)]; if ($col === '0000-00-00 00:00:00') { $col = null; } @@ -902,10 +887,10 @@ abstract class OrderProduct implements ActiveRecordInterface $this->ensureConsistency(); } - return $startcol + 12; // 12 = OrderProductTableMap::NUM_HYDRATE_COLUMNS. + return $startcol + 12; // 12 = OrderAttributeCombinationTableMap::NUM_HYDRATE_COLUMNS. } catch (Exception $e) { - throw new PropelException("Error populating \Thelia\Model\OrderProduct object", 0, $e); + throw new PropelException("Error populating \Thelia\Model\OrderAttributeCombination object", 0, $e); } } @@ -924,8 +909,8 @@ abstract class OrderProduct implements ActiveRecordInterface */ public function ensureConsistency() { - if ($this->aOrder !== null && $this->order_id !== $this->aOrder->getId()) { - $this->aOrder = null; + if ($this->aOrderProduct !== null && $this->order_product_id !== $this->aOrderProduct->getId()) { + $this->aOrderProduct = null; } } // ensureConsistency @@ -950,13 +935,13 @@ abstract class OrderProduct implements ActiveRecordInterface } if ($con === null) { - $con = Propel::getServiceContainer()->getReadConnection(OrderProductTableMap::DATABASE_NAME); + $con = Propel::getServiceContainer()->getReadConnection(OrderAttributeCombinationTableMap::DATABASE_NAME); } // We don't need to alter the object instance pool; we're just modifying this instance // already in the pool. - $dataFetcher = ChildOrderProductQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); + $dataFetcher = ChildOrderAttributeCombinationQuery::create(null, $this->buildPkeyCriteria())->setFormatter(ModelCriteria::FORMAT_STATEMENT)->find($con); $row = $dataFetcher->fetch(); $dataFetcher->close(); if (!$row) { @@ -966,9 +951,7 @@ abstract class OrderProduct implements ActiveRecordInterface if ($deep) { // also de-associate any related objects? - $this->aOrder = null; - $this->collOrderFeatures = null; - + $this->aOrderProduct = null; } // if (deep) } @@ -978,8 +961,8 @@ abstract class OrderProduct implements ActiveRecordInterface * @param ConnectionInterface $con * @return void * @throws PropelException - * @see OrderProduct::setDeleted() - * @see OrderProduct::isDeleted() + * @see OrderAttributeCombination::setDeleted() + * @see OrderAttributeCombination::isDeleted() */ public function delete(ConnectionInterface $con = null) { @@ -988,12 +971,12 @@ abstract class OrderProduct implements ActiveRecordInterface } if ($con === null) { - $con = Propel::getServiceContainer()->getWriteConnection(OrderProductTableMap::DATABASE_NAME); + $con = Propel::getServiceContainer()->getWriteConnection(OrderAttributeCombinationTableMap::DATABASE_NAME); } $con->beginTransaction(); try { - $deleteQuery = ChildOrderProductQuery::create() + $deleteQuery = ChildOrderAttributeCombinationQuery::create() ->filterByPrimaryKey($this->getPrimaryKey()); $ret = $this->preDelete($con); if ($ret) { @@ -1030,7 +1013,7 @@ abstract class OrderProduct implements ActiveRecordInterface } if ($con === null) { - $con = Propel::getServiceContainer()->getWriteConnection(OrderProductTableMap::DATABASE_NAME); + $con = Propel::getServiceContainer()->getWriteConnection(OrderAttributeCombinationTableMap::DATABASE_NAME); } $con->beginTransaction(); @@ -1040,16 +1023,16 @@ abstract class OrderProduct implements ActiveRecordInterface if ($isInsert) { $ret = $ret && $this->preInsert($con); // timestampable behavior - if (!$this->isColumnModified(OrderProductTableMap::CREATED_AT)) { + if (!$this->isColumnModified(OrderAttributeCombinationTableMap::CREATED_AT)) { $this->setCreatedAt(time()); } - if (!$this->isColumnModified(OrderProductTableMap::UPDATED_AT)) { + if (!$this->isColumnModified(OrderAttributeCombinationTableMap::UPDATED_AT)) { $this->setUpdatedAt(time()); } } else { $ret = $ret && $this->preUpdate($con); // timestampable behavior - if ($this->isModified() && !$this->isColumnModified(OrderProductTableMap::UPDATED_AT)) { + if ($this->isModified() && !$this->isColumnModified(OrderAttributeCombinationTableMap::UPDATED_AT)) { $this->setUpdatedAt(time()); } } @@ -1061,7 +1044,7 @@ abstract class OrderProduct implements ActiveRecordInterface $this->postUpdate($con); } $this->postSave($con); - OrderProductTableMap::addInstanceToPool($this); + OrderAttributeCombinationTableMap::addInstanceToPool($this); } else { $affectedRows = 0; } @@ -1096,11 +1079,11 @@ abstract class OrderProduct implements ActiveRecordInterface // method. This object relates to these object(s) by a // foreign key reference. - if ($this->aOrder !== null) { - if ($this->aOrder->isModified() || $this->aOrder->isNew()) { - $affectedRows += $this->aOrder->save($con); + if ($this->aOrderProduct !== null) { + if ($this->aOrderProduct->isModified() || $this->aOrderProduct->isNew()) { + $affectedRows += $this->aOrderProduct->save($con); } - $this->setOrder($this->aOrder); + $this->setOrderProduct($this->aOrderProduct); } if ($this->isNew() || $this->isModified()) { @@ -1114,23 +1097,6 @@ abstract class OrderProduct implements ActiveRecordInterface $this->resetModified(); } - if ($this->orderFeaturesScheduledForDeletion !== null) { - if (!$this->orderFeaturesScheduledForDeletion->isEmpty()) { - \Thelia\Model\OrderFeatureQuery::create() - ->filterByPrimaryKeys($this->orderFeaturesScheduledForDeletion->getPrimaryKeys(false)) - ->delete($con); - $this->orderFeaturesScheduledForDeletion = null; - } - } - - if ($this->collOrderFeatures !== null) { - foreach ($this->collOrderFeatures as $referrerFK) { - if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) { - $affectedRows += $referrerFK->save($con); - } - } - } - $this->alreadyInSave = false; } @@ -1151,51 +1117,51 @@ abstract class OrderProduct implements ActiveRecordInterface $modifiedColumns = array(); $index = 0; - $this->modifiedColumns[] = OrderProductTableMap::ID; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::ID; if (null !== $this->id) { - throw new PropelException('Cannot insert a value for auto-increment primary key (' . OrderProductTableMap::ID . ')'); + throw new PropelException('Cannot insert a value for auto-increment primary key (' . OrderAttributeCombinationTableMap::ID . ')'); } // check the columns in natural order for more readable SQL queries - if ($this->isColumnModified(OrderProductTableMap::ID)) { + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ID)) { $modifiedColumns[':p' . $index++] = 'ID'; } - if ($this->isColumnModified(OrderProductTableMap::ORDER_ID)) { - $modifiedColumns[':p' . $index++] = 'ORDER_ID'; + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID)) { + $modifiedColumns[':p' . $index++] = 'ORDER_PRODUCT_ID'; } - if ($this->isColumnModified(OrderProductTableMap::PRODUCT_REF)) { - $modifiedColumns[':p' . $index++] = 'PRODUCT_REF'; + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_TITLE)) { + $modifiedColumns[':p' . $index++] = 'ATTRIBUTE_TITLE'; } - if ($this->isColumnModified(OrderProductTableMap::TITLE)) { - $modifiedColumns[':p' . $index++] = 'TITLE'; + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_CHAPO)) { + $modifiedColumns[':p' . $index++] = 'ATTRIBUTE_CHAPO'; } - if ($this->isColumnModified(OrderProductTableMap::DESCRIPTION)) { - $modifiedColumns[':p' . $index++] = 'DESCRIPTION'; + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = 'ATTRIBUTE_DESCRIPTION'; } - if ($this->isColumnModified(OrderProductTableMap::CHAPO)) { - $modifiedColumns[':p' . $index++] = 'CHAPO'; + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_POSTSCRIPTUMN)) { + $modifiedColumns[':p' . $index++] = 'ATTRIBUTE_POSTSCRIPTUMN'; } - if ($this->isColumnModified(OrderProductTableMap::QUANTITY)) { - $modifiedColumns[':p' . $index++] = 'QUANTITY'; + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_TITLE)) { + $modifiedColumns[':p' . $index++] = 'ATTRIBUTE_AV_TITLE'; } - if ($this->isColumnModified(OrderProductTableMap::PRICE)) { - $modifiedColumns[':p' . $index++] = 'PRICE'; + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_CHAPO)) { + $modifiedColumns[':p' . $index++] = 'ATTRIBUTE_AV_CHAPO'; } - if ($this->isColumnModified(OrderProductTableMap::TAX)) { - $modifiedColumns[':p' . $index++] = 'TAX'; + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = 'ATTRIBUTE_AV_DESCRIPTION'; } - if ($this->isColumnModified(OrderProductTableMap::PARENT)) { - $modifiedColumns[':p' . $index++] = 'PARENT'; + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_POSTSCRIPTUM)) { + $modifiedColumns[':p' . $index++] = 'ATTRIBUTE_AV_POSTSCRIPTUM'; } - if ($this->isColumnModified(OrderProductTableMap::CREATED_AT)) { + if ($this->isColumnModified(OrderAttributeCombinationTableMap::CREATED_AT)) { $modifiedColumns[':p' . $index++] = 'CREATED_AT'; } - if ($this->isColumnModified(OrderProductTableMap::UPDATED_AT)) { + if ($this->isColumnModified(OrderAttributeCombinationTableMap::UPDATED_AT)) { $modifiedColumns[':p' . $index++] = 'UPDATED_AT'; } $sql = sprintf( - 'INSERT INTO order_product (%s) VALUES (%s)', + 'INSERT INTO order_attribute_combination (%s) VALUES (%s)', implode(', ', $modifiedColumns), implode(', ', array_keys($modifiedColumns)) ); @@ -1207,32 +1173,32 @@ abstract class OrderProduct implements ActiveRecordInterface case 'ID': $stmt->bindValue($identifier, $this->id, PDO::PARAM_INT); break; - case 'ORDER_ID': - $stmt->bindValue($identifier, $this->order_id, PDO::PARAM_INT); + case 'ORDER_PRODUCT_ID': + $stmt->bindValue($identifier, $this->order_product_id, PDO::PARAM_INT); break; - case 'PRODUCT_REF': - $stmt->bindValue($identifier, $this->product_ref, PDO::PARAM_STR); + case 'ATTRIBUTE_TITLE': + $stmt->bindValue($identifier, $this->attribute_title, PDO::PARAM_STR); break; - case 'TITLE': - $stmt->bindValue($identifier, $this->title, PDO::PARAM_STR); + case 'ATTRIBUTE_CHAPO': + $stmt->bindValue($identifier, $this->attribute_chapo, PDO::PARAM_STR); break; - case 'DESCRIPTION': - $stmt->bindValue($identifier, $this->description, PDO::PARAM_STR); + case 'ATTRIBUTE_DESCRIPTION': + $stmt->bindValue($identifier, $this->attribute_description, PDO::PARAM_STR); break; - case 'CHAPO': - $stmt->bindValue($identifier, $this->chapo, PDO::PARAM_STR); + case 'ATTRIBUTE_POSTSCRIPTUMN': + $stmt->bindValue($identifier, $this->attribute_postscriptumn, PDO::PARAM_STR); break; - case 'QUANTITY': - $stmt->bindValue($identifier, $this->quantity, PDO::PARAM_STR); + case 'ATTRIBUTE_AV_TITLE': + $stmt->bindValue($identifier, $this->attribute_av_title, PDO::PARAM_STR); break; - case 'PRICE': - $stmt->bindValue($identifier, $this->price, PDO::PARAM_STR); + case 'ATTRIBUTE_AV_CHAPO': + $stmt->bindValue($identifier, $this->attribute_av_chapo, PDO::PARAM_STR); break; - case 'TAX': - $stmt->bindValue($identifier, $this->tax, PDO::PARAM_STR); + case 'ATTRIBUTE_AV_DESCRIPTION': + $stmt->bindValue($identifier, $this->attribute_av_description, PDO::PARAM_STR); break; - case 'PARENT': - $stmt->bindValue($identifier, $this->parent, PDO::PARAM_INT); + case 'ATTRIBUTE_AV_POSTSCRIPTUM': + $stmt->bindValue($identifier, $this->attribute_av_postscriptum, PDO::PARAM_STR); break; case 'CREATED_AT': $stmt->bindValue($identifier, $this->created_at ? $this->created_at->format("Y-m-d H:i:s") : null, PDO::PARAM_STR); @@ -1286,7 +1252,7 @@ abstract class OrderProduct implements ActiveRecordInterface */ public function getByName($name, $type = TableMap::TYPE_PHPNAME) { - $pos = OrderProductTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $pos = OrderAttributeCombinationTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); $field = $this->getByPosition($pos); return $field; @@ -1306,31 +1272,31 @@ abstract class OrderProduct implements ActiveRecordInterface return $this->getId(); break; case 1: - return $this->getOrderId(); + return $this->getOrderProductId(); break; case 2: - return $this->getProductRef(); + return $this->getAttributeTitle(); break; case 3: - return $this->getTitle(); + return $this->getAttributeChapo(); break; case 4: - return $this->getDescription(); + return $this->getAttributeDescription(); break; case 5: - return $this->getChapo(); + return $this->getAttributePostscriptumn(); break; case 6: - return $this->getQuantity(); + return $this->getAttributeAvTitle(); break; case 7: - return $this->getPrice(); + return $this->getAttributeAvChapo(); break; case 8: - return $this->getTax(); + return $this->getAttributeAvDescription(); break; case 9: - return $this->getParent(); + return $this->getAttributeAvPostscriptum(); break; case 10: return $this->getCreatedAt(); @@ -1361,22 +1327,22 @@ abstract class OrderProduct implements ActiveRecordInterface */ public function toArray($keyType = TableMap::TYPE_PHPNAME, $includeLazyLoadColumns = true, $alreadyDumpedObjects = array(), $includeForeignObjects = false) { - if (isset($alreadyDumpedObjects['OrderProduct'][$this->getPrimaryKey()])) { + if (isset($alreadyDumpedObjects['OrderAttributeCombination'][$this->getPrimaryKey()])) { return '*RECURSION*'; } - $alreadyDumpedObjects['OrderProduct'][$this->getPrimaryKey()] = true; - $keys = OrderProductTableMap::getFieldNames($keyType); + $alreadyDumpedObjects['OrderAttributeCombination'][$this->getPrimaryKey()] = true; + $keys = OrderAttributeCombinationTableMap::getFieldNames($keyType); $result = array( $keys[0] => $this->getId(), - $keys[1] => $this->getOrderId(), - $keys[2] => $this->getProductRef(), - $keys[3] => $this->getTitle(), - $keys[4] => $this->getDescription(), - $keys[5] => $this->getChapo(), - $keys[6] => $this->getQuantity(), - $keys[7] => $this->getPrice(), - $keys[8] => $this->getTax(), - $keys[9] => $this->getParent(), + $keys[1] => $this->getOrderProductId(), + $keys[2] => $this->getAttributeTitle(), + $keys[3] => $this->getAttributeChapo(), + $keys[4] => $this->getAttributeDescription(), + $keys[5] => $this->getAttributePostscriptumn(), + $keys[6] => $this->getAttributeAvTitle(), + $keys[7] => $this->getAttributeAvChapo(), + $keys[8] => $this->getAttributeAvDescription(), + $keys[9] => $this->getAttributeAvPostscriptum(), $keys[10] => $this->getCreatedAt(), $keys[11] => $this->getUpdatedAt(), ); @@ -1387,11 +1353,8 @@ abstract class OrderProduct implements ActiveRecordInterface } if ($includeForeignObjects) { - if (null !== $this->aOrder) { - $result['Order'] = $this->aOrder->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); - } - if (null !== $this->collOrderFeatures) { - $result['OrderFeatures'] = $this->collOrderFeatures->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects); + if (null !== $this->aOrderProduct) { + $result['OrderProduct'] = $this->aOrderProduct->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true); } } @@ -1411,7 +1374,7 @@ abstract class OrderProduct implements ActiveRecordInterface */ public function setByName($name, $value, $type = TableMap::TYPE_PHPNAME) { - $pos = OrderProductTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); + $pos = OrderAttributeCombinationTableMap::translateFieldName($name, $type, TableMap::TYPE_NUM); return $this->setByPosition($pos, $value); } @@ -1431,31 +1394,31 @@ abstract class OrderProduct implements ActiveRecordInterface $this->setId($value); break; case 1: - $this->setOrderId($value); + $this->setOrderProductId($value); break; case 2: - $this->setProductRef($value); + $this->setAttributeTitle($value); break; case 3: - $this->setTitle($value); + $this->setAttributeChapo($value); break; case 4: - $this->setDescription($value); + $this->setAttributeDescription($value); break; case 5: - $this->setChapo($value); + $this->setAttributePostscriptumn($value); break; case 6: - $this->setQuantity($value); + $this->setAttributeAvTitle($value); break; case 7: - $this->setPrice($value); + $this->setAttributeAvChapo($value); break; case 8: - $this->setTax($value); + $this->setAttributeAvDescription($value); break; case 9: - $this->setParent($value); + $this->setAttributeAvPostscriptum($value); break; case 10: $this->setCreatedAt($value); @@ -1485,18 +1448,18 @@ abstract class OrderProduct implements ActiveRecordInterface */ public function fromArray($arr, $keyType = TableMap::TYPE_PHPNAME) { - $keys = OrderProductTableMap::getFieldNames($keyType); + $keys = OrderAttributeCombinationTableMap::getFieldNames($keyType); if (array_key_exists($keys[0], $arr)) $this->setId($arr[$keys[0]]); - if (array_key_exists($keys[1], $arr)) $this->setOrderId($arr[$keys[1]]); - if (array_key_exists($keys[2], $arr)) $this->setProductRef($arr[$keys[2]]); - if (array_key_exists($keys[3], $arr)) $this->setTitle($arr[$keys[3]]); - if (array_key_exists($keys[4], $arr)) $this->setDescription($arr[$keys[4]]); - if (array_key_exists($keys[5], $arr)) $this->setChapo($arr[$keys[5]]); - if (array_key_exists($keys[6], $arr)) $this->setQuantity($arr[$keys[6]]); - if (array_key_exists($keys[7], $arr)) $this->setPrice($arr[$keys[7]]); - if (array_key_exists($keys[8], $arr)) $this->setTax($arr[$keys[8]]); - if (array_key_exists($keys[9], $arr)) $this->setParent($arr[$keys[9]]); + if (array_key_exists($keys[1], $arr)) $this->setOrderProductId($arr[$keys[1]]); + if (array_key_exists($keys[2], $arr)) $this->setAttributeTitle($arr[$keys[2]]); + if (array_key_exists($keys[3], $arr)) $this->setAttributeChapo($arr[$keys[3]]); + if (array_key_exists($keys[4], $arr)) $this->setAttributeDescription($arr[$keys[4]]); + if (array_key_exists($keys[5], $arr)) $this->setAttributePostscriptumn($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setAttributeAvTitle($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setAttributeAvChapo($arr[$keys[7]]); + if (array_key_exists($keys[8], $arr)) $this->setAttributeAvDescription($arr[$keys[8]]); + if (array_key_exists($keys[9], $arr)) $this->setAttributeAvPostscriptum($arr[$keys[9]]); if (array_key_exists($keys[10], $arr)) $this->setCreatedAt($arr[$keys[10]]); if (array_key_exists($keys[11], $arr)) $this->setUpdatedAt($arr[$keys[11]]); } @@ -1508,20 +1471,20 @@ abstract class OrderProduct implements ActiveRecordInterface */ public function buildCriteria() { - $criteria = new Criteria(OrderProductTableMap::DATABASE_NAME); + $criteria = new Criteria(OrderAttributeCombinationTableMap::DATABASE_NAME); - if ($this->isColumnModified(OrderProductTableMap::ID)) $criteria->add(OrderProductTableMap::ID, $this->id); - if ($this->isColumnModified(OrderProductTableMap::ORDER_ID)) $criteria->add(OrderProductTableMap::ORDER_ID, $this->order_id); - if ($this->isColumnModified(OrderProductTableMap::PRODUCT_REF)) $criteria->add(OrderProductTableMap::PRODUCT_REF, $this->product_ref); - if ($this->isColumnModified(OrderProductTableMap::TITLE)) $criteria->add(OrderProductTableMap::TITLE, $this->title); - if ($this->isColumnModified(OrderProductTableMap::DESCRIPTION)) $criteria->add(OrderProductTableMap::DESCRIPTION, $this->description); - if ($this->isColumnModified(OrderProductTableMap::CHAPO)) $criteria->add(OrderProductTableMap::CHAPO, $this->chapo); - if ($this->isColumnModified(OrderProductTableMap::QUANTITY)) $criteria->add(OrderProductTableMap::QUANTITY, $this->quantity); - if ($this->isColumnModified(OrderProductTableMap::PRICE)) $criteria->add(OrderProductTableMap::PRICE, $this->price); - if ($this->isColumnModified(OrderProductTableMap::TAX)) $criteria->add(OrderProductTableMap::TAX, $this->tax); - if ($this->isColumnModified(OrderProductTableMap::PARENT)) $criteria->add(OrderProductTableMap::PARENT, $this->parent); - if ($this->isColumnModified(OrderProductTableMap::CREATED_AT)) $criteria->add(OrderProductTableMap::CREATED_AT, $this->created_at); - if ($this->isColumnModified(OrderProductTableMap::UPDATED_AT)) $criteria->add(OrderProductTableMap::UPDATED_AT, $this->updated_at); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ID)) $criteria->add(OrderAttributeCombinationTableMap::ID, $this->id); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID)) $criteria->add(OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID, $this->order_product_id); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_TITLE)) $criteria->add(OrderAttributeCombinationTableMap::ATTRIBUTE_TITLE, $this->attribute_title); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_CHAPO)) $criteria->add(OrderAttributeCombinationTableMap::ATTRIBUTE_CHAPO, $this->attribute_chapo); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_DESCRIPTION)) $criteria->add(OrderAttributeCombinationTableMap::ATTRIBUTE_DESCRIPTION, $this->attribute_description); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_POSTSCRIPTUMN)) $criteria->add(OrderAttributeCombinationTableMap::ATTRIBUTE_POSTSCRIPTUMN, $this->attribute_postscriptumn); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_TITLE)) $criteria->add(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_TITLE, $this->attribute_av_title); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_CHAPO)) $criteria->add(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_CHAPO, $this->attribute_av_chapo); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_DESCRIPTION)) $criteria->add(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_DESCRIPTION, $this->attribute_av_description); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_POSTSCRIPTUM)) $criteria->add(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_POSTSCRIPTUM, $this->attribute_av_postscriptum); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::CREATED_AT)) $criteria->add(OrderAttributeCombinationTableMap::CREATED_AT, $this->created_at); + if ($this->isColumnModified(OrderAttributeCombinationTableMap::UPDATED_AT)) $criteria->add(OrderAttributeCombinationTableMap::UPDATED_AT, $this->updated_at); return $criteria; } @@ -1536,8 +1499,8 @@ abstract class OrderProduct implements ActiveRecordInterface */ public function buildPkeyCriteria() { - $criteria = new Criteria(OrderProductTableMap::DATABASE_NAME); - $criteria->add(OrderProductTableMap::ID, $this->id); + $criteria = new Criteria(OrderAttributeCombinationTableMap::DATABASE_NAME); + $criteria->add(OrderAttributeCombinationTableMap::ID, $this->id); return $criteria; } @@ -1578,38 +1541,24 @@ abstract class OrderProduct implements ActiveRecordInterface * If desired, this method can also make copies of all associated (fkey referrers) * objects. * - * @param object $copyObj An object of \Thelia\Model\OrderProduct (or compatible) type. + * @param object $copyObj An object of \Thelia\Model\OrderAttributeCombination (or compatible) type. * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. * @param boolean $makeNew Whether to reset autoincrement PKs and make the object new. * @throws PropelException */ public function copyInto($copyObj, $deepCopy = false, $makeNew = true) { - $copyObj->setOrderId($this->getOrderId()); - $copyObj->setProductRef($this->getProductRef()); - $copyObj->setTitle($this->getTitle()); - $copyObj->setDescription($this->getDescription()); - $copyObj->setChapo($this->getChapo()); - $copyObj->setQuantity($this->getQuantity()); - $copyObj->setPrice($this->getPrice()); - $copyObj->setTax($this->getTax()); - $copyObj->setParent($this->getParent()); + $copyObj->setOrderProductId($this->getOrderProductId()); + $copyObj->setAttributeTitle($this->getAttributeTitle()); + $copyObj->setAttributeChapo($this->getAttributeChapo()); + $copyObj->setAttributeDescription($this->getAttributeDescription()); + $copyObj->setAttributePostscriptumn($this->getAttributePostscriptumn()); + $copyObj->setAttributeAvTitle($this->getAttributeAvTitle()); + $copyObj->setAttributeAvChapo($this->getAttributeAvChapo()); + $copyObj->setAttributeAvDescription($this->getAttributeAvDescription()); + $copyObj->setAttributeAvPostscriptum($this->getAttributeAvPostscriptum()); $copyObj->setCreatedAt($this->getCreatedAt()); $copyObj->setUpdatedAt($this->getUpdatedAt()); - - if ($deepCopy) { - // important: temporarily setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); - - foreach ($this->getOrderFeatures() as $relObj) { - if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves - $copyObj->addOrderFeature($relObj->copy($deepCopy)); - } - } - - } // if ($deepCopy) - if ($makeNew) { $copyObj->setNew(true); $copyObj->setId(NULL); // this is a auto-increment column, so set to default value @@ -1625,7 +1574,7 @@ abstract class OrderProduct implements ActiveRecordInterface * objects. * * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * @return \Thelia\Model\OrderProduct Clone of current object. + * @return \Thelia\Model\OrderAttributeCombination Clone of current object. * @throws PropelException */ public function copy($deepCopy = false) @@ -1639,26 +1588,26 @@ abstract class OrderProduct implements ActiveRecordInterface } /** - * Declares an association between this object and a ChildOrder object. + * Declares an association between this object and a ChildOrderProduct object. * - * @param ChildOrder $v - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) + * @param ChildOrderProduct $v + * @return \Thelia\Model\OrderAttributeCombination The current object (for fluent API support) * @throws PropelException */ - public function setOrder(ChildOrder $v = null) + public function setOrderProduct(ChildOrderProduct $v = null) { if ($v === null) { - $this->setOrderId(NULL); + $this->setOrderProductId(NULL); } else { - $this->setOrderId($v->getId()); + $this->setOrderProductId($v->getId()); } - $this->aOrder = $v; + $this->aOrderProduct = $v; // Add binding for other direction of this n:n relationship. - // If this object has already been added to the ChildOrder object, it will not be re-added. + // If this object has already been added to the ChildOrderProduct object, it will not be re-added. if ($v !== null) { - $v->addOrderProduct($this); + $v->addOrderAttributeCombination($this); } @@ -1667,260 +1616,26 @@ abstract class OrderProduct implements ActiveRecordInterface /** - * Get the associated ChildOrder object + * Get the associated ChildOrderProduct object * * @param ConnectionInterface $con Optional Connection object. - * @return ChildOrder The associated ChildOrder object. + * @return ChildOrderProduct The associated ChildOrderProduct object. * @throws PropelException */ - public function getOrder(ConnectionInterface $con = null) + public function getOrderProduct(ConnectionInterface $con = null) { - if ($this->aOrder === null && ($this->order_id !== null)) { - $this->aOrder = ChildOrderQuery::create()->findPk($this->order_id, $con); + if ($this->aOrderProduct === null && ($this->order_product_id !== null)) { + $this->aOrderProduct = ChildOrderProductQuery::create()->findPk($this->order_product_id, $con); /* The following can be used additionally to guarantee the related object contains a reference to this object. This level of coupling may, however, be undesirable since it could result in an only partially populated collection in the referenced object. - $this->aOrder->addOrderProducts($this); + $this->aOrderProduct->addOrderAttributeCombinations($this); */ } - return $this->aOrder; - } - - - /** - * Initializes a collection based on the name of a relation. - * Avoids crafting an 'init[$relationName]s' method name - * that wouldn't work when StandardEnglishPluralizer is used. - * - * @param string $relationName The name of the relation to initialize - * @return void - */ - public function initRelation($relationName) - { - if ('OrderFeature' == $relationName) { - return $this->initOrderFeatures(); - } - } - - /** - * Clears out the collOrderFeatures collection - * - * This does not modify the database; however, it will remove any associated objects, causing - * them to be refetched by subsequent calls to accessor method. - * - * @return void - * @see addOrderFeatures() - */ - public function clearOrderFeatures() - { - $this->collOrderFeatures = null; // important to set this to NULL since that means it is uninitialized - } - - /** - * Reset is the collOrderFeatures collection loaded partially. - */ - public function resetPartialOrderFeatures($v = true) - { - $this->collOrderFeaturesPartial = $v; - } - - /** - * Initializes the collOrderFeatures collection. - * - * By default this just sets the collOrderFeatures collection to an empty array (like clearcollOrderFeatures()); - * however, you may wish to override this method in your stub class to provide setting appropriate - * to your application -- for example, setting the initial array to the values stored in database. - * - * @param boolean $overrideExisting If set to true, the method call initializes - * the collection even if it is not empty - * - * @return void - */ - public function initOrderFeatures($overrideExisting = true) - { - if (null !== $this->collOrderFeatures && !$overrideExisting) { - return; - } - $this->collOrderFeatures = new ObjectCollection(); - $this->collOrderFeatures->setModel('\Thelia\Model\OrderFeature'); - } - - /** - * Gets an array of ChildOrderFeature objects which contain a foreign key that references this object. - * - * If the $criteria is not null, it is used to always fetch the results from the database. - * Otherwise the results are fetched from the database the first time, then cached. - * Next time the same method is called without $criteria, the cached collection is returned. - * If this ChildOrderProduct is new, it will return - * an empty collection or the current collection; the criteria is ignored on a new object. - * - * @param Criteria $criteria optional Criteria object to narrow the query - * @param ConnectionInterface $con optional connection object - * @return Collection|ChildOrderFeature[] List of ChildOrderFeature objects - * @throws PropelException - */ - public function getOrderFeatures($criteria = null, ConnectionInterface $con = null) - { - $partial = $this->collOrderFeaturesPartial && !$this->isNew(); - if (null === $this->collOrderFeatures || null !== $criteria || $partial) { - if ($this->isNew() && null === $this->collOrderFeatures) { - // return empty collection - $this->initOrderFeatures(); - } else { - $collOrderFeatures = ChildOrderFeatureQuery::create(null, $criteria) - ->filterByOrderProduct($this) - ->find($con); - - if (null !== $criteria) { - if (false !== $this->collOrderFeaturesPartial && count($collOrderFeatures)) { - $this->initOrderFeatures(false); - - foreach ($collOrderFeatures as $obj) { - if (false == $this->collOrderFeatures->contains($obj)) { - $this->collOrderFeatures->append($obj); - } - } - - $this->collOrderFeaturesPartial = true; - } - - $collOrderFeatures->getInternalIterator()->rewind(); - - return $collOrderFeatures; - } - - if ($partial && $this->collOrderFeatures) { - foreach ($this->collOrderFeatures as $obj) { - if ($obj->isNew()) { - $collOrderFeatures[] = $obj; - } - } - } - - $this->collOrderFeatures = $collOrderFeatures; - $this->collOrderFeaturesPartial = false; - } - } - - return $this->collOrderFeatures; - } - - /** - * Sets a collection of OrderFeature objects related by a one-to-many relationship - * to the current object. - * It will also schedule objects for deletion based on a diff between old objects (aka persisted) - * and new objects from the given Propel collection. - * - * @param Collection $orderFeatures A Propel collection. - * @param ConnectionInterface $con Optional connection object - * @return ChildOrderProduct The current object (for fluent API support) - */ - public function setOrderFeatures(Collection $orderFeatures, ConnectionInterface $con = null) - { - $orderFeaturesToDelete = $this->getOrderFeatures(new Criteria(), $con)->diff($orderFeatures); - - - $this->orderFeaturesScheduledForDeletion = $orderFeaturesToDelete; - - foreach ($orderFeaturesToDelete as $orderFeatureRemoved) { - $orderFeatureRemoved->setOrderProduct(null); - } - - $this->collOrderFeatures = null; - foreach ($orderFeatures as $orderFeature) { - $this->addOrderFeature($orderFeature); - } - - $this->collOrderFeatures = $orderFeatures; - $this->collOrderFeaturesPartial = false; - - return $this; - } - - /** - * Returns the number of related OrderFeature objects. - * - * @param Criteria $criteria - * @param boolean $distinct - * @param ConnectionInterface $con - * @return int Count of related OrderFeature objects. - * @throws PropelException - */ - public function countOrderFeatures(Criteria $criteria = null, $distinct = false, ConnectionInterface $con = null) - { - $partial = $this->collOrderFeaturesPartial && !$this->isNew(); - if (null === $this->collOrderFeatures || null !== $criteria || $partial) { - if ($this->isNew() && null === $this->collOrderFeatures) { - return 0; - } - - if ($partial && !$criteria) { - return count($this->getOrderFeatures()); - } - - $query = ChildOrderFeatureQuery::create(null, $criteria); - if ($distinct) { - $query->distinct(); - } - - return $query - ->filterByOrderProduct($this) - ->count($con); - } - - return count($this->collOrderFeatures); - } - - /** - * Method called to associate a ChildOrderFeature object to this object - * through the ChildOrderFeature foreign key attribute. - * - * @param ChildOrderFeature $l ChildOrderFeature - * @return \Thelia\Model\OrderProduct The current object (for fluent API support) - */ - public function addOrderFeature(ChildOrderFeature $l) - { - if ($this->collOrderFeatures === null) { - $this->initOrderFeatures(); - $this->collOrderFeaturesPartial = true; - } - - if (!in_array($l, $this->collOrderFeatures->getArrayCopy(), true)) { // only add it if the **same** object is not already associated - $this->doAddOrderFeature($l); - } - - return $this; - } - - /** - * @param OrderFeature $orderFeature The orderFeature object to add. - */ - protected function doAddOrderFeature($orderFeature) - { - $this->collOrderFeatures[]= $orderFeature; - $orderFeature->setOrderProduct($this); - } - - /** - * @param OrderFeature $orderFeature The orderFeature object to remove. - * @return ChildOrderProduct The current object (for fluent API support) - */ - public function removeOrderFeature($orderFeature) - { - if ($this->getOrderFeatures()->contains($orderFeature)) { - $this->collOrderFeatures->remove($this->collOrderFeatures->search($orderFeature)); - if (null === $this->orderFeaturesScheduledForDeletion) { - $this->orderFeaturesScheduledForDeletion = clone $this->collOrderFeatures; - $this->orderFeaturesScheduledForDeletion->clear(); - } - $this->orderFeaturesScheduledForDeletion[]= clone $orderFeature; - $orderFeature->setOrderProduct(null); - } - - return $this; + return $this->aOrderProduct; } /** @@ -1929,15 +1644,15 @@ abstract class OrderProduct implements ActiveRecordInterface public function clear() { $this->id = null; - $this->order_id = null; - $this->product_ref = null; - $this->title = null; - $this->description = null; - $this->chapo = null; - $this->quantity = null; - $this->price = null; - $this->tax = null; - $this->parent = null; + $this->order_product_id = null; + $this->attribute_title = null; + $this->attribute_chapo = null; + $this->attribute_description = null; + $this->attribute_postscriptumn = null; + $this->attribute_av_title = null; + $this->attribute_av_chapo = null; + $this->attribute_av_description = null; + $this->attribute_av_postscriptum = null; $this->created_at = null; $this->updated_at = null; $this->alreadyInSave = false; @@ -1959,18 +1674,9 @@ abstract class OrderProduct implements ActiveRecordInterface public function clearAllReferences($deep = false) { if ($deep) { - if ($this->collOrderFeatures) { - foreach ($this->collOrderFeatures as $o) { - $o->clearAllReferences($deep); - } - } } // if ($deep) - if ($this->collOrderFeatures instanceof Collection) { - $this->collOrderFeatures->clearIterator(); - } - $this->collOrderFeatures = null; - $this->aOrder = null; + $this->aOrderProduct = null; } /** @@ -1980,7 +1686,7 @@ abstract class OrderProduct implements ActiveRecordInterface */ public function __toString() { - return (string) $this->exportTo(OrderProductTableMap::DEFAULT_STRING_FORMAT); + return (string) $this->exportTo(OrderAttributeCombinationTableMap::DEFAULT_STRING_FORMAT); } // timestampable behavior @@ -1988,11 +1694,11 @@ abstract class OrderProduct implements ActiveRecordInterface /** * Mark the current object so that the update date doesn't get updated during next save * - * @return ChildOrderProduct The current object (for fluent API support) + * @return ChildOrderAttributeCombination The current object (for fluent API support) */ public function keepUpdateDateUnchanged() { - $this->modifiedColumns[] = OrderProductTableMap::UPDATED_AT; + $this->modifiedColumns[] = OrderAttributeCombinationTableMap::UPDATED_AT; return $this; } diff --git a/core/lib/Thelia/Model/Base/OrderAttributeCombinationQuery.php b/core/lib/Thelia/Model/Base/OrderAttributeCombinationQuery.php new file mode 100644 index 000000000..0c7e7bfd8 --- /dev/null +++ b/core/lib/Thelia/Model/Base/OrderAttributeCombinationQuery.php @@ -0,0 +1,897 @@ +setModelAlias($modelAlias); + } + if ($criteria instanceof Criteria) { + $query->mergeWith($criteria); + } + + return $query; + } + + /** + * Find object by primary key. + * Propel uses the instance pool to skip the database if the object exists. + * Go fast if the query is untouched. + * + * + * $obj = $c->findPk(12, $con); + * + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ChildOrderAttributeCombination|array|mixed the result, formatted by the current formatter + */ + public function findPk($key, $con = null) + { + if ($key === null) { + return null; + } + if ((null !== ($obj = OrderAttributeCombinationTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { + // the object is already in the instance pool + return $obj; + } + if ($con === null) { + $con = Propel::getServiceContainer()->getReadConnection(OrderAttributeCombinationTableMap::DATABASE_NAME); + } + $this->basePreSelect($con); + if ($this->formatter || $this->modelAlias || $this->with || $this->select + || $this->selectColumns || $this->asColumns || $this->selectModifiers + || $this->map || $this->having || $this->joins) { + return $this->findPkComplex($key, $con); + } else { + return $this->findPkSimple($key, $con); + } + } + + /** + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildOrderAttributeCombination A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, ORDER_PRODUCT_ID, ATTRIBUTE_TITLE, ATTRIBUTE_CHAPO, ATTRIBUTE_DESCRIPTION, ATTRIBUTE_POSTSCRIPTUMN, ATTRIBUTE_AV_TITLE, ATTRIBUTE_AV_CHAPO, ATTRIBUTE_AV_DESCRIPTION, ATTRIBUTE_AV_POSTSCRIPTUM, CREATED_AT, UPDATED_AT FROM order_attribute_combination WHERE ID = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new ChildOrderAttributeCombination(); + $obj->hydrate($row); + OrderAttributeCombinationTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + + return $obj; + } + + /** + * Find object by primary key. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return ChildOrderAttributeCombination|array|mixed the result, formatted by the current formatter + */ + protected function findPkComplex($key, $con) + { + // As the query uses a PK condition, no limit(1) is necessary. + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKey($key) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); + } + + /** + * Find objects by primary key + * + * $objs = $c->findPks(array(12, 56, 832), $con); + * + * @param array $keys Primary keys to use for the query + * @param ConnectionInterface $con an optional connection object + * + * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter + */ + public function findPks($keys, $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); + } + $this->basePreSelect($con); + $criteria = $this->isKeepQuery() ? clone $this : $this; + $dataFetcher = $criteria + ->filterByPrimaryKeys($keys) + ->doSelect($con); + + return $criteria->getFormatter()->init($criteria)->format($dataFetcher); + } + + /** + * Filter the query by primary key + * + * @param mixed $key Primary key to use for the query + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByPrimaryKey($key) + { + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ID, $key, Criteria::EQUAL); + } + + /** + * Filter the query by a list of primary keys + * + * @param array $keys The list of primary key to use for the query + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByPrimaryKeys($keys) + { + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ID, $keys, Criteria::IN); + } + + /** + * Filter the query on the id column + * + * Example usage: + * + * $query->filterById(1234); // WHERE id = 1234 + * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) + * $query->filterById(array('min' => 12)); // WHERE id > 12 + * + * + * @param mixed $id The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterById($id = null, $comparison = null) + { + if (is_array($id)) { + $useMinMax = false; + if (isset($id['min'])) { + $this->addUsingAlias(OrderAttributeCombinationTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($id['max'])) { + $this->addUsingAlias(OrderAttributeCombinationTableMap::ID, $id['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ID, $id, $comparison); + } + + /** + * Filter the query on the order_product_id column + * + * Example usage: + * + * $query->filterByOrderProductId(1234); // WHERE order_product_id = 1234 + * $query->filterByOrderProductId(array(12, 34)); // WHERE order_product_id IN (12, 34) + * $query->filterByOrderProductId(array('min' => 12)); // WHERE order_product_id > 12 + * + * + * @see filterByOrderProduct() + * + * @param mixed $orderProductId The value to use as filter. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByOrderProductId($orderProductId = null, $comparison = null) + { + if (is_array($orderProductId)) { + $useMinMax = false; + if (isset($orderProductId['min'])) { + $this->addUsingAlias(OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID, $orderProductId['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($orderProductId['max'])) { + $this->addUsingAlias(OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID, $orderProductId['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID, $orderProductId, $comparison); + } + + /** + * Filter the query on the attribute_title column + * + * Example usage: + * + * $query->filterByAttributeTitle('fooValue'); // WHERE attribute_title = 'fooValue' + * $query->filterByAttributeTitle('%fooValue%'); // WHERE attribute_title LIKE '%fooValue%' + * + * + * @param string $attributeTitle 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 ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByAttributeTitle($attributeTitle = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($attributeTitle)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $attributeTitle)) { + $attributeTitle = str_replace('*', '%', $attributeTitle); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ATTRIBUTE_TITLE, $attributeTitle, $comparison); + } + + /** + * Filter the query on the attribute_chapo column + * + * Example usage: + * + * $query->filterByAttributeChapo('fooValue'); // WHERE attribute_chapo = 'fooValue' + * $query->filterByAttributeChapo('%fooValue%'); // WHERE attribute_chapo LIKE '%fooValue%' + * + * + * @param string $attributeChapo 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 ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByAttributeChapo($attributeChapo = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($attributeChapo)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $attributeChapo)) { + $attributeChapo = str_replace('*', '%', $attributeChapo); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ATTRIBUTE_CHAPO, $attributeChapo, $comparison); + } + + /** + * Filter the query on the attribute_description column + * + * Example usage: + * + * $query->filterByAttributeDescription('fooValue'); // WHERE attribute_description = 'fooValue' + * $query->filterByAttributeDescription('%fooValue%'); // WHERE attribute_description LIKE '%fooValue%' + * + * + * @param string $attributeDescription 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 ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByAttributeDescription($attributeDescription = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($attributeDescription)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $attributeDescription)) { + $attributeDescription = str_replace('*', '%', $attributeDescription); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ATTRIBUTE_DESCRIPTION, $attributeDescription, $comparison); + } + + /** + * Filter the query on the attribute_postscriptumn column + * + * Example usage: + * + * $query->filterByAttributePostscriptumn('fooValue'); // WHERE attribute_postscriptumn = 'fooValue' + * $query->filterByAttributePostscriptumn('%fooValue%'); // WHERE attribute_postscriptumn LIKE '%fooValue%' + * + * + * @param string $attributePostscriptumn 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 ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByAttributePostscriptumn($attributePostscriptumn = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($attributePostscriptumn)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $attributePostscriptumn)) { + $attributePostscriptumn = str_replace('*', '%', $attributePostscriptumn); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ATTRIBUTE_POSTSCRIPTUMN, $attributePostscriptumn, $comparison); + } + + /** + * Filter the query on the attribute_av_title column + * + * Example usage: + * + * $query->filterByAttributeAvTitle('fooValue'); // WHERE attribute_av_title = 'fooValue' + * $query->filterByAttributeAvTitle('%fooValue%'); // WHERE attribute_av_title LIKE '%fooValue%' + * + * + * @param string $attributeAvTitle 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 ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByAttributeAvTitle($attributeAvTitle = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($attributeAvTitle)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $attributeAvTitle)) { + $attributeAvTitle = str_replace('*', '%', $attributeAvTitle); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_TITLE, $attributeAvTitle, $comparison); + } + + /** + * Filter the query on the attribute_av_chapo column + * + * Example usage: + * + * $query->filterByAttributeAvChapo('fooValue'); // WHERE attribute_av_chapo = 'fooValue' + * $query->filterByAttributeAvChapo('%fooValue%'); // WHERE attribute_av_chapo LIKE '%fooValue%' + * + * + * @param string $attributeAvChapo 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 ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByAttributeAvChapo($attributeAvChapo = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($attributeAvChapo)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $attributeAvChapo)) { + $attributeAvChapo = str_replace('*', '%', $attributeAvChapo); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_CHAPO, $attributeAvChapo, $comparison); + } + + /** + * Filter the query on the attribute_av_description column + * + * Example usage: + * + * $query->filterByAttributeAvDescription('fooValue'); // WHERE attribute_av_description = 'fooValue' + * $query->filterByAttributeAvDescription('%fooValue%'); // WHERE attribute_av_description LIKE '%fooValue%' + * + * + * @param string $attributeAvDescription 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 ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByAttributeAvDescription($attributeAvDescription = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($attributeAvDescription)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $attributeAvDescription)) { + $attributeAvDescription = str_replace('*', '%', $attributeAvDescription); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_DESCRIPTION, $attributeAvDescription, $comparison); + } + + /** + * Filter the query on the attribute_av_postscriptum column + * + * Example usage: + * + * $query->filterByAttributeAvPostscriptum('fooValue'); // WHERE attribute_av_postscriptum = 'fooValue' + * $query->filterByAttributeAvPostscriptum('%fooValue%'); // WHERE attribute_av_postscriptum LIKE '%fooValue%' + * + * + * @param string $attributeAvPostscriptum 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 ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByAttributeAvPostscriptum($attributeAvPostscriptum = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($attributeAvPostscriptum)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $attributeAvPostscriptum)) { + $attributeAvPostscriptum = str_replace('*', '%', $attributeAvPostscriptum); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_POSTSCRIPTUM, $attributeAvPostscriptum, $comparison); + } + + /** + * Filter the query on the created_at column + * + * Example usage: + * + * $query->filterByCreatedAt('2011-03-14'); // WHERE created_at = '2011-03-14' + * $query->filterByCreatedAt('now'); // WHERE created_at = '2011-03-14' + * $query->filterByCreatedAt(array('max' => 'yesterday')); // WHERE created_at > '2011-03-13' + * + * + * @param mixed $createdAt The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByCreatedAt($createdAt = null, $comparison = null) + { + if (is_array($createdAt)) { + $useMinMax = false; + if (isset($createdAt['min'])) { + $this->addUsingAlias(OrderAttributeCombinationTableMap::CREATED_AT, $createdAt['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($createdAt['max'])) { + $this->addUsingAlias(OrderAttributeCombinationTableMap::CREATED_AT, $createdAt['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::CREATED_AT, $createdAt, $comparison); + } + + /** + * Filter the query on the updated_at column + * + * Example usage: + * + * $query->filterByUpdatedAt('2011-03-14'); // WHERE updated_at = '2011-03-14' + * $query->filterByUpdatedAt('now'); // WHERE updated_at = '2011-03-14' + * $query->filterByUpdatedAt(array('max' => 'yesterday')); // WHERE updated_at > '2011-03-13' + * + * + * @param mixed $updatedAt The value to use as filter. + * Values can be integers (unix timestamps), DateTime objects, or strings. + * Empty strings are treated as NULL. + * Use scalar values for equality. + * Use array values for in_array() equivalent. + * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByUpdatedAt($updatedAt = null, $comparison = null) + { + if (is_array($updatedAt)) { + $useMinMax = false; + if (isset($updatedAt['min'])) { + $this->addUsingAlias(OrderAttributeCombinationTableMap::UPDATED_AT, $updatedAt['min'], Criteria::GREATER_EQUAL); + $useMinMax = true; + } + if (isset($updatedAt['max'])) { + $this->addUsingAlias(OrderAttributeCombinationTableMap::UPDATED_AT, $updatedAt['max'], Criteria::LESS_EQUAL); + $useMinMax = true; + } + if ($useMinMax) { + return $this; + } + if (null === $comparison) { + $comparison = Criteria::IN; + } + } + + return $this->addUsingAlias(OrderAttributeCombinationTableMap::UPDATED_AT, $updatedAt, $comparison); + } + + /** + * Filter the query by a related \Thelia\Model\OrderProduct object + * + * @param \Thelia\Model\OrderProduct|ObjectCollection $orderProduct The related object(s) to use as filter + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function filterByOrderProduct($orderProduct, $comparison = null) + { + if ($orderProduct instanceof \Thelia\Model\OrderProduct) { + return $this + ->addUsingAlias(OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID, $orderProduct->getId(), $comparison); + } elseif ($orderProduct instanceof ObjectCollection) { + if (null === $comparison) { + $comparison = Criteria::IN; + } + + return $this + ->addUsingAlias(OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID, $orderProduct->toKeyValue('PrimaryKey', 'Id'), $comparison); + } else { + throw new PropelException('filterByOrderProduct() only accepts arguments of type \Thelia\Model\OrderProduct or Collection'); + } + } + + /** + * Adds a JOIN clause to the query using the OrderProduct relation + * + * @param string $relationAlias optional alias for the relation + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function joinOrderProduct($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + $tableMap = $this->getTableMap(); + $relationMap = $tableMap->getRelation('OrderProduct'); + + // create a ModelJoin object for this join + $join = new ModelJoin(); + $join->setJoinType($joinType); + $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); + if ($previousJoin = $this->getPreviousJoin()) { + $join->setPreviousJoin($previousJoin); + } + + // add the ModelJoin to the current object + if ($relationAlias) { + $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); + $this->addJoinObject($join, $relationAlias); + } else { + $this->addJoinObject($join, 'OrderProduct'); + } + + return $this; + } + + /** + * Use the OrderProduct relation OrderProduct object + * + * @see useQuery() + * + * @param string $relationAlias optional alias for the relation, + * to be used as main alias in the secondary query + * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' + * + * @return \Thelia\Model\OrderProductQuery A secondary query class using the current class as primary query + */ + public function useOrderProductQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) + { + return $this + ->joinOrderProduct($relationAlias, $joinType) + ->useQuery($relationAlias ? $relationAlias : 'OrderProduct', '\Thelia\Model\OrderProductQuery'); + } + + /** + * Exclude object from result + * + * @param ChildOrderAttributeCombination $orderAttributeCombination Object to remove from the list of results + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function prune($orderAttributeCombination = null) + { + if ($orderAttributeCombination) { + $this->addUsingAlias(OrderAttributeCombinationTableMap::ID, $orderAttributeCombination->getId(), Criteria::NOT_EQUAL); + } + + return $this; + } + + /** + * Deletes all rows from the order_attribute_combination table. + * + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + */ + public function doDeleteAll(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(OrderAttributeCombinationTableMap::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + $affectedRows += parent::doDeleteAll($con); + // Because this db requires some delete cascade/set null emulation, we have to + // clear the cached instance *after* the emulation has happened (since + // instances get re-added by the select statement contained therein). + OrderAttributeCombinationTableMap::clearInstancePool(); + OrderAttributeCombinationTableMap::clearRelatedInstancePool(); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + return $affectedRows; + } + + /** + * Performs a DELETE on the database, given a ChildOrderAttributeCombination or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or ChildOrderAttributeCombination object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param ConnectionInterface $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public function delete(ConnectionInterface $con = null) + { + if (null === $con) { + $con = Propel::getServiceContainer()->getWriteConnection(OrderAttributeCombinationTableMap::DATABASE_NAME); + } + + $criteria = $this; + + // Set the correct dbName + $criteria->setDbName(OrderAttributeCombinationTableMap::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->beginTransaction(); + + + OrderAttributeCombinationTableMap::removeInstanceFromPool($criteria); + + $affectedRows += ModelCriteria::delete($con); + OrderAttributeCombinationTableMap::clearRelatedInstancePool(); + $con->commit(); + + return $affectedRows; + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + } + + // timestampable behavior + + /** + * Filter by the latest updated + * + * @param int $nbDays Maximum age of the latest update in days + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function recentlyUpdated($nbDays = 7) + { + return $this->addUsingAlias(OrderAttributeCombinationTableMap::UPDATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); + } + + /** + * Filter by the latest created + * + * @param int $nbDays Maximum age of in days + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function recentlyCreated($nbDays = 7) + { + return $this->addUsingAlias(OrderAttributeCombinationTableMap::CREATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); + } + + /** + * Order by update date desc + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function lastUpdatedFirst() + { + return $this->addDescendingOrderByColumn(OrderAttributeCombinationTableMap::UPDATED_AT); + } + + /** + * Order by update date asc + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function firstUpdatedFirst() + { + return $this->addAscendingOrderByColumn(OrderAttributeCombinationTableMap::UPDATED_AT); + } + + /** + * Order by create date desc + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function lastCreatedFirst() + { + return $this->addDescendingOrderByColumn(OrderAttributeCombinationTableMap::CREATED_AT); + } + + /** + * Order by create date asc + * + * @return ChildOrderAttributeCombinationQuery The current query, for fluid interface + */ + public function firstCreatedFirst() + { + return $this->addAscendingOrderByColumn(OrderAttributeCombinationTableMap::CREATED_AT); + } + +} // OrderAttributeCombinationQuery diff --git a/core/lib/Thelia/Model/Base/OrderProductQuery.php b/core/lib/Thelia/Model/Base/OrderProductQuery.php deleted file mode 100644 index b007c89e1..000000000 --- a/core/lib/Thelia/Model/Base/OrderProductQuery.php +++ /dev/null @@ -1,1022 +0,0 @@ -setModelAlias($modelAlias); - } - if ($criteria instanceof Criteria) { - $query->mergeWith($criteria); - } - - return $query; - } - - /** - * Find object by primary key. - * Propel uses the instance pool to skip the database if the object exists. - * Go fast if the query is untouched. - * - * - * $obj = $c->findPk(12, $con); - * - * - * @param mixed $key Primary key to use for the query - * @param ConnectionInterface $con an optional connection object - * - * @return ChildOrderProduct|array|mixed the result, formatted by the current formatter - */ - public function findPk($key, $con = null) - { - if ($key === null) { - return null; - } - if ((null !== ($obj = OrderProductTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) { - // the object is already in the instance pool - return $obj; - } - if ($con === null) { - $con = Propel::getServiceContainer()->getReadConnection(OrderProductTableMap::DATABASE_NAME); - } - $this->basePreSelect($con); - if ($this->formatter || $this->modelAlias || $this->with || $this->select - || $this->selectColumns || $this->asColumns || $this->selectModifiers - || $this->map || $this->having || $this->joins) { - return $this->findPkComplex($key, $con); - } else { - return $this->findPkSimple($key, $con); - } - } - - /** - * Find object by primary key using raw SQL to go fast. - * Bypass doSelect() and the object formatter by using generated code. - * - * @param mixed $key Primary key to use for the query - * @param ConnectionInterface $con A connection object - * - * @return ChildOrderProduct A model object, or null if the key is not found - */ - protected function findPkSimple($key, $con) - { - $sql = 'SELECT ID, ORDER_ID, PRODUCT_REF, TITLE, DESCRIPTION, CHAPO, QUANTITY, PRICE, TAX, PARENT, CREATED_AT, UPDATED_AT FROM order_product WHERE ID = :p0'; - try { - $stmt = $con->prepare($sql); - $stmt->bindValue(':p0', $key, PDO::PARAM_INT); - $stmt->execute(); - } catch (Exception $e) { - Propel::log($e->getMessage(), Propel::LOG_ERR); - throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); - } - $obj = null; - if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { - $obj = new ChildOrderProduct(); - $obj->hydrate($row); - OrderProductTableMap::addInstanceToPool($obj, (string) $key); - } - $stmt->closeCursor(); - - return $obj; - } - - /** - * Find object by primary key. - * - * @param mixed $key Primary key to use for the query - * @param ConnectionInterface $con A connection object - * - * @return ChildOrderProduct|array|mixed the result, formatted by the current formatter - */ - protected function findPkComplex($key, $con) - { - // As the query uses a PK condition, no limit(1) is necessary. - $criteria = $this->isKeepQuery() ? clone $this : $this; - $dataFetcher = $criteria - ->filterByPrimaryKey($key) - ->doSelect($con); - - return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher); - } - - /** - * Find objects by primary key - * - * $objs = $c->findPks(array(12, 56, 832), $con); - * - * @param array $keys Primary keys to use for the query - * @param ConnectionInterface $con an optional connection object - * - * @return ObjectCollection|array|mixed the list of results, formatted by the current formatter - */ - public function findPks($keys, $con = null) - { - if (null === $con) { - $con = Propel::getServiceContainer()->getReadConnection($this->getDbName()); - } - $this->basePreSelect($con); - $criteria = $this->isKeepQuery() ? clone $this : $this; - $dataFetcher = $criteria - ->filterByPrimaryKeys($keys) - ->doSelect($con); - - return $criteria->getFormatter()->init($criteria)->format($dataFetcher); - } - - /** - * Filter the query by primary key - * - * @param mixed $key Primary key to use for the query - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByPrimaryKey($key) - { - - return $this->addUsingAlias(OrderProductTableMap::ID, $key, Criteria::EQUAL); - } - - /** - * Filter the query by a list of primary keys - * - * @param array $keys The list of primary key to use for the query - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByPrimaryKeys($keys) - { - - return $this->addUsingAlias(OrderProductTableMap::ID, $keys, Criteria::IN); - } - - /** - * Filter the query on the id column - * - * Example usage: - * - * $query->filterById(1234); // WHERE id = 1234 - * $query->filterById(array(12, 34)); // WHERE id IN (12, 34) - * $query->filterById(array('min' => 12)); // WHERE id > 12 - * - * - * @param mixed $id The value to use as filter. - * Use scalar values for equality. - * Use array values for in_array() equivalent. - * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterById($id = null, $comparison = null) - { - if (is_array($id)) { - $useMinMax = false; - if (isset($id['min'])) { - $this->addUsingAlias(OrderProductTableMap::ID, $id['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($id['max'])) { - $this->addUsingAlias(OrderProductTableMap::ID, $id['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - - return $this->addUsingAlias(OrderProductTableMap::ID, $id, $comparison); - } - - /** - * Filter the query on the order_id column - * - * Example usage: - * - * $query->filterByOrderId(1234); // WHERE order_id = 1234 - * $query->filterByOrderId(array(12, 34)); // WHERE order_id IN (12, 34) - * $query->filterByOrderId(array('min' => 12)); // WHERE order_id > 12 - * - * - * @see filterByOrder() - * - * @param mixed $orderId The value to use as filter. - * Use scalar values for equality. - * Use array values for in_array() equivalent. - * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByOrderId($orderId = null, $comparison = null) - { - if (is_array($orderId)) { - $useMinMax = false; - if (isset($orderId['min'])) { - $this->addUsingAlias(OrderProductTableMap::ORDER_ID, $orderId['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($orderId['max'])) { - $this->addUsingAlias(OrderProductTableMap::ORDER_ID, $orderId['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - - return $this->addUsingAlias(OrderProductTableMap::ORDER_ID, $orderId, $comparison); - } - - /** - * Filter the query on the product_ref column - * - * Example usage: - * - * $query->filterByProductRef('fooValue'); // WHERE product_ref = 'fooValue' - * $query->filterByProductRef('%fooValue%'); // WHERE product_ref LIKE '%fooValue%' - * - * - * @param string $productRef 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 ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByProductRef($productRef = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($productRef)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $productRef)) { - $productRef = str_replace('*', '%', $productRef); - $comparison = Criteria::LIKE; - } - } - - return $this->addUsingAlias(OrderProductTableMap::PRODUCT_REF, $productRef, $comparison); - } - - /** - * Filter the query on the title column - * - * Example usage: - * - * $query->filterByTitle('fooValue'); // WHERE title = 'fooValue' - * $query->filterByTitle('%fooValue%'); // WHERE title LIKE '%fooValue%' - * - * - * @param string $title 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 ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByTitle($title = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($title)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $title)) { - $title = str_replace('*', '%', $title); - $comparison = Criteria::LIKE; - } - } - - return $this->addUsingAlias(OrderProductTableMap::TITLE, $title, $comparison); - } - - /** - * Filter the query on the description column - * - * Example usage: - * - * $query->filterByDescription('fooValue'); // WHERE description = 'fooValue' - * $query->filterByDescription('%fooValue%'); // WHERE description LIKE '%fooValue%' - * - * - * @param string $description 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 ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByDescription($description = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($description)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $description)) { - $description = str_replace('*', '%', $description); - $comparison = Criteria::LIKE; - } - } - - return $this->addUsingAlias(OrderProductTableMap::DESCRIPTION, $description, $comparison); - } - - /** - * Filter the query on the chapo column - * - * Example usage: - * - * $query->filterByChapo('fooValue'); // WHERE chapo = 'fooValue' - * $query->filterByChapo('%fooValue%'); // WHERE chapo LIKE '%fooValue%' - * - * - * @param string $chapo 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 ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByChapo($chapo = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($chapo)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $chapo)) { - $chapo = str_replace('*', '%', $chapo); - $comparison = Criteria::LIKE; - } - } - - return $this->addUsingAlias(OrderProductTableMap::CHAPO, $chapo, $comparison); - } - - /** - * Filter the query on the quantity column - * - * Example usage: - * - * $query->filterByQuantity(1234); // WHERE quantity = 1234 - * $query->filterByQuantity(array(12, 34)); // WHERE quantity IN (12, 34) - * $query->filterByQuantity(array('min' => 12)); // WHERE quantity > 12 - * - * - * @param mixed $quantity The value to use as filter. - * Use scalar values for equality. - * Use array values for in_array() equivalent. - * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByQuantity($quantity = null, $comparison = null) - { - if (is_array($quantity)) { - $useMinMax = false; - if (isset($quantity['min'])) { - $this->addUsingAlias(OrderProductTableMap::QUANTITY, $quantity['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($quantity['max'])) { - $this->addUsingAlias(OrderProductTableMap::QUANTITY, $quantity['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - - return $this->addUsingAlias(OrderProductTableMap::QUANTITY, $quantity, $comparison); - } - - /** - * Filter the query on the price column - * - * Example usage: - * - * $query->filterByPrice(1234); // WHERE price = 1234 - * $query->filterByPrice(array(12, 34)); // WHERE price IN (12, 34) - * $query->filterByPrice(array('min' => 12)); // WHERE price > 12 - * - * - * @param mixed $price The value to use as filter. - * Use scalar values for equality. - * Use array values for in_array() equivalent. - * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByPrice($price = null, $comparison = null) - { - if (is_array($price)) { - $useMinMax = false; - if (isset($price['min'])) { - $this->addUsingAlias(OrderProductTableMap::PRICE, $price['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($price['max'])) { - $this->addUsingAlias(OrderProductTableMap::PRICE, $price['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - - return $this->addUsingAlias(OrderProductTableMap::PRICE, $price, $comparison); - } - - /** - * Filter the query on the tax column - * - * Example usage: - * - * $query->filterByTax(1234); // WHERE tax = 1234 - * $query->filterByTax(array(12, 34)); // WHERE tax IN (12, 34) - * $query->filterByTax(array('min' => 12)); // WHERE tax > 12 - * - * - * @param mixed $tax The value to use as filter. - * Use scalar values for equality. - * Use array values for in_array() equivalent. - * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByTax($tax = null, $comparison = null) - { - if (is_array($tax)) { - $useMinMax = false; - if (isset($tax['min'])) { - $this->addUsingAlias(OrderProductTableMap::TAX, $tax['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($tax['max'])) { - $this->addUsingAlias(OrderProductTableMap::TAX, $tax['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - - return $this->addUsingAlias(OrderProductTableMap::TAX, $tax, $comparison); - } - - /** - * Filter the query on the parent column - * - * Example usage: - * - * $query->filterByParent(1234); // WHERE parent = 1234 - * $query->filterByParent(array(12, 34)); // WHERE parent IN (12, 34) - * $query->filterByParent(array('min' => 12)); // WHERE parent > 12 - * - * - * @param mixed $parent The value to use as filter. - * Use scalar values for equality. - * Use array values for in_array() equivalent. - * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByParent($parent = null, $comparison = null) - { - if (is_array($parent)) { - $useMinMax = false; - if (isset($parent['min'])) { - $this->addUsingAlias(OrderProductTableMap::PARENT, $parent['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($parent['max'])) { - $this->addUsingAlias(OrderProductTableMap::PARENT, $parent['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - - return $this->addUsingAlias(OrderProductTableMap::PARENT, $parent, $comparison); - } - - /** - * Filter the query on the created_at column - * - * Example usage: - * - * $query->filterByCreatedAt('2011-03-14'); // WHERE created_at = '2011-03-14' - * $query->filterByCreatedAt('now'); // WHERE created_at = '2011-03-14' - * $query->filterByCreatedAt(array('max' => 'yesterday')); // WHERE created_at > '2011-03-13' - * - * - * @param mixed $createdAt The value to use as filter. - * Values can be integers (unix timestamps), DateTime objects, or strings. - * Empty strings are treated as NULL. - * Use scalar values for equality. - * Use array values for in_array() equivalent. - * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByCreatedAt($createdAt = null, $comparison = null) - { - if (is_array($createdAt)) { - $useMinMax = false; - if (isset($createdAt['min'])) { - $this->addUsingAlias(OrderProductTableMap::CREATED_AT, $createdAt['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($createdAt['max'])) { - $this->addUsingAlias(OrderProductTableMap::CREATED_AT, $createdAt['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - - return $this->addUsingAlias(OrderProductTableMap::CREATED_AT, $createdAt, $comparison); - } - - /** - * Filter the query on the updated_at column - * - * Example usage: - * - * $query->filterByUpdatedAt('2011-03-14'); // WHERE updated_at = '2011-03-14' - * $query->filterByUpdatedAt('now'); // WHERE updated_at = '2011-03-14' - * $query->filterByUpdatedAt(array('max' => 'yesterday')); // WHERE updated_at > '2011-03-13' - * - * - * @param mixed $updatedAt The value to use as filter. - * Values can be integers (unix timestamps), DateTime objects, or strings. - * Empty strings are treated as NULL. - * Use scalar values for equality. - * Use array values for in_array() equivalent. - * Use associative array('min' => $minValue, 'max' => $maxValue) for intervals. - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByUpdatedAt($updatedAt = null, $comparison = null) - { - if (is_array($updatedAt)) { - $useMinMax = false; - if (isset($updatedAt['min'])) { - $this->addUsingAlias(OrderProductTableMap::UPDATED_AT, $updatedAt['min'], Criteria::GREATER_EQUAL); - $useMinMax = true; - } - if (isset($updatedAt['max'])) { - $this->addUsingAlias(OrderProductTableMap::UPDATED_AT, $updatedAt['max'], Criteria::LESS_EQUAL); - $useMinMax = true; - } - if ($useMinMax) { - return $this; - } - if (null === $comparison) { - $comparison = Criteria::IN; - } - } - - return $this->addUsingAlias(OrderProductTableMap::UPDATED_AT, $updatedAt, $comparison); - } - - /** - * Filter the query by a related \Thelia\Model\Order object - * - * @param \Thelia\Model\Order|ObjectCollection $order The related object(s) to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByOrder($order, $comparison = null) - { - if ($order instanceof \Thelia\Model\Order) { - return $this - ->addUsingAlias(OrderProductTableMap::ORDER_ID, $order->getId(), $comparison); - } elseif ($order instanceof ObjectCollection) { - if (null === $comparison) { - $comparison = Criteria::IN; - } - - return $this - ->addUsingAlias(OrderProductTableMap::ORDER_ID, $order->toKeyValue('PrimaryKey', 'Id'), $comparison); - } else { - throw new PropelException('filterByOrder() only accepts arguments of type \Thelia\Model\Order or Collection'); - } - } - - /** - * Adds a JOIN clause to the query using the Order relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function joinOrder($relationAlias = null, $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('Order'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if ($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'Order'); - } - - return $this; - } - - /** - * Use the Order relation Order object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return \Thelia\Model\OrderQuery A secondary query class using the current class as primary query - */ - public function useOrderQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinOrder($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'Order', '\Thelia\Model\OrderQuery'); - } - - /** - * Filter the query by a related \Thelia\Model\OrderFeature object - * - * @param \Thelia\Model\OrderFeature|ObjectCollection $orderFeature the related object to use as filter - * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function filterByOrderFeature($orderFeature, $comparison = null) - { - if ($orderFeature instanceof \Thelia\Model\OrderFeature) { - return $this - ->addUsingAlias(OrderProductTableMap::ID, $orderFeature->getOrderProductId(), $comparison); - } elseif ($orderFeature instanceof ObjectCollection) { - return $this - ->useOrderFeatureQuery() - ->filterByPrimaryKeys($orderFeature->getPrimaryKeys()) - ->endUse(); - } else { - throw new PropelException('filterByOrderFeature() only accepts arguments of type \Thelia\Model\OrderFeature or Collection'); - } - } - - /** - * Adds a JOIN clause to the query using the OrderFeature relation - * - * @param string $relationAlias optional alias for the relation - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function joinOrderFeature($relationAlias = null, $joinType = Criteria::INNER_JOIN) - { - $tableMap = $this->getTableMap(); - $relationMap = $tableMap->getRelation('OrderFeature'); - - // create a ModelJoin object for this join - $join = new ModelJoin(); - $join->setJoinType($joinType); - $join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias); - if ($previousJoin = $this->getPreviousJoin()) { - $join->setPreviousJoin($previousJoin); - } - - // add the ModelJoin to the current object - if ($relationAlias) { - $this->addAlias($relationAlias, $relationMap->getRightTable()->getName()); - $this->addJoinObject($join, $relationAlias); - } else { - $this->addJoinObject($join, 'OrderFeature'); - } - - return $this; - } - - /** - * Use the OrderFeature relation OrderFeature object - * - * @see useQuery() - * - * @param string $relationAlias optional alias for the relation, - * to be used as main alias in the secondary query - * @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join' - * - * @return \Thelia\Model\OrderFeatureQuery A secondary query class using the current class as primary query - */ - public function useOrderFeatureQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN) - { - return $this - ->joinOrderFeature($relationAlias, $joinType) - ->useQuery($relationAlias ? $relationAlias : 'OrderFeature', '\Thelia\Model\OrderFeatureQuery'); - } - - /** - * Exclude object from result - * - * @param ChildOrderProduct $orderProduct Object to remove from the list of results - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function prune($orderProduct = null) - { - if ($orderProduct) { - $this->addUsingAlias(OrderProductTableMap::ID, $orderProduct->getId(), Criteria::NOT_EQUAL); - } - - return $this; - } - - /** - * Deletes all rows from the order_product table. - * - * @param ConnectionInterface $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). - */ - public function doDeleteAll(ConnectionInterface $con = null) - { - if (null === $con) { - $con = Propel::getServiceContainer()->getWriteConnection(OrderProductTableMap::DATABASE_NAME); - } - $affectedRows = 0; // initialize var to track total num of affected rows - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - $affectedRows += parent::doDeleteAll($con); - // Because this db requires some delete cascade/set null emulation, we have to - // clear the cached instance *after* the emulation has happened (since - // instances get re-added by the select statement contained therein). - OrderProductTableMap::clearInstancePool(); - OrderProductTableMap::clearRelatedInstancePool(); - - $con->commit(); - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - - return $affectedRows; - } - - /** - * Performs a DELETE on the database, given a ChildOrderProduct or Criteria object OR a primary key value. - * - * @param mixed $values Criteria or ChildOrderProduct object or primary key or array of primary keys - * which is used to create the DELETE statement - * @param ConnectionInterface $con the connection to use - * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows - * if supported by native driver or if emulated using Propel. - * @throws PropelException Any exceptions caught during processing will be - * rethrown wrapped into a PropelException. - */ - public function delete(ConnectionInterface $con = null) - { - if (null === $con) { - $con = Propel::getServiceContainer()->getWriteConnection(OrderProductTableMap::DATABASE_NAME); - } - - $criteria = $this; - - // Set the correct dbName - $criteria->setDbName(OrderProductTableMap::DATABASE_NAME); - - $affectedRows = 0; // initialize var to track total num of affected rows - - try { - // use transaction because $criteria could contain info - // for more than one table or we could emulating ON DELETE CASCADE, etc. - $con->beginTransaction(); - - - OrderProductTableMap::removeInstanceFromPool($criteria); - - $affectedRows += ModelCriteria::delete($con); - OrderProductTableMap::clearRelatedInstancePool(); - $con->commit(); - - return $affectedRows; - } catch (PropelException $e) { - $con->rollBack(); - throw $e; - } - } - - // timestampable behavior - - /** - * Filter by the latest updated - * - * @param int $nbDays Maximum age of the latest update in days - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function recentlyUpdated($nbDays = 7) - { - return $this->addUsingAlias(OrderProductTableMap::UPDATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); - } - - /** - * Filter by the latest created - * - * @param int $nbDays Maximum age of in days - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function recentlyCreated($nbDays = 7) - { - return $this->addUsingAlias(OrderProductTableMap::CREATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL); - } - - /** - * Order by update date desc - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function lastUpdatedFirst() - { - return $this->addDescendingOrderByColumn(OrderProductTableMap::UPDATED_AT); - } - - /** - * Order by update date asc - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function firstUpdatedFirst() - { - return $this->addAscendingOrderByColumn(OrderProductTableMap::UPDATED_AT); - } - - /** - * Order by create date desc - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function lastCreatedFirst() - { - return $this->addDescendingOrderByColumn(OrderProductTableMap::CREATED_AT); - } - - /** - * Order by create date asc - * - * @return ChildOrderProductQuery The current query, for fluid interface - */ - public function firstCreatedFirst() - { - return $this->addAscendingOrderByColumn(OrderProductTableMap::CREATED_AT); - } - -} // OrderProductQuery diff --git a/core/lib/Thelia/Model/Map/OrderProductTableMap.php b/core/lib/Thelia/Model/Map/OrderAttributeCombinationTableMap.php similarity index 51% rename from core/lib/Thelia/Model/Map/OrderProductTableMap.php rename to core/lib/Thelia/Model/Map/OrderAttributeCombinationTableMap.php index 038d12863..f87e8d59e 100644 --- a/core/lib/Thelia/Model/Map/OrderProductTableMap.php +++ b/core/lib/Thelia/Model/Map/OrderAttributeCombinationTableMap.php @@ -10,12 +10,12 @@ use Propel\Runtime\Exception\PropelException; use Propel\Runtime\Map\RelationMap; use Propel\Runtime\Map\TableMap; use Propel\Runtime\Map\TableMapTrait; -use Thelia\Model\OrderProduct; -use Thelia\Model\OrderProductQuery; +use Thelia\Model\OrderAttributeCombination; +use Thelia\Model\OrderAttributeCombinationQuery; /** - * This class defines the structure of the 'order_product' table. + * This class defines the structure of the 'order_attribute_combination' table. * * * @@ -25,14 +25,14 @@ use Thelia\Model\OrderProductQuery; * (i.e. if it's a text column type). * */ -class OrderProductTableMap extends TableMap +class OrderAttributeCombinationTableMap extends TableMap { use InstancePoolTrait; use TableMapTrait; /** * The (dot-path) name of this class */ - const CLASS_NAME = 'Thelia.Model.Map.OrderProductTableMap'; + const CLASS_NAME = 'Thelia.Model.Map.OrderAttributeCombinationTableMap'; /** * The default database name for this class @@ -42,17 +42,17 @@ class OrderProductTableMap extends TableMap /** * The table name for this class */ - const TABLE_NAME = 'order_product'; + const TABLE_NAME = 'order_attribute_combination'; /** * The related Propel class for this table */ - const OM_CLASS = '\\Thelia\\Model\\OrderProduct'; + const OM_CLASS = '\\Thelia\\Model\\OrderAttributeCombination'; /** * A class that can be returned by this tableMap */ - const CLASS_DEFAULT = 'Thelia.Model.OrderProduct'; + const CLASS_DEFAULT = 'Thelia.Model.OrderAttributeCombination'; /** * The total number of columns @@ -72,62 +72,62 @@ class OrderProductTableMap extends TableMap /** * the column name for the ID field */ - const ID = 'order_product.ID'; + const ID = 'order_attribute_combination.ID'; /** - * the column name for the ORDER_ID field + * the column name for the ORDER_PRODUCT_ID field */ - const ORDER_ID = 'order_product.ORDER_ID'; + const ORDER_PRODUCT_ID = 'order_attribute_combination.ORDER_PRODUCT_ID'; /** - * the column name for the PRODUCT_REF field + * the column name for the ATTRIBUTE_TITLE field */ - const PRODUCT_REF = 'order_product.PRODUCT_REF'; + const ATTRIBUTE_TITLE = 'order_attribute_combination.ATTRIBUTE_TITLE'; /** - * the column name for the TITLE field + * the column name for the ATTRIBUTE_CHAPO field */ - const TITLE = 'order_product.TITLE'; + const ATTRIBUTE_CHAPO = 'order_attribute_combination.ATTRIBUTE_CHAPO'; /** - * the column name for the DESCRIPTION field + * the column name for the ATTRIBUTE_DESCRIPTION field */ - const DESCRIPTION = 'order_product.DESCRIPTION'; + const ATTRIBUTE_DESCRIPTION = 'order_attribute_combination.ATTRIBUTE_DESCRIPTION'; /** - * the column name for the CHAPO field + * the column name for the ATTRIBUTE_POSTSCRIPTUMN field */ - const CHAPO = 'order_product.CHAPO'; + const ATTRIBUTE_POSTSCRIPTUMN = 'order_attribute_combination.ATTRIBUTE_POSTSCRIPTUMN'; /** - * the column name for the QUANTITY field + * the column name for the ATTRIBUTE_AV_TITLE field */ - const QUANTITY = 'order_product.QUANTITY'; + const ATTRIBUTE_AV_TITLE = 'order_attribute_combination.ATTRIBUTE_AV_TITLE'; /** - * the column name for the PRICE field + * the column name for the ATTRIBUTE_AV_CHAPO field */ - const PRICE = 'order_product.PRICE'; + const ATTRIBUTE_AV_CHAPO = 'order_attribute_combination.ATTRIBUTE_AV_CHAPO'; /** - * the column name for the TAX field + * the column name for the ATTRIBUTE_AV_DESCRIPTION field */ - const TAX = 'order_product.TAX'; + const ATTRIBUTE_AV_DESCRIPTION = 'order_attribute_combination.ATTRIBUTE_AV_DESCRIPTION'; /** - * the column name for the PARENT field + * the column name for the ATTRIBUTE_AV_POSTSCRIPTUM field */ - const PARENT = 'order_product.PARENT'; + const ATTRIBUTE_AV_POSTSCRIPTUM = 'order_attribute_combination.ATTRIBUTE_AV_POSTSCRIPTUM'; /** * the column name for the CREATED_AT field */ - const CREATED_AT = 'order_product.CREATED_AT'; + const CREATED_AT = 'order_attribute_combination.CREATED_AT'; /** * the column name for the UPDATED_AT field */ - const UPDATED_AT = 'order_product.UPDATED_AT'; + const UPDATED_AT = 'order_attribute_combination.UPDATED_AT'; /** * The default string format for model objects of the related table @@ -141,11 +141,11 @@ class OrderProductTableMap extends TableMap * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - self::TYPE_PHPNAME => array('Id', 'OrderId', 'ProductRef', 'Title', 'Description', 'Chapo', 'Quantity', 'Price', 'Tax', 'Parent', 'CreatedAt', 'UpdatedAt', ), - self::TYPE_STUDLYPHPNAME => array('id', 'orderId', 'productRef', 'title', 'description', 'chapo', 'quantity', 'price', 'tax', 'parent', 'createdAt', 'updatedAt', ), - self::TYPE_COLNAME => array(OrderProductTableMap::ID, OrderProductTableMap::ORDER_ID, OrderProductTableMap::PRODUCT_REF, OrderProductTableMap::TITLE, OrderProductTableMap::DESCRIPTION, OrderProductTableMap::CHAPO, OrderProductTableMap::QUANTITY, OrderProductTableMap::PRICE, OrderProductTableMap::TAX, OrderProductTableMap::PARENT, OrderProductTableMap::CREATED_AT, OrderProductTableMap::UPDATED_AT, ), - self::TYPE_RAW_COLNAME => array('ID', 'ORDER_ID', 'PRODUCT_REF', 'TITLE', 'DESCRIPTION', 'CHAPO', 'QUANTITY', 'PRICE', 'TAX', 'PARENT', 'CREATED_AT', 'UPDATED_AT', ), - self::TYPE_FIELDNAME => array('id', 'order_id', 'product_ref', 'title', 'description', 'chapo', 'quantity', 'price', 'tax', 'parent', 'created_at', 'updated_at', ), + self::TYPE_PHPNAME => array('Id', 'OrderProductId', 'AttributeTitle', 'AttributeChapo', 'AttributeDescription', 'AttributePostscriptumn', 'AttributeAvTitle', 'AttributeAvChapo', 'AttributeAvDescription', 'AttributeAvPostscriptum', 'CreatedAt', 'UpdatedAt', ), + self::TYPE_STUDLYPHPNAME => array('id', 'orderProductId', 'attributeTitle', 'attributeChapo', 'attributeDescription', 'attributePostscriptumn', 'attributeAvTitle', 'attributeAvChapo', 'attributeAvDescription', 'attributeAvPostscriptum', 'createdAt', 'updatedAt', ), + self::TYPE_COLNAME => array(OrderAttributeCombinationTableMap::ID, OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID, OrderAttributeCombinationTableMap::ATTRIBUTE_TITLE, OrderAttributeCombinationTableMap::ATTRIBUTE_CHAPO, OrderAttributeCombinationTableMap::ATTRIBUTE_DESCRIPTION, OrderAttributeCombinationTableMap::ATTRIBUTE_POSTSCRIPTUMN, OrderAttributeCombinationTableMap::ATTRIBUTE_AV_TITLE, OrderAttributeCombinationTableMap::ATTRIBUTE_AV_CHAPO, OrderAttributeCombinationTableMap::ATTRIBUTE_AV_DESCRIPTION, OrderAttributeCombinationTableMap::ATTRIBUTE_AV_POSTSCRIPTUM, OrderAttributeCombinationTableMap::CREATED_AT, OrderAttributeCombinationTableMap::UPDATED_AT, ), + self::TYPE_RAW_COLNAME => array('ID', 'ORDER_PRODUCT_ID', 'ATTRIBUTE_TITLE', 'ATTRIBUTE_CHAPO', 'ATTRIBUTE_DESCRIPTION', 'ATTRIBUTE_POSTSCRIPTUMN', 'ATTRIBUTE_AV_TITLE', 'ATTRIBUTE_AV_CHAPO', 'ATTRIBUTE_AV_DESCRIPTION', 'ATTRIBUTE_AV_POSTSCRIPTUM', 'CREATED_AT', 'UPDATED_AT', ), + self::TYPE_FIELDNAME => array('id', 'order_product_id', 'attribute_title', 'attribute_chapo', 'attribute_description', 'attribute_postscriptumn', 'attribute_av_title', 'attribute_av_chapo', 'attribute_av_description', 'attribute_av_postscriptum', 'created_at', 'updated_at', ), self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) ); @@ -156,11 +156,11 @@ class OrderProductTableMap extends TableMap * e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - self::TYPE_PHPNAME => array('Id' => 0, 'OrderId' => 1, 'ProductRef' => 2, 'Title' => 3, 'Description' => 4, 'Chapo' => 5, 'Quantity' => 6, 'Price' => 7, 'Tax' => 8, 'Parent' => 9, 'CreatedAt' => 10, 'UpdatedAt' => 11, ), - self::TYPE_STUDLYPHPNAME => array('id' => 0, 'orderId' => 1, 'productRef' => 2, 'title' => 3, 'description' => 4, 'chapo' => 5, 'quantity' => 6, 'price' => 7, 'tax' => 8, 'parent' => 9, 'createdAt' => 10, 'updatedAt' => 11, ), - self::TYPE_COLNAME => array(OrderProductTableMap::ID => 0, OrderProductTableMap::ORDER_ID => 1, OrderProductTableMap::PRODUCT_REF => 2, OrderProductTableMap::TITLE => 3, OrderProductTableMap::DESCRIPTION => 4, OrderProductTableMap::CHAPO => 5, OrderProductTableMap::QUANTITY => 6, OrderProductTableMap::PRICE => 7, OrderProductTableMap::TAX => 8, OrderProductTableMap::PARENT => 9, OrderProductTableMap::CREATED_AT => 10, OrderProductTableMap::UPDATED_AT => 11, ), - self::TYPE_RAW_COLNAME => array('ID' => 0, 'ORDER_ID' => 1, 'PRODUCT_REF' => 2, 'TITLE' => 3, 'DESCRIPTION' => 4, 'CHAPO' => 5, 'QUANTITY' => 6, 'PRICE' => 7, 'TAX' => 8, 'PARENT' => 9, 'CREATED_AT' => 10, 'UPDATED_AT' => 11, ), - self::TYPE_FIELDNAME => array('id' => 0, 'order_id' => 1, 'product_ref' => 2, 'title' => 3, 'description' => 4, 'chapo' => 5, 'quantity' => 6, 'price' => 7, 'tax' => 8, 'parent' => 9, 'created_at' => 10, 'updated_at' => 11, ), + self::TYPE_PHPNAME => array('Id' => 0, 'OrderProductId' => 1, 'AttributeTitle' => 2, 'AttributeChapo' => 3, 'AttributeDescription' => 4, 'AttributePostscriptumn' => 5, 'AttributeAvTitle' => 6, 'AttributeAvChapo' => 7, 'AttributeAvDescription' => 8, 'AttributeAvPostscriptum' => 9, 'CreatedAt' => 10, 'UpdatedAt' => 11, ), + self::TYPE_STUDLYPHPNAME => array('id' => 0, 'orderProductId' => 1, 'attributeTitle' => 2, 'attributeChapo' => 3, 'attributeDescription' => 4, 'attributePostscriptumn' => 5, 'attributeAvTitle' => 6, 'attributeAvChapo' => 7, 'attributeAvDescription' => 8, 'attributeAvPostscriptum' => 9, 'createdAt' => 10, 'updatedAt' => 11, ), + self::TYPE_COLNAME => array(OrderAttributeCombinationTableMap::ID => 0, OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID => 1, OrderAttributeCombinationTableMap::ATTRIBUTE_TITLE => 2, OrderAttributeCombinationTableMap::ATTRIBUTE_CHAPO => 3, OrderAttributeCombinationTableMap::ATTRIBUTE_DESCRIPTION => 4, OrderAttributeCombinationTableMap::ATTRIBUTE_POSTSCRIPTUMN => 5, OrderAttributeCombinationTableMap::ATTRIBUTE_AV_TITLE => 6, OrderAttributeCombinationTableMap::ATTRIBUTE_AV_CHAPO => 7, OrderAttributeCombinationTableMap::ATTRIBUTE_AV_DESCRIPTION => 8, OrderAttributeCombinationTableMap::ATTRIBUTE_AV_POSTSCRIPTUM => 9, OrderAttributeCombinationTableMap::CREATED_AT => 10, OrderAttributeCombinationTableMap::UPDATED_AT => 11, ), + self::TYPE_RAW_COLNAME => array('ID' => 0, 'ORDER_PRODUCT_ID' => 1, 'ATTRIBUTE_TITLE' => 2, 'ATTRIBUTE_CHAPO' => 3, 'ATTRIBUTE_DESCRIPTION' => 4, 'ATTRIBUTE_POSTSCRIPTUMN' => 5, 'ATTRIBUTE_AV_TITLE' => 6, 'ATTRIBUTE_AV_CHAPO' => 7, 'ATTRIBUTE_AV_DESCRIPTION' => 8, 'ATTRIBUTE_AV_POSTSCRIPTUM' => 9, 'CREATED_AT' => 10, 'UPDATED_AT' => 11, ), + self::TYPE_FIELDNAME => array('id' => 0, 'order_product_id' => 1, 'attribute_title' => 2, 'attribute_chapo' => 3, 'attribute_description' => 4, 'attribute_postscriptumn' => 5, 'attribute_av_title' => 6, 'attribute_av_chapo' => 7, 'attribute_av_description' => 8, 'attribute_av_postscriptum' => 9, 'created_at' => 10, 'updated_at' => 11, ), self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) ); @@ -174,22 +174,22 @@ class OrderProductTableMap extends TableMap public function initialize() { // attributes - $this->setName('order_product'); - $this->setPhpName('OrderProduct'); - $this->setClassName('\\Thelia\\Model\\OrderProduct'); + $this->setName('order_attribute_combination'); + $this->setPhpName('OrderAttributeCombination'); + $this->setClassName('\\Thelia\\Model\\OrderAttributeCombination'); $this->setPackage('Thelia.Model'); $this->setUseIdGenerator(true); // columns $this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null); - $this->addForeignKey('ORDER_ID', 'OrderId', 'INTEGER', 'order', 'ID', true, null, null); - $this->addColumn('PRODUCT_REF', 'ProductRef', 'VARCHAR', false, 255, null); - $this->addColumn('TITLE', 'Title', 'VARCHAR', false, 255, null); - $this->addColumn('DESCRIPTION', 'Description', 'LONGVARCHAR', false, null, null); - $this->addColumn('CHAPO', 'Chapo', 'LONGVARCHAR', false, null, null); - $this->addColumn('QUANTITY', 'Quantity', 'FLOAT', true, null, null); - $this->addColumn('PRICE', 'Price', 'FLOAT', true, null, null); - $this->addColumn('TAX', 'Tax', 'FLOAT', false, null, null); - $this->addColumn('PARENT', 'Parent', 'INTEGER', false, null, null); + $this->addForeignKey('ORDER_PRODUCT_ID', 'OrderProductId', 'INTEGER', 'order_product', 'ID', true, null, null); + $this->addColumn('ATTRIBUTE_TITLE', 'AttributeTitle', 'VARCHAR', true, 255, null); + $this->addColumn('ATTRIBUTE_CHAPO', 'AttributeChapo', 'LONGVARCHAR', false, null, null); + $this->addColumn('ATTRIBUTE_DESCRIPTION', 'AttributeDescription', 'CLOB', false, null, null); + $this->addColumn('ATTRIBUTE_POSTSCRIPTUMN', 'AttributePostscriptumn', 'LONGVARCHAR', false, null, null); + $this->addColumn('ATTRIBUTE_AV_TITLE', 'AttributeAvTitle', 'VARCHAR', true, 255, null); + $this->addColumn('ATTRIBUTE_AV_CHAPO', 'AttributeAvChapo', 'LONGVARCHAR', false, null, null); + $this->addColumn('ATTRIBUTE_AV_DESCRIPTION', 'AttributeAvDescription', 'CLOB', false, null, null); + $this->addColumn('ATTRIBUTE_AV_POSTSCRIPTUM', 'AttributeAvPostscriptum', 'LONGVARCHAR', false, null, null); $this->addColumn('CREATED_AT', 'CreatedAt', 'TIMESTAMP', false, null, null); $this->addColumn('UPDATED_AT', 'UpdatedAt', 'TIMESTAMP', false, null, null); } // initialize() @@ -199,8 +199,7 @@ class OrderProductTableMap extends TableMap */ public function buildRelations() { - $this->addRelation('Order', '\\Thelia\\Model\\Order', RelationMap::MANY_TO_ONE, array('order_id' => 'id', ), 'CASCADE', 'RESTRICT'); - $this->addRelation('OrderFeature', '\\Thelia\\Model\\OrderFeature', RelationMap::ONE_TO_MANY, array('id' => 'order_product_id', ), 'CASCADE', 'RESTRICT', 'OrderFeatures'); + $this->addRelation('OrderProduct', '\\Thelia\\Model\\OrderProduct', RelationMap::MANY_TO_ONE, array('order_product_id' => 'id', ), 'CASCADE', 'RESTRICT'); } // buildRelations() /** @@ -215,15 +214,6 @@ class OrderProductTableMap extends TableMap 'timestampable' => array('create_column' => 'created_at', 'update_column' => 'updated_at', ), ); } // getBehaviors() - /** - * Method to invalidate the instance pool of all tables related to order_product * by a foreign key with ON DELETE CASCADE - */ - public static function clearRelatedInstancePool() - { - // Invalidate objects in ".$this->getClassNameFromBuilder($joinedTableTableMapBuilder)." instance pool, - // since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule. - OrderFeatureTableMap::clearInstancePool(); - } /** * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table. @@ -281,7 +271,7 @@ class OrderProductTableMap extends TableMap */ public static function getOMClass($withPrefix = true) { - return $withPrefix ? OrderProductTableMap::CLASS_DEFAULT : OrderProductTableMap::OM_CLASS; + return $withPrefix ? OrderAttributeCombinationTableMap::CLASS_DEFAULT : OrderAttributeCombinationTableMap::OM_CLASS; } /** @@ -295,21 +285,21 @@ class OrderProductTableMap extends TableMap * * @throws PropelException Any exceptions caught during processing will be * rethrown wrapped into a PropelException. - * @return array (OrderProduct object, last column rank) + * @return array (OrderAttributeCombination object, last column rank) */ public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM) { - $key = OrderProductTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); - if (null !== ($obj = OrderProductTableMap::getInstanceFromPool($key))) { + $key = OrderAttributeCombinationTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType); + if (null !== ($obj = OrderAttributeCombinationTableMap::getInstanceFromPool($key))) { // We no longer rehydrate the object, since this can cause data loss. // See http://www.propelorm.org/ticket/509 // $obj->hydrate($row, $offset, true); // rehydrate - $col = $offset + OrderProductTableMap::NUM_HYDRATE_COLUMNS; + $col = $offset + OrderAttributeCombinationTableMap::NUM_HYDRATE_COLUMNS; } else { - $cls = OrderProductTableMap::OM_CLASS; + $cls = OrderAttributeCombinationTableMap::OM_CLASS; $obj = new $cls(); $col = $obj->hydrate($row, $offset, false, $indexType); - OrderProductTableMap::addInstanceToPool($obj, $key); + OrderAttributeCombinationTableMap::addInstanceToPool($obj, $key); } return array($obj, $col); @@ -332,8 +322,8 @@ class OrderProductTableMap extends TableMap $cls = static::getOMClass(false); // populate the object(s) while ($row = $dataFetcher->fetch()) { - $key = OrderProductTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); - if (null !== ($obj = OrderProductTableMap::getInstanceFromPool($key))) { + $key = OrderAttributeCombinationTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType()); + if (null !== ($obj = OrderAttributeCombinationTableMap::getInstanceFromPool($key))) { // We no longer rehydrate the object, since this can cause data loss. // See http://www.propelorm.org/ticket/509 // $obj->hydrate($row, 0, true); // rehydrate @@ -342,7 +332,7 @@ class OrderProductTableMap extends TableMap $obj = new $cls(); $obj->hydrate($row); $results[] = $obj; - OrderProductTableMap::addInstanceToPool($obj, $key); + OrderAttributeCombinationTableMap::addInstanceToPool($obj, $key); } // if key exists } @@ -363,29 +353,29 @@ class OrderProductTableMap extends TableMap public static function addSelectColumns(Criteria $criteria, $alias = null) { if (null === $alias) { - $criteria->addSelectColumn(OrderProductTableMap::ID); - $criteria->addSelectColumn(OrderProductTableMap::ORDER_ID); - $criteria->addSelectColumn(OrderProductTableMap::PRODUCT_REF); - $criteria->addSelectColumn(OrderProductTableMap::TITLE); - $criteria->addSelectColumn(OrderProductTableMap::DESCRIPTION); - $criteria->addSelectColumn(OrderProductTableMap::CHAPO); - $criteria->addSelectColumn(OrderProductTableMap::QUANTITY); - $criteria->addSelectColumn(OrderProductTableMap::PRICE); - $criteria->addSelectColumn(OrderProductTableMap::TAX); - $criteria->addSelectColumn(OrderProductTableMap::PARENT); - $criteria->addSelectColumn(OrderProductTableMap::CREATED_AT); - $criteria->addSelectColumn(OrderProductTableMap::UPDATED_AT); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::ID); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::ORDER_PRODUCT_ID); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::ATTRIBUTE_TITLE); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::ATTRIBUTE_CHAPO); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::ATTRIBUTE_DESCRIPTION); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::ATTRIBUTE_POSTSCRIPTUMN); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_TITLE); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_CHAPO); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_DESCRIPTION); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::ATTRIBUTE_AV_POSTSCRIPTUM); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::CREATED_AT); + $criteria->addSelectColumn(OrderAttributeCombinationTableMap::UPDATED_AT); } else { $criteria->addSelectColumn($alias . '.ID'); - $criteria->addSelectColumn($alias . '.ORDER_ID'); - $criteria->addSelectColumn($alias . '.PRODUCT_REF'); - $criteria->addSelectColumn($alias . '.TITLE'); - $criteria->addSelectColumn($alias . '.DESCRIPTION'); - $criteria->addSelectColumn($alias . '.CHAPO'); - $criteria->addSelectColumn($alias . '.QUANTITY'); - $criteria->addSelectColumn($alias . '.PRICE'); - $criteria->addSelectColumn($alias . '.TAX'); - $criteria->addSelectColumn($alias . '.PARENT'); + $criteria->addSelectColumn($alias . '.ORDER_PRODUCT_ID'); + $criteria->addSelectColumn($alias . '.ATTRIBUTE_TITLE'); + $criteria->addSelectColumn($alias . '.ATTRIBUTE_CHAPO'); + $criteria->addSelectColumn($alias . '.ATTRIBUTE_DESCRIPTION'); + $criteria->addSelectColumn($alias . '.ATTRIBUTE_POSTSCRIPTUMN'); + $criteria->addSelectColumn($alias . '.ATTRIBUTE_AV_TITLE'); + $criteria->addSelectColumn($alias . '.ATTRIBUTE_AV_CHAPO'); + $criteria->addSelectColumn($alias . '.ATTRIBUTE_AV_DESCRIPTION'); + $criteria->addSelectColumn($alias . '.ATTRIBUTE_AV_POSTSCRIPTUM'); $criteria->addSelectColumn($alias . '.CREATED_AT'); $criteria->addSelectColumn($alias . '.UPDATED_AT'); } @@ -400,7 +390,7 @@ class OrderProductTableMap extends TableMap */ public static function getTableMap() { - return Propel::getServiceContainer()->getDatabaseMap(OrderProductTableMap::DATABASE_NAME)->getTable(OrderProductTableMap::TABLE_NAME); + return Propel::getServiceContainer()->getDatabaseMap(OrderAttributeCombinationTableMap::DATABASE_NAME)->getTable(OrderAttributeCombinationTableMap::TABLE_NAME); } /** @@ -408,16 +398,16 @@ class OrderProductTableMap extends TableMap */ public static function buildTableMap() { - $dbMap = Propel::getServiceContainer()->getDatabaseMap(OrderProductTableMap::DATABASE_NAME); - if (!$dbMap->hasTable(OrderProductTableMap::TABLE_NAME)) { - $dbMap->addTableObject(new OrderProductTableMap()); + $dbMap = Propel::getServiceContainer()->getDatabaseMap(OrderAttributeCombinationTableMap::DATABASE_NAME); + if (!$dbMap->hasTable(OrderAttributeCombinationTableMap::TABLE_NAME)) { + $dbMap->addTableObject(new OrderAttributeCombinationTableMap()); } } /** - * Performs a DELETE on the database, given a OrderProduct or Criteria object OR a primary key value. + * Performs a DELETE on the database, given a OrderAttributeCombination or Criteria object OR a primary key value. * - * @param mixed $values Criteria or OrderProduct object or primary key or array of primary keys + * @param mixed $values Criteria or OrderAttributeCombination object or primary key or array of primary keys * which is used to create the DELETE statement * @param ConnectionInterface $con the connection to use * @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows @@ -428,25 +418,25 @@ class OrderProductTableMap extends TableMap public static function doDelete($values, ConnectionInterface $con = null) { if (null === $con) { - $con = Propel::getServiceContainer()->getWriteConnection(OrderProductTableMap::DATABASE_NAME); + $con = Propel::getServiceContainer()->getWriteConnection(OrderAttributeCombinationTableMap::DATABASE_NAME); } if ($values instanceof Criteria) { // rename for clarity $criteria = $values; - } elseif ($values instanceof \Thelia\Model\OrderProduct) { // it's a model object + } elseif ($values instanceof \Thelia\Model\OrderAttributeCombination) { // it's a model object // create criteria based on pk values $criteria = $values->buildPkeyCriteria(); } else { // it's a primary key, or an array of pks - $criteria = new Criteria(OrderProductTableMap::DATABASE_NAME); - $criteria->add(OrderProductTableMap::ID, (array) $values, Criteria::IN); + $criteria = new Criteria(OrderAttributeCombinationTableMap::DATABASE_NAME); + $criteria->add(OrderAttributeCombinationTableMap::ID, (array) $values, Criteria::IN); } - $query = OrderProductQuery::create()->mergeWith($criteria); + $query = OrderAttributeCombinationQuery::create()->mergeWith($criteria); - if ($values instanceof Criteria) { OrderProductTableMap::clearInstancePool(); + if ($values instanceof Criteria) { OrderAttributeCombinationTableMap::clearInstancePool(); } elseif (!is_object($values)) { // it's a primary key, or an array of pks - foreach ((array) $values as $singleval) { OrderProductTableMap::removeInstanceFromPool($singleval); + foreach ((array) $values as $singleval) { OrderAttributeCombinationTableMap::removeInstanceFromPool($singleval); } } @@ -454,20 +444,20 @@ class OrderProductTableMap extends TableMap } /** - * Deletes all rows from the order_product table. + * Deletes all rows from the order_attribute_combination table. * * @param ConnectionInterface $con the connection to use * @return int The number of affected rows (if supported by underlying database driver). */ public static function doDeleteAll(ConnectionInterface $con = null) { - return OrderProductQuery::create()->doDeleteAll($con); + return OrderAttributeCombinationQuery::create()->doDeleteAll($con); } /** - * Performs an INSERT on the database, given a OrderProduct or Criteria object. + * Performs an INSERT on the database, given a OrderAttributeCombination or Criteria object. * - * @param mixed $criteria Criteria or OrderProduct object containing data that is used to create the INSERT statement. + * @param mixed $criteria Criteria or OrderAttributeCombination object containing data that is used to create the INSERT statement. * @param ConnectionInterface $con the ConnectionInterface connection to use * @return mixed The new primary key. * @throws PropelException Any exceptions caught during processing will be @@ -476,22 +466,22 @@ class OrderProductTableMap extends TableMap public static function doInsert($criteria, ConnectionInterface $con = null) { if (null === $con) { - $con = Propel::getServiceContainer()->getWriteConnection(OrderProductTableMap::DATABASE_NAME); + $con = Propel::getServiceContainer()->getWriteConnection(OrderAttributeCombinationTableMap::DATABASE_NAME); } if ($criteria instanceof Criteria) { $criteria = clone $criteria; // rename for clarity } else { - $criteria = $criteria->buildCriteria(); // build Criteria from OrderProduct object + $criteria = $criteria->buildCriteria(); // build Criteria from OrderAttributeCombination object } - if ($criteria->containsKey(OrderProductTableMap::ID) && $criteria->keyContainsValue(OrderProductTableMap::ID) ) { - throw new PropelException('Cannot insert a value for auto-increment primary key ('.OrderProductTableMap::ID.')'); + if ($criteria->containsKey(OrderAttributeCombinationTableMap::ID) && $criteria->keyContainsValue(OrderAttributeCombinationTableMap::ID) ) { + throw new PropelException('Cannot insert a value for auto-increment primary key ('.OrderAttributeCombinationTableMap::ID.')'); } // Set the correct dbName - $query = OrderProductQuery::create()->mergeWith($criteria); + $query = OrderAttributeCombinationQuery::create()->mergeWith($criteria); try { // use transaction because $criteria could contain info @@ -507,7 +497,7 @@ class OrderProductTableMap extends TableMap return $pk; } -} // OrderProductTableMap +} // OrderAttributeCombinationTableMap // This is the static code needed to register the TableMap for this table with the main Propel class. // -OrderProductTableMap::buildTableMap(); +OrderAttributeCombinationTableMap::buildTableMap(); diff --git a/core/lib/Thelia/Model/OrderAttributeCombination.php b/core/lib/Thelia/Model/OrderAttributeCombination.php new file mode 100644 index 000000000..896cda895 --- /dev/null +++ b/core/lib/Thelia/Model/OrderAttributeCombination.php @@ -0,0 +1,10 @@ + - + + - + + + + + + - + @@ -626,11 +632,17 @@ - +
    - - + + + + + + + + From a540626fff891eb2f38af5d7a1bb66762d2a766e Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Thu, 19 Sep 2013 18:47:12 +0200 Subject: [PATCH 28/51] fix product import --- install/import/products.csv | 2 +- templates/default/category.html | 170 ++++++++++++++++++ .../default/includes/category-toolbar.html | 52 ++++++ templates/default/product.html | 6 +- 4 files changed, 226 insertions(+), 4 deletions(-) create mode 100644 templates/default/includes/category-toolbar.html diff --git a/install/import/products.csv b/install/import/products.csv index d2d84fb53..b085feee2 100644 --- a/install/import/products.csv +++ b/install/import/products.csv @@ -18,7 +18,7 @@ Swivel feature for added function. ";"Zoe est un fauteuil contemporain qui combi "PROD013";"Violet";"A beautifull classic";"Une beauté classique";"A new edition of a classic. Beneath a beautiful colorfull leather, a strong walnut wood frame. You will appreciate the luxurious stylish details of the ''Violet'' armless chair. ";"La réédition d'un classique. Sous un superbe cuir aux couleurs chatoyantes, une solide structure en noyer. Vous apprécierez les détails stylistiques luxueux de notre chaise Violet. ";"Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm";98;;"PROD013-1.jpg";"MAGIS";"Gray";"Chairs" "PROD014";"Sally";"Contemporary atypical chair";"Chaise contemporaine hors normes";"Contemporary atypical chair. The atypical sitting of the ''Sally '' chair will nestled you in confort. Play with the vibrant colours range to create a unique dining room. ";"Chaise contemporaine hors normes. L'assise surprenante de la chaise Sally vous enveloppera de confort. Amusez vous avec l'éventail de couleurs lumineuses pour créer une salle à manger unique. ";"Dimensions : Width : 19'' – Depth : 23'' – Height : 31''";"Dimensions : Larg. 50 cm – Prof.60 cm – Haut. 80 cm";112;;"PROD014-1.jpg;PROD014-2.jpg;PROD014-3.jpg;PROD014-4.jpg";"PARRY";"blue;purple;orange;yellow";"Chairs" "PROD015";"Oliver";"Comfort & Design";"Confort et Design";"Surround yourself in ultra modern luxury with the ''Oliver'' armchair and get a look at the future ! Eye-catching, this unique combination of comfort and design is a must-have for today's book nook. ";"Abandonnez vous à un univers de luxe ultra moderne avec le fauteuil Oliver et voyagez dans le futur ! Cette combinaison unique de confort et de design est spectaculaire. Un élément incontournable pour votre bibliothèque. ";"Dimensions : Width : 30'' – Depth : 27'' – height : 31''";"Dimensions : Larg. 75 cm – Prof. 69 cm – Haut. 80 cm";340;;"PROD015-1.jpg;PROD015-2.jpg;";"MAGIS";"white;black";"Armchairs;Chairs" -"PROD016";"Lexie";"A modern style";"Un style moderne";"Demonstrate your flair for modern style with our ''Lexie'' chair in your dining room. A rectangular cushioned back offers a contemporary feel, while the comfortable seat provides complete comfort. ";"Montrez que vous avez le sens de la modernité en choisissant la chaise ''Lexie'' pour votre salle à manger. Le coussin rectangulaire sur le dossier apporte une touche contemporaine. L'assise généreuse apporte un confort complet. ";"Dimensions : Width : 19'' – Depth : 23'' – Height : 40''";"Dimensions : larg. 50 cm – Prof. 60 cm – Haut. 100 cm";159;;"PROD016-1.jpg";"PLINK";;"Chairs" +"PROD016";"Lexie";"A modern style";"Un style moderne";"Demonstrate your flair for modern style with our ''Lexie'' chair in your dining room. A rectangular cushioned back offers a contemporary feel, while the comfortable seat provides complete comfort. ";"Montrez que vous avez le sens de la modernité en choisissant la chaise ''Lexie'' pour votre salle à manger. Le coussin rectangulaire sur le dossier apporte une touche contemporaine. L'assise généreuse apporte un confort complet. ";"Dimensions : Width : 19'' – Depth : 23'' – Height : 40''";"Dimensions : larg. 50 cm – Prof. 60 cm – Haut. 100 cm";159;;"PROD016-1.jpg";"PLINK";"Beige";"Chairs" "PROD017";"Flynn";"A touch of retro vibe";"Un petit air rétro";"If your destination is up-to-date décor with a touch of retro vibe, look no further than our ''Flynn'' sofa. Sleek, low track arms and high tapering legs give this piece a mid-century flavor. The vibrant tones of the woven upholstery will easily blend with any interior décor. ";"Si vous recherchez une décoration actuelle avec une touche rétro, n'allez pas plus loin et opter pour notre canapé ''Flynn''. Ce canapé a un petit air des années 50 grâce à ses accoudoirs bas, ses pieds allongés et ses lignes pures. Les couleurs chatoyantes de son revêtement en laine lui permettent de se fondre dans tous les intérieurs. ";"Dimensions : Width : 89'' – Depth : 37'' – Height : 36''";"Dimensions : Larg. 225 cm – Prof. 95 cm – Haut. 90 cm";1299;;"PROD017-1.jpg;PROD017-2.jpg;PROD017-3.jpg;PROD017-4.jpg";"OFFUS";"blue;green;red;purple";"Sofas" "PROD018";"Emily";"A old-world feel";"Une touche d'histoire";"Our ''Emily'' armlesschair adds a touch of a old-world feel to your space. Perfect for when defining the seating space in a larger room. A medium wood finish sets off the delicate embellishments at the base, while the luxurous upholstery keeps the look fresh. The cushions guarantee that this is a chair worth relaxing in, not just admiring from afar. ";"La chaise ''Emily'' apporte une touche d'histoire à votre intérieur. Elle est parfaite pour structurer votre espace, notamment dans une grande pièce. Les finitions bois font la part belle à de délicates arabesques, tandis que le luxueux revêtement apporte un look frais. Cette chaise n'est pas destinée à la figuration grâce à la mousse confortable de l'assise. ";"Dimensions : Width : 33'' – Depth : 27'' – Height : 40''";"Dimensions : Larg. 85 cm – Prof. 69 cm – Haut. 100 cm";690;;"PROD018-1.jpg";"PARRY";"red";"Armchairs" "PROD019";"Edgar";"A special spot";"Un endroit à part";"A special spot for reading, lounging or chatting, our '' Edgar '' armchair has no reservations when it comes to style. The design starts with mid-century modern elements like lean arms, while the brushed stainless steel base ensures stability. Swivel feature for added function. ";"Un endroit spécial où lire, rêver ou discuter, notre fauteuil ''Edgar'' n'a pas de limite quand il s'agit de style. Son design part d'éléments contemporains comme ses accoudoirs bas et fins, tandis que sa base en inox brossé assure la stabilité de l'ensemble. Siège pivotant. ";"Dimensions : Width : 33'' – Depth : 27'' – Height : 40''";"Dimensions: Larg. 85 cm – Prof. 69 cm – Haut. 100 cm";275;;"PROD019-1.jpg;PROD019-2.jpg;PROD019-3.jpg;PROD019-4.jpg;PROD019-5.jpg";"TOKO";"blue;yellow;orange;pink;purple";"Armchairs" diff --git a/templates/default/category.html b/templates/default/category.html index 8bca4fbde..3ac31189a 100644 --- a/templates/default/category.html +++ b/templates/default/category.html @@ -17,3 +17,173 @@ {/block} + +{block name="main-content"} +
    + +
    + {include file="includes/category-toolbar.html" toolbar="top"} +
    +
    + +
    +
    + {include file="includes/category-toolbar.html" toolbar="bottom"} +
    + + + +
    + + +{/block} diff --git a/templates/default/includes/category-toolbar.html b/templates/default/includes/category-toolbar.html new file mode 100644 index 000000000..59a78151e --- /dev/null +++ b/templates/default/includes/category-toolbar.html @@ -0,0 +1,52 @@ + diff --git a/templates/default/product.html b/templates/default/product.html index c2135d232..63ad2364b 100644 --- a/templates/default/product.html +++ b/templates/default/product.html @@ -58,10 +58,10 @@
    From a7a755fab589c25cf0f962603afa667880f90ffc Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Thu, 19 Sep 2013 18:58:43 +0200 Subject: [PATCH 29/51] add isbn meta tag --- templates/default/category.html | 17 +++++++++++++---- templates/default/product.html | 10 +++++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/templates/default/category.html b/templates/default/category.html index 3ac31189a..153dafc9d 100644 --- a/templates/default/category.html +++ b/templates/default/category.html @@ -31,8 +31,17 @@
  • - - + {$product_id=$ID} + {loop name="brand.feature" type="feature" product=$ID title="brand"} + {loop name="brand.value" type="feature_value" feature=$ID product=$product_id} + + {/loop} + {/loop} + {loop name="brand.feature" type="feature" product=$ID title="isbn"} + {loop name="brand.value" type="feature_value" feature=$ID product=$product_id} + + {/loop} + {/loop}
  • - + @@ -607,7 +607,8 @@ - + + @@ -632,7 +633,7 @@
    - +
    @@ -643,10 +644,10 @@ - + - + @@ -1236,4 +1237,18 @@
    + + + + + + + + + + + + + +
    From c255548d9bfdc97cca765b1f2624455dfeb5f367 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Fri, 20 Sep 2013 08:45:38 +0200 Subject: [PATCH 36/51] create dedicated file for menu --- templates/default/category.html | 138 +++++------------- templates/default/includes/menu.html | 27 ++++ .../default/includes/single-product.html | 60 ++++++++ templates/default/index.html | 3 +- 4 files changed, 126 insertions(+), 102 deletions(-) create mode 100644 templates/default/includes/menu.html create mode 100644 templates/default/includes/single-product.html diff --git a/templates/default/category.html b/templates/default/category.html index c75bd2159..aa6f95c08 100644 --- a/templates/default/category.html +++ b/templates/default/category.html @@ -29,67 +29,7 @@ {loop type="product" name="product_list" category={category attr="id"}}
  • -
    - - {$product_id=$ID} - {loop name="brand.feature" type="feature" product=$ID title="brand"} - {loop name="brand.value" type="feature_value" feature=$ID product=$product_id} - - {/loop} - {/loop} - {loop name="brand.feature" type="feature" product=$ID title="isbn"} - {loop name="brand.value" type="feature_value" feature=$ID product=$product_id} - - {/loop} - {/loop} - - - -
    -

    {$TITLE}

    - -
    -

    {$DESCRIPTION}

    -
    -
    - -
    -
    - - - - - - {if $IS_PROMO } - {loop name="productSaleElements_promo" type="product_sale_elements" product=$ID limit="1" order="min_price"} - {assign var="default_product_sale_elements" value=$ID} - {intl l="Special Price:"} {format_number number=$TAXED_PROMO_PRICE} {currency attr="symbol"} - {intl l="Regular Price:"} {format_number number=$TAXED_PRICE} {currency attr="symbol"} - {/loop} - {else} - {format_number number=$BEST_TAXED_PRICE} {currency attr="symbol"} - {/if} - -
    -
    - -
    -
    -
    + {include file="includes/single-product.html" product_id=$ID}
  • {/loop} @@ -100,33 +40,7 @@
    @@ -150,13 +72,21 @@
    Price
    - $value) { ?>
    -
    +
    + +
    +
    +
    -
    @@ -165,13 +95,21 @@
    Size
    - $value) { ?>
    -
    +
    + +
    +
    +
    -
    diff --git a/templates/default/includes/menu.html b/templates/default/includes/menu.html new file mode 100644 index 000000000..083c74ef2 --- /dev/null +++ b/templates/default/includes/menu.html @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/templates/default/includes/single-product.html b/templates/default/includes/single-product.html new file mode 100644 index 000000000..40b9d326b --- /dev/null +++ b/templates/default/includes/single-product.html @@ -0,0 +1,60 @@ +
    + + {loop name="brand.feature" type="feature" product=$ID title="brand"} + {loop name="brand.value" type="feature_value" feature=$ID product=$product_id} + + {/loop} + {/loop} + {loop name="brand.feature" type="feature" product=$ID title="isbn"} + {loop name="brand.value" type="feature_value" feature=$ID product=$product_id} + + {/loop} + {/loop} + + + +
    +

    {$TITLE}

    + +
    +

    {$DESCRIPTION}

    +
    +
    + +
    +
    + + + + + + {if $IS_PROMO } + {loop name="productSaleElements_promo" type="product_sale_elements" product=$ID limit="1" order="min_price"} + {assign var="default_product_sale_elements" value=$ID} + {intl l="Special Price:"} {format_number number=$TAXED_PROMO_PRICE} {currency attr="symbol"} + {intl l="Regular Price:"} {format_number number=$TAXED_PRICE} {currency attr="symbol"} + {/loop} + {else} + {format_number number=$BEST_TAXED_PRICE} {currency attr="symbol"} + {/if} + +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/templates/default/index.html b/templates/default/index.html index ca6fbbf7c..674892ce9 100644 --- a/templates/default/index.html +++ b/templates/default/index.html @@ -80,8 +80,7 @@ preorder : http://schema.org/PreOrder online_only : http://schema.org/OnlineOnly --> - {currency attr="symbol"} {format_number number="{$BEST_TAXED_PRICE}"} - + {format_number number="{$BEST_TAXED_PRICE}"} {currency attr="symbol"} From 16de9bbcc92930779503a9a8c18e4439e2fc37f6 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Fri, 20 Sep 2013 09:19:12 +0200 Subject: [PATCH 37/51] allow displaying how much product wanted in category page --- .../Template/Smarty/Plugins/UrlGenerator.php | 3 ++- templates/default/assets/js/script.js | 27 +++---------------- templates/default/category.html | 6 ++--- .../default/includes/category-toolbar.html | 14 +++++----- 4 files changed, 15 insertions(+), 35 deletions(-) diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/UrlGenerator.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/UrlGenerator.php index aa96a0014..f1249697a 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/UrlGenerator.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/UrlGenerator.php @@ -186,7 +186,8 @@ class UrlGenerator extends AbstractSmartyPlugin protected function getCurrentUrl() { - return URL::getInstance()->retrieveCurrent($this->request)->toString(); + //return URL::getInstance()->retrieveCurrent($this->request)->toString(); + return $this->request->getUri(); } protected function getReturnToUrl() diff --git a/templates/default/assets/js/script.js b/templates/default/assets/js/script.js index 18581ed1e..2bbba577f 100644 --- a/templates/default/assets/js/script.js +++ b/templates/default/assets/js/script.js @@ -126,31 +126,10 @@ }).filter(':has(:checked)').addClass('active'); }); + $('#limit-top').change(function(e){ + window.location = $(this).val() + }); - // Styliser le message Confirm par Bootstrap sur un formulaire - /* - $('body').on('click', '[data-confirm]', function(){ - var $this = $(this); - bootbox.confirm($(this).attr('data-confirm'), - function(result){ - if(result) { - // Si lien - if($this.attr('href')){ - window.location.href = $this.attr('href'); - }else{ - // Si on doit soumettre un formulaire - var $form = $this.closest("form"); - if($form.size() > 0){ - $form.submit(); - } - } - } - } - ); - - return false; - }); - */ }); })(jQuery); diff --git a/templates/default/category.html b/templates/default/category.html index aa6f95c08..5c1516f45 100644 --- a/templates/default/category.html +++ b/templates/default/category.html @@ -20,13 +20,13 @@ {block name="main-content"}
    - + {$limit={$smarty.get.limit|default:8}}
    - {include file="includes/category-toolbar.html" toolbar="top"} + {include file="includes/category-toolbar.html" toolbar="top" limit=$limit}
      - {loop type="product" name="product_list" category={category attr="id"}} + {loop type="product" name="product_list" category={category attr="id"} limit=$limit}
    • {include file="includes/single-product.html" product_id=$ID} diff --git a/templates/default/includes/category-toolbar.html b/templates/default/includes/category-toolbar.html index 98ce01434..8268d6393 100644 --- a/templates/default/includes/category-toolbar.html +++ b/templates/default/includes/category-toolbar.html @@ -5,11 +5,11 @@ per page @@ -30,8 +30,8 @@ {intl l="View as"}: - - + + From 5abae4db7dd117d37b35634d6511bb06b352f8dd Mon Sep 17 00:00:00 2001 From: mespeche Date: Fri, 20 Sep 2013 09:35:56 +0200 Subject: [PATCH 38/51] Setting profile update --- core/lib/Thelia/Config/Resources/config.xml | 2 + .../Thelia/Form/ProfileModificationForm.php | 91 +++++++++++++++++++ templates/admin/default/profile-edit.html | 80 ++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 core/lib/Thelia/Form/ProfileModificationForm.php diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml index 43e48f6e4..8f5a78b59 100755 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -102,6 +102,8 @@
      + + diff --git a/core/lib/Thelia/Form/ProfileModificationForm.php b/core/lib/Thelia/Form/ProfileModificationForm.php new file mode 100644 index 000000000..94ce1fba9 --- /dev/null +++ b/core/lib/Thelia/Form/ProfileModificationForm.php @@ -0,0 +1,91 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Form; + +use Symfony\Component\Validator\Constraints; +use Thelia\Core\Translation\Translator; +use Thelia\Model\ConfigQuery; + +/** + * Class ProfileModification + * @package Thelia\Form + * @author Manuel Raynaud + */ +class ProfileModificationForm extends BaseForm +{ + + + protected function buildForm() + { + + $this->formBuilder + ->add("firstname", "text", array( + "constraints" => array( + new Constraints\NotBlank() + ), + "label" => Translator::getInstance()->trans("First Name"), + "label_attr" => array( + "for" => "firstname" + ) + )) + ->add("lastname", "text", array( + "constraints" => array( + new Constraints\NotBlank() + ), + "label" => Translator::getInstance()->trans("Last Name"), + "label_attr" => array( + "for" => "lastname" + ) + )) + ->add("password", "password", array( + "constraints" => array( + new Constraints\NotBlank(), + new Constraints\Length(array("min" => ConfigQuery::read("password.length", 4))) + ), + "label" => Translator::getInstance()->trans("Password"), + "label_attr" => array( + "for" => "password" + ) + )) + ->add("password_confirm", "password", array( + "constraints" => array( + new Constraints\NotBlank(), + new Constraints\Length(array("min" => ConfigQuery::read("password.length", 4))), + new Constraints\Callback(array("methods" => array( + array($this, "verifyPasswordField") + ))) + ), + "label" => "Password confirmation", + "label_attr" => array( + "for" => "password_confirmation" + ) + )) + ; + } + + public function getName() + { + return "thelia_profile_modification"; + } +} diff --git a/templates/admin/default/profile-edit.html b/templates/admin/default/profile-edit.html index e69de29bb..19b6c4c2d 100644 --- a/templates/admin/default/profile-edit.html +++ b/templates/admin/default/profile-edit.html @@ -0,0 +1,80 @@ +{extends file="admin-layout.tpl"} + +{block name="page-title"}{intl l='Edit profile'}{/block} + +{block name="check-permissions"}admin.profile.edit{/block} + +{block name="main-content"} +
      + +
      + + + +
      +
      + +
      + {intl l="Edit profile $NAME"} +
      + +
      + {form name="thelia.admin.profile.modification"} + + + {form_hidden_fields form=$form} + + {form_field form=$form field='success_url'} + + {/form_field} + + {if $form_error}
      {$form_error_message}
      {/if} + + {form_field form=$form field='firstname'} +
      + + +
      + {/form_field} + + {form_field form=$form field='lastname'} +
      + + +
      + {/form_field} + + {form_field form=$form field='password'} +
      + + +
      + {/form_field} + + {form_field form=$form field='password_confirm'} +
      + + +
      + {/form_field} + +
      + +
      + + {/form} +
      + +
      + +
      + +
      +
      +{/block} \ No newline at end of file From f7d2c09c6d883a60ccc3e281e0adb611141c375e Mon Sep 17 00:00:00 2001 From: franck Date: Fri, 20 Sep 2013 09:38:48 +0200 Subject: [PATCH 39/51] Added producr attributes routes --- core/lib/Thelia/Config/Resources/config.xml | 2 +- core/lib/Thelia/Config/Resources/routing/admin.xml | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml index 43e48f6e4..495cf2ac3 100755 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -18,7 +18,7 @@ - + diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index 284103798..5c07d48c2 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -178,6 +178,12 @@ Thelia\Controller\Admin\ProductController::updateAccessoryPositionAction + + + + Thelia\Controller\Admin\ProductController::updateAttributesAndFeaturesAction + + From cb5f6d4c7027bfe9bc9382e584671c9428587318 Mon Sep 17 00:00:00 2001 From: franck Date: Fri, 20 Sep 2013 09:57:30 +0200 Subject: [PATCH 40/51] Fixed translations --- templates/admin/default/home.html | 156 +++++++++++++++--------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/templates/admin/default/home.html b/templates/admin/default/home.html index ea1bd3392..3371a1d9f 100755 --- a/templates/admin/default/home.html +++ b/templates/admin/default/home.html @@ -21,8 +21,8 @@
      - - + + @@ -34,7 +34,7 @@
      -
      +
      @@ -47,7 +47,7 @@
      -
      {intl l="Informations site"}
      +
      {intl l="Shop Informations"}
      @@ -56,7 +56,7 @@ - + @@ -64,11 +64,11 @@ - + - + @@ -76,11 +76,11 @@ - + - + @@ -112,32 +112,32 @@
      1
      {intl l="Sections"}{intl l="Categories"} 8
      43
      {intl l="Products online"}{intl l="Online products"} 43
      {intl l="Products offline"}{intl l="Offline products"} 0
      1
      {intl l="Orders pending"}{intl l="Pending orders"} 1
      {intl l="Orders treatment"}{intl l="In process orderst"} 0
      - - - - + + + + + + + + - - - - - + - + - + - + - + @@ -148,34 +148,34 @@
      {intl l="C. A. TTC"}2000.00 €
      {intl l="Overall sales"}2500.00 €
      {intl l="Sales excluding shipping"}2000.00 €
      {intl l="C. A. TTC hors frais de port"}2500.00 €
      {intl l="C. A. TTC précédent"}{intl l="Yesterday sales"} 1700.00 €
      {intl l="Commandes en instance"}{intl l="Waiting orders"} 4
      {intl l="Commandes en traitement"}{intl l="In process orders"} 52
      {intl l="Commandes annulées"}{intl l="Canceled orders"} 3
      {intl l="Panier moyen TTC"}{intl l="Average cart"} 25.00 €
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {intl l="C. A. TTC"}2000.00 €
      {intl l="C. A. TTC hors frais de port"}2500.00 €
      {intl l="C. A. TTC précédent"}1700.00 €
      {intl l="Commandes en instance"}4
      {intl l="Commandes en traitement"}52
      {intl l="Commandes annulées"}3
      {intl l="Panier moyen TTC"}25.00 €
      {intl l="Overall sales"}2500.00 €
      {intl l="Sales excluding shipping"}2000.00 €
      {intl l="Previous month sales"}1700.00 €
      {intl l="Waiting orders"}4
      {intl l="In process orders"}52
      {intl l="Canceled orders"}3
      {intl l="Average cart"}25.00 €
      @@ -184,34 +184,34 @@
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {intl l="C. A. TTC"}2000.00 €
      {intl l="C. A. TTC hors frais de port"}2500.00 €
      {intl l="C. A. TTC précédent"}1700.00 €
      {intl l="Commandes en instance"}4
      {intl l="Commandes en traitement"}52
      {intl l="Commandes annulées"}3
      {intl l="Panier moyen TTC"}25.00 €
      {intl l="Overall sales"}2500.00 €
      {intl l="Sales excluding shipping"}2000.00 €
      {intl l="Previous year sales"}1700.00 €
      {intl l="Waiting orders"}4
      {intl l="In process orders"}52
      {intl l="Canceled orders"}3
      {intl l="Average cart"}25.00 €
      From b933a96c8eb7ca42db745ccadce2b48924e45278 Mon Sep 17 00:00:00 2001 From: mespeche Date: Fri, 20 Sep 2013 10:39:02 +0200 Subject: [PATCH 41/51] Vertical align middle tables --- .../default/assets/less/thelia/tables.less | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/templates/admin/default/assets/less/thelia/tables.less b/templates/admin/default/assets/less/thelia/tables.less index 8a4baa897..e542786ec 100755 --- a/templates/admin/default/assets/less/thelia/tables.less +++ b/templates/admin/default/assets/less/thelia/tables.less @@ -1,3 +1,22 @@ +// Baseline styles + +.table { + + // Cells + thead, + tbody, + tfoot { + > tr { + > th, + > td { + vertical-align: middle; + } + } + } + +} + + tfoot{ .pagination{ From 265da6a57ebbeda60c579c81a612ac331f5bb329 Mon Sep 17 00:00:00 2001 From: mespeche Date: Fri, 20 Sep 2013 12:00:39 +0200 Subject: [PATCH 42/51] Add default language & editing language default field --- .../Thelia/Form/ProfileModificationForm.php | 28 +++++++++ templates/admin/default/profile-edit.html | 62 ++++++++++++++++--- 2 files changed, 82 insertions(+), 8 deletions(-) diff --git a/core/lib/Thelia/Form/ProfileModificationForm.php b/core/lib/Thelia/Form/ProfileModificationForm.php index 94ce1fba9..e3119cfee 100644 --- a/core/lib/Thelia/Form/ProfileModificationForm.php +++ b/core/lib/Thelia/Form/ProfileModificationForm.php @@ -58,6 +58,34 @@ class ProfileModificationForm extends BaseForm "for" => "lastname" ) )) + ->add("default_language", "text", array( + "constraints" => array( + new Constraints\NotBlank() + ), + "label" => Translator::getInstance()->trans("Default language"), + "label_attr" => array( + "for" => "default_language" + ) + )) + ->add("editing_language_default", "text", array( + "constraints" => array( + new Constraints\NotBlank() + ), + "label" => Translator::getInstance()->trans("Editing language default"), + "label_attr" => array( + "for" => "editing_language_default" + ) + )) + ->add("old_password", "password", array( + "constraints" => array( + new Constraints\NotBlank(), + new Constraints\Length(array("min" => ConfigQuery::read("password.length", 4))) + ), + "label" => Translator::getInstance()->trans("Old password"), + "label_attr" => array( + "for" => "old_password" + ) + )) ->add("password", "password", array( "constraints" => array( new Constraints\NotBlank(), diff --git a/templates/admin/default/profile-edit.html b/templates/admin/default/profile-edit.html index 19b6c4c2d..e882dc40d 100644 --- a/templates/admin/default/profile-edit.html +++ b/templates/admin/default/profile-edit.html @@ -47,20 +47,55 @@
      {/form_field} - {form_field form=$form field='password'} + {form_field form=$form field='default_language'}
      - -
      - {/form_field} - {form_field form=$form field='password_confirm'} -
      - - +
      {/form_field} + {form_field form=$form field='editing_language_default'} +
      + + + +
      + {/form_field} + +
      +
      {intl l="Change password"}
      + + {form_field form=$form field='old_password'} +
      + + +
      + {/form_field} + + {form_field form=$form field='password'} +
      + + +
      + {/form_field} + + {form_field form=$form field='password_confirm'} +
      + + +
      + {/form_field} +
      +
      +{/block} + +{block name="javascript-initialization"} + + {javascripts file='assets/js/bootstrap-select/bootstrap-select.js'} + + {/javascripts} + {javascripts file='assets/js/main.js'} + + {/javascripts} + {/block} \ No newline at end of file From bb40086e2ae1b4d85d68bfba6ecec5996ce8a066 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Fri, 20 Sep 2013 13:59:51 +0200 Subject: [PATCH 43/51] allow to order products on category page --- templates/default/assets/js/script.js | 4 + templates/default/category.html | 89 ++----------------- .../default/includes/categories-filters.html | 77 ++++++++++++++++ .../default/includes/category-toolbar.html | 63 ++++++++----- .../default/includes/single-product.html | 13 ++- templates/default/index.html | 57 +----------- 6 files changed, 136 insertions(+), 167 deletions(-) create mode 100644 templates/default/includes/categories-filters.html diff --git a/templates/default/assets/js/script.js b/templates/default/assets/js/script.js index 2bbba577f..d115d2c5d 100644 --- a/templates/default/assets/js/script.js +++ b/templates/default/assets/js/script.js @@ -130,6 +130,10 @@ window.location = $(this).val() }); + $('#sortby-top').change(function(e){ + window.location = $(this).val() + }); + }); })(jQuery); diff --git a/templates/default/category.html b/templates/default/category.html index 5c1516f45..99db32948 100644 --- a/templates/default/category.html +++ b/templates/default/category.html @@ -21,16 +21,15 @@ {block name="main-content"}
      {$limit={$smarty.get.limit|default:8}} + {$product_page={$smarty.get.page|default:1}} + {$product_order={$smarty.get.order|default:'alpha'}}
      - {include file="includes/category-toolbar.html" toolbar="top" limit=$limit} + {include file="includes/category-toolbar.html" toolbar="top" limit=$limit order=$product_order}
        - {loop type="product" name="product_list" category={category attr="id"} limit=$limit} - -
      • - {include file="includes/single-product.html" product_id=$ID} -
      • + {loop type="product" name="product_list" category={category attr="id"} limit=$limit page=$product_page order=$product_order} + {include file="includes/single-product.html" product_id=$ID hasBtn=true hasDescription=true width="218" height="146"} {/loop}
      @@ -42,83 +41,7 @@ {include file="includes/menu.html"} -
      -

      Find a product

      -
      -
      -
      - Type -
      -
      - -
      -
      - -
      -
      - -
      -
      -
      -
      - -
      -
      - Price -
      -
      - -
      -
      - -
      -
      - -
      -
      -
      -
      - -
      -
      - Size -
      -
      - -
      -
      - -
      -
      - -
      -
      -
      -
      - -
      - -
      -
      -
      + {include file="includes/categories-filters.html"} diff --git a/templates/default/includes/categories-filters.html b/templates/default/includes/categories-filters.html new file mode 100644 index 000000000..6a9425a66 --- /dev/null +++ b/templates/default/includes/categories-filters.html @@ -0,0 +1,77 @@ +
      +

      Find a product

      +
      +
      +
      + Type +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + Price +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + Size +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      + +
      +
      +
      \ No newline at end of file diff --git a/templates/default/includes/category-toolbar.html b/templates/default/includes/category-toolbar.html index 8268d6393..99583a02d 100644 --- a/templates/default/includes/category-toolbar.html +++ b/templates/default/includes/category-toolbar.html @@ -1,30 +1,30 @@ -
      \ No newline at end of file +
    + \ No newline at end of file diff --git a/templates/default/index.html b/templates/default/index.html index 674892ce9..390f06965 100644 --- a/templates/default/index.html +++ b/templates/default/index.html @@ -100,62 +100,7 @@
      {loop name="product_promo" type="product" limit="5" promo="yes"} -
    • -
      - - {$product_id=$ID} - {loop name="brand.feature" type="feature" product="{$ID}" title="brand"} - {loop name="brand.value" type="feature_value" feature="{$ID}" product="$product_id"} - - {/loop} - {/loop} - {loop name="brand.feature" type="feature" product=$ID title="isbn"} - {loop name="brand.value" type="feature_value" feature=$ID product=$product_id} - - {/loop} - {/loop} - - - -
      -

      {$CHAPO}

      -
      - -
      -
      - {loop type="category" name="category_tag" id=$DEFAULT_CATEGORY} - - {/loop} - - - - - {loop name="productSaleElements_promo" type="product_sale_elements" product="{$ID}" limit="1"} - {intl l="Special Price:"} {format_number number="{$TAXED_PROMO_PRICE}"} {currency attr="symbol"} - {intl l="Regular Price:"} {format_number number="{$TAXED_PRICE}"} {currency attr="symbol"} - {/loop} -
      -
      -
      -
    • + {include file="includes/single-product.html" product_id=$ID hasBtn=false hasDescription=false width="218" height="146"} {/loop}
    From 1649e4d76b5e120e80ad90579c46d4381375c5c2 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Fri, 20 Sep 2013 14:26:36 +0200 Subject: [PATCH 44/51] fix query in Thelia\Model\Folder::countAllContents --- core/lib/Thelia/Model/Folder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/lib/Thelia/Model/Folder.php b/core/lib/Thelia/Model/Folder.php index 8cbe00ce0..128c5932a 100755 --- a/core/lib/Thelia/Model/Folder.php +++ b/core/lib/Thelia/Model/Folder.php @@ -44,8 +44,8 @@ class Folder extends BaseFolder foreach($children as $child) { - $contentsCount += ProductQuery::create() - ->filterByCategory($child) + $contentsCount += ContentQuery::create() + ->filterByFolder($child) ->count(); } From 2cf71f99a90c3dae389fd486fcdf997f49f9749a Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Fri, 20 Sep 2013 14:38:11 +0200 Subject: [PATCH 45/51] change some informations in layou --- templates/default/layout.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/default/layout.tpl b/templates/default/layout.tpl index 7834bc706..37cbad224 100644 --- a/templates/default/layout.tpl +++ b/templates/default/layout.tpl @@ -314,10 +314,10 @@ URL: http://www.thelia.net
  • - +33 09 08 07 06 05 + +33 04 44 05 31 00
  • - +
  • From 854149930259ab6fcea3d253f03152233d8f5a33 Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Fri, 20 Sep 2013 16:25:46 +0200 Subject: [PATCH 46/51] order process --- core/lib/Thelia/Action/Order.php | 89 ++++-------- core/lib/Thelia/Config/Resources/config.xml | 1 + .../Thelia/Config/Resources/routing/front.xml | 6 +- .../Controller/Front/OrderController.php | 33 +++++ core/lib/Thelia/Core/Event/OrderEvent.php | 17 +++ core/lib/Thelia/Core/Template/Loop/Cart.php | 10 +- core/lib/Thelia/Core/Template/Loop/Module.php | 137 ++++++++++++++++++ core/lib/Thelia/Core/Template/Loop/Order.php | 91 +++++++++++- core/lib/Thelia/Exception/OrderException.php | 3 - .../Thelia/Exception/TaxEngineException.php | 1 + .../Exception/TheliaProcessException.php | 54 +++++++ core/lib/Thelia/Model/Order.php | 26 +++- core/lib/Thelia/Model/OrderQuery.php | 39 ++++- core/lib/Thelia/Model/TaxRule.php | 20 ++- core/lib/Thelia/Model/TaxRuleQuery.php | 10 +- core/lib/Thelia/Module/BaseModule.php | 23 +++ core/lib/Thelia/TaxEngine/Calculator.php | 54 ++++++- .../TaxEngine/OrderProductTaxCollection.php | 126 ++++++++++++++++ .../Thelia/Tests/TaxEngine/CalculatorTest.php | 2 +- core/lib/Thelia/Tools/I18n.php | 37 +++++ install/insert.sql | 4 +- local/modules/Cheque/Cheque.php | 9 ++ local/modules/FakeCB/FakeCB.php | 9 ++ .../{order_payment.html => order_placed.html} | 12 +- 24 files changed, 718 insertions(+), 95 deletions(-) create mode 100755 core/lib/Thelia/Core/Template/Loop/Module.php create mode 100755 core/lib/Thelia/Exception/TheliaProcessException.php create mode 100755 core/lib/Thelia/TaxEngine/OrderProductTaxCollection.php rename templates/default/{order_payment.html => order_placed.html} (85%) diff --git a/core/lib/Thelia/Action/Order.php b/core/lib/Thelia/Action/Order.php index 17d8327c0..3b1ceb5da 100755 --- a/core/lib/Thelia/Action/Order.php +++ b/core/lib/Thelia/Action/Order.php @@ -24,20 +24,14 @@ namespace Thelia\Action; use Propel\Runtime\ActiveQuery\ModelCriteria; -use Propel\Runtime\ActiveRecord\ActiveRecordInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Thelia\Core\Event\OrderEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Exception\OrderException; -use Thelia\Model\AttributeAvI18n; -use Thelia\Model\AttributeAvI18nQuery; -use Thelia\Model\AttributeI18n; -use Thelia\Model\AttributeI18nQuery; +use Thelia\Exception\TheliaProcessException; use Thelia\Model\AddressQuery; use Thelia\Model\OrderProductAttributeCombination; -use Thelia\Model\ProductI18nQuery; -use Thelia\Model\Lang; use Thelia\Model\ModuleQuery; use Thelia\Model\OrderProduct; use Thelia\Model\OrderStatus; @@ -45,7 +39,7 @@ use Thelia\Model\Map\OrderTableMap; use Thelia\Model\OrderAddress; use Thelia\Model\OrderStatusQuery; use Thelia\Model\ConfigQuery; -use Thelia\Model\ProductI18n; +use Thelia\Tools\I18n; /** * @@ -125,6 +119,7 @@ class Order extends BaseAction implements EventSubscriberInterface $currency = $this->getSession()->getCurrency(); $lang = $this->getSession()->getLang(); $deliveryAddress = AddressQuery::create()->findPk($sessionOrder->chosenDeliveryAddress); + $taxCountry = $deliveryAddress->getCountry(); $invoiceAddress = AddressQuery::create()->findPk($sessionOrder->chosenInvoiceAddress); $cart = $this->getSession()->getCart(); $cartItems = $cart->getCartItems(); @@ -182,23 +177,30 @@ class Order extends BaseAction implements EventSubscriberInterface foreach($cartItems as $cartItem) { $product = $cartItem->getProduct(); - /* get customer translation */ - $productI18n = $this->getI18n(ProductI18nQuery::create(), new ProductI18n(), $product->getId()); + /* get translation */ + $productI18n = I18n::forceI18nRetrieving($this->getSession()->getLang()->getLocale(), 'Product', $product->getId()); $pse = $cartItem->getProductSaleElements(); /* check still in stock */ if($cartItem->getQuantity() > $pse->getQuantity()) { - $e = new OrderException("Not enough stock", OrderException::NOT_ENOUGH_STOCK); - $e->cartItem = $cartItem; - throw $e; + throw new TheliaProcessException("Not enough stock", TheliaProcessException::CART_ITEM_NOT_ENOUGH_STOCK, $cartItem); } /* decrease stock */ $pse->setQuantity( $pse->getQuantity() - $cartItem->getQuantity() ); - $pse->save(); + $pse->save($con); + + /* get tax */ + $taxRuleI18n = I18n::forceI18nRetrieving($this->getSession()->getLang()->getLocale(), 'TaxRule', $product->getTaxRuleId()); + + $taxDetail = $product->getTaxRule()->getTaxDetail( + $taxCountry, + $cartItem->getPromo() == 1 ? $cartItem->getPromoPrice() : $cartItem->getPrice(), + $this->getSession()->getLang()->getLocale() + ); $orderProduct = new OrderProduct(); $orderProduct @@ -215,14 +217,22 @@ class Order extends BaseAction implements EventSubscriberInterface ->setWasNew($pse->getNewness()) ->setWasInPromo($cartItem->getPromo()) ->setWeight($pse->getWeight()) + ->setTaxRuleTitle($taxRuleI18n->getTitle()) + ->setTaxRuleDescription($taxRuleI18n->getDescription()) ; $orderProduct->setDispatcher($this->getDispatcher()); - $orderProduct->save(); + $orderProduct->save($con); + + /* fulfill order_product_tax */ + foreach($taxDetail as $tax) { + $tax->setOrderProductId($orderProduct->getId()); + $tax->save($con); + } /* fulfill order_attribute_combination and decrease stock */ foreach($pse->getAttributeCombinations() as $attributeCombination) { - $attribute = $this->getI18n(AttributeI18nQuery::create(), new AttributeI18n(), $attributeCombination->getAttributeId()); - $attributeAv = $this->getI18n(AttributeAvI18nQuery::create(), new AttributeAvI18n(), $attributeCombination->getAttributeAvId()); + $attribute = I18n::forceI18nRetrieving($this->getSession()->getLang()->getLocale(), 'Attribute', $attributeCombination->getAttributeId()); + $attributeAv = I18n::forceI18nRetrieving($this->getSession()->getLang()->getLocale(), 'AttributeAv', $attributeCombination->getAttributeAvId()); $orderAttributeCombination = new OrderProductAttributeCombination(); $orderAttributeCombination @@ -237,7 +247,7 @@ class Order extends BaseAction implements EventSubscriberInterface ->setAttributeAvPostscriptum($attributeAv->getPostscriptum()) ; - $orderAttributeCombination->save(); + $orderAttributeCombination->save($con); } } @@ -248,12 +258,13 @@ class Order extends BaseAction implements EventSubscriberInterface $this->getDispatcher()->dispatch(TheliaEvents::ORDER_BEFORE_PAYMENT, new OrderEvent($placedOrder)); /* clear session */ + /* but memorize placed order */ $sessionOrder = new \Thelia\Model\Order(); $event->setOrder($sessionOrder); + $event->setPlacedOrder($placedOrder); $this->getSession()->setOrder($sessionOrder); - /* empty cart */ - $this->getSession()->getCart()->clear(); + /* empty cart @todo */ /* call pay method */ $paymentModuleReflection = new \ReflectionClass($paymentModule->getFullNamespace()); @@ -349,42 +360,4 @@ class Order extends BaseAction implements EventSubscriberInterface return $request->getSession(); } - - /** - * @param ModelCriteria $query - * @param ActiveRecordInterface $object - * @param $id - * @param array $needed = array('Title') - * - * @return ProductI18n - */ - protected function getI18n(ModelCriteria $query, ActiveRecordInterface $object, $id, $needed = array('Title')) - { - $i18n = $query - ->filterById($id) - ->filterByLocale( - $this->getSession()->getLang()->getLocale() - )->findOne(); - /* or default translation */ - if(null === $i18n) { - $i18n = $query - ->filterById($id) - ->filterByLocale( - Lang::getDefaultLanguage()->getLocale() - )->findOne(); - } - if(null === $i18n) { // @todo something else ? - $i18n = $object; - foreach($needed as $need) { - $method = sprintf('get%s', $need); - if(method_exists($i18n, $method)) { - $i18n->$method('DEFAULT ' . strtoupper($need)); - } else { - // @todo throw sg ? - } - } - } - - return $i18n; - } } diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml index 43e48f6e4..329ed609d 100755 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -21,6 +21,7 @@ + diff --git a/core/lib/Thelia/Config/Resources/routing/front.xml b/core/lib/Thelia/Config/Resources/routing/front.xml index f254a817e..5b26a6ed6 100755 --- a/core/lib/Thelia/Config/Resources/routing/front.xml +++ b/core/lib/Thelia/Config/Resources/routing/front.xml @@ -137,7 +137,11 @@ Thelia\Controller\Front\OrderController::pay - order_payment + + + + Thelia\Controller\Front\OrderController::orderPlaced + order_placed diff --git a/core/lib/Thelia/Controller/Front/OrderController.php b/core/lib/Thelia/Controller/Front/OrderController.php index 4dd678a82..1f2c716ae 100755 --- a/core/lib/Thelia/Controller/Front/OrderController.php +++ b/core/lib/Thelia/Controller/Front/OrderController.php @@ -23,6 +23,7 @@ namespace Thelia\Controller\Front; use Propel\Runtime\Exception\PropelException; +use Thelia\Exception\TheliaProcessException; use Thelia\Form\Exception\FormValidationException; use Thelia\Core\Event\OrderEvent; use Thelia\Core\Event\TheliaEvents; @@ -32,9 +33,11 @@ use Thelia\Form\OrderPayment; use Thelia\Log\Tlog; use Thelia\Model\AddressQuery; use Thelia\Model\AreaDeliveryModuleQuery; +use Thelia\Model\Base\OrderQuery; use Thelia\Model\CountryQuery; use Thelia\Model\ModuleQuery; use Thelia\Model\Order; +use Thelia\Tools\URL; /** * Class OrderController @@ -187,6 +190,36 @@ class OrderController extends BaseFrontController $orderEvent = $this->getOrderEvent(); $this->getDispatcher()->dispatch(TheliaEvents::ORDER_PAY, $orderEvent); + + $placedOrder = $orderEvent->getPlacedOrder(); + + if(null !== $placedOrder && null !== $placedOrder->getId()) { + /* order has been placed */ + $this->redirect(URL::getInstance()->absoluteUrl($this->getRoute('order.placed', array('order_id' => $orderEvent->getPlacedOrder()->getId())))); + } else { + /* order has not been placed */ + $this->redirectToRoute("cart.view"); + } + } + + public function orderPlaced($order_id) + { + /* check if the placed order matched the customer */ + $placedOrder = OrderQuery::create()->findPk( + $this->getRequest()->attributes->get('order_id') + ); + + if(null === $placedOrder) { + throw new TheliaProcessException("No placed order", TheliaProcessException::NO_PLACED_ORDER, $placedOrder); + } + + $customer = $this->getSecurityContext()->getCustomerUser(); + + if(null === $customer || $placedOrder->getCustomerId() !== $customer->getId()) { + throw new TheliaProcessException("Received placed order id does not belong to the current customer", TheliaProcessException::PLACED_ORDER_ID_BAD_CURRENT_CUSTOMER, $placedOrder); + } + + $this->getParserContext()->set("placed_order_id", $placedOrder->getId()); } protected function getOrderEvent() diff --git a/core/lib/Thelia/Core/Event/OrderEvent.php b/core/lib/Thelia/Core/Event/OrderEvent.php index a156b753f..7089141bb 100755 --- a/core/lib/Thelia/Core/Event/OrderEvent.php +++ b/core/lib/Thelia/Core/Event/OrderEvent.php @@ -28,6 +28,7 @@ use Thelia\Model\Order; class OrderEvent extends ActionEvent { protected $order = null; + protected $placedOrder = null; protected $invoiceAddress = null; protected $deliveryAddress = null; protected $deliveryModule = null; @@ -51,6 +52,14 @@ class OrderEvent extends ActionEvent $this->order = $order; } + /** + * @param Order $order + */ + public function setPlacedOrder(Order $order) + { + $this->placedOrder = $order; + } + /** * @param $address */ @@ -107,6 +116,14 @@ class OrderEvent extends ActionEvent return $this->order; } + /** + * @return null|Order + */ + public function getPlacedOrder() + { + return $this->placedOrder; + } + /** * @return null|int */ diff --git a/core/lib/Thelia/Core/Template/Loop/Cart.php b/core/lib/Thelia/Core/Template/Loop/Cart.php index 16c108135..5c08b2896 100755 --- a/core/lib/Thelia/Core/Template/Loop/Cart.php +++ b/core/lib/Thelia/Core/Template/Loop/Cart.php @@ -81,6 +81,8 @@ class Cart extends BaseLoop return $result; } + $taxCountry = CountryQuery::create()->findPk(64); // @TODO : make it magic; + foreach ($cartItems as $cartItem) { $product = $cartItem->getProduct(); $productSaleElement = $cartItem->getProductSaleElements(); @@ -97,12 +99,8 @@ class Cart extends BaseLoop ->set("STOCK", $productSaleElement->getQuantity()) ->set("PRICE", $cartItem->getPrice()) ->set("PROMO_PRICE", $cartItem->getPromoPrice()) - ->set("TAXED_PRICE", $cartItem->getTaxedPrice( - CountryQuery::create()->findOneById(64) // @TODO : make it magic - )) - ->set("PROMO_TAXED_PRICE", $cartItem->getTaxedPromoPrice( - CountryQuery::create()->findOneById(64) // @TODO : make it magic - )) + ->set("TAXED_PRICE", $cartItem->getTaxedPrice($taxCountry)) + ->set("PROMO_TAXED_PRICE", $cartItem->getTaxedPromoPrice($taxCountry)) ->set("IS_PROMO", $cartItem->getPromo() === 1 ? 1 : 0); $result->addRow($loopResultRow); } diff --git a/core/lib/Thelia/Core/Template/Loop/Module.php b/core/lib/Thelia/Core/Template/Loop/Module.php new file mode 100755 index 000000000..1c4f91b4d --- /dev/null +++ b/core/lib/Thelia/Core/Template/Loop/Module.php @@ -0,0 +1,137 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Template\Loop; + +use Propel\Runtime\ActiveQuery\Criteria; +use Thelia\Core\Template\Element\BaseI18nLoop; +use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\LoopResultRow; + +use Thelia\Core\Template\Loop\Argument\ArgumentCollection; +use Thelia\Core\Template\Loop\Argument\Argument; + +use Thelia\Model\ModuleQuery; + +use Thelia\Module\BaseModule; +use Thelia\Type; + +/** + * + * Module loop + * + * + * Class Module + * @package Thelia\Core\Template\Loop + * @author Etienne Roudeix + */ +class Module extends BaseI18nLoop +{ + public $timestampable = true; + + /** + * @return ArgumentCollection + */ + protected function getArgDefinitions() + { + return new ArgumentCollection( + Argument::createIntListTypeArgument('id'), + new Argument( + 'module_type', + new Type\TypeCollection( + new Type\EnumListType(array( + BaseModule::CLASSIC_MODULE_TYPE, + BaseModule::DELIVERY_MODULE_TYPE, + BaseModule::PAYMENT_MODULE_TYPE, + )) + ) + ), + Argument::createIntListTypeArgument('exclude'), + Argument::createBooleanOrBothTypeArgument('active', Type\BooleanOrBothType::ANY) + ); + } + + /** + * @param $pagination + * + * @return \Thelia\Core\Template\Element\LoopResult + */ + public function exec(&$pagination) + { + $search = ModuleQuery::create(); + + /* manage translations */ + $locale = $this->configureI18nProcessing($search); + + $id = $this->getId(); + + if (null !== $id) { + $search->filterById($id, Criteria::IN); + } + + $moduleType = $this->getModule_type(); + + if (null !== $moduleType) { + $search->filterByType($moduleType, Criteria::IN); + } + + $exclude = $this->getExclude(); + + if (!is_null($exclude)) { + $search->filterById($exclude, Criteria::NOT_IN); + } + + $active = $this->getActive(); + + if($active !== Type\BooleanOrBothType::ANY) { + $search->filterByActivate($active ? 1 : 0, Criteria::EQUAL); + } + + $search->orderByPosition(); + + /* perform search */ + $modules = $this->search($search, $pagination); + + $loopResult = new LoopResult($modules); + + foreach ($modules as $module) { + $loopResultRow = new LoopResultRow($loopResult, $module, $this->versionable, $this->timestampable, $this->countable); + $loopResultRow->set("ID", $module->getId()) + ->set("IS_TRANSLATED",$module->getVirtualColumn('IS_TRANSLATED')) + ->set("LOCALE",$locale) + ->set("TITLE",$module->getVirtualColumn('i18n_TITLE')) + ->set("CHAPO", $module->getVirtualColumn('i18n_CHAPO')) + ->set("DESCRIPTION", $module->getVirtualColumn('i18n_DESCRIPTION')) + ->set("POSTSCRIPTUM", $module->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set("CODE", $module->getCode()) + ->set("TYPE", $module->getType()) + ->set("ACTIVE", $module->getActivate()) + ->set("CLASS", $module->getFullNamespace()) + ->set("POSITION", $module->getPosition()); + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } +} diff --git a/core/lib/Thelia/Core/Template/Loop/Order.php b/core/lib/Thelia/Core/Template/Loop/Order.php index fd11d8d4c..41d49c4f8 100755 --- a/core/lib/Thelia/Core/Template/Loop/Order.php +++ b/core/lib/Thelia/Core/Template/Loop/Order.php @@ -23,12 +23,16 @@ namespace Thelia\Core\Template\Loop; +use Propel\Runtime\ActiveQuery\Criteria; use Thelia\Core\Template\Element\BaseLoop; use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\LoopResultRow; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; - +use Thelia\Model\OrderQuery; +use Thelia\Type\TypeCollection; +use Thelia\Type; /** * * @package Thelia\Core\Template\Loop @@ -37,19 +41,94 @@ use Thelia\Core\Template\Loop\Argument\Argument; */ class Order extends BaseLoop { + public $countable = true; + public $timestampable = true; + public $versionable = false; + public function getArgDefinitions() { - return new ArgumentCollection(); + return new ArgumentCollection( + Argument::createIntListTypeArgument('id'), + new Argument( + 'customer', + new TypeCollection( + new Type\IntType(), + new Type\EnumType(array('current')) + ), + 'current' + ), + Argument::createIntListTypeArgument('status') + ); } /** + * @param $pagination * - * - * @return \Thelia\Core\Template\Element\LoopResult + * @return LoopResult */ public function exec(&$pagination) { - // TODO : a coder ! - return new LoopResult(); + $search = OrderQuery::create(); + + $id = $this->getId(); + + if (null !== $id) { + $search->filterById($id, Criteria::IN); + } + + $customer = $this->getCustomer(); + + if ($customer === 'current') { + $currentCustomer = $this->securityContext->getCustomerUser(); + if ($currentCustomer === null) { + return new LoopResult(); + } else { + $search->filterByCustomerId($currentCustomer->getId(), Criteria::EQUAL); + } + } else { + $search->filterByCustomerId($customer, Criteria::EQUAL); + } + + $status = $this->getStatus(); + + if (null !== $status) { + $search->filterByStatusId($status, Criteria::IN); + } + + $orders = $this->search($search, $pagination); + + $loopResult = new LoopResult($orders); + + foreach ($orders as $order) { + $tax = 0; + $amount = $order->getTotalAmount($tax); + $loopResultRow = new LoopResultRow($loopResult, $order, $this->versionable, $this->timestampable, $this->countable); + $loopResultRow + ->set("ID", $order->getId()) + ->set("REF", $order->getRef()) + ->set("CUSTOMER", $order->getCustomerId()) + ->set("DELIVERY_ADDRESS", $order->getDeliveryOrderAddressId()) + ->set("INVOICE_ADDRESS", $order->getInvoiceOrderAddressId()) + ->set("INVOICE_DATE", $order->getInvoiceDate()) + ->set("CURRENCY", $order->getCurrencyId()) + ->set("CURRENCY_RATE", $order->getCurrencyRate()) + ->set("TRANSACTION_REF", $order->getTransactionRef()) + ->set("DELIVERY_REF", $order->getDeliveryRef()) + ->set("INVOICE_REF", $order->getInvoiceRef()) + ->set("POSTAGE", $order->getPostage()) + ->set("PAYMENT_MODULE", $order->getPaymentModuleId()) + ->set("DELIVERY_MODULE", $order->getDeliveryModuleId()) + ->set("STATUS", $order->getStatusId()) + ->set("LANG", $order->getLangId()) + ->set("POSTAGE", $order->getPostage()) + ->set("TOTAL_TAX", $tax) + ->set("TOTAL_AMOUNT", $amount - $tax) + ->set("TOTAL_TAXED_AMOUNT", $amount) + ; + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; } } diff --git a/core/lib/Thelia/Exception/OrderException.php b/core/lib/Thelia/Exception/OrderException.php index 68eb36474..70fd21c01 100755 --- a/core/lib/Thelia/Exception/OrderException.php +++ b/core/lib/Thelia/Exception/OrderException.php @@ -30,7 +30,6 @@ class OrderException extends \RuntimeException */ public $cartRoute = "cart.view"; public $orderDeliveryRoute = "order.delivery"; - public $cartItem = null; public $arguments = array(); @@ -40,8 +39,6 @@ class OrderException extends \RuntimeException const UNDEFINED_DELIVERY = 200; - const NOT_ENOUGH_STOCK = 300; - public function __construct($message, $code = null, $arguments = array(), $previous = null) { if(is_array($arguments)) { diff --git a/core/lib/Thelia/Exception/TaxEngineException.php b/core/lib/Thelia/Exception/TaxEngineException.php index 93f5b8237..86f8952b9 100755 --- a/core/lib/Thelia/Exception/TaxEngineException.php +++ b/core/lib/Thelia/Exception/TaxEngineException.php @@ -39,6 +39,7 @@ class TaxEngineException extends \RuntimeException const UNDEFINED_TAX_RULES_COLLECTION = 503; const UNDEFINED_REQUIREMENTS = 504; const UNDEFINED_REQUIREMENT_VALUE = 505; + const UNDEFINED_TAX_RULE = 506; const BAD_AMOUNT_FORMAT = 601; diff --git a/core/lib/Thelia/Exception/TheliaProcessException.php b/core/lib/Thelia/Exception/TheliaProcessException.php new file mode 100755 index 000000000..f61224dea --- /dev/null +++ b/core/lib/Thelia/Exception/TheliaProcessException.php @@ -0,0 +1,54 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Exception; + +/** + * these exception are non fatal exception, due to thelia process exception + * or customer random navigation + * + * they redirect the customer who trig them to a specific error page // @todo + * + * Class TheliaProcessException + * @package Thelia\Exception + */ +class TheliaProcessException extends \RuntimeException +{ + public $data = null; + + const UNKNOWN_EXCEPTION = 0; + + const CART_ITEM_NOT_ENOUGH_STOCK = 100; + const NO_PLACED_ORDER = 101; + const PLACED_ORDER_ID_BAD_CURRENT_CUSTOMER = 102; + + public function __construct($message, $code = null, $data = null, $previous = null) + { + $this->data = $data; + + if ($code === null) { + $code = self::UNKNOWN_EXCEPTION; + } + parent::__construct($message, $code, $previous); + } +} diff --git a/core/lib/Thelia/Model/Order.php b/core/lib/Thelia/Model/Order.php index f730c8853..5249a1366 100755 --- a/core/lib/Thelia/Model/Order.php +++ b/core/lib/Thelia/Model/Order.php @@ -2,11 +2,15 @@ namespace Thelia\Model; +use Propel\Runtime\ActiveQuery\Criteria; use Propel\Runtime\Connection\ConnectionInterface; use Propel\Runtime\Propel; use Thelia\Core\Event\OrderEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Model\Base\Order as BaseOrder; +use Thelia\Model\Base\OrderProductTaxQuery; +use Thelia\Model\Map\OrderProductTaxTableMap; +use Thelia\Model\OrderProductQuery; use Thelia\Model\Map\OrderTableMap; use \PDO; @@ -38,13 +42,27 @@ class Order extends BaseOrder /** * calculate the total amount * - * @TODO create body method + * @param int $tax * - * @return int + * @return int|string|Base\double */ - public function getTotalAmount() + public function getTotalAmount(&$tax = 0) { - return 2; + $amount = 0; + $tax = 0; + + /* browse all products */ + $orderProductIds = array(); + foreach($this->getOrderProducts() as $orderProduct) { + $taxAmount = OrderProductTaxQuery::create() + ->withColumn('SUM(' . OrderProductTaxTableMap::AMOUNT . ')', 'total_tax') + ->filterByOrderProductId($orderProduct->getId(), Criteria::EQUAL) + ->findOne(); + $amount += ($orderProduct->getWasInPromo() == 1 ? $orderProduct->getPromoPrice() : $orderProduct->getPrice()) * $orderProduct->getQuantity(); + $tax += round($taxAmount->getVirtualColumn('total_tax'), 2) * $orderProduct->getQuantity(); + } + + return $amount + $tax + $this->getPostage(); // @todo : manage discount } /** diff --git a/core/lib/Thelia/Model/OrderQuery.php b/core/lib/Thelia/Model/OrderQuery.php index 13cb1cbf1..8d5e4c085 100755 --- a/core/lib/Thelia/Model/OrderQuery.php +++ b/core/lib/Thelia/Model/OrderQuery.php @@ -2,8 +2,11 @@ namespace Thelia\Model; +use Propel\Runtime\Exception\PropelException; +use Propel\Runtime\Propel; use Thelia\Model\Base\OrderQuery as BaseOrderQuery; - +use \PDO; +use Thelia\Model\Map\OrderTableMap; /** * Skeleton subclass for performing query and update operations on the 'order' table. @@ -15,6 +18,38 @@ use Thelia\Model\Base\OrderQuery as BaseOrderQuery; * long as it does not already exist in the output directory. * */ -class OrderQuery extends BaseOrderQuery { +class OrderQuery extends BaseOrderQuery +{ + /** + * PROPEL SHOULD FIX IT + * + * Find object by primary key using raw SQL to go fast. + * Bypass doSelect() and the object formatter by using generated code. + * + * @param mixed $key Primary key to use for the query + * @param ConnectionInterface $con A connection object + * + * @return Order A model object, or null if the key is not found + */ + protected function findPkSimple($key, $con) + { + $sql = 'SELECT ID, REF, CUSTOMER_ID, INVOICE_ORDER_ADDRESS_ID, DELIVERY_ORDER_ADDRESS_ID, INVOICE_DATE, CURRENCY_ID, CURRENCY_RATE, TRANSACTION_REF, DELIVERY_REF, INVOICE_REF, POSTAGE, PAYMENT_MODULE_ID, DELIVERY_MODULE_ID, STATUS_ID, LANG_ID, CREATED_AT, UPDATED_AT FROM `order` WHERE ID = :p0'; + try { + $stmt = $con->prepare($sql); + $stmt->bindValue(':p0', $key, PDO::PARAM_INT); + $stmt->execute(); + } catch (\Exception $e) { + Propel::log($e->getMessage(), Propel::LOG_ERR); + throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e); + } + $obj = null; + if ($row = $stmt->fetch(\PDO::FETCH_NUM)) { + $obj = new Order(); + $obj->hydrate($row); + OrderTableMap::addInstanceToPool($obj, (string) $key); + } + $stmt->closeCursor(); + return $obj; + } } // OrderQuery diff --git a/core/lib/Thelia/Model/TaxRule.php b/core/lib/Thelia/Model/TaxRule.php index 36f80a044..024fd8923 100755 --- a/core/lib/Thelia/Model/TaxRule.php +++ b/core/lib/Thelia/Model/TaxRule.php @@ -3,7 +3,25 @@ namespace Thelia\Model; use Thelia\Model\Base\TaxRule as BaseTaxRule; +use Thelia\TaxEngine\Calculator; +use Thelia\TaxEngine\OrderProductTaxCollection; -class TaxRule extends BaseTaxRule { +class TaxRule extends BaseTaxRule +{ + /** + * @param Country $country + * @param $untaxedAmount + * @param null $askedLocale + * + * @return OrderProductTaxCollection + */ + public function getTaxDetail(Country $country, $untaxedAmount, $askedLocale = null) + { + $taxCalculator = new Calculator(); + $taxCollection = new OrderProductTaxCollection(); + $taxCalculator->loadTaxRule($this, $country)->getTaxedPrice($untaxedAmount, $taxCollection, $askedLocale); + + return $taxCollection; + } } diff --git a/core/lib/Thelia/Model/TaxRuleQuery.php b/core/lib/Thelia/Model/TaxRuleQuery.php index d5ce47546..572500003 100755 --- a/core/lib/Thelia/Model/TaxRuleQuery.php +++ b/core/lib/Thelia/Model/TaxRuleQuery.php @@ -21,13 +21,19 @@ class TaxRuleQuery extends BaseTaxRuleQuery { const ALIAS_FOR_TAX_RULE_COUNTRY_POSITION = 'taxRuleCountryPosition'; - public function getTaxCalculatorCollection(Product $product, Country $country) + /** + * @param TaxRule $taxRule + * @param Country $country + * + * @return array|mixed|\Propel\Runtime\Collection\ObjectCollection + */ + public function getTaxCalculatorCollection(TaxRule $taxRule, Country $country) { $search = TaxQuery::create() ->filterByTaxRuleCountry( TaxRuleCountryQuery::create() ->filterByCountry($country, Criteria::EQUAL) - ->filterByTaxRuleId($product->getTaxRuleId()) + ->filterByTaxRuleId($taxRule->getId()) ->orderByPosition() ->find() ) diff --git a/core/lib/Thelia/Module/BaseModule.php b/core/lib/Thelia/Module/BaseModule.php index f559c1fd5..8efc76e6e 100755 --- a/core/lib/Thelia/Module/BaseModule.php +++ b/core/lib/Thelia/Module/BaseModule.php @@ -25,7 +25,9 @@ namespace Thelia\Module; use Symfony\Component\DependencyInjection\ContainerAware; +use Thelia\Model\ModuleI18nQuery; use Thelia\Model\Map\ModuleImageTableMap; +use Thelia\Model\ModuleI18n; use Thelia\Tools\Image; use Thelia\Exception\ModuleException; use Thelia\Model\Module; @@ -76,6 +78,27 @@ abstract class BaseModule extends ContainerAware return $this->container; } + public function setTitle(Module $module, $titles) + { + if(is_array($titles)) { + foreach($titles as $locale => $title) { + $moduleI18n = ModuleI18nQuery::create()->filterById($module->getId())->filterByLocale($locale)->findOne(); + if(null === $moduleI18n) { + $moduleI18n = new ModuleI18n(); + $moduleI18n + ->setId($module->getId()) + ->setLocale($locale) + ->setTitle($title) + ; + $moduleI18n->save(); + } else { + $moduleI18n->setTitle($title); + $moduleI18n->save(); + } + } + } + } + public function deployImageFolder(Module $module, $folderPath) { try { diff --git a/core/lib/Thelia/TaxEngine/Calculator.php b/core/lib/Thelia/TaxEngine/Calculator.php index b5a2f995e..8039dec39 100755 --- a/core/lib/Thelia/TaxEngine/Calculator.php +++ b/core/lib/Thelia/TaxEngine/Calculator.php @@ -24,8 +24,11 @@ namespace Thelia\TaxEngine; use Thelia\Exception\TaxEngineException; use Thelia\Model\Country; +use Thelia\Model\OrderProductTax; use Thelia\Model\Product; +use Thelia\Model\TaxRule; use Thelia\Model\TaxRuleQuery; +use Thelia\Tools\I18n; /** * Class Calculator @@ -68,14 +71,34 @@ class Calculator $this->product = $product; $this->country = $country; - $this->taxRulesCollection = $this->taxRuleQuery->getTaxCalculatorCollection($product, $country); + $this->taxRulesCollection = $this->taxRuleQuery->getTaxCalculatorCollection($product->getTaxRule(), $country); return $this; } - public function getTaxAmountFromUntaxedPrice($untaxedPrice) + public function loadTaxRule(TaxRule $taxRule, Country $country) { - return $this->getTaxedPrice($untaxedPrice) - $untaxedPrice; + $this->product = null; + $this->country = null; + $this->taxRulesCollection = null; + + if($taxRule->getId() === null) { + throw new TaxEngineException('TaxRule id is empty in Calculator::loadTaxRule', TaxEngineException::UNDEFINED_TAX_RULE); + } + if($country->getId() === null) { + throw new TaxEngineException('Country id is empty in Calculator::loadTaxRule', TaxEngineException::UNDEFINED_COUNTRY); + } + + $this->country = $country; + + $this->taxRulesCollection = $this->taxRuleQuery->getTaxCalculatorCollection($taxRule, $country); + + return $this; + } + + public function getTaxAmountFromUntaxedPrice($untaxedPrice, &$taxCollection = null) + { + return $this->getTaxedPrice($untaxedPrice, $taxCollection) - $untaxedPrice; } public function getTaxAmountFromTaxedPrice($taxedPrice) @@ -83,7 +106,15 @@ class Calculator return $taxedPrice - $this->getUntaxedPrice($taxedPrice); } - public function getTaxedPrice($untaxedPrice) + /** + * @param $untaxedPrice + * @param null $taxCollection returns OrderProductTaxCollection + * @param null $askedLocale + * + * @return int + * @throws \Thelia\Exception\TaxEngineException + */ + public function getTaxedPrice($untaxedPrice, &$taxCollection = null, $askedLocale = null) { if(null === $this->taxRulesCollection) { throw new TaxEngineException('Tax rules collection is empty in Calculator::getTaxAmount', TaxEngineException::UNDEFINED_TAX_RULES_COLLECTION); @@ -97,6 +128,9 @@ class Calculator $currentPosition = 1; $currentTax = 0; + if(null !== $taxCollection) { + $taxCollection = new OrderProductTaxCollection(); + } foreach($this->taxRulesCollection as $taxRule) { $position = (int)$taxRule->getTaxRuleCountryPosition(); @@ -109,7 +143,17 @@ class Calculator $currentPosition = $position; } - $currentTax += $taxType->calculate($taxedPrice); + $taxAmount = round($taxType->calculate($taxedPrice), 2); + $currentTax += $taxAmount; + + if(null !== $taxCollection) { + $taxI18n = I18n::forceI18nRetrieving($askedLocale, 'Tax', $taxRule->getId()); + $orderProductTax = new OrderProductTax(); + $orderProductTax->setTitle($taxI18n->getTitle()); + $orderProductTax->setDescription($taxI18n->getDescription()); + $orderProductTax->setAmount($taxAmount); + $taxCollection->addTax($orderProductTax); + } } $taxedPrice += $currentTax; diff --git a/core/lib/Thelia/TaxEngine/OrderProductTaxCollection.php b/core/lib/Thelia/TaxEngine/OrderProductTaxCollection.php new file mode 100755 index 000000000..5c4ac2022 --- /dev/null +++ b/core/lib/Thelia/TaxEngine/OrderProductTaxCollection.php @@ -0,0 +1,126 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Thelia\TaxEngine; + +use Thelia\Model\OrderProductTax; + +/** + * + * @author Etienne Roudeix + * + */ +class OrderProductTaxCollection implements \Iterator +{ + private $position; + protected $taxes = array(); + + public function __construct() + { + foreach (func_get_args() as $tax) { + $this->addTax($tax); + } + } + + public function isEmpty() + { + return count($this->taxes) == 0; + } + + /** + * @param OrderProductTax $tax + * + * @return OrderProductTaxCollection + */ + public function addTax(OrderProductTax $tax) + { + $this->taxes[] = $tax; + + return $this; + } + + public function getCount() + { + return count($this->taxes); + } + + /** + * (PHP 5 >= 5.0.0)
    + * Return the current element + * @link http://php.net/manual/en/iterator.current.php + * @return OrderProductTax + */ + public function current() + { + return $this->taxes[$this->position]; + } + + /** + * (PHP 5 >= 5.0.0)
    + * Move forward to next element + * @link http://php.net/manual/en/iterator.next.php + * @return void Any returned value is ignored. + */ + public function next() + { + $this->position++; + } + + /** + * (PHP 5 >= 5.0.0)
    + * Return the key of the current element + * @link http://php.net/manual/en/iterator.key.php + * @return mixed scalar on success, or null on failure. + */ + public function key() + { + return $this->position; + } + + /** + * (PHP 5 >= 5.0.0)
    + * Checks if current position is valid + * @link http://php.net/manual/en/iterator.valid.php + * @return boolean The return value will be casted to boolean and then evaluated. + * Returns true on success or false on failure. + */ + public function valid() + { + return isset($this->taxes[$this->position]); + } + + /** + * (PHP 5 >= 5.0.0)
    + * Rewind the Iterator to the first element + * @link http://php.net/manual/en/iterator.rewind.php + * @return void Any returned value is ignored. + */ + public function rewind() + { + $this->position = 0; + } + + public function getKey($key) + { + return isset($this->taxes[$key]) ? $this->taxes[$key] : null; + } +} diff --git a/core/lib/Thelia/Tests/TaxEngine/CalculatorTest.php b/core/lib/Thelia/Tests/TaxEngine/CalculatorTest.php index 502b14c7e..f8c6ec6c0 100755 --- a/core/lib/Thelia/Tests/TaxEngine/CalculatorTest.php +++ b/core/lib/Thelia/Tests/TaxEngine/CalculatorTest.php @@ -86,7 +86,7 @@ class CalculatorTest extends \PHPUnit_Framework_TestCase $taxRuleQuery = $this->getMock('\Thelia\Model\TaxRuleQuery', array('getTaxCalculatorCollection')); $taxRuleQuery->expects($this->once()) ->method('getTaxCalculatorCollection') - ->with($productQuery, $countryQuery) + ->with($productQuery->getTaxRule(), $countryQuery) ->will($this->returnValue('foo')); $rewritingUrlQuery = $this->getProperty('taxRuleQuery'); diff --git a/core/lib/Thelia/Tools/I18n.php b/core/lib/Thelia/Tools/I18n.php index 1f3ff57dd..aeb79ca84 100644 --- a/core/lib/Thelia/Tools/I18n.php +++ b/core/lib/Thelia/Tools/I18n.php @@ -23,6 +23,8 @@ namespace Thelia\Tools; +use Propel\Runtime\ActiveQuery\ModelCriteria; +use Propel\Runtime\ActiveRecord\ActiveRecordInterface; use Thelia\Model\Lang; /** @@ -54,4 +56,39 @@ class I18n return \DateTime::createFromFormat($currentDateFormat, $date); } + + public static function forceI18nRetrieving($askedLocale, $modelName, $id, $needed = array('Title')) + { + $i18nQueryClass = sprintf("\\Thelia\\Model\\%sI18nQuery", $modelName); + $i18nClass = sprintf("\\Thelia\\Model\\%sI18n", $modelName); + + /* get customer language translation */ + $i18n = $i18nQueryClass::create() + ->filterById($id) + ->filterByLocale( + $askedLocale + )->findOne(); + /* or default translation */ + if(null === $i18n) { + $i18n = $i18nQueryClass::create() + ->filterById($id) + ->filterByLocale( + Lang::getDefaultLanguage()->getLocale() + )->findOne(); + } + if(null === $i18n) { // @todo something else ? + $i18n = new $i18nClass();; + $i18n->setId($id); + foreach($needed as $need) { + $method = sprintf('set%s', $need); + if(method_exists($i18n, $method)) { + $i18n->$method('DEFAULT ' . strtoupper($need)); + } else { + // @todo throw sg ? + } + } + } + + return $i18n; + } } diff --git a/install/insert.sql b/install/insert.sql index aa7573d12..df252d366 100755 --- a/install/insert.sql +++ b/install/insert.sql @@ -1153,7 +1153,7 @@ INSERT INTO `tax` (`id`, `type`, `serialized_requirements`, `created_at`, `upda INSERT INTO `tax_i18n` (`id`, `locale`, `title`) VALUES (1, 'fr_FR', 'TVA française à 19.6%'), - (1, 'en_UK', 'french 19.6% tax'); + (1, 'en_US', 'french 19.6% tax'); INSERT INTO `tax_rule` (`id`, `is_default`, `created_at`, `updated_at`) VALUES @@ -1162,7 +1162,7 @@ INSERT INTO `tax_rule` (`id`, `is_default`, `created_at`, `updated_at`) INSERT INTO `tax_rule_i18n` (`id`, `locale`, `title`) VALUES (1, 'fr_FR', 'TVA française à 19.6%'), - (1, 'en_UK', 'french 19.6% tax'); + (1, 'en_US', 'french 19.6% tax'); INSERT INTO `tax_rule_country` (`tax_rule_id`, `country_id`, `tax_id`, `position`, `created_at`, `updated_at`) VALUES diff --git a/local/modules/Cheque/Cheque.php b/local/modules/Cheque/Cheque.php index f4438db4e..4516c84f3 100755 --- a/local/modules/Cheque/Cheque.php +++ b/local/modules/Cheque/Cheque.php @@ -71,6 +71,15 @@ class Cheque extends BaseModule implements PaymentModuleInterface if(ModuleImageQuery::create()->filterByModule($module)->count() == 0) { $this->deployImageFolder($module, sprintf('%s/images', __DIR__)); } + + /* set module title */ + $this->setTitle( + $module, + array( + "en_US" => "Cheque", + "fr_FR" => "Cheque", + ) + ); } public function destroy() diff --git a/local/modules/FakeCB/FakeCB.php b/local/modules/FakeCB/FakeCB.php index 7b304420c..329bbac41 100755 --- a/local/modules/FakeCB/FakeCB.php +++ b/local/modules/FakeCB/FakeCB.php @@ -71,6 +71,15 @@ class FakeCB extends BaseModule implements PaymentModuleInterface if(ModuleImageQuery::create()->filterByModule($module)->count() == 0) { $this->deployImageFolder($module, sprintf('%s/images', __DIR__)); } + + /* set module title */ + $this->setTitle( + $module, + array( + "en_US" => "Credit Card", + "fr_FR" => "Credit Card", + ) + ); } public function destroy() diff --git a/templates/default/order_payment.html b/templates/default/order_placed.html similarity index 85% rename from templates/default/order_payment.html rename to templates/default/order_placed.html index 884230258..c4a26af67 100644 --- a/templates/default/order_payment.html +++ b/templates/default/order_placed.html @@ -24,9 +24,11 @@ 4 Secure payment
    + {loop type="order" name="placed-order" id=$placed_order_id} +
    -

    You chose to pay by : Cheque

    +

    You chose to pay by : {loop name="payment-module" type="module" id=$PAYMENT_MODULE}{$TITLE}{/loop}

    Thank you for the trust you place in us.

    @@ -35,15 +37,17 @@
    Order number :
    -
    PRO123456788978979
    +
    {$REF}
    Date :
    -
    02/12/2013
    +
    {format_date date=$CREATE_DATE output="date"}
    Total :
    -
    $216.25
    +
    {loop type="currency" name="order-currency" id=$CURRENCY}{$SYMBOL}{/loop} {$TOTAL_TAXED_AMOUNT}
    + {/loop} + Go home From 61191b9d326407f50a18b9152cd28608286df81c Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Fri, 20 Sep 2013 16:31:19 +0200 Subject: [PATCH 47/51] fixes order integration --- local/modules/FakeCB/FakeCB.php | 2 +- templates/default/order_placed.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/local/modules/FakeCB/FakeCB.php b/local/modules/FakeCB/FakeCB.php index 329bbac41..ca682fab3 100755 --- a/local/modules/FakeCB/FakeCB.php +++ b/local/modules/FakeCB/FakeCB.php @@ -77,7 +77,7 @@ class FakeCB extends BaseModule implements PaymentModuleInterface $module, array( "en_US" => "Credit Card", - "fr_FR" => "Credit Card", + "fr_FR" => "Carte de crédit", ) ); } diff --git a/templates/default/order_placed.html b/templates/default/order_placed.html index c4a26af67..281800bb5 100644 --- a/templates/default/order_placed.html +++ b/templates/default/order_placed.html @@ -32,7 +32,7 @@

    Thank you for the trust you place in us.

    -

    A summary of your order email has been sent to the following address: email@toto.com

    +

    A summary of your order email has been sent to the following address: {customer attr="email"}

    Your order will be confirmed by us upon receipt of your payment.

    From 1a962d701d6bc1a4c3d56bb744a95af743d00136 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Fri, 20 Sep 2013 16:31:25 +0200 Subject: [PATCH 48/51] translate some missing string --- templates/default/includes/category-toolbar.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/default/includes/category-toolbar.html b/templates/default/includes/category-toolbar.html index 99583a02d..b3a6c7daa 100644 --- a/templates/default/includes/category-toolbar.html +++ b/templates/default/includes/category-toolbar.html @@ -1,10 +1,10 @@