From f32ebf0da6b30f0bd9e86d3a4fd42b663f0c1c63 Mon Sep 17 00:00:00 2001 From: Lee Saferite Date: Sat, 30 May 2009 14:36:43 -0400 Subject: [PATCH] Import Magento Release 1.3.2 --- app/Mage.php | 100 +- app/code/core/Mage/Admin/Model/Mysql4/Acl.php | 5 + app/code/core/Mage/Admin/Model/Session.php | 16 +- .../Mage/AdminNotification/Helper/Data.php | 70 +- .../Mage/AdminNotification/Model/Feed.php | 8 +- .../Mage/AdminNotification/etc/config.xml | 1 + .../Block/Catalog/Category/Edit/Form.php | 71 +- .../Category/Helper/Sortby/Available.php | 5 + .../Category/Helper/Sortby/Default.php | 5 + .../Block/Catalog/Category/Tab/Attributes.php | 8 + .../Block/Catalog/Category/Tab/Product.php | 28 +- .../Adminhtml/Block/Catalog/Category/Tree.php | 103 +- .../Mage/Adminhtml/Block/Catalog/Product.php | 50 +- .../Product/Attribute/Edit/Tab/Main.php | 7 + .../Adminhtml/Block/Catalog/Product/Edit.php | 87 +- .../Edit/Action/Attribute/Tab/Attributes.php | 19 +- .../Catalog/Product/Edit/Tab/Attributes.php | 12 +- .../Catalog/Product/Edit/Tab/Categories.php | 85 +- .../Catalog/Product/Edit/Tab/Crosssell.php | 41 +- .../Catalog/Product/Edit/Tab/Inventory.php | 10 + .../Product/Edit/Tab/Options/Option.php | 14 +- .../Catalog/Product/Edit/Tab/Related.php | 41 +- .../Catalog/Product/Edit/Tab/Super/Config.php | 10 + .../Product/Edit/Tab/Super/Config/Grid.php | 39 +- .../Product/Edit/Tab/Super/Settings.php | 294 ++--- .../Block/Catalog/Product/Edit/Tab/Upsell.php | 39 +- .../Catalog/Product/Edit/Tab/Websites.php | 10 + .../Block/Catalog/Product/Edit/Tabs.php | 9 +- .../Catalog/Product/Helper/Form/Gallery.php | 19 + .../Catalog/Product/Helper/Form/Price.php | 5 +- .../Block/Cms/Page/Edit/Tab/Design.php | 9 +- .../Adminhtml/Block/Cms/Page/Edit/Tabs.php | 2 +- .../Mage/Adminhtml/Block/Cms/Page/Grid.php | 9 +- .../Mage/Adminhtml/Block/Customer/Edit.php | 27 +- .../Block/Customer/Edit/Tab/Account.php | 79 +- .../Block/Customer/Edit/Tab/Addresses.php | 34 +- .../Block/Customer/Edit/Tab/Newsletter.php | 4 + .../Block/Customer/Edit/Tab/View.php | 93 +- .../Customer/Edit/Tab/View/Accordion.php | 84 ++ .../Block/Customer/Edit/Tab/View/Orders.php | 24 +- .../Block/Customer/Edit/Tab/View/Sales.php | 1 - .../Block/Customer/Edit/Tab/Wishlist.php | 64 +- .../Adminhtml/Block/Customer/Edit/Tabs.php | 3 +- .../Mage/Adminhtml/Block/Customer/Grid.php | 4 +- .../Adminhtml/Block/Newsletter/Queue/Edit.php | 29 +- .../Block/Newsletter/Subscriber/Grid.php | 6 +- .../Block/Newsletter/Template/Edit.php | 226 ++-- .../Block/Newsletter/Template/Edit/Form.php | 141 ++- .../Adminhtml/Block/Notification/Toolbar.php | 67 +- .../Adminhtml/Block/Notification/Window.php | 53 +- .../core/Mage/Adminhtml/Block/Page/Footer.php | 4 +- .../core/Mage/Adminhtml/Block/Page/Header.php | 11 + .../core/Mage/Adminhtml/Block/Page/Menu.php | 12 +- .../Mage/Adminhtml/Block/Page/Notices.php | 57 + .../Adminhtml/Block/Permissions/Editroles.php | 6 +- .../Adminhtml/Block/Promo/Catalog/Edit.php | 21 +- .../Block/Promo/Catalog/Edit/Tab/Actions.php | 8 +- .../Block/Promo/Catalog/Edit/Tab/Main.php | 8 +- .../Mage/Adminhtml/Block/Promo/Quote/Edit.php | 15 +- .../Block/Promo/Quote/Edit/Tab/Actions.php | 7 +- .../Block/Promo/Quote/Edit/Tab/Main.php | 8 +- .../Block/Promo/Widget/Chooser/Sku.php | 3 +- .../Block/Report/Product/Downloads/Grid.php | 3 +- .../Product/Downloads/Renderer/Purchases.php | 50 + .../core/Mage/Adminhtml/Block/Review/Grid.php | 2 +- .../Adminhtml/Block/Sales/Items/Abstract.php | 40 +- .../Block/Sales/Order/Create/Abstract.php | 7 - .../Sales/Order/Create/Billing/Address.php | 5 - .../Sales/Order/Create/Billing/Method.php | 8 - .../Order/Create/Billing/Method/Form.php | 7 - .../Block/Sales/Order/Create/Comment.php | 6 - .../Block/Sales/Order/Create/Coupons.php | 12 - .../Block/Sales/Order/Create/Coupons/Form.php | 1 - .../Block/Sales/Order/Create/Customer.php | 6 - .../Block/Sales/Order/Create/Data.php | 29 - .../Block/Sales/Order/Create/Form.php | 22 +- .../Block/Sales/Order/Create/Form/Account.php | 46 +- .../Block/Sales/Order/Create/Form/Address.php | 6 - .../Block/Sales/Order/Create/Giftmessage.php | 10 - .../Block/Sales/Order/Create/Items.php | 9 - .../Block/Sales/Order/Create/Items/Grid.php | 11 +- .../Block/Sales/Order/Create/Load.php | 49 + .../Block/Sales/Order/Create/Newsletter.php | 6 - .../Sales/Order/Create/Newsletter/Form.php | 1 - .../Block/Sales/Order/Create/Search.php | 6 - .../Block/Sales/Order/Create/Search/Grid.php | 4 +- .../Sales/Order/Create/Shipping/Address.php | 5 - .../Sales/Order/Create/Shipping/Method.php | 7 - .../Order/Create/Shipping/Method/Form.php | 1 - .../Block/Sales/Order/Create/Sidebar.php | 16 +- .../Sales/Order/Create/Sidebar/Abstract.php | 6 - .../Sales/Order/Create/Sidebar/Compared.php | 2 +- .../Sales/Order/Create/Sidebar/Pcompared.php | 2 + .../Sales/Order/Create/Sidebar/Pviewed.php | 1 + .../Sales/Order/Create/Sidebar/Reorder.php | 18 +- .../Block/Sales/Order/Create/Store.php | 6 - .../Block/Sales/Order/Create/Store/Select.php | 1 - .../Block/Sales/Order/Create/Totals.php | 1 - .../Block/Sales/Order/Create/Totals/Table.php | 1 - .../Sales/Order/Creditmemo/Create/Items.php | 10 +- .../Block/Sales/Order/Invoice/Create.php | 8 +- .../Block/Sales/Order/Invoice/Create/Form.php | 10 + .../Sales/Order/Invoice/Create/Items.php | 30 +- .../Block/Sales/Order/Invoice/View.php | 18 +- .../Block/Sales/Order/Shipment/Create.php | 3 +- .../Block/Sales/Order/Shipment/View.php | 3 +- .../Mage/Adminhtml/Block/Sales/Order/View.php | 14 +- .../Block/Sales/Order/View/History.php | 5 +- .../Adminhtml/Block/Sales/Order/View/Info.php | 8 + .../Mage/Adminhtml/Block/Store/Switcher.php | 89 +- .../Adminhtml/Block/System/Cache/Edit.php | 9 + .../Adminhtml/Block/System/Cache/Form.php | 4 +- .../Adminhtml/Block/System/Config/Form.php | 7 +- .../Adminhtml/Block/System/Store/Edit.php | 3 + .../Block/System/Store/Edit/Form.php | 45 +- .../core/Mage/Adminhtml/Block/Template.php | 17 + .../Mage/Adminhtml/Block/Widget/Container.php | 21 + .../core/Mage/Adminhtml/Block/Widget/Form.php | 3 - .../core/Mage/Adminhtml/Block/Widget/Grid.php | 7 - .../Widget/Grid/Column/Renderer/Abstract.php | 9 +- .../Widget/Grid/Column/Renderer/Options.php | 16 +- .../Widget/Grid/Column/Renderer/Store.php | 50 +- .../Adminhtml/Block/Widget/Grid/Container.php | 19 +- .../core/Mage/Adminhtml/Controller/Action.php | 34 +- app/code/core/Mage/Adminhtml/Helper/Data.php | 14 +- app/code/core/Mage/Adminhtml/Model/Config.php | 21 +- .../Adminhtml/Model/Sales/Order/Create.php | 3 +- .../System/Config/Backend/Email/Address.php | 45 + .../System/Config/Backend/Email/Sender.php | 45 + .../Model/System/Config/Source/Website.php | 15 +- .../Mage/Adminhtml/Model/System/Store.php | 95 +- app/code/core/Mage/Adminhtml/Model/Url.php | 6 +- .../Catalog/CategoryController.php | 11 +- .../Product/Action/AttributeController.php | 7 + .../controllers/Catalog/ProductController.php | 61 +- .../controllers/Cms/PageController.php | 2 +- .../controllers/CustomerController.php | 6 +- .../Newsletter/QueueController.php | 1 + .../Newsletter/TemplateController.php | 184 ++- .../Permissions/RoleController.php | 386 +++--- .../controllers/Promo/CatalogController.php | 40 +- .../controllers/Promo/QuoteController.php | 42 +- .../Sales/Order/CreateController.php | 41 +- .../Sales/Order/CreditmemoController.php | 8 +- .../Sales/Order/InvoiceController.php | 11 +- .../Sales/Order/ShipmentController.php | 7 + .../controllers/Sales/OrderController.php | 7 + .../controllers/System/CacheController.php | 26 +- .../controllers/System/ConfigController.php | 1 - .../controllers/System/StoreController.php | 11 +- .../Mage/AmazonPayments/Model/Api/Cba.php | 54 +- .../AmazonPayments/Model/Api/Cba/Document.php | 50 +- .../Mage/AmazonPayments/Model/Payment/Asp.php | 1 + .../Mage/AmazonPayments/Model/Payment/Cba.php | 84 +- .../controllers/AspController.php | 62 +- app/code/core/Mage/Api/Model/Config.php | 31 +- app/code/core/Mage/Api/Model/Mysql4/User.php | 65 +- .../core/Mage/Api/Model/Server/V2/Handler.php | 4 +- app/code/core/Mage/Api/Model/Session.php | 42 +- app/code/core/Mage/Api/Model/User.php | 10 +- app/code/core/Mage/Api/Model/Wsdl/Config.php | 51 +- .../core/Mage/Api/Model/Wsdl/Config/Base.php | 22 + app/code/core/Mage/Api/etc/config.xml | 10 +- .../api_setup/mysql4-upgrade-0.8.0-0.8.1.php | 56 + app/code/core/Mage/Backup/Model/Mysql4/Db.php | 44 +- .../Product/Edit/Tab/Attributes/Extend.php | 6 +- .../Catalog/Product/Edit/Tab/Bundle.php | 10 + .../Catalog/Product/View/Type/Bundle.php | 2 + .../Bundle/Model/CatalogIndex/Data/Bundle.php | 15 + .../core/Mage/Bundle/Model/Mysql4/Option.php | 44 +- .../Mage/Bundle/Model/Mysql4/Price/Index.php | 790 +++++++++++++ .../Mage/Bundle/Model/Mysql4/Selection.php | 363 +++--- app/code/core/Mage/Bundle/Model/Observer.php | 494 ++++---- app/code/core/Mage/Bundle/Model/Option.php | 46 +- .../core/Mage/Bundle/Model/Price/Index.php | 144 +++ .../core/Mage/Bundle/Model/Product/Price.php | 165 +-- .../core/Mage/Bundle/Model/Product/Type.php | 35 +- .../Model/Sales/Order/Pdf/Items/Abstract.php | 67 +- .../Sales/Order/Pdf/Items/Creditmemo.php | 157 ++- .../Model/Sales/Order/Pdf/Items/Invoice.php | 145 ++- .../Model/Sales/Order/Pdf/Items/Shipment.php | 120 +- app/code/core/Mage/Bundle/etc/config.xml | 39 +- .../mysql4-upgrade-0.1.6-0.1.7.php | 47 + .../core/Mage/Catalog/Block/Category/View.php | 7 +- .../core/Mage/Catalog/Block/Layer/State.php | 1 - .../core/Mage/Catalog/Block/Navigation.php | 18 +- .../Mage/Catalog/Block/Product/Abstract.php | 11 +- .../Catalog/Block/Product/Compare/List.php | 32 +- .../core/Mage/Catalog/Block/Product/List.php | 96 +- .../Catalog/Block/Product/List/Crosssell.php | 17 - .../core/Mage/Catalog/Block/Product/View.php | 17 +- .../core/Mage/Catalog/Helper/Category.php | 20 +- app/code/core/Mage/Catalog/Helper/Image.php | 38 + .../Mage/Catalog/Helper/Product/Compare.php | 4 +- app/code/core/Mage/Catalog/Model/Abstract.php | 207 +++- app/code/core/Mage/Catalog/Model/Category.php | 9 + .../core/Mage/Catalog/Model/Category/Api.php | 7 +- .../Category/Attribute/Source/Layout.php | 8 +- app/code/core/Mage/Catalog/Model/Config.php | 33 +- .../Catalog/Model/Convert/Adapter/Product.php | 77 +- .../Catalog/Model/Convert/Parser/Product.php | 81 +- app/code/core/Mage/Catalog/Model/Design.php | 15 +- app/code/core/Mage/Catalog/Model/Index.php | 52 + .../Catalog/Model/Layer/Filter/Category.php | 2 +- .../Mage/Catalog/Model/Layer/Filter/Item.php | 5 +- app/code/core/Mage/Catalog/Model/Observer.php | 15 + app/code/core/Mage/Catalog/Model/Product.php | 81 +- .../core/Mage/Catalog/Model/Product/Api.php | 608 +++++----- .../Mage/Catalog/Model/Product/Api/V2.php | 16 +- .../Catalog/Model/Product/Attribute/Api.php | 6 +- .../Model/Product/Attribute/Backend/Media.php | 39 +- .../Model/Product/Attribute/Backend/Price.php | 48 +- .../Product/Attribute/Backend/Tierprice.php | 218 +++- .../Product/Attribute/Frontend/Image.php | 6 +- .../Model/Product/Attribute/Media/Api.php | 743 ++++++------ .../Model/Product/Attribute/Media/Api/V2.php | 9 +- .../Model/Product/Attribute/Source/Layout.php | 10 +- .../Catalog/Model/Product/Compare/Item.php | 12 + .../Mage/Catalog/Model/Product/Option.php | 14 +- .../Mage/Catalog/Model/Product/Status.php | 80 +- .../Catalog/Model/Product/Type/Abstract.php | 45 +- .../Model/Product/Type/Configurable.php | 4 +- .../Catalog/Model/Product/Type/Grouped.php | 2 +- .../Mage/Catalog/Model/Product/Type/Price.php | 14 +- .../Mage/Catalog/Model/Product/Visibility.php | 75 +- .../Mage/Catalog/Model/Product/Website.php | 39 +- .../Model/Resource/Eav/Mysql4/Abstract.php | 47 +- .../Model/Resource/Eav/Mysql4/Category.php | 21 +- .../Resource/Eav/Mysql4/Category/Flat.php | 48 + .../Resource/Eav/Mysql4/Category/Tree.php | 66 +- .../Model/Resource/Eav/Mysql4/Config.php | 187 ++- .../Product/Attribute/Backend/Tierprice.php | 19 +- .../Eav/Mysql4/Product/Collection.php | 319 +++-- .../Product/Compare/Item/Collection.php | 207 +++- .../Eav/Mysql4/Product/Flat/Indexer.php | 22 +- .../Resource/Eav/Mysql4/Product/Link.php | 283 ++--- .../Resource/Eav/Mysql4/Product/Option.php | 51 +- .../Eav/Mysql4/Product/Type/Configurable.php | 221 ++-- .../Resource/Eav/Mysql4/Product/Website.php | 82 +- .../core/Mage/Catalog/Model/Sendfriend.php | 21 +- .../controllers/CategoryController.php | 14 +- .../Catalog/controllers/IndexController.php | 128 +- .../controllers/Product/CompareController.php | 14 +- .../Catalog/controllers/ProductController.php | 13 +- app/code/core/Mage/Catalog/etc/config.xml | 116 +- app/code/core/Mage/Catalog/etc/wsdl.xml | 3 + .../mysql4-upgrade-0.7.66-0.7.67.php | 40 + .../mysql4-upgrade-0.7.67-0.7.68.php | 53 + .../mysql4-upgrade-0.7.68-0.7.69.php | 77 ++ .../Mage/CatalogIndex/Model/Data/Abstract.php | 38 +- .../core/Mage/CatalogIndex/Model/Indexer.php | 201 +++- .../CatalogIndex/Model/Indexer/Abstract.php | 300 ++--- .../Mage/CatalogIndex/Model/Indexer/Eav.php | 2 +- .../CatalogIndex/Model/Indexer/Interface.php | 2 +- .../Model/Indexer/Minimalprice.php | 2 +- .../Mage/CatalogIndex/Model/Indexer/Price.php | 2 +- .../CatalogIndex/Model/Indexer/Tierprice.php | 2 +- .../Model/Mysql4/Data/Abstract.php | 101 +- .../Model/Mysql4/Data/Configurable.php | 14 +- .../Model/Mysql4/Data/Grouped.php | 84 +- .../Mage/CatalogInventory/Helper/Data.php | 17 + .../Model/Mysql4/Stock/Status.php | 412 +++---- .../Mage/CatalogInventory/Model/Observer.php | 18 + .../CatalogInventory/Model/Stock/Item.php | 32 +- .../Model/Stock/Item/Api/V2.php | 2 +- .../CatalogInventory/Model/Stock/Status.php | 21 +- .../core/Mage/CatalogInventory/etc/config.xml | 9 + .../mysql4-upgrade-0.7.4-0.7.5.php | 102 +- .../Mage/CatalogRule/Model/Mysql4/Rule.php | 6 +- .../Model/Mysql4/Rule/Collection.php | 21 + .../Mage/CatalogSearch/Model/Advanced.php | 4 +- .../CatalogSearch/Model/Fulltext/Observer.php | 45 +- .../CatalogSearch/Model/Mysql4/Fulltext.php | 80 +- .../Model/Mysql4/Query/Collection.php | 24 +- .../core/Mage/CatalogSearch/etc/config.xml | 9 + .../Model/Mysql4/Agreement/Collection.php | 29 +- .../core/Mage/Checkout/Model/Type/Onepage.php | 6 +- .../Checkout/controllers/CartController.php | 11 +- app/code/core/Mage/Cms/Block/Page.php | 2 - app/code/core/Mage/Cms/Helper/Data.php | 10 +- app/code/core/Mage/Cms/Helper/Page.php | 67 +- app/code/core/Mage/Cms/Model/Mysql4/Block.php | 14 + .../Cms/Model/Mysql4/Block/Collection.php | 4 +- app/code/core/Mage/Cms/Model/Mysql4/Page.php | 14 + .../Mage/Cms/Model/Mysql4/Page/Collection.php | 4 +- app/code/core/Mage/Cms/Model/Observer.php | 42 +- .../Mage/Cms/controllers/IndexController.php | 67 +- .../Mage/Cms/controllers/PageController.php | 26 +- app/code/core/Mage/Cms/etc/config.xml | 36 +- app/code/core/Mage/Cms/etc/system.xml | 9 + .../cms_setup/mysql4-upgrade-0.7.7-0.7.8.php | 46 + app/code/core/Mage/Compiler/Block/Process.php | 199 ++++ app/code/core/Mage/Compiler/Helper/Data.php | 36 + app/code/core/Mage/Compiler/Model/Process.php | 382 ++++++ .../controllers/ProcessController.php | 110 ++ .../core/Mage/Compiler/etc/compilation.xml | 402 +++++++ app/code/core/Mage/Compiler/etc/config.xml | 134 +++ app/code/core/Mage/Core/Block/Abstract.php | 11 + .../core/Mage/Core/Block/Html/Calendar.php | 10 + .../Mage/Core/Controller/Request/Http.php | 110 +- .../Mage/Core/Controller/Varien/Action.php | 115 +- .../Mage/Core/Controller/Varien/Exception.php | 125 ++ .../Controller/Varien/Router/Standard.php | 1 + app/code/core/Mage/Core/Helper/Abstract.php | 11 + app/code/core/Mage/Core/Model/Abstract.php | 2 + app/code/core/Mage/Core/Model/App.php | 95 +- app/code/core/Mage/Core/Model/Config.php | 369 ++++-- .../core/Mage/Core/Model/Config/Options.php | 125 +- .../Mage/Core/Model/Email/Template/Filter.php | 23 + app/code/core/Mage/Core/Model/Layout.php | 2 +- app/code/core/Mage/Core/Model/Locale.php | 66 +- .../core/Mage/Core/Model/Mysql4/Abstract.php | 22 +- .../Core/Model/Mysql4/Collection/Abstract.php | 18 + .../core/Mage/Core/Model/Mysql4/Design.php | 4 +- .../Core/Model/Mysql4/Store/Collection.php | 35 +- .../Model/Mysql4/Store/Group/Collection.php | 4 +- .../Model/Mysql4/Url/Rewrite/Collection.php | 25 +- .../Core/Model/Mysql4/Website/Collection.php | 2 + app/code/core/Mage/Core/Model/Resource.php | 2 + .../core/Mage/Core/Model/Resource/Setup.php | 28 + .../core/Mage/Core/Model/Session/Abstract.php | 91 +- .../Core/Model/Session/Abstract/Varien.php | 24 +- app/code/core/Mage/Core/Model/Store.php | 53 +- app/code/core/Mage/Core/Model/Store/Group.php | 21 +- app/code/core/Mage/Core/Model/Translate.php | 7 +- app/code/core/Mage/Core/Model/Url.php | 29 +- app/code/core/Mage/Core/Model/Website.php | 24 +- app/code/core/Mage/Core/etc/config.xml | 23 +- app/code/core/Mage/Core/etc/system.xml | 67 +- app/code/core/Mage/Core/functions.php | 68 +- .../mysql4-upgrade-0.8.12-0.8.13.php | 36 + .../core/Mage/Customer/Model/Customer.php | 93 +- .../controllers/AccountController.php | 11 +- app/code/core/Mage/Customer/etc/api.xml | 4 +- app/code/core/Mage/Customer/etc/wsdl.xml | 2 +- .../Model/Convert/Adapter/Abstract.php | 3 +- .../Model/Mysql4/Profile/Collection.php | 12 + .../Catalog/Product/Edit/Tab/Downloadable.php | 20 + .../Product/Edit/Tab/Downloadable/Links.php | 41 +- .../Product/Edit/Tab/Downloadable/Samples.php | 40 +- .../Sales/Order/Email/Items/Downloadable.php | 7 +- .../Order/Email/Items/Order/Downloadable.php | 7 +- .../core/Mage/Downloadable/Model/Link.php | 34 +- .../Mage/Downloadable/Model/Mysql4/Link.php | 42 +- .../Mage/Downloadable/Model/Mysql4/Sample.php | 34 +- .../core/Mage/Downloadable/Model/Observer.php | 15 +- .../Mage/Downloadable/Model/Product/Type.php | 27 + .../core/Mage/Downloadable/Model/Sample.php | 31 +- .../core/Mage/Downloadable/etc/config.xml | 55 +- app/code/core/Mage/Eav/Model/Config.php | 98 +- .../core/Mage/Eav/Model/Entity/Abstract.php | 32 +- .../Eav/Model/Entity/Attribute/Abstract.php | 4 +- .../Entity/Attribute/Backend/Datetime.php | 18 +- .../Mage/Eav/Model/Entity/Attribute/Set.php | 100 +- .../Eav/Model/Entity/Collection/Abstract.php | 3 +- app/code/core/Mage/Eav/Model/Entity/Setup.php | 25 +- .../Eav/Model/Mysql4/Entity/Attribute/Set.php | 73 +- app/code/core/Mage/Eav/etc/config.xml | 2 +- .../mysql4-upgrade-0.7.12-0.7.13.php | 36 + .../Mage/GoogleBase/Block/Adminhtml/Items.php | 7 +- .../GoogleBase/Block/Adminhtml/Items/Item.php | 50 +- .../Block/Adminhtml/Items/Product.php | 2 +- .../Block/Adminhtml/Store/Switcher.php | 13 +- .../Block/Adminhtml/Types/Edit/Attributes.php | 22 +- .../core/Mage/GoogleBase/Model/Attribute.php | 2 +- .../core/Mage/GoogleBase/Model/Config.php | 2 +- .../Model/Mysql4/Item/Collection.php | 19 +- .../Mage/GoogleBase/Model/Service/Feed.php | 58 +- .../Mage/GoogleBase/Model/Service/Item.php | 48 +- .../controllers/ItemsController.php | 53 +- .../GoogleCheckout/Model/Api/Xml/Callback.php | 16 +- .../Mage/GoogleCheckout/Model/Payment.php | 1 + .../core/Mage/GoogleOptimizer/Helper/Data.php | 27 + app/code/core/Mage/Install/Block/Locale.php | 2 +- app/code/core/Mage/Install/Model/Config.php | 5 +- .../core/Mage/Install/Model/Installer.php | 2 +- .../Install/Model/Installer/Filesystem.php | 2 +- app/code/core/Mage/Install/etc/install.xml | 24 +- app/code/core/Mage/Log/Model/Mysql4/Log.php | 3 +- .../Log/Model/Mysql4/Visitor/Collection.php | 26 + .../Mysql4/Visitor/Online/Collection.php | 16 + .../log_setup/mysql4-upgrade-0.7.3-0.7.4.php | 3 - app/code/core/Mage/Newsletter/Helper/Data.php | 45 +- .../Model/Mysql4/Queue/Collection.php | 20 + .../Mage/Newsletter/Model/Mysql4/Template.php | 228 +--- app/code/core/Mage/Newsletter/Model/Queue.php | 28 +- .../core/Mage/Newsletter/Model/Template.php | 185 +-- app/code/core/Mage/Page/Block/Html/Footer.php | 10 +- app/code/core/Mage/Page/Block/Html/Head.php | 2 +- .../core/Mage/Page/Block/Html/Notices.php | 57 + app/code/core/Mage/Page/Helper/Data.php | 1 - app/code/core/Mage/Page/Helper/Layout.php | 121 ++ app/code/core/Mage/Page/Model/Config.php | 111 ++ .../core/Mage/Page/Model/Source/Layout.php | 79 ++ app/code/core/Mage/Page/etc/config.xml | 31 +- app/code/core/Mage/Page/etc/system.xml | 9 + .../core/Mage/Paygate/Model/Authorizenet.php | 42 +- .../core/Mage/Paygate/Model/Payflow/Pro.php | 37 +- .../Mage/Payment/Block/Form/Container.php | 4 + .../Mage/Payment/Model/Method/Abstract.php | 22 + app/code/core/Mage/Payment/Model/Observer.php | 62 + app/code/core/Mage/Payment/etc/config.xml | 12 + .../core/Mage/Paypal/Model/Api/Abstract.php | 13 +- app/code/core/Mage/Paypal/Model/Api/Nvp.php | 20 +- app/code/core/Mage/Paypal/Model/Direct.php | 20 +- app/code/core/Mage/Paypal/Model/Express.php | 26 +- app/code/core/Mage/Paypal/Model/Standard.php | 47 +- app/code/core/Mage/Paypal/etc/config.xml | 2 +- app/code/core/Mage/Paypal/etc/system.xml | 7 +- .../mysql4-upgrade-0.7.1-0.7.2.php | 30 + .../core/Mage/PaypalUk/Model/Api/Abstract.php | 14 +- app/code/core/Mage/PaypalUk/Model/Api/Pro.php | 22 +- app/code/core/Mage/PaypalUk/Model/Direct.php | 16 + app/code/core/Mage/PaypalUk/Model/Express.php | 28 +- app/code/core/Mage/PaypalUk/etc/config.xml | 1 + app/code/core/Mage/PaypalUk/etc/system.xml | 14 +- app/code/core/Mage/Poll/Model/Mysql4/Poll.php | 19 +- .../Poll/Model/Mysql4/Poll/Collection.php | 16 +- .../Mage/Poll/controllers/VoteController.php | 7 + .../ProductAlert/Block/Email/Abstract.php | 138 +++ .../Mage/ProductAlert/Block/Email/Price.php | 66 +- .../Mage/ProductAlert/Block/Email/Stock.php | 66 +- .../core/Mage/ProductAlert/Model/Email.php | 14 +- .../Mage/ProductAlert/Model/Mysql4/Price.php | 38 +- .../core/Mage/ProductAlert/etc/config.xml | 2 +- .../mysql4-upgrade-0.7.1-0.7.2.php | 49 + .../Rating/Model/Mysql4/Rating/Collection.php | 22 +- .../Mage/Reports/Block/Product/Abstract.php | 2 +- .../Review/Model/Mysql4/Review/Collection.php | 6 +- app/code/core/Mage/Review/Model/Observer.php | 21 +- app/code/core/Mage/Review/Model/Review.php | 22 +- .../Review/controllers/ProductController.php | 21 +- app/code/core/Mage/Review/etc/config.xml | 27 +- .../mysql4-upgrade-0.7.3-0.7.4.php | 36 + app/code/core/Mage/Rss/Block/Abstract.php | 2 +- .../core/Mage/Rss/Block/Catalog/Category.php | 2 +- app/code/core/Mage/Rss/Block/List.php | 4 +- app/code/core/Mage/Rss/etc/config.xml | 114 +- app/code/core/Mage/Rule/Block/Editable.php | 2 +- app/code/core/Mage/Rule/Model/Rule.php | 60 + .../core/Mage/Sales/Model/Convert/Quote.php | 554 ++++----- .../Model/Mysql4/Quote/Item/Collection.php | 385 +++--- .../core/Mage/Sales/Model/Mysql4/Setup.php | 15 - app/code/core/Mage/Sales/Model/Order.php | 102 +- .../Mage/Sales/Model/Order/Creditmemo.php | 5 +- .../Mage/Sales/Model/Order/Invoice/Item.php | 5 +- .../core/Mage/Sales/Model/Order/Payment.php | 22 +- .../Mage/Sales/Model/Order/Pdf/Abstract.php | 310 ++++- .../Mage/Sales/Model/Order/Pdf/Creditmemo.php | 48 +- .../Mage/Sales/Model/Order/Pdf/Invoice.php | 67 +- .../Order/Pdf/Items/Creditmemo/Default.php | 154 ++- .../Model/Order/Pdf/Items/Invoice/Default.php | 100 +- .../Order/Pdf/Items/Shipment/Default.php | 69 +- .../Mage/Sales/Model/Order/Pdf/Shipment.php | 58 +- .../Mage/Sales/Model/Order/Shipment/Api.php | 7 +- .../Mage/Sales/Model/Order/Shipment/Item.php | 3 + app/code/core/Mage/Sales/Model/Quote.php | 41 +- .../core/Mage/Sales/Model/Quote/Address.php | 67 +- app/code/core/Mage/Sales/Model/Quote/Item.php | 1043 +++++++++-------- app/code/core/Mage/Sales/etc/config.xml | 54 +- .../mysql4-upgrade-0.9.35-0.9.36.php | 34 + .../mysql4-upgrade-0.9.36-0.9.37.php | 35 + .../mysql4-upgrade-0.9.37-0.9.38.php | 46 + .../Model/Mysql4/Rule/Collection.php | 21 + .../SalesRule/Model/Mysql4/Rule/Customer.php | 18 +- .../Mage/Shipping/Model/Carrier/Abstract.php | 12 + .../core/Mage/Shipping/Model/Shipping.php | 3 + .../Model/Mysql4/Sitemap/Collection.php | 11 + .../core/Mage/Tag/Block/Customer/View.php | 100 +- .../core/Mage/Tag/Block/Product/Result.php | 2 +- .../Tag/Model/Mysql4/Product/Collection.php | 234 +++- .../Mage/Tag/Model/Mysql4/Tag/Collection.php | 48 +- .../Tag/controllers/CustomerController.php | 5 +- app/code/core/Mage/Tag/etc/config.xml | 2 +- .../tag_setup/mysql4-upgrade-0.7.1-0.7.2.php | 114 ++ .../Adminhtml/Frontend/Region/Updater.php | 16 +- app/code/core/Mage/Tax/Model/Calculation.php | 7 +- app/code/core/Mage/Tax/etc/config.xml | 23 +- app/code/core/Mage/Tax/etc/system.xml | 4 +- .../tax_setup/mysql4-upgrade-0.7.3-0.7.4.php | 2 +- .../tax_setup/mysql4-upgrade-0.7.5-0.7.6.php | 2 +- .../Usa/Model/Shipping/Carrier/Abstract.php | 31 + app/code/core/Mage/Usa/etc/system.xml | 4 + .../Mage/Wishlist/Block/Customer/Sidebar.php | 2 +- .../Mage/Wishlist/Block/Customer/Wishlist.php | 2 +- .../Mage/Wishlist/Block/Share/Wishlist.php | 7 +- .../Model/Mysql4/Product/Collection.php | 68 +- .../Mage/Wishlist/Model/Mysql4/Wishlist.php | 2 +- .../Model/Mysql4/Wishlist/Collection.php | 2 +- .../core/Mage/Wishlist/Model/Wishlist.php | 2 +- .../Wishlist/controllers/IndexController.php | 7 + app/code/core/Zend/Cache/Backend/Apc.php | 34 +- .../core/Zend/Cache/Backend/Eaccelerator.php | 338 ++++++ app/code/core/Zend/Cache/Backend/File.php | 4 +- .../core/Zend/Cache/Backend/Memcached.php | 188 +-- .../default/default/layout/compiler.xml | 35 + .../default/default/layout/customer.xml | 8 +- .../adminhtml/default/default/layout/main.xml | 1 + .../default/default/layout/sales.xml | 300 ++++- .../template/bundle/product/edit/bundle.phtml | 31 +- .../edit/bundle/option/selection.phtml | 6 +- .../template/catalog/category/tree.phtml | 14 +- .../form/renderer/fieldset/element.phtml | 4 +- .../renderer/googleoptimizer/import.phtml | 4 +- .../default/template/catalog/product.phtml | 9 +- .../template/catalog/product/edit.phtml | 2 + .../catalog/product/edit/categories.phtml | 6 +- .../catalog/product/edit/options/option.phtml | 11 +- .../catalog/product/edit/price/tier.phtml | 22 +- .../catalog/product/edit/super/config.phtml | 17 +- .../catalog/product/edit/websites.phtml | 4 +- .../catalog/product/helper/gallery.phtml | 21 +- .../catalog/product/tab/inventory.phtml | 49 +- .../default/template/compiler/process.phtml | 93 ++ .../template/customer/tab/addresses.phtml | 13 +- .../default/template/customer/tab/view.phtml | 5 +- .../template/customer/tab/view/sales.phtml | 2 + .../product/edit/downloadable.phtml | 14 +- .../default/template/forgotpassword.phtml | 2 +- .../googlebase/types/edit/attributes.phtml | 2 +- .../default/template/googleoptimizer/js.phtml | 12 +- .../default/default/template/login.phtml | 2 +- .../template/notification/toolbar.phtml | 5 + .../default/default/template/page.phtml | 181 +-- .../default/template/page/js/calendar.phtml | 3 + .../default/template/page/notices.phtml | 44 + .../sales/order/create/abstract.phtml | 2 +- .../order/create/billing/method/form.phtml | 2 + .../template/sales/order/create/form.phtml | 4 +- .../sales/order/create/giftmessage.phtml | 16 +- .../sales/order/create/items/grid.phtml | 74 +- .../template/sales/order/create/sidebar.phtml | 13 +- .../sales/order/creditmemo/create/items.phtml | 2 + .../sales/order/invoice/create/form.phtml | 17 +- .../sales/order/invoice/create/items.phtml | 5 +- .../create/items/renderer/default.phtml | 30 +- .../sales/order/invoice/create/tracking.phtml | 11 +- .../view/items/renderer/configurable.phtml | 30 +- .../invoice/view/items/renderer/default.phtml | 30 +- .../order/shipment/create/tracking.phtml | 5 + .../template/sales/order/view/info.phtml | 8 +- .../default/template/store/switcher.phtml | 17 +- .../system/shipping/applicable_country.phtml | 34 +- .../default/template/weee/renderer/tax.phtml | 4 +- .../default/template/widget/breadcrumbs.phtml | 6 +- .../default/template/widget/grid.phtml | 3 + .../default/default/layout/bundle.xml | 6 + .../frontend/default/default/layout/page.xml | 45 +- .../template/catalog/layer/filter.phtml | 6 +- .../catalog/product/compare/list.phtml | 2 +- .../catalog/product/compare/sidebar.phtml | 14 +- .../template/catalog/product/list.phtml | 5 +- .../template/catalog/product/new.phtml | 2 +- .../template/checkout/onepage/login.phtml | 11 +- .../template/email/productalert/price.phtml | 8 +- .../template/email/productalert/stock.phtml | 8 +- .../default/template/page/1column.phtml | 1 + .../default/template/page/2columns-left.phtml | 2 +- .../template/page/2columns-right.phtml | 2 +- .../default/template/page/3columns.phtml | 2 +- .../default/template/page/dashboard.phtml | 2 +- .../template/page/html/breadcrumbs.phtml | 6 +- .../default/template/page/html/notices.phtml | 44 + .../template/payment/form/ccsave.phtml | 4 +- .../default/default/template/page.phtml | 13 +- app/etc/config.xml | 4 + app/etc/modules/Mage_Compiler.xml | 38 + .../en_US/template/email/account_new.html | 106 +- .../email/account_new_confirmation.html | 4 +- .../template/email/account_new_confirmed.html | 96 +- .../template/email/admin_password_new.html | 4 +- .../email/newsletter_subscr_confirm.html | 2 +- .../en_US/template/email/password_new.html | 4 +- .../en_US/template/email/product_share.html | 2 +- .../template/email/sales/creditmemo_new.html | 176 +-- .../email/sales/creditmemo_new_guest.html | 174 +-- .../email/sales/creditmemo_update.html | 72 +- .../email/sales/creditmemo_update_guest.html | 70 +- .../template/email/sales/invoice_new.html | 172 +-- .../email/sales/invoice_new_guest.html | 174 +-- .../template/email/sales/invoice_update.html | 72 +- .../email/sales/invoice_update_guest.html | 70 +- .../en_US/template/email/sales/order_new.html | 174 ++- .../template/email/sales/order_new_guest.html | 170 +-- .../template/email/sales/order_update.html | 72 +- .../email/sales/order_update_guest.html | 70 +- .../template/email/sales/shipment_new.html | 184 +-- .../email/sales/shipment_new_guest.html | 182 +-- .../template/email/sales/shipment_update.html | 72 +- .../email/sales/shipment_update_guest.html | 70 +- .../en_US/template/email/wishlist_share.html | 2 +- cron.sh | 29 + downloader/Maged/Controller.php | 13 + downloader/Maged/Model/Config.php | 17 +- downloader/config.ini | 6 +- downloader/pearlib/php/PEAR/Common.php | 15 + downloader/pearlib/php/PEAR/Installer.php | 21 +- downloader/pearlib/php/System.php | 46 +- downloader/template/install/download.phtml | 54 +- downloader/template/settings.phtml | 45 + includes/.htaccess | 2 + includes/config.php | 29 + index.php | 13 + js/calendar/calendar.js | 58 +- js/extjs/ext-tree-checkbox.js | 10 +- js/mage/adminhtml/product.js | 17 +- js/mage/adminhtml/sales.js | 23 +- js/mage/adminhtml/tabs.js | 4 + js/prototype/validation.js | 44 +- js/varien/form.js | 12 +- lib/Varien/Autoload.php | 168 +++ lib/Varien/Data/Collection/Db.php | 7 + lib/Varien/Data/Form/Element/Abstract.php | 34 +- lib/Varien/Data/Form/Element/Date.php | 2 +- lib/Varien/Db/Adapter/Pdo/Mysql.php | 592 +++++++--- lib/Varien/Db/Select.php | 16 + lib/Varien/File/Uploader.php | 44 +- lib/Varien/Filter/Template.php | 50 +- lib/Varien/Http/Adapter/Curl.php | 12 + lib/Varien/Image.php | 25 + lib/Varien/Image/Adapter/Abstract.php | 22 + lib/Varien/Image/Adapter/Gd2.php | 21 +- lib/Zend/Amf/Server.php | 2 +- lib/Zend/Controller/Front.php | 6 +- lib/Zend/Controller/Router/Rewrite.php | 2 +- lib/Zend/Db.php | 2 +- lib/Zend/Db/Adapter/Abstract.php | 2 +- lib/Zend/Db/Adapter/Db2.php | 2 +- lib/Zend/Db/Adapter/Mysqli.php | 2 +- lib/Zend/Db/Adapter/Oracle.php | 2 +- lib/Zend/Db/Adapter/Pdo/Abstract.php | 2 +- lib/Zend/Db/Table/Abstract.php | 6 +- lib/Zend/Db/Table/Row/Abstract.php | 14 +- lib/Zend/Db/Table/Rowset/Abstract.php | 2 +- lib/Zend/Feed.php | 6 +- lib/Zend/Feed/Builder/Header.php | 6 +- lib/Zend/Feed/Builder/Header/Itunes.php | 2 +- lib/Zend/File/Transfer.php | 2 +- lib/Zend/Filter.php | 2 +- lib/Zend/Form.php | 2 +- lib/Zend/Gdata/App.php | 2 +- lib/Zend/Gdata/Gapps.php | 2 +- lib/Zend/Http/Client.php | 2 +- lib/Zend/InfoCard/Xml/Element.php | 2 +- lib/Zend/InfoCard/Xml/Security/Transform.php | 2 +- lib/Zend/Layout.php | 4 +- lib/Zend/Loader.php | 6 +- lib/Zend/Locale/Math.php | 6 +- lib/Zend/Mail/Transport/Smtp.php | 2 +- lib/Zend/Memory.php | 2 +- lib/Zend/Registry.php | 2 +- lib/Zend/Service/Nirvanix.php | 2 +- lib/Zend/Service/StrikeIron.php | 2 +- lib/Zend/Session.php | 2 +- lib/Zend/TimeSync.php | 2 +- lib/Zend/Translate.php | 2 +- lib/Zend/Uri.php | 2 +- lib/Zend/Validate/Hostname.php | 2 +- lib/Zend/View/Helper/Placeholder/Registry.php | 2 +- lib/Zend/Wildfire/Channel/HttpHeaders.php | 2 +- lib/Zend/Wildfire/Plugin/FirePhp.php | 2 +- report/index.php | 9 +- skin/adminhtml/default/default/boxes.css | 28 +- .../default/default/images/i_notice.gif | Bin 0 -> 802 bytes skin/frontend/default/blue/css/boxes.css | 67 +- .../frontend/default/blue/images/i_notice.gif | Bin 0 -> 802 bytes .../default/blue/images/logo_email.gif | Bin 3584 -> 3407 bytes .../default/blue/images/logo_print.gif | Bin 3584 -> 3407 bytes skin/frontend/default/default/css/boxes.css | 43 +- .../default/images/cookies/firefox.png | Bin 0 -> 12133 bytes .../default/default/images/cookies/ie6-1.gif | Bin 0 -> 19710 bytes .../default/default/images/cookies/ie6-2.gif | Bin 0 -> 48085 bytes .../default/default/images/cookies/ie7-1.gif | Bin 0 -> 3538 bytes .../default/default/images/cookies/ie7-2.gif | Bin 0 -> 14575 bytes .../default/default/images/cookies/ie7-3.gif | Bin 0 -> 19023 bytes .../default/default/images/cookies/ie7-4.gif | Bin 0 -> 9137 bytes .../default/default/images/cookies/ie7-5.gif | Bin 0 -> 9066 bytes .../default/default/images/cookies/ie7-6.gif | Bin 0 -> 6485 bytes .../default/default/images/cookies/opera.png | Bin 0 -> 17813 bytes .../default/default/images/i_notice.gif | Bin 0 -> 802 bytes .../default/default/images/logo_email.gif | Bin 3584 -> 3407 bytes .../default/default/images/logo_print.gif | Bin 3584 -> 3407 bytes skin/frontend/default/french/images/logo.gif | Bin 0 -> 3267 bytes .../default/french/images/logo_email.gif | Bin 0 -> 3271 bytes skin/frontend/default/german/images/logo.gif | Bin 0 -> 3383 bytes .../default/german/images/logo_email.gif | Bin 0 -> 3306 bytes skin/install/default/default/css/boxes.css | 6 +- .../default/default/images/i_notice.gif | Bin 0 -> 802 bytes 688 files changed, 21673 insertions(+), 8931 deletions(-) create mode 100644 app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Accordion.php create mode 100644 app/code/core/Mage/Adminhtml/Block/Page/Notices.php create mode 100644 app/code/core/Mage/Adminhtml/Block/Report/Product/Downloads/Renderer/Purchases.php create mode 100644 app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Load.php create mode 100644 app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Email/Address.php create mode 100644 app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Email/Sender.php create mode 100644 app/code/core/Mage/Api/sql/api_setup/mysql4-upgrade-0.8.0-0.8.1.php create mode 100644 app/code/core/Mage/Bundle/Model/Mysql4/Price/Index.php create mode 100644 app/code/core/Mage/Bundle/Model/Price/Index.php create mode 100644 app/code/core/Mage/Bundle/sql/bundle_setup/mysql4-upgrade-0.1.6-0.1.7.php create mode 100644 app/code/core/Mage/Catalog/Model/Index.php create mode 100644 app/code/core/Mage/Catalog/sql/catalog_setup/mysql4-upgrade-0.7.66-0.7.67.php create mode 100644 app/code/core/Mage/Catalog/sql/catalog_setup/mysql4-upgrade-0.7.67-0.7.68.php create mode 100644 app/code/core/Mage/Catalog/sql/catalog_setup/mysql4-upgrade-0.7.68-0.7.69.php create mode 100644 app/code/core/Mage/Cms/sql/cms_setup/mysql4-upgrade-0.7.7-0.7.8.php create mode 100644 app/code/core/Mage/Compiler/Block/Process.php create mode 100644 app/code/core/Mage/Compiler/Helper/Data.php create mode 100644 app/code/core/Mage/Compiler/Model/Process.php create mode 100644 app/code/core/Mage/Compiler/controllers/ProcessController.php create mode 100644 app/code/core/Mage/Compiler/etc/compilation.xml create mode 100644 app/code/core/Mage/Compiler/etc/config.xml create mode 100644 app/code/core/Mage/Core/Controller/Varien/Exception.php create mode 100644 app/code/core/Mage/Core/sql/core_setup/mysql4-upgrade-0.8.12-0.8.13.php create mode 100644 app/code/core/Mage/Eav/sql/eav_setup/mysql4-upgrade-0.7.12-0.7.13.php create mode 100644 app/code/core/Mage/Page/Block/Html/Notices.php create mode 100644 app/code/core/Mage/Page/Helper/Layout.php create mode 100644 app/code/core/Mage/Page/Model/Config.php create mode 100644 app/code/core/Mage/Page/Model/Source/Layout.php create mode 100644 app/code/core/Mage/Payment/Model/Observer.php create mode 100644 app/code/core/Mage/Paypal/sql/paypal_setup/mysql4-upgrade-0.7.1-0.7.2.php create mode 100644 app/code/core/Mage/ProductAlert/Block/Email/Abstract.php create mode 100644 app/code/core/Mage/ProductAlert/sql/productalert_setup/mysql4-upgrade-0.7.1-0.7.2.php create mode 100644 app/code/core/Mage/Review/sql/review_setup/mysql4-upgrade-0.7.3-0.7.4.php create mode 100644 app/code/core/Mage/Sales/sql/sales_setup/mysql4-upgrade-0.9.35-0.9.36.php create mode 100644 app/code/core/Mage/Sales/sql/sales_setup/mysql4-upgrade-0.9.36-0.9.37.php create mode 100644 app/code/core/Mage/Sales/sql/sales_setup/mysql4-upgrade-0.9.37-0.9.38.php create mode 100644 app/code/core/Mage/Tag/sql/tag_setup/mysql4-upgrade-0.7.1-0.7.2.php create mode 100644 app/code/core/Zend/Cache/Backend/Eaccelerator.php create mode 100644 app/design/adminhtml/default/default/layout/compiler.xml create mode 100644 app/design/adminhtml/default/default/template/compiler/process.phtml create mode 100644 app/design/adminhtml/default/default/template/page/notices.phtml create mode 100644 app/design/frontend/default/default/template/page/html/notices.phtml create mode 100644 app/etc/modules/Mage_Compiler.xml create mode 100644 cron.sh create mode 100644 includes/.htaccess create mode 100644 includes/config.php create mode 100644 lib/Varien/Autoload.php create mode 100644 skin/adminhtml/default/default/images/i_notice.gif create mode 100644 skin/frontend/default/blue/images/i_notice.gif create mode 100644 skin/frontend/default/default/images/cookies/firefox.png create mode 100644 skin/frontend/default/default/images/cookies/ie6-1.gif create mode 100644 skin/frontend/default/default/images/cookies/ie6-2.gif create mode 100644 skin/frontend/default/default/images/cookies/ie7-1.gif create mode 100644 skin/frontend/default/default/images/cookies/ie7-2.gif create mode 100644 skin/frontend/default/default/images/cookies/ie7-3.gif create mode 100644 skin/frontend/default/default/images/cookies/ie7-4.gif create mode 100644 skin/frontend/default/default/images/cookies/ie7-5.gif create mode 100644 skin/frontend/default/default/images/cookies/ie7-6.gif create mode 100644 skin/frontend/default/default/images/cookies/opera.png create mode 100644 skin/frontend/default/default/images/i_notice.gif create mode 100644 skin/frontend/default/french/images/logo.gif create mode 100644 skin/frontend/default/french/images/logo_email.gif create mode 100644 skin/frontend/default/german/images/logo.gif create mode 100644 skin/frontend/default/german/images/logo_email.gif create mode 100644 skin/install/default/default/images/i_notice.gif diff --git a/app/Mage.php b/app/Mage.php index 46ef862f92..b9b715d1a6 100644 --- a/app/Mage.php +++ b/app/Mage.php @@ -28,27 +28,29 @@ define('PS', PATH_SEPARATOR); define('BP', dirname(dirname(__FILE__))); -/** - * Error reporting - */ -error_reporting(E_ALL | E_STRICT); - Mage::register('original_include_path', get_include_path()); -/** - * Set include path - */ -$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local'; -$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community'; -$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core'; -$paths[] = BP . DS . 'lib'; - -$app_path = implode(PS, $paths); - -set_include_path($app_path . PS . Mage::registry('original_include_path')); +if (defined('COMPILER_INCLUDE_PATH')) { + $app_path = COMPILER_INCLUDE_PATH; + set_include_path($app_path . PS . Mage::registry('original_include_path')); + include_once "Mage_Core_functions.php"; + include_once "Varien_Autoload.php"; +} else { + /** + * Set include path + */ + $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local'; + $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community'; + $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core'; + $paths[] = BP . DS . 'lib'; + + $app_path = implode(PS, $paths); + set_include_path($app_path . PS . Mage::registry('original_include_path')); + include_once "Mage/Core/functions.php"; + include_once "Varien/Autoload.php"; +} -include_once "Mage/Core/functions.php"; -include_once "Varien/Profiler.php"; +Varien_Autoload::register(); /** * Main Mage hub class @@ -82,7 +84,7 @@ final class Mage { public static function getVersion() { - return '1.3.1.1'; + return '1.3.2'; } /** @@ -464,9 +466,9 @@ public static function run($code = '', $type = 'store', $options=array()) die(); } catch (Mage_Core_Model_Store_Exception $e) { - $baseUrl = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/'); + $baseUrl = self::getScriptSystemUrl('404'); if (!headers_sent()) { - header('Location: ' . $baseUrl.'/404/'); + header('Location: ' . rtrim($baseUrl, '/').'/404/'); } else { print ''; diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Attributes.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Attributes.php index 9b401aa1da..7864b34dbb 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Attributes.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Attributes.php @@ -113,6 +113,14 @@ protected function _prepareForm() { } } + if ($this->getCategory()->hasLockedAttributes()) { + foreach ($this->getCategory()->getLockedAttributes() as $attribute) { + if ($element = $form->getElement($attribute)) { + $element->setReadonly(true, true); + } + } + } + $form->addValues($this->getCategory()->getData()); $form->setFieldNameSuffix('general'); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php index 9e4d576cb3..268cf236d9 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php @@ -86,19 +86,29 @@ protected function _prepareCollection() 'left'); $this->setCollection($collection); + if ($this->getCategory()->getProductsReadonly()) { + $productIds = $this->_getSelectedProducts(); + if (empty($productIds)) { + $productIds = 0; + } + $this->getCollection()->addFieldToFilter('entity_id', array('in'=>$productIds)); + } + return parent::_prepareCollection(); } protected function _prepareColumns() { - $this->addColumn('in_category', array( - 'header_css_class' => 'a-center', - 'type' => 'checkbox', - 'name' => 'in_category', - 'values' => $this->_getSelectedProducts(), - 'align' => 'center', - 'index' => 'entity_id' - )); + if (!$this->getCategory()->getProductsReadonly()) { + $this->addColumn('in_category', array( + 'header_css_class' => 'a-center', + 'type' => 'checkbox', + 'name' => 'in_category', + 'values' => $this->_getSelectedProducts(), + 'align' => 'center', + 'index' => 'entity_id' + )); + } $this->addColumn('entity_id', array( 'header' => Mage::helper('catalog')->__('ID'), 'sortable' => true, @@ -126,7 +136,7 @@ protected function _prepareColumns() 'width' => '1', 'type' => 'number', 'index' => 'position', - 'editable' => true + 'editable' => !$this->getCategory()->getProductsReadonly() //'renderer' => 'adminhtml/widget_grid_column_renderer_input' )); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tree.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tree.php index bbd83d4aac..5a86d84027 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tree.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tree.php @@ -53,24 +53,28 @@ protected function _prepareLayout() '_query' => false )); - $this->setChild('add_sub_button', - $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData(array( - 'label' => Mage::helper('catalog')->__('Add Subcategory'), - 'onclick' => "addNew('".$addUrl."', false)", - 'class' => 'add' - )) - ); + if ($this->canAddSubCategory()) { + $this->setChild('add_sub_button', + $this->getLayout()->createBlock('adminhtml/widget_button') + ->setData(array( + 'label' => Mage::helper('catalog')->__('Add Subcategory'), + 'onclick' => "addNew('".$addUrl."', false)", + 'class' => 'add' + )) + ); + } - $this->setChild('add_root_button', - $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData(array( - 'label' => Mage::helper('catalog')->__('Add Root Category'), - 'onclick' => "addNew('".$addUrl."', true)", - 'class' => 'add', - 'id' => 'add_root_category_button' - )) - ); + if ($this->canAddRootCategory()) { + $this->setChild('add_root_button', + $this->getLayout()->createBlock('adminhtml/widget_button') + ->setData(array( + 'label' => Mage::helper('catalog')->__('Add Root Category'), + 'onclick' => "addNew('".$addUrl."', true)", + 'class' => 'add', + 'id' => 'add_root_category_button' + )) + ); + } $this->setChild('store_switcher', $this->getLayout()->createBlock('adminhtml/store_switcher') @@ -238,11 +242,10 @@ protected function _getNodeJson($node, $level = 0) $item['cls'] = 'folder ' . ($node->getIsActive() ? 'active-category' : 'no-active-category'); //$item['allowDrop'] = ($level<3) ? true : false; - $item['allowDrop'] = true; + $allowMove = $this->_isCategoryMoveable($node); + $item['allowDrop'] = $allowMove; // disallow drag if it's first level and category is root of a store - $item['allowDrag'] = $this->_allowNodesDrag() - ? ($node->getLevel()==1 && $rootForStores) ? false : true - : false; + $item['allowDrag'] = $allowMove && (($node->getLevel()==1 && $rootForStores) ? false : true); if ((int)$node->getChildrenCount()>0) { $item['children'] = array(); @@ -281,12 +284,20 @@ public function buildNodeName($node) return $result; } - protected function _allowNodesDrag() + protected function _isCategoryMoveable($node) { - return true; + $options = new Varien_Object(array( + 'is_moveable' => true, + 'category' => $node + )); + + Mage::dispatchEvent('adminhtml_catalog_category_tree_is_moveable', + array('options'=>$options) + ); + + return $options->getIsMoveable(); } - - + protected function _isParentSelectedCategory($node) { if ($node && $this->getCategory()) { @@ -308,4 +319,44 @@ public function isClearEdit() { return (bool) $this->getRequest()->getParam('clear'); } -} \ No newline at end of file + + /** + * Check availability of adding root category + * + * @return boolean + */ + public function canAddRootCategory() + { + $options = new Varien_Object(array('is_allow'=>true)); + Mage::dispatchEvent( + 'adminhtml_catalog_category_tree_can_add_root_category', + array( + 'category' => $this->getCategory(), + 'options' => $options, + 'store' => $this->getStore()->getId() + ) + ); + + return $options->getIsAllow(); + } + + /** + * Check availability of adding sub category + * + * @return boolean + */ + public function canAddSubCategory() + { + $options = new Varien_Object(array('is_allow'=>true)); + Mage::dispatchEvent( + 'adminhtml_catalog_category_tree_can_add_sub_category', + array( + 'category' => $this->getCategory(), + 'options' => $options, + 'store' => $this->getStore()->getId() + ) + ); + + return $options->getIsAllow(); + } +} diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product.php index 791eaeaec4..ef124c0612 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product.php @@ -31,43 +31,59 @@ * @package Mage_Adminhtml * @author Magento Core Team */ -class Mage_Adminhtml_Block_Catalog_Product extends Mage_Adminhtml_Block_Template +class Mage_Adminhtml_Block_Catalog_Product extends Mage_Adminhtml_Block_Widget_Container { - + /** + * Set template + */ public function __construct() { parent::__construct(); $this->setTemplate('catalog/product.phtml'); } + /** + * Prepare button and grid + * + * @return Mage_Adminhtml_Block_Catalog_Product + */ protected function _prepareLayout() { - $this->setChild('add_new_button', - $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData(array( - 'label' => Mage::helper('catalog')->__('Add Product'), - 'onclick' => "setLocation('".$this->getUrl('*/*/new')."')", - 'class' => 'add' - )) - ); + $this->_addButton('add_new', array( + 'label' => Mage::helper('catalog')->__('Add Product'), + 'onclick' => "setLocation('{$this->getUrl('*/*/new')}')", + 'class' => 'add' + )); $this->setChild('grid', $this->getLayout()->createBlock('adminhtml/catalog_product_grid', 'product.grid')); return parent::_prepareLayout(); } + /** + * Deprecated since 1.3.2 + * + * @return string + */ public function getAddNewButtonHtml() { - if( $this->_enabledAddNewButton() ) { - return $this->getChildHtml('add_new_button'); - } - return ''; + return $this->getChildHtml('add_new_button'); } + /** + * Render grid + * + * @return string + */ public function getGridHtml() { return $this->getChildHtml('grid'); } + /** + * Check whether it is single store mode + * + * @return bool + */ public function isSingleStoreMode() { if (!Mage::app()->isSingleStoreMode()) { @@ -75,10 +91,4 @@ public function isSingleStoreMode() } return true; } - - protected function _enabledAddNewButton() - { - return true; - } } - diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Attribute/Edit/Tab/Main.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Attribute/Edit/Tab/Main.php index 4b01d01117..2e780f4e62 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Attribute/Edit/Tab/Main.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Attribute/Edit/Tab/Main.php @@ -322,6 +322,13 @@ protected function _prepareForm() 'values' => $yesno, )); + $fieldset->addField('is_used_for_price_rules', 'select', array( + 'name' => 'is_used_for_price_rules', + 'label' => Mage::helper('catalog')->__('Use for Price Rule Conditions'), + 'title' => Mage::helper('catalog')->__('Use for Price Rule Conditions'), + 'values' => $yesno, + )); + $fieldset->addField('position', 'text', array( 'name' => 'position', 'label' => Mage::helper('catalog')->__('Position'), diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit.php index 5f6d643b5e..cc23b6683d 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit.php @@ -72,52 +72,58 @@ protected function _prepareLayout() ); } - $this->setChild('reset_button', - $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData(array( - 'label' => Mage::helper('catalog')->__('Reset'), - 'onclick' => 'setLocation(\''.$this->getUrl('*/*/*', array('_current'=>true)).'\')' - )) - ); - - $this->setChild('save_button', - $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData(array( - 'label' => Mage::helper('catalog')->__('Save'), - 'onclick' => 'productForm.submit()', - 'class' => 'save' - )) - ); - - if (!$this->getRequest()->getParam('popup')) { - $this->setChild('save_and_edit_button', + if (!$this->getProduct()->isReadonly()) { + $this->setChild('reset_button', $this->getLayout()->createBlock('adminhtml/widget_button') ->setData(array( - 'label' => Mage::helper('catalog')->__('Save And Continue Edit'), - 'onclick' => 'saveAndContinueEdit(\''.$this->getSaveAndContinueUrl().'\')', - 'class' => 'save' + 'label' => Mage::helper('catalog')->__('Reset'), + 'onclick' => 'setLocation(\''.$this->getUrl('*/*/*', array('_current'=>true)).'\')' )) ); - $this->setChild('delete_button', - $this->getLayout()->createBlock('adminhtml/widget_button') + + $this->setChild('save_button', + $this->getLayout()->createBlock('adminhtml/widget_button') ->setData(array( - 'label' => Mage::helper('catalog')->__('Delete'), - 'onclick' => 'confirmSetLocation(\''.Mage::helper('catalog')->__('Are you sure?').'\', \''.$this->getDeleteUrl().'\')', - 'class' => 'delete' + 'label' => Mage::helper('catalog')->__('Save'), + 'onclick' => 'productForm.submit()', + 'class' => 'save' )) ); - $this->setChild('duplicate_button', - $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData(array( - 'label' => Mage::helper('catalog')->__('Duplicate'), - 'onclick' => 'setLocation(\''.$this->getDuplicateUrl().'\')', - 'class' => 'add' - )) - ); } - - + if (!$this->getRequest()->getParam('popup')) { + if (!$this->getProduct()->isReadonly()) { + $this->setChild('save_and_edit_button', + $this->getLayout()->createBlock('adminhtml/widget_button') + ->setData(array( + 'label' => Mage::helper('catalog')->__('Save And Continue Edit'), + 'onclick' => 'saveAndContinueEdit(\''.$this->getSaveAndContinueUrl().'\')', + 'class' => 'save' + )) + ); + } + if ($this->getProduct()->isDeleteable()) { + $this->setChild('delete_button', + $this->getLayout()->createBlock('adminhtml/widget_button') + ->setData(array( + 'label' => Mage::helper('catalog')->__('Delete'), + 'onclick' => 'confirmSetLocation(\''.Mage::helper('catalog')->__('Are you sure?').'\', \''.$this->getDeleteUrl().'\')', + 'class' => 'delete' + )) + ); + } + + if ($this->getProduct()->isDuplicable()) { + $this->setChild('duplicate_button', + $this->getLayout()->createBlock('adminhtml/widget_button') + ->setData(array( + 'label' => Mage::helper('catalog')->__('Duplicate'), + 'onclick' => 'setLocation(\''.$this->getDuplicateUrl().'\')', + 'class' => 'add' + )) + ); + } + } return parent::_prepareLayout(); } @@ -165,9 +171,10 @@ public function getSaveUrl() public function getSaveAndContinueUrl() { return $this->getUrl('*/*/save', array( - '_current' => true, - 'back' => 'edit', - 'tab' => '{{tab_id}}' + '_current' => true, + 'back' => 'edit', + 'tab' => '{{tab_id}}', + 'active_tab' => null )); } diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Action/Attribute/Tab/Attributes.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Action/Attribute/Tab/Attributes.php index 96e7497681..6ec5631624 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Action/Attribute/Tab/Attributes.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Action/Attribute/Tab/Attributes.php @@ -92,20 +92,11 @@ protected function _getAdditionalElementTypes() */ protected function _getAdditionalElementHtml($element) { - if( $this->_returnAdditionalElementHtml($element) === true ) { - return ' - '; - } else { - return ''; - } - } - - protected function _returnAdditionalElementHtml($element) - { - return true; + return ' + '; } /** diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes.php index 1c734153dd..c036e04f56 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes.php @@ -95,6 +95,14 @@ protected function _prepareForm() } } + if (Mage::registry('product')->hasLockedAttributes()) { + foreach (Mage::registry('product')->getLockedAttributes() as $attribute) { + if ($element = $form->getElement($attribute)) { + $element->setReadonly(true, true); + } + } + } + Mage::dispatchEvent('adminhtml_catalog_product_edit_prepare_form', array('form'=>$form)); $form->addValues($values); @@ -111,7 +119,7 @@ protected function _getAdditionalElementTypes() 'image' => Mage::getConfig()->getBlockClassName('adminhtml/catalog_product_helper_form_image'), 'boolean' => Mage::getConfig()->getBlockClassName('adminhtml/catalog_product_helper_form_boolean') ); - + $response = new Varien_Object(); $response->setTypes(array()); Mage::dispatchEvent('adminhtml_catalog_product_edit_element_types', array('response'=>$response)); @@ -119,7 +127,7 @@ protected function _getAdditionalElementTypes() foreach ($response->getTypes() as $typeName=>$typeClass) { $result[$typeName] = $typeClass; } - + return $result; } } diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Categories.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Categories.php index a6a41c3060..009f8efcc8 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Categories.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Categories.php @@ -52,6 +52,16 @@ public function getProduct() return Mage::registry('current_product'); } + /** + * Checks when this block is readonly + * + * @return boolean + */ + public function isReadonly() + { + return $this->getProduct()->getCategoriesReadonly(); + } + protected function getCategoryIds() { return $this->getProduct()->getCategoryIds(); @@ -64,13 +74,59 @@ public function getIdsString() public function getRootNode() { - $root = parent::getRoot(); +// $root = parent::getRoot(); + $root = $this->getRoot(); if ($root && in_array($root->getId(), $this->getCategoryIds())) { $root->setChecked(true); } return $root; } + public function getRoot($parentNodeCategory=null, $recursionLevel=3) + { + if (!is_null($parentNodeCategory) && $parentNodeCategory->getId()) { + return $this->getNode($parentNodeCategory, $recursionLevel); + } + $root = Mage::registry('root'); + if (is_null($root)) { + $storeId = (int) $this->getRequest()->getParam('store'); + + if ($storeId) { + $store = Mage::app()->getStore($storeId); + $rootId = $store->getRootCategoryId(); + } + else { + $rootId = Mage_Catalog_Model_Category::TREE_ROOT_ID; + } + + $ids = $this->getSelectedCategoriesPathIds($rootId); + $tree = Mage::getResourceSingleton('catalog/category_tree') + ->loadByIds($ids, false, false); + + if ($this->getCategory()) { + $tree->loadEnsuredNodes($this->getCategory(), $tree->getNodeById($rootId)); + } + + $tree->addCollectionData($this->getCategoryCollection()); + + $root = $tree->getNodeById($rootId); + + if ($root && $rootId != Mage_Catalog_Model_Category::TREE_ROOT_ID) { + $root->setIsVisible(true); + if ($this->isReadonly()) { + $root->setDisabled(true); + } + } + elseif($root && $root->getId() == Mage_Catalog_Model_Category::TREE_ROOT_ID) { + $root->setName(Mage::helper('catalog')->__('Root')); + } + + Mage::register('root', $root); + } + + return $root; + } + protected function _getNodeJson($node, $level=1) { $item = parent::_getNodeJson($node, $level); @@ -88,7 +144,10 @@ protected function _getNodeJson($node, $level=1) if (in_array($node->getId(), $this->getCategoryIds())) { $item['checked'] = true; + } + if ($this->isReadonly()) { + $item['disabled'] = true; } return $item; } @@ -140,4 +199,28 @@ public function getLoadTreeUrl($expanded=null) { return $this->getUrl('*/*/categoriesJson', array('_current'=>true)); } + + /** + * Return distinct path ids of selected categories + * + * @param int $rootId Root category Id for context + * @return array + */ + public function getSelectedCategoriesPathIds($rootId = false) + { + $ids = array(); + $collection = Mage::getModel('catalog/category')->getCollection() + ->addFieldToFilter('entity_id', array('in'=>$this->getCategoryIds())); + foreach ($collection as $item) { + if ($rootId && !in_array($rootId, $item->getPathIds())) { + continue; + } + foreach ($item->getPathIds() as $id) { + if (!in_array($id, $ids)) { + $ids[] = $id; + } + } + } + return $ids; + } } diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php index 841491972b..bf7d8330ed 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php @@ -83,21 +83,42 @@ protected function _prepareCollection() ->getProductCollection() ->setProduct($this->_getProduct()) ->addAttributeToSelect('*'); + + if ($this->isReadonly()) { + $productIds = $this->_getSelectedProducts(); + if (empty($productIds)) { + $productIds = array(0); + } + $collection->addFieldToFilter('entity_id', array('in'=>$productIds)); + } + $this->setCollection($collection); return parent::_prepareCollection(); } + /** + * Checks when this block is readonly + * + * @return boolean + */ + public function isReadonly() + { + return $this->_getProduct()->getCrosssellReadonly(); + } + protected function _prepareColumns() { - $this->addColumn('in_products', array( - 'header_css_class' => 'a-center', - 'type' => 'checkbox', - 'name' => 'in_products', - 'values' => $this->_getSelectedProducts(), - 'align' => 'center', - 'index' => 'entity_id' - )); + if (!$this->isReadonly()) { + $this->addColumn('in_products', array( + 'header_css_class' => 'a-center', + 'type' => 'checkbox', + 'name' => 'in_products', + 'values' => $this->_getSelectedProducts(), + 'align' => 'center', + 'index' => 'entity_id' + )); + } $this->addColumn('entity_id', array( 'header' => Mage::helper('catalog')->__('ID'), @@ -171,7 +192,7 @@ protected function _prepareColumns() 'type' => 'number', 'validate_class' => 'validate-number', 'index' => 'position', - 'editable' => true, + 'editable' => !$this->isReadonly(), 'edit_only' => !$this->_getProduct()->getId() )); @@ -193,4 +214,4 @@ protected function _getSelectedProducts() } return $products; } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Inventory.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Inventory.php index a44fc92de3..2801b8ce87 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Inventory.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Inventory.php @@ -97,6 +97,16 @@ public function getDefaultConfigValue($field) return Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_ITEM . $field); } + /** + * Is readonly stock + * + * @return boolean + */ + public function isReadonly() + { + return $this->getProduct()->getInventoryReadonly(); + } + public function isNew() { if (Mage::registry('product')->getId()) { diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php index 07d78eff4b..bdf569c05f 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php @@ -96,13 +96,23 @@ public function getFieldId() return $this->_id; } + /** + * Check block is readonly + * + * @return boolean + */ + public function isReadonly() + { + return $this->getProduct()->getOptionsReadonly(); + } + protected function _prepareLayout() { $this->setChild('delete_button', $this->getLayout()->createBlock('adminhtml/widget_button') ->setData(array( 'label' => Mage::helper('catalog')->__('Delete Option'), - 'class' => 'delete delete-product-option', + 'class' => 'delete delete-product-option ' )) ); @@ -271,4 +281,4 @@ public function getPriceValue($value, $type) return number_format($value, 2, null, ''); } } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php index ca98639da2..5f957300ea 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php @@ -84,20 +84,41 @@ protected function _prepareCollection() ->setProduct($this->_getProduct()) ->addAttributeToSelect('*'); + if ($this->isReadonly()) { + $productIds = $this->_getSelectedProducts(); + if (empty($productIds)) { + $productIds = array(0); + } + $collection->addFieldToFilter('entity_id', array('in'=>$productIds)); + } + $this->setCollection($collection); return parent::_prepareCollection(); } + /** + * Checks when this block is readonly + * + * @return boolean + */ + public function isReadonly() + { + return $this->_getProduct()->getRelatedReadonly(); + } + + protected function _prepareColumns() { - $this->addColumn('in_products', array( - 'header_css_class' => 'a-center', - 'type' => 'checkbox', - 'name' => 'in_products', - 'values' => $this->_getSelectedProducts(), - 'align' => 'center', - 'index' => 'entity_id' - )); + if (!$this->isReadonly()) { + $this->addColumn('in_products', array( + 'header_css_class' => 'a-center', + 'type' => 'checkbox', + 'name' => 'in_products', + 'values' => $this->_getSelectedProducts(), + 'align' => 'center', + 'index' => 'entity_id' + )); + } $this->addColumn('entity_id', array( 'header' => Mage::helper('catalog')->__('ID'), @@ -181,7 +202,7 @@ protected function _prepareColumns() 'validate_class' => 'validate-number', 'index' => 'position', 'width' => '60px', - 'editable' => true, + 'editable' => !$this->isReadonly(), 'edit_only' => !$this->_getProduct()->getId() )); @@ -201,4 +222,4 @@ protected function _getSelectedProducts() } return $products; } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config.php index 19a85a6668..29f90a807c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config.php @@ -56,6 +56,16 @@ public function getTabClass() return 'ajax'; } + /** + * Check block is readonly + * + * @return boolean + */ + public function isReadonly() + { + return $this->_getProduct()->getCompositeReadonly(); + } + /** * Prepare Layout data * diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config/Grid.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config/Grid.php index 719f3b441e..381f67837e 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config/Grid.php @@ -129,6 +129,10 @@ protected function _prepareCollection() $this->setCollection($collection); + if ($this->isReadonly()) { + $collection->addFieldToFilter('entity_id', array('in' => $this->_getSelectedProducts())); + } + parent::_prepareCollection(); return $this; } @@ -142,20 +146,33 @@ protected function _getSelectedProducts() return $products; } + /** + * Check block is readonly + * + * @return boolean + */ + public function isReadonly() + { + return $this->_getProduct()->getCompositeReadonly(); + } + protected function _prepareColumns() { $product = $this->_getProduct(); $attributes = $product->getTypeInstance(true)->getConfigurableAttributes($product); - $this->addColumn('in_products', array( - 'header_css_class' => 'a-center', - 'type' => 'checkbox', - 'name' => 'in_products', - 'values' => $this->_getSelectedProducts(), - 'align' => 'center', - 'index' => 'entity_id', - 'renderer' => 'adminhtml/catalog_product_edit_tab_super_config_grid_renderer_checkbox', - 'attributes' => $attributes - )); + + if (!$this->isReadonly()) { + $this->addColumn('in_products', array( + 'header_css_class' => 'a-center', + 'type' => 'checkbox', + 'name' => 'in_products', + 'values' => $this->_getSelectedProducts(), + 'align' => 'center', + 'index' => 'entity_id', + 'renderer' => 'adminhtml/catalog_product_edit_tab_super_config_grid_renderer_checkbox', + 'attributes' => $attributes + )); + } $this->addColumn('entity_id', array( 'header' => Mage::helper('catalog')->__('ID'), @@ -272,4 +289,4 @@ public function getGridUrl() return $this->getUrl('*/*/superConfig', array('_current'=>true)); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Settings.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Settings.php index 6009ea31c8..0884cefed5 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Settings.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Settings.php @@ -1,135 +1,159 @@ - - */ -class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Settings extends Mage_Adminhtml_Block_Widget_Form -{ - protected function _prepareLayout() - { - $onclick = "setSuperSettings('".$this->getContinueUrl()."','attribute-checkbox', 'attributes')"; - $this->setChild('continue_button', - $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData(array( - 'label' => Mage::helper('catalog')->__('Continue'), - 'onclick' => $onclick, - 'class' => 'save' - )) - ); - - $backButton = $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData(array( - 'label' => Mage::helper('catalog')->__('Back'), - 'onclick' => "setLocation('".$this->getBackUrl()."')", - 'class' => 'back' - )); - - $this->setChild('back_button', $backButton); - return parent::_prepareLayout(); - } - - /** - * Retrieve currently edited product object - * - * @return Mage_Catalog_Model_Product - */ - protected function _getProduct() - { - return Mage::registry('current_product'); - } - - protected function _prepareForm() - { - $form = new Varien_Data_Form(); - $fieldset = $form->addFieldset('settings', array( - 'legend'=>Mage::helper('catalog')->__('Select Configurable Attributes ') - )); - - $product = $this->_getProduct(); - $attributes = $product->getTypeInstance(true)->getSetAttributes($product); - - $fieldset->addField('req_text', 'note', array( - 'text' => '' - )); - - $hasAttributes = false; - foreach($attributes as $attribute) { - if($product->getTypeInstance(true)->canUseAttribute($attribute, $product)) { - $hasAttributes = true; - $fieldset->addField('attribute_'.$attribute->getAttributeId(), 'checkbox', array( - 'label' => $attribute->getFrontend()->getLabel(), - 'title' => $attribute->getFrontend()->getLabel(), - 'name' => 'attribute', - 'class' => 'attribute-checkbox', - 'value' => $attribute->getAttributeId() - )); - } - } - - if ($hasAttributes) { - $fieldset->addField('attributes', 'hidden', array( - 'name' => 'attribute_validate', - 'value' => '', - 'class' => 'validate-super-product-attributes' - )); - - $fieldset->addField('continue_button', 'note', array( - 'text' => $this->getChildHtml('continue_button'), - )); - } - else { - $fieldset->addField('note_text', 'note', array( - 'text' => $this->__('This attribute set don\'t have attributes which we can use for configurable product') - )); - $fieldset->addField('back_button', 'note', array( - 'text' => $this->getChildHtml('back_button'), - )); - } - - - $this->setForm($form); - } - - public function getContinueUrl() - { - return $this->getUrl('*/*/new', array( - '_current' => true, - 'attributes' => '{{attributes}}' - )); - } - - public function getBackUrl() - { - return $this->getUrl('*/*/new', array('set'=>null, 'type'=>null)); - } -} + + */ +class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Settings extends Mage_Adminhtml_Block_Widget_Form +{ + /** + * Prepare block children and data + * + */ + protected function _prepareLayout() + { + $onclick = "setSuperSettings('".$this->getContinueUrl()."','attribute-checkbox', 'attributes')"; + $this->setChild('continue_button', + $this->getLayout()->createBlock('adminhtml/widget_button') + ->setData(array( + 'label' => Mage::helper('catalog')->__('Continue'), + 'onclick' => $onclick, + 'class' => 'save' + )) + ); + + $backButton = $this->getLayout()->createBlock('adminhtml/widget_button') + ->setData(array( + 'label' => Mage::helper('catalog')->__('Back'), + 'onclick' => "setLocation('".$this->getBackUrl()."')", + 'class' => 'back' + )); + + $this->setChild('back_button', $backButton); + parent::_prepareLayout(); + } + + /** + * Retrieve currently edited product object + * + * @return Mage_Catalog_Model_Product + */ + protected function _getProduct() + { + return Mage::registry('current_product'); + } + + /** + * Prepare form before rendering HTML + * + * @return Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Settings + */ + protected function _prepareForm() + { + $form = new Varien_Data_Form(); + $fieldset = $form->addFieldset('settings', array( + 'legend'=>Mage::helper('catalog')->__('Select Configurable Attributes ') + )); + + $product = $this->_getProduct(); + $attributes = $product->getTypeInstance(true) + ->getSetAttributes($product); + + $fieldset->addField('req_text', 'note', array( + 'text' => '' + )); + + $hasAttributes = false; + + foreach ($attributes as $attribute) { + if ($product->getTypeInstance(true)->canUseAttribute($attribute, $product)) { + $hasAttributes = true; + $fieldset->addField('attribute_'.$attribute->getAttributeId(), 'checkbox', array( + 'label' => $attribute->getFrontend()->getLabel(), + 'title' => $attribute->getFrontend()->getLabel(), + 'name' => 'attribute', + 'class' => 'attribute-checkbox', + 'value' => $attribute->getAttributeId() + )); + } + } + + if ($hasAttributes) { + $fieldset->addField('attributes', 'hidden', array( + 'name' => 'attribute_validate', + 'value' => '', + 'class' => 'validate-super-product-attributes' + )); + + $fieldset->addField('continue_button', 'note', array( + 'text' => $this->getChildHtml('continue_button'), + )); + } + else { + $fieldset->addField('note_text', 'note', array( + 'text' => $this->__('This attribute set don\'t have attributes which we can use for configurable product') + )); + $fieldset->addField('back_button', 'note', array( + 'text' => $this->getChildHtml('back_button'), + )); + } + + + $this->setForm($form); + + return parent::_prepareForm(); + } + + /** + * Retrieve Continue URL + * + * @return string + */ + public function getContinueUrl() + { + return $this->getUrl('*/*/new', array( + '_current' => true, + 'attributes' => '{{attributes}}' + )); + } + + /** + * Retrieve Back URL + * + * @return string + */ + public function getBackUrl() + { + return $this->getUrl('*/*/new', array('set'=>null, 'type'=>null)); + } +} diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php index 5dc06281e7..ba48494b5b 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php @@ -78,26 +78,47 @@ protected function _addColumnFilterToCollection($column) return $this; } + /** + * Checks when this block is readonly + * + * @return boolean + */ + public function isReadonly() + { + return $this->_getProduct()->getUpsellReadonly(); + } + protected function _prepareCollection() { $collection = Mage::getModel('catalog/product_link')->useUpSellLinks() ->getProductCollection() ->setProduct($this->_getProduct()) ->addAttributeToSelect('*'); + + if ($this->isReadonly()) { + $productIds = $this->_getSelectedProducts(); + if (empty($productIds)) { + $productIds = array(0); + } + $collection->addFieldToFilter('entity_id', array('in'=>$productIds)); + } + $this->setCollection($collection); return parent::_prepareCollection(); } protected function _prepareColumns() { - $this->addColumn('in_products', array( - 'header_css_class' => 'a-center', - 'type' => 'checkbox', - 'name' => 'in_products', - 'values' => $this->_getSelectedProducts(), - 'align' => 'center', - 'index' => 'entity_id' - )); + if (!$this->_getProduct()->getUpsellReadonly()) { + $this->addColumn('in_products', array( + 'header_css_class' => 'a-center', + 'type' => 'checkbox', + 'name' => 'in_products', + 'values' => $this->_getSelectedProducts(), + 'align' => 'center', + 'index' => 'entity_id' + )); + } $this->addColumn('entity_id', array( 'header' => Mage::helper('catalog')->__('ID'), @@ -170,7 +191,7 @@ protected function _prepareColumns() 'width' => '60px', 'validate_class' => 'validate-number', 'index' => 'position', - 'editable' => true, + 'editable' => !$this->_getProduct()->getUpsellReadonly(), 'edit_only' => !$this->_getProduct()->getId() )); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Websites.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Websites.php index 70eb44890a..28d97949d5 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Websites.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Websites.php @@ -71,6 +71,16 @@ public function hasWebsite($websiteId) return in_array($websiteId, $this->getProduct()->getWebsiteIds()); } + /** + * Check websites block is readonly + * + * @return boolean + */ + public function isReadonly() + { + return $this->getProduct()->getWebsitesReadonly(); + } + public function getStoreName($storeId) { return Mage::app()->getStore($storeId)->getName(); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tabs.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tabs.php index a9321055e4..b9734b4ec7 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tabs.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tabs.php @@ -88,7 +88,7 @@ protected function _prepareLayout() /** * Don't display website tab for single mode */ - if (!Mage::app()->isSingleStoreMode() && $this->_enabledWebsites()) { + if (!Mage::app()->isSingleStoreMode()) { $this->addTab('websites', array( 'label' => Mage::helper('catalog')->__('Websites'), 'content' => $this->getLayout()->createBlock('adminhtml/catalog_product_edit_tab_websites')->toHtml(), @@ -209,9 +209,4 @@ public function setAttributeTabBlock($attributeTabBlock) $this->_attributeTabBlock = $attributeTabBlock; return $this; } - - protected function _enabledWebsites() - { - return true; - } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php index 660f6f6952..3159b2139b 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Gallery.php @@ -144,6 +144,25 @@ public function getAttributeFieldName($attribute) return $name; } + /** + * Check readonly attribute + * + * @param Mage_Eav_Model_Entity_Attribute|string $attribute + * @return boolean + */ + public function getAttributeReadonly($attribute) + { + if (is_object($attribute)) { + $attribute = $attribute->getAttributeCode(); + } + + if ($this->getDataObject()->isLockedAttribute($attribute)) { + return true; + } + + return false; + } + public function toHtml() { return '' . $this->getElementHtml() . ''; diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Price.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Price.php index ed38eea03b..1e4952caf6 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Price.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Price.php @@ -48,7 +48,10 @@ public function getAfterElementHtml() */ $addJsObserver = false; if ($attribute = $this->getEntityAttribute()) { - $store = Mage::app()->getStore($attribute->getStoreId()); + if (!($storeId = $attribute->getStoreId())) { + $storeId = $this->getForm()->getDataObject()->getStoreId(); + } + $store = Mage::app()->getStore($storeId); $html.= '['.(string)$store->getBaseCurrencyCode().']'; if (Mage::helper('tax')->priceIncludesTax()) { if ($attribute->getAttributeCode()!=='cost') { diff --git a/app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tab/Design.php b/app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tab/Design.php index 72115edb39..63c7e1c207 100644 --- a/app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tab/Design.php +++ b/app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tab/Design.php @@ -64,15 +64,12 @@ public function _prepareForm() 'format' => Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT) )); - $layouts = array(); - foreach (Mage::getConfig()->getNode('global/cms/layouts')->children() as $layoutName=>$layoutConfig) { - $layouts[$layoutName] = (string)$layoutConfig->label; - } + $fieldset->addField('root_template', 'select', array( 'name' => 'root_template', 'label' => Mage::helper('cms')->__('Layout'), 'required' => true, - 'options' => $layouts, + 'values' => Mage::getSingleton('page/source_layout')->toOptionArray(), )); $fieldset->addField('layout_update_xml', 'editor', array( @@ -88,4 +85,4 @@ public function _prepareForm() return parent::_prepareForm(); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tabs.php b/app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tabs.php index 6ce53bf2a7..bbb99b93b6 100644 --- a/app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tabs.php +++ b/app/code/core/Mage/Adminhtml/Block/Cms/Page/Edit/Tabs.php @@ -63,7 +63,7 @@ protected function _beforeToHtml() 'content' => $this->getLayout()->createBlock('adminhtml/cms_page_edit_tab_meta')->toHtml(), )); if (Mage::app()->getConfig()->getModuleConfig('Mage_GoogleOptimizer')->is('active', true) - && Mage::helper('googleoptimizer')->isOptimizerActive()) { + && Mage::helper('googleoptimizer')->isOptimizerActiveForCms()) { $this->addTab('googleoptimizer_section', array( 'label' => Mage::helper('googleoptimizer')->__('Page View Optimization'), 'title' => Mage::helper('googleoptimizer')->__('Page View Optimization'), diff --git a/app/code/core/Mage/Adminhtml/Block/Cms/Page/Grid.php b/app/code/core/Mage/Adminhtml/Block/Cms/Page/Grid.php index 51cbab82f1..6ff54640df 100644 --- a/app/code/core/Mage/Adminhtml/Block/Cms/Page/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Cms/Page/Grid.php @@ -68,16 +68,13 @@ protected function _prepareColumns() 'index' => 'identifier' )); - $layouts = array(); - foreach (Mage::getConfig()->getNode('global/cms/layouts')->children() as $layoutName=>$layoutConfig) { - $layouts[$layoutName] = (string)$layoutConfig->label; - } + $this->addColumn('root_template', array( 'header' => Mage::helper('cms')->__('Layout'), 'index' => 'root_template', 'type' => 'options', - 'options' => $layouts, + 'options' => Mage::getSingleton('page/source_layout')->getOptions(), )); /** @@ -153,4 +150,4 @@ public function getRowUrl($row) { return $this->getUrl('*/*/edit', array('page_id' => $row->getId())); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit.php index eb4e25fad0..7ab19295bb 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit.php @@ -38,7 +38,8 @@ public function __construct() $this->_objectId = 'id'; $this->_controller = 'customer'; - if ($this->getCustomerId()) { + if ($this->getCustomerId() && + Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/create')) { $this->_addButton('order', array( 'label' => Mage::helper('customer')->__('Create Order'), 'onclick' => 'setLocation(\'' . $this->getCreateOrderUrl() . '\')', @@ -51,6 +52,14 @@ public function __construct() $this->_updateButton('save', 'label', Mage::helper('customer')->__('Save Customer')); $this->_updateButton('delete', 'label', Mage::helper('customer')->__('Delete Customer')); + if (Mage::registry('current_customer')->isReadonly()) { + $this->_removeButton('save'); + $this->_removeButton('reset'); + } + + if (!Mage::registry('current_customer')->isDeleteable()) { + $this->_removeButton('delete'); + } } public function getCreateOrderUrl() @@ -77,18 +86,20 @@ public function getValidationUrl() { return $this->getUrl('*/*/validate', array('_current'=>true)); } - + protected function _prepareLayout() { - $this->_addButton('save_and_continue', array( - 'label' => Mage::helper('customer')->__('Save And Continue Edit'), - 'onclick' => 'saveAndContinueEdit(\''.$this->_getSaveAndContinueUrl().'\')', - 'class' => 'save' - ), 10); + if (!Mage::registry('current_customer')->isReadonly()) { + $this->_addButton('save_and_continue', array( + 'label' => Mage::helper('customer')->__('Save And Continue Edit'), + 'onclick' => 'saveAndContinueEdit(\''.$this->_getSaveAndContinueUrl().'\')', + 'class' => 'save' + ), 10); + } return parent::_prepareLayout(); } - + protected function _getSaveAndContinueUrl() { return $this->getUrl('*/*/save', array( diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Account.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Account.php index 72cf6dd1f6..2d17235dcd 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Account.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Account.php @@ -71,41 +71,43 @@ public function initForm() // } if ($customer->getId()) { - // add password management fieldset - $newFieldset = $form->addFieldset( - 'password_fieldset', - array('legend'=>Mage::helper('customer')->__('Password Management')) - ); - // New customer password - $field = $newFieldset->addField('new_password', 'text', - array( - 'label' => Mage::helper('customer')->__('New Password'), - 'name' => 'new_password', - 'class' => 'validate-new-password' - ) - ); - $field->setRenderer($this->getLayout()->createBlock('adminhtml/customer_edit_renderer_newpass')); + if (!$customer->isReadonly()) { + // add password management fieldset + $newFieldset = $form->addFieldset( + 'password_fieldset', + array('legend'=>Mage::helper('customer')->__('Password Management')) + ); + // New customer password + $field = $newFieldset->addField('new_password', 'text', + array( + 'label' => Mage::helper('customer')->__('New Password'), + 'name' => 'new_password', + 'class' => 'validate-new-password' + ) + ); + $field->setRenderer($this->getLayout()->createBlock('adminhtml/customer_edit_renderer_newpass')); - // prepare customer confirmation control (only for existing customers) - $confirmationKey = $customer->getConfirmation(); - if ($confirmationKey || $customer->isConfirmationRequired()) { - $confirmationAttribute = $customer->getAttribute('confirmation'); - if (!$confirmationKey) { - $confirmationKey = $customer->getRandomConfirmationKey(); - } - $element = $fieldset->addField('confirmation', 'select', array( - 'name' => 'confirmation', - 'label' => Mage::helper('customer')->__($confirmationAttribute->getFrontendLabel()), - ))->setEntityAttribute($confirmationAttribute) - ->setValues(array('' => 'Confirmed', $confirmationKey => 'Not confirmed')); - - // prepare send welcome email checkbox, if customer is not confirmed - // no need to add it, if website id is empty - if ($customer->getConfirmation() && $customer->getWebsiteId()) { - $fieldset->addField('sendemail', 'checkbox', array( - 'name' => 'sendemail', - 'label' => Mage::helper('customer')->__('Send Welcome Email after Confirmation') - )); + // prepare customer confirmation control (only for existing customers) + $confirmationKey = $customer->getConfirmation(); + if ($confirmationKey || $customer->isConfirmationRequired()) { + $confirmationAttribute = $customer->getAttribute('confirmation'); + if (!$confirmationKey) { + $confirmationKey = $customer->getRandomConfirmationKey(); + } + $element = $fieldset->addField('confirmation', 'select', array( + 'name' => 'confirmation', + 'label' => Mage::helper('customer')->__($confirmationAttribute->getFrontendLabel()), + ))->setEntityAttribute($confirmationAttribute) + ->setValues(array('' => 'Confirmed', $confirmationKey => 'Not confirmed')); + + // prepare send welcome email checkbox, if customer is not confirmed + // no need to add it, if website id is empty + if ($customer->getConfirmation() && $customer->getWebsiteId()) { + $fieldset->addField('sendemail', 'checkbox', array( + 'name' => 'sendemail', + 'label' => Mage::helper('customer')->__('Send Welcome Email after Confirmation') + )); + } } } } @@ -148,6 +150,15 @@ public function initForm() ); } + if ($customer->isReadonly()) { + foreach ($customer->getAttributes() as $attribute) { + $element = $form->getElement($attribute->getAttributeCode()); + if ($element) { + $element->setReadonly(true, true); + } + } + } + $form->setValues($customer->getData()); $this->setForm($form); return $this; diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Addresses.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Addresses.php index b58b1a399c..3016226db2 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Addresses.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Addresses.php @@ -51,7 +51,8 @@ protected function _prepareLayout() ->setData(array( 'label' => Mage::helper('customer')->__('Delete Address'), 'name' => 'delete_address', - 'class' => 'delete' + 'disabled' => $this->isReadonly(), + 'class' => 'delete' . ($this->isReadonly() ? ' disabled' : '') )) ); $this->setChild('add_address_button', @@ -60,7 +61,8 @@ protected function _prepareLayout() 'label' => Mage::helper('customer')->__('Add New Address'), 'id' => 'add_address_button', 'name' => 'add_address_button', - 'class' => 'add', + 'disabled' => $this->isReadonly(), + 'class' => 'add' . ($this->isReadonly() ? ' disabled' : ''), 'onclick'=> 'customerAddresses.addNewAddress()' )) ); @@ -70,13 +72,25 @@ protected function _prepareLayout() 'label' => Mage::helper('customer')->__('Cancel'), 'id' => 'cancel_add_address'.$this->getTemplatePrefix(), 'name' => 'cancel_address', - 'class' => 'cancel delete-address', + 'class' => 'cancel delete-address' . ($this->isReadonly() ? ' disabled' : ''), + 'disabled' => $this->isReadonly(), 'onclick'=> 'customerAddresses.cancelAdd(this)', )) ); return parent::_prepareLayout(); } + /** + * Check block is readonly. + * + * @return boolean + */ + public function isReadonly() + { + $customer = Mage::registry('current_customer'); + return $customer->isReadonly(); + } + public function getDeleteButtonHtml() { return $this->getChildHtml('delete_button'); @@ -84,6 +98,7 @@ public function getDeleteButtonHtml() public function initForm() { + $customer = Mage::registry('current_customer'); $form = new Varien_Data_Form(); $fieldset = $form->addFieldset('address_fieldset', array('legend'=>Mage::helper('customer')->__("Edit Customer's Address"))); @@ -108,8 +123,17 @@ public function initForm() $country->addClass('countries'); } - $addressCollection = Mage::registry('current_customer')->getAddresses(); - $this->assign('customer', Mage::registry('current_customer')); + if ($this->isReadonly()) { + foreach ($addressModel->getAttributes() as $attribute) { + $element = $form->getElement($attribute->getAttributeCode()); + if ($element) { + $element->setReadonly(true, true); + } + } + } + + $addressCollection = $customer->getAddresses(); + $this->assign('customer', $customer); $this->assign('addressCollection', $addressCollection); $this->setForm($form); diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Newsletter.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Newsletter.php index a05ea901e0..c27cd615cd 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Newsletter.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Newsletter.php @@ -57,6 +57,10 @@ public function initForm() ) ); + if ($customer->isReadonly()) { + $form->getElement('subscription')->setReadonly(true, true); + } + $form->getElement('subscription')->setIsChecked($subscriber->isSubscribed()); if($changedDate = $this->getStatusChangedDate()) { diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View.php index 78d9089f0e..9665317dc5 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View.php @@ -31,76 +31,15 @@ * @package Mage_Adminhtml * @author Magento Core Team */ -class Mage_Adminhtml_Block_Customer_Edit_Tab_View extends Mage_Adminhtml_Block_Template +class Mage_Adminhtml_Block_Customer_Edit_Tab_View + extends Mage_Adminhtml_Block_Template + implements Mage_Adminhtml_Block_Widget_Tab_Interface { protected $_customer; protected $_customerLog; - public function __construct() - { - parent::__construct(); - $this->setTemplate('customer/tab/view.phtml'); - } - - protected function _prepareLayout() - { - $customer = Mage::registry('current_customer'); - - $this->setChild('sales', $this->getLayout()->createBlock('adminhtml/customer_edit_tab_view_sales')); - - $accordion = $this->getLayout()->createBlock('adminhtml/widget_accordion') - ->setId('customerViewAccordion'); - //->setShowOnlyOne(0) - - /* @var $accordion Mage_Adminhtml_Block_Widget_Accordion */ - $accordion->addItem('lastOrders', array( - 'title' => Mage::helper('customer')->__('Recent Orders'), - 'ajax' => true, - 'content_url' => $this->getUrl('*/*/lastOrders', array('_current' => true)), - )); - - // add shopping cart block of each website - foreach (Mage::registry('current_customer')->getSharedWebsiteIds() as $websiteId) { - $website = Mage::app()->getWebsite($websiteId); - - // count cart items - $cartItemsCount = Mage::getModel('sales/quote') - ->setWebsite($website)->loadByCustomer($customer) - ->getItemsCollection(false)->getSize(); - // prepare title for cart - $title = Mage::helper('customer')->__('Shopping Cart - %d item(s)', $cartItemsCount); - if (count($customer->getSharedWebsiteIds()) > 1) { - $title = Mage::helper('customer')->__('Shopping Cart of %1$s - %2$d item(s)', - $website->getName(), $cartItemsCount - ); - } - - // add cart ajax accordion - $accordion->addItem('shopingCart' . $websiteId, array( - 'title' => $title, - 'ajax' => true, - 'content_url' => $this->getUrl('*/*/viewCart', array('_current' => true, 'website_id' => $websiteId)), - )); - } - - // count wishlist items - $wishlistCount = Mage::getModel('wishlist/wishlist')->loadByCustomer($customer) - ->getProductCollection() - ->addStoreData() - ->getSize(); - // add wishlist ajax accordion - $accordion->addItem('wishlist', array( - 'title' => Mage::helper('customer')->__('Wishlist - %d item(s)', $wishlistCount), - 'ajax' => true, - 'content_url' => $this->getUrl('*/*/viewWishlist', array('_current' => true)), - )); - - $this->setChild('accordion', $accordion); - return parent::_prepareLayout(); - } - public function getCustomer() { if (!$this->_customer) { @@ -232,4 +171,30 @@ public function getSalesHtml() return $this->getChildHtml('sales'); } + public function getTabLabel() + { + return Mage::helper('customer')->__('Customer View'); + } + + public function getTabTitle() + { + return Mage::helper('customer')->__('Customer View'); + } + + public function canShowTab() + { + if (Mage::registry('current_customer')->getId()) { + return true; + } + return false; + } + + public function isHidden() + { + if (Mage::registry('current_customer')->getId()) { + return false; + } + return true; + } + } diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Accordion.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Accordion.php new file mode 100644 index 0000000000..9767f599d3 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Accordion.php @@ -0,0 +1,84 @@ + + */ +class Mage_Adminhtml_Block_Customer_Edit_Tab_View_Accordion extends Mage_Adminhtml_Block_Widget_Accordion +{ + protected function _prepareLayout() + { + $customer = Mage::registry('current_customer'); + + $this->setId('customerViewAccordion'); + + $this->addItem('lastOrders', array( + 'title' => Mage::helper('customer')->__('Recent Orders'), + 'ajax' => true, + 'content_url' => $this->getUrl('*/*/lastOrders', array('_current' => true)), + )); + + // add shopping cart block of each website + foreach (Mage::registry('current_customer')->getSharedWebsiteIds() as $websiteId) { + $website = Mage::app()->getWebsite($websiteId); + + // count cart items + $cartItemsCount = Mage::getModel('sales/quote') + ->setWebsite($website)->loadByCustomer($customer) + ->getItemsCollection(false)->getSize(); + // prepare title for cart + $title = Mage::helper('customer')->__('Shopping Cart - %d item(s)', $cartItemsCount); + if (count($customer->getSharedWebsiteIds()) > 1) { + $title = Mage::helper('customer')->__('Shopping Cart of %1$s - %2$d item(s)', + $website->getName(), $cartItemsCount + ); + } + + // add cart ajax accordion + $this->addItem('shopingCart' . $websiteId, array( + 'title' => $title, + 'ajax' => true, + 'content_url' => $this->getUrl('*/*/viewCart', array('_current' => true, 'website_id' => $websiteId)), + )); + } + + // count wishlist items + $wishlistCount = Mage::getModel('wishlist/wishlist')->loadByCustomer($customer) + ->getProductCollection() + ->addStoreData() + ->getSize(); + // add wishlist ajax accordion + $this->addItem('wishlist', array( + 'title' => Mage::helper('customer')->__('Wishlist - %d item(s)', $wishlistCount), + 'ajax' => true, + 'content_url' => $this->getUrl('*/*/viewWishlist', array('_current' => true)), + )); + } +} diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Orders.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Orders.php index 4811650052..d6e3e53a49 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Orders.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Orders.php @@ -60,8 +60,16 @@ protected function _prepareCollection() ->addAttributeToSelect('grand_total') ->addAttributeToSelect('order_currency_code') ->addAttributeToSelect('store_id') - ->joinAttribute('shipping_firstname', 'order_address/firstname', 'shipping_address_id') - ->joinAttribute('shipping_lastname', 'order_address/lastname', 'shipping_address_id') + ->joinAttribute('billing_firstname', 'order_address/firstname', 'billing_address_id', null, 'left') + ->joinAttribute('billing_lastname', 'order_address/lastname', 'billing_address_id', null, 'left') + ->joinAttribute('shipping_firstname', 'order_address/firstname', 'shipping_address_id', null, 'left') + ->joinAttribute('shipping_lastname', 'order_address/lastname', 'shipping_address_id', null, 'left') + ->addExpressionAttributeToSelect('billing_name', + 'CONCAT({{billing_firstname}}, " ", {{billing_lastname}})', + array('billing_firstname', 'billing_lastname')) + ->addExpressionAttributeToSelect('shipping_name', + 'CONCAT({{shipping_firstname}}, " ", {{shipping_lastname}})', + array('shipping_firstname', 'shipping_lastname')) ->addAttributeToFilter('customer_id', Mage::registry('current_customer')->getId()); $this->setCollection($collection); return parent::_prepareCollection(); @@ -83,14 +91,14 @@ protected function _prepareColumns() 'type' => 'datetime', )); - $this->addColumn('shipping_firstname', array( - 'header' => Mage::helper('customer')->__('Ship to First name'), - 'index' => 'shipping_firstname', + $this->addColumn('billing_name', array( + 'header' => Mage::helper('customer')->__('Bill to Name'), + 'index' => 'billing_name', )); - $this->addColumn('shipping_lastname', array( - 'header' => Mage::helper('customer')->__('Ship to Last name'), - 'index' => 'shipping_lastname', + $this->addColumn('shipping_name', array( + 'header' => Mage::helper('customer')->__('Shipped to Name'), + 'index' => 'shipping_name', )); $this->addColumn('grand_total', array( diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Sales.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Sales.php index fef3a425b9..57b0109e7f 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Sales.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Sales.php @@ -55,7 +55,6 @@ public function __construct() { parent::__construct(); $this->setId('customer_view_sales_grid'); - $this->setTemplate('customer/tab/view/sales.phtml'); } public function _beforeToHtml() diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Wishlist.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Wishlist.php index 9eb4fc7258..4a51c36a6c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Wishlist.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Wishlist.php @@ -20,7 +20,7 @@ * * @category Mage * @package Mage_Adminhtml - * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com) + * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ @@ -30,13 +30,21 @@ * * @category Mage * @package Mage_Adminhtml - * @author Magento Core Team + * @author Magento Core Team */ class Mage_Adminhtml_Block_Customer_Edit_Tab_Wishlist extends Mage_Adminhtml_Block_Widget_Grid { - - protected $_parentTemplate = ''; - + /** + * Parent template name + * + * @var string + */ + protected $_parentTemplate; + + /** + * Initialize Grid + * + */ public function __construct() { parent::__construct(); @@ -47,9 +55,26 @@ public function __construct() $this->setEmptyText(Mage::helper('customer')->__('No Items Found')); } + /** + * Retrieve current customer object + * + * @return Mage_Customer_Model_Customer + */ + protected function _getCustomer() + { + return Mage::registry('current_customer'); + } + + /** + * Prepare customer wishlist product collection + * + * @return Mage_Adminhtml_Block_Customer_Edit_Tab_Wishlist + */ protected function _prepareCollection() { - $collection = Mage::getModel('wishlist/wishlist')->loadByCustomer(Mage::registry('current_customer')) + $collection = Mage::getModel('wishlist/wishlist') + ->loadByCustomer($this->_getCustomer()) + ->setSharedStoreIds($this->_getCustomer()->getSharedStoreIds()) ->getProductCollection() ->addAttributeToSelect('name') ->addAttributeToSelect('price') @@ -61,6 +86,11 @@ protected function _prepareCollection() return parent::_prepareCollection(); } + /** + * Prepare Grid columns + * + * @return Mage_Adminhtml_Block_Customer_Edit_Tab_Wishlist + */ protected function _prepareColumns() { @@ -127,11 +157,22 @@ protected function _prepareColumns() return parent::_prepareColumns(); } + /** + * Retrieve Grid URL + * + * @return string + */ public function getGridUrl() { return $this->getUrl('*/*/wishlist', array('_current'=>true)); } + /** + * Add column filter to collection + * + * @param Mage_Adminhtml_Block_Widget_Grid_Column $column + * @return Mage_Adminhtml_Block_Customer_Edit_Tab_Wishlist + */ protected function _addColumnFilterToCollection($column) { if($column->getId()=='store') { @@ -146,15 +187,24 @@ protected function _addColumnFilterToCollection($column) return $this; } + /** + * Retrieve Grid Parent Block HTML + * + * @return string + */ public function getGridParentHtml() { $templateName = Mage::getDesign()->getTemplateFilename($this->_parentTemplate, array('_relative'=>true)); return $this->fetchView($templateName); } + /** + * Retrieve Row click URL + * + * @return string + */ public function getRowUrl($row) { return $this->getUrl('*/catalog_product/edit', array('id' => $row->getProductId())); } - } diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tabs.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tabs.php index deea5eb545..acd905096b 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tabs.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tabs.php @@ -44,6 +44,7 @@ public function __construct() protected function _beforeToHtml() { +/* if (Mage::registry('current_customer')->getId()) { $this->addTab('view', array( 'label' => Mage::helper('customer')->__('Customer View'), @@ -51,7 +52,7 @@ protected function _beforeToHtml() 'active' => true )); } - +*/ $this->addTab('account', array( 'label' => Mage::helper('customer')->__('Account Information'), 'content' => $this->getLayout()->createBlock('adminhtml/customer_edit_tab_account')->initForm()->toHtml(), diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Grid.php b/app/code/core/Mage/Adminhtml/Block/Customer/Grid.php index 6c0e0fcb0a..2aa174ba06 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Grid.php @@ -133,14 +133,12 @@ protected function _prepareColumns() )); if (!Mage::app()->isSingleStoreMode()) { - $websites = Mage::getSingleton('adminhtml/system_store')->getWebsiteValuesForGridFilter(true, true); - $this->addColumn('website_id', array( 'header' => Mage::helper('customer')->__('Website'), 'align' => 'center', 'width' => '80px', 'type' => 'options', - 'options' => $websites, + 'options' => Mage::getSingleton('adminhtml/system_store')->getWebsiteOptionHash(true), 'index' => 'website_id', )); } diff --git a/app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Edit.php b/app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Edit.php index 599b73c5af..07046a0d92 100644 --- a/app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Edit.php +++ b/app/code/core/Mage/Adminhtml/Block/Newsletter/Queue/Edit.php @@ -34,6 +34,16 @@ class Mage_Adminhtml_Block_Newsletter_Queue_Edit extends Mage_Adminhtml_Block_Template { + /** + * Retrieve current Newsletter Queue Object + * + * @return Mage_Newsletter_Model_Queue + */ + public function getQueue() + { + return Mage::registry('current_queue'); + } + protected function _beforeToHtml() { $this->setTemplate('newsletter/queue/edit.phtml'); @@ -41,8 +51,7 @@ protected function _beforeToHtml() { $this->setChild('form', $this->getLayout()->createBlock('adminhtml/newsletter_queue_edit_form','form') ); - $queue = Mage::getSingleton('newsletter/queue'); - $queue->addTemplateData($queue); + return parent::_beforeToHtml(); } @@ -129,26 +138,26 @@ public function getResumeButtonHtml() public function getIsPreview() { - $queue = Mage::getSingleton('newsletter/queue'); - return !in_array($queue->getQueueStatus(), array(Mage_Newsletter_Model_Queue::STATUS_NEVER, Mage_Newsletter_Model_Queue::STATUS_PAUSE)); + return !in_array($this->getQueue()->getQueueStatus(), array( + Mage_Newsletter_Model_Queue::STATUS_NEVER, + Mage_Newsletter_Model_Queue::STATUS_PAUSE + )); } public function getIsTextType() { - $queue = Mage::getSingleton('newsletter/queue'); - return $queue->getTemplate()->isPlain(); + return $this->getQueue()->getTemplate()->isPlain(); } public function getCanResume() { - $queue = Mage::getSingleton('newsletter/queue'); - return in_array($queue->getQueueStatus(), array(Mage_Newsletter_Model_Queue::STATUS_PAUSE)); + return in_array($this->getQueue()->getQueueStatus(), array( + Mage_Newsletter_Model_Queue::STATUS_PAUSE + )); } public function getHeaderText() { return ( $this->getIsPreview() ? Mage::helper('newsletter')->__('View Newsletter') : Mage::helper('newsletter')->__('Edit Newsletter')); } - - }// Class Mage_Adminhtml_Block_Newsletter_Queue_Edit END diff --git a/app/code/core/Mage/Adminhtml/Block/Newsletter/Subscriber/Grid.php b/app/code/core/Mage/Adminhtml/Block/Newsletter/Subscriber/Grid.php index 9a5a5896e0..32ef3d1fea 100644 --- a/app/code/core/Mage/Adminhtml/Block/Newsletter/Subscriber/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Newsletter/Subscriber/Grid.php @@ -164,7 +164,7 @@ protected function _getOptions($optionsArray) */ protected function _getWebsiteOptions() { - return Mage::getModel('adminhtml/system_store')->getWebsiteValuesForGridFilter(); + return Mage::getModel('adminhtml/system_store')->getWebsiteOptionHash(); } /** @@ -174,7 +174,7 @@ protected function _getWebsiteOptions() */ protected function _getStoreGroupOptions() { - return Mage::getModel('adminhtml/system_store')->getStoreGroupValuesForGridFilter(); + return Mage::getModel('adminhtml/system_store')->getStoreGroupOptionHash(); } /** @@ -184,7 +184,7 @@ protected function _getStoreGroupOptions() */ protected function _getStoreOptions() { - return Mage::getModel('adminhtml/system_store')->getStoreValuesForGridFilter(); + return Mage::getModel('adminhtml/system_store')->getStoreOptionHash(); } protected function _prepareMassaction() diff --git a/app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Edit.php b/app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Edit.php index fc12d060fc..fb3b3160f2 100644 --- a/app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Edit.php +++ b/app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Edit.php @@ -20,181 +20,226 @@ * * @category Mage * @package Mage_Adminhtml - * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com) + * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ /** - * Adminhtml newsletter template edit block + * Adminhtml Newsletter Template Edit Block * * @category Mage * @package Mage_Adminhtml - * @author Magento Core Team + * @author Magento Core Team */ class Mage_Adminhtml_Block_Newsletter_Template_Edit extends Mage_Adminhtml_Block_Widget { + /** + * Edit Block model + * + * @var bool + */ + protected $_editMode = false; - protected $_template; - + /** + * Define Edit template + * + */ public function __construct() { parent::__construct(); $this->setTemplate('newsletter/template/edit.phtml'); - $this->_template = Mage::getModel('newsletter/template'); - if ($templateId = (int) $this->getRequest()->getParam('id')) { - $this->_template->load($templateId); - } } + /** + * Retrieve template object + * + * @return Mage_Newsletter_Model_Template + */ + public function getModel() + { + return Mage::registry('_current_template'); + } + + /** + * Preparing block layout + * + * @return Mage_Adminhtml_Block_Newsletter_Template_Edit + */ protected function _prepareLayout() { $this->setChild('back_button', $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData( - array( - 'label' => Mage::helper('newsletter')->__('Back'), - 'onclick' => "window.location.href = '" . $this->getUrl('*/*') . "'", - 'class' => 'back' - ) - ) + ->setData(array( + 'label' => Mage::helper('newsletter')->__('Back'), + 'onclick' => "window.location.href = '" . $this->getUrl('*/*') . "'", + 'class' => 'back' + )) ); - $this->setChild('reset_button', $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData( - array( - 'label' => Mage::helper('newsletter')->__('Reset'), - 'onclick' => 'window.location.href = window.location.href' - ) - ) + ->setData(array( + 'label' => Mage::helper('newsletter')->__('Reset'), + 'onclick' => 'window.location.href = window.location.href' + )) ); $this->setChild('to_plain_button', $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData( - array( - 'label' => Mage::helper('newsletter')->__('Convert to Plain Text'), - 'onclick' => 'templateControl.stripTags();', - 'id' => 'convert_button', - 'class' => 'task' - ) - ) + ->setData(array( + 'label' => Mage::helper('newsletter')->__('Convert to Plain Text'), + 'onclick' => 'templateControl.stripTags();', + 'id' => 'convert_button', + 'class' => 'task' + )) ); - $this->setChild('to_html_button', $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData( - array( - 'label' => Mage::helper('newsletter')->__('Return Html Version'), - 'onclick' => 'templateControl.unStripTags();', - 'id' => 'convert_button_back', - 'style' => 'display:none', - 'class' => 'task' - ) - ) + ->setData(array( + 'label' => Mage::helper('newsletter')->__('Return Html Version'), + 'onclick' => 'templateControl.unStripTags();', + 'id' => 'convert_button_back', + 'style' => 'display:none', + 'class' => 'task' + )) ); $this->setChild('toggle_button', $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData( - array( - 'label' => Mage::helper('newsletter')->__('Toggle Editor'), - 'onclick' => 'templateControl.toggleEditor();', - 'id' => 'toggle_button', - 'class' => 'task' - ) - ) + ->setData(array( + 'label' => Mage::helper('newsletter')->__('Toggle Editor'), + 'onclick' => 'templateControl.toggleEditor();', + 'id' => 'toggle_button', + 'class' => 'task' + )) ); $this->setChild('save_button', $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData( - array( - 'label' => Mage::helper('newsletter')->__('Save Template'), - 'onclick' => 'templateControl.save();', - 'class' => 'save' - ) - ) + ->setData(array( + 'label' => Mage::helper('newsletter')->__('Save Template'), + 'onclick' => 'templateControl.save();', + 'class' => 'save' + )) ); $this->setChild('save_as_button', $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData( - array( - 'label' => Mage::helper('newsletter')->__('Save As'), - 'onclick' => 'templateControl.saveAs();', - 'class' => 'save' - ) - ) + ->setData(array( + 'label' => Mage::helper('newsletter')->__('Save As'), + 'onclick' => 'templateControl.saveAs();', + 'class' => 'save' + )) ); $this->setChild('preview_button', $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData( - array( - 'label' => Mage::helper('newsletter')->__('Preview Template'), - 'onclick' => 'templateControl.preview();', - 'class' => 'task' - ) - ) + ->setData(array( + 'label' => Mage::helper('newsletter')->__('Preview Template'), + 'onclick' => 'templateControl.preview();', + 'class' => 'task' + )) ); $this->setChild('delete_button', $this->getLayout()->createBlock('adminhtml/widget_button') - ->setData( - array( - 'label' => Mage::helper('newsletter')->__('Delete Template'), - 'onclick' => 'templateControl.deleteTemplate();', - 'class' => 'delete' - ) - ) + ->setData(array( + 'label' => Mage::helper('newsletter')->__('Delete Template'), + 'onclick' => 'templateControl.deleteTemplate();', + 'class' => 'delete' + )) ); + return parent::_prepareLayout(); } + /** + * Retrieve Back Button HTML + * + * @return string + */ public function getBackButtonHtml() { return $this->getChildHtml('back_button'); } + /** + * Retrieve Toggle Button HTML + * + * @return string + */ public function getToggleButtonHtml() { return $this->getChildHtml('toggle_button'); } + /** + * Retrieve Reset Button HTML + * + * @return string + */ public function getResetButtonHtml() { return $this->getChildHtml('reset_button'); } + /** + * Retrieve Convert To Plain Button HTML + * + * @return string + */ public function getToPlainButtonHtml() { return $this->getChildHtml('to_plain_button'); } + /** + * Retrieve Convert to HTML Button HTML + * + * @return string + */ public function getToHtmlButtonHtml() { return $this->getChildHtml('to_html_button'); } + /** + * Retrieve Save Button HTML + * + * @return string + */ public function getSaveButtonHtml() { return $this->getChildHtml('save_button'); } + /** + * Retrieve Preview Button HTML + * + * @return string + */ public function getPreviewButtonHtml() { return $this->getChildHtml('preview_button'); } + /** + * Retrieve Delete Button HTML + * + * @return string + */ public function getDeleteButtonHtml() { return $this->getChildHtml('delete_button'); } + /** + * Retrieve Save as Button HTML + * + * @return string + */ public function getSaveAsButtonHtml() { return $this->getChildHtml('save_as_button'); @@ -206,9 +251,9 @@ public function getSaveAsButtonHtml() * @param boolean $value * @return Mage_Adminhtml_Block_Newsletter_Template_Edit */ - public function setEditMode($value=true) + public function setEditMode($value = true) { - $this->_editMode = $value; + $this->_editMode = (bool)$value; return $this; } @@ -229,8 +274,8 @@ public function getEditMode() */ public function getHeaderText() { - if($this->getEditMode()) { - return Mage::helper('newsletter')->__('Edit Newsletter Template'); + if ($this->getEditMode()) { + return Mage::helper('newsletter')->__('Edit Newsletter Template'); } return Mage::helper('newsletter')->__('New Newsletter Template'); @@ -243,8 +288,8 @@ public function getHeaderText() */ public function getForm() { - return $this->getLayout()->createBlock('adminhtml/newsletter_template_edit_form') - ->renderPrepare($this->_template) + return $this->getLayout() + ->createBlock('adminhtml/newsletter_template_edit_form') ->toHtml(); } @@ -255,7 +300,7 @@ public function getForm() */ public function getJsTemplateName() { - return addcslashes($this->_template->getTemplateCode(), "\"\r\n\\"); + return addcslashes($this->getModel()->getTemplateCode(), "\"\r\n\\"); } /** @@ -278,9 +323,14 @@ public function getPreviewUrl() return $this->getUrl('*/*/preview'); } + /** + * Check Template Type is Plain Text + * + * @return bool + */ public function isTextType() { - return $this->_template->isPlain(); + return $this->getModel()->isPlain(); } /** @@ -293,9 +343,13 @@ public function getDeleteUrl() return $this->getUrl('*/*/delete', array('id' => $this->getRequest()->getParam('id'))); } + /** + * Retrieve Save As Flag + * + * @return int + */ public function getSaveAsFlag() { return $this->getRequest()->getParam('_save_as_flag') ? '1' : ''; } - } diff --git a/app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Edit/Form.php b/app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Edit/Form.php index 6f1230379b..967afb36e3 100644 --- a/app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Edit/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/Newsletter/Template/Edit/Form.php @@ -20,121 +20,114 @@ * * @category Mage * @package Mage_Adminhtml - * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com) + * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ + /** - * Adminhtml newsletter template edit form + * Adminhtml Newsletter Template Edit Form Block * * @category Mage * @package Mage_Adminhtml - * @author Magento Core Team + * @author Magento Core Team */ - class Mage_Adminhtml_Block_Newsletter_Template_Edit_Form extends Mage_Adminhtml_Block_Widget_Form { - /** - * Constructor + /** + * Define Form settings * - * Initialize form */ public function __construct() { parent::__construct(); - } - /** - * Prepare form for render + * Retrieve template object + * + * @return Mage_Newsletter_Model_Template */ - public function renderPrepare($template) + public function getModel() { - $form = new Varien_Data_Form(); + return Mage::registry('_current_template'); + } - if($this->getRequest()->isPost()) { - $post = $this->getRequest()->getPost(); - if (isset($post['template_id'])) { - unset($post['template_id']); - } + /** + * Prepare form before rendering HTML + * + * @return Mage_Adminhtml_Block_Newsletter_Template_Edit_Form + */ + protected function _prepareForm() + { + $model = $this->getModel(); + $form = new Varien_Data_Form(array( + 'id' => 'edit_form', + 'action' => $this->getData('action'), + 'method' => 'post' + )); - if (isset($post['template_type'])) { - unset($post['template_type']); - } + $fieldset = $form->addFieldset('base_fieldset', array( + 'legend' => Mage::helper('newsletter')->__('Template Information'), + 'class' => 'fieldset-wide' + )); - $template->addData($post); + if ($model->getId()) { + $fieldset->addField('id', 'hidden', array( + 'name' => 'id', + 'value' => $model->getId(), + )); } - $fieldset = $form->addFieldset('base_fieldset', array('legend'=>Mage::helper('newsletter')->__('Template Information'), 'class' => 'fieldset-wide')); - $fieldset->addField('code', 'text', array( - 'name'=>'code', - 'label' => Mage::helper('newsletter')->__('Template Name'), - 'title' => Mage::helper('newsletter')->__('Template Name'), - 'class' => 'required-entry', - 'required' => true, - 'value' => $template->getTemplateCode() + 'name' => 'code', + 'label' => Mage::helper('newsletter')->__('Template Name'), + 'title' => Mage::helper('newsletter')->__('Template Name'), + 'required' => true, + 'value' => $model->getTemplateCode(), )); $fieldset->addField('subject', 'text', array( - 'name'=>'subject', - 'label' => Mage::helper('newsletter')->__('Template Subject'), - 'title' => Mage::helper('newsletter')->__('Template Subject'), - 'class' => 'required-entry', - 'required' => true, - 'value' => $template->getTemplateSubject() + 'name' => 'subject', + 'label' => Mage::helper('newsletter')->__('Template Subject'), + 'title' => Mage::helper('newsletter')->__('Template Subject'), + 'required' => true, + 'value' => $model->getTemplateSubject(), )); $fieldset->addField('sender_name', 'text', array( - 'name'=>'sender_name', - 'label' => Mage::helper('newsletter')->__('Sender Name'), - 'title' => Mage::helper('newsletter')->__('Sender Name'), - 'class' => 'required-entry', - 'required' => true, - 'value' => $template->getTemplateSenderName() + 'name' =>'sender_name', + 'label' => Mage::helper('newsletter')->__('Sender Name'), + 'title' => Mage::helper('newsletter')->__('Sender Name'), + 'required' => true, + 'value' => $model->getTemplateSenderName(), )); $fieldset->addField('sender_email', 'text', array( - 'name'=>'sender_email', - 'label' => Mage::helper('newsletter')->__('Sender Email'), - 'title' => Mage::helper('newsletter')->__('Sender Email'), - 'class' => 'required-entry validate-email', - 'required' => true, - 'value' => $template->getTemplateSenderEmail() + 'name' =>'sender_email', + 'label' => Mage::helper('newsletter')->__('Sender Email'), + 'title' => Mage::helper('newsletter')->__('Sender Email'), + 'class' => 'validate-email', + 'required' => true, + 'value' => $model->getTemplateSenderEmail(), )); - $txtType = constant(Mage::getConfig()->getModelClassName('newsletter/template') . '::TYPE_TEXT'); - $fieldset->addField('text', 'editor', array( - 'name'=>'text', - 'wysiwyg' => ($template->getTemplateType() != $txtType), - 'label' => Mage::helper('newsletter')->__('Template Content'), - 'title' => Mage::helper('newsletter')->__('Template Content'), - 'theme' => 'advanced', - 'class' => 'required-entry', - 'required' => true, - 'state' => 'html', - 'value' => $template->getTemplateText(), - 'style' => 'height:36em;', + 'name' => 'text', + 'wysiwyg' => (!$model->isPlain()), + 'label' => Mage::helper('newsletter')->__('Template Content'), + 'title' => Mage::helper('newsletter')->__('Template Content'), + 'theme' => 'advanced', + 'required' => true, + 'state' => 'html', + 'style' => 'height:36em;', + 'value' => $model->getTemplateText(), )); - if ($template->getId()) { - // If edit add id - $form->addField('id', 'hidden', - array( - 'name' => 'id', - 'value' => $template->getId() - ) - ); - } - - if($values = Mage::getSingleton('adminhtml/session')->getData('newsletter_template_form_data', true)) { - $form->setValues($values); - } - + $form->setAction($this->getUrl('*/*/save')); + $form->setUseContainer(true); $this->setForm($form); - return $this; + return parent::_prepareForm(); } } diff --git a/app/code/core/Mage/Adminhtml/Block/Notification/Toolbar.php b/app/code/core/Mage/Adminhtml/Block/Notification/Toolbar.php index d26b0eb6c4..2e37e76804 100644 --- a/app/code/core/Mage/Adminhtml/Block/Notification/Toolbar.php +++ b/app/code/core/Mage/Adminhtml/Block/Notification/Toolbar.php @@ -34,6 +34,10 @@ */ class Mage_Adminhtml_Block_Notification_Toolbar extends Mage_Adminhtml_Block_Template { + /** + * Initialize Toolbar block + * + */ protected function _construct() {} @@ -47,8 +51,16 @@ protected function _getHelper() return Mage::helper('adminnotification'); } + /** + * Check is show toolbar + * + * @return bool + */ public function isShow() { + if (!$this->isOutputEnabled('Mage_AdminNotification')) { + return false; + } if ($this->getRequest()->getControllerName() == 'notification') { return false; } @@ -58,41 +70,86 @@ public function isShow() return true; } + /** + * Retrieve count of critical errors + * + * @return int + */ public function getCriticalCount() { - return $this->_getHelper()->getUnreadNoticeCount(Mage_AdminNotification_Model_Inbox::SEVERITY_CRITICAL); + return $this->_getHelper() + ->getUnreadNoticeCount(Mage_AdminNotification_Model_Inbox::SEVERITY_CRITICAL); } + /** + * Retrieve count of major errors + * + * @return int + */ public function getMajorCount() { - return $this->_getHelper()->getUnreadNoticeCount(Mage_AdminNotification_Model_Inbox::SEVERITY_MAJOR); + return $this->_getHelper() + ->getUnreadNoticeCount(Mage_AdminNotification_Model_Inbox::SEVERITY_MAJOR); } + /** + * Retrieve count of minor errors + * + * @return int + */ public function getMinorCount() { - return $this->_getHelper()->getUnreadNoticeCount(Mage_AdminNotification_Model_Inbox::SEVERITY_MINOR); + return $this->_getHelper() + ->getUnreadNoticeCount(Mage_AdminNotification_Model_Inbox::SEVERITY_MINOR); } + /** + * Retrieve count of notices + * + * @return int + */ public function getNoticeCount() { - return $this->_getHelper()->getUnreadNoticeCount(Mage_AdminNotification_Model_Inbox::SEVERITY_NOTICE); + return $this->_getHelper() + ->getUnreadNoticeCount(Mage_AdminNotification_Model_Inbox::SEVERITY_NOTICE); } + /** + * Retrieve Notices Inbox URL + * + * @return string + */ public function getNoticesInboxUrl() { return $this->getUrl('adminhtml/notification'); } + /** + * Retrieve last notice Title + * + * @return string + */ public function getLatestNotice() { - return $this->_getHelper()->getLatestNotice()->getTitle(); + return $this->_getHelper() + ->getLatestNotice()->getTitle(); } + /** + * Retrieve Last Notice URL + * + * @return string + */ public function getLatestNoticeUrl() { return $this->_getHelper()->getLatestNotice()->getUrl(); } + /** + * Check is Message Window Available + * + * @return bool + */ public function isMessageWindowAvailable() { $block = $this->getLayout()->getBlock('notification_window'); diff --git a/app/code/core/Mage/Adminhtml/Block/Notification/Window.php b/app/code/core/Mage/Adminhtml/Block/Notification/Window.php index 833af7c051..96d51f274a 100644 --- a/app/code/core/Mage/Adminhtml/Block/Notification/Window.php +++ b/app/code/core/Mage/Adminhtml/Block/Notification/Window.php @@ -26,13 +26,17 @@ class Mage_Adminhtml_Block_Notification_Window extends Mage_Adminhtml_Block_Notification_Toolbar { - protected $_available = null; - - protected $_httpsObjectUrl = 'https://widgets.magentocommerce.com/notificationPopup'; - protected $_httpObjectUrl = 'http://widgets.magentocommerce.com/notificationPopup'; - - protected $_aclResourcePath = 'admin/system/adminnotification/show_toolbar'; + /** + * Is available flag + * + * @var bool + */ + protected $_available; + /** + * Initialize block window + * + */ protected function _construct() { parent::_construct(); @@ -75,7 +79,12 @@ protected function _construct() */ public function canShow() { - if (!$this->_isObjectReadable()) { + if (!$this->isOutputEnabled('Mage_AdminNotification')) { + $this->_available = false; + return false; + } + + if (!$this->_getHelper()->isReadablePopupObject()) { $this->_available = false; return false; } @@ -103,16 +112,17 @@ public function canShow() */ public function getObjectUrl() { - if (!empty($_SERVER['HTTPS'])) { - return $this->_httpsObjectUrl; - } else { - return $this->_httpObjectUrl; - } + return $this->_getHelper()->getPopupObjectUrl(); } + /** + * Retrieve Last Notice object + * + * @return Mage_AdminNotification_Model_Inbox + */ public function getLastNotice() { - return Mage::helper('adminnotification')->getLatestNotice(); + return $this->_getHelper()->getLatestNotice(); } /** @@ -124,22 +134,11 @@ public function getLastNotice() protected function _isAllowed() { if (!is_null($this->_aclResourcePath)) { - return Mage::getSingleton('admin/session')->isAllowed($this->_aclResourcePath); - } else { - return true; + return Mage::getSingleton('admin/session') + ->isAllowed('admin/system/adminnotification/show_toolbar'); } - } - - /** - * Check whether or not the remote flash file is available - * - * @return boolean - */ - protected function _isObjectReadable() - { - if (@fopen($this->getObjectUrl() . '.swf', 'r') || @fopen($this->getObjectUrl() . '.dcr', 'r')) { + else { return true; } - return false; } } diff --git a/app/code/core/Mage/Adminhtml/Block/Page/Footer.php b/app/code/core/Mage/Adminhtml/Block/Page/Footer.php index d38244cb9a..9636620601 100644 --- a/app/code/core/Mage/Adminhtml/Block/Page/Footer.php +++ b/app/code/core/Mage/Adminhtml/Block/Page/Footer.php @@ -43,7 +43,7 @@ protected function _construct() public function getChangeLocaleUrl() { - return $this->getUrl('*/index/changeLocale'); + return $this->getUrl('adminhtml/index/changeLocale'); } public function getUrlForReferer() @@ -64,7 +64,7 @@ public function getLanguageSelect() ->setTitle(Mage::helper('page')->__('Interface Language')) ->setExtraParams('style="width:200px"') ->setValue(Mage::app()->getLocale()->getLocaleCode()) - ->setOptions(Mage::app()->getLocale()->getOptionLocales()) + ->setOptions(Mage::app()->getLocale()->getTranslatedOptionLocales()) ->getHtml(); return $html; } diff --git a/app/code/core/Mage/Adminhtml/Block/Page/Header.php b/app/code/core/Mage/Adminhtml/Block/Page/Header.php index 91a39bc613..7aab7a2b93 100644 --- a/app/code/core/Mage/Adminhtml/Block/Page/Header.php +++ b/app/code/core/Mage/Adminhtml/Block/Page/Header.php @@ -53,4 +53,15 @@ public function getLogoutLink() { return $this->getUrl('adminhtml/index/logout'); } + + /** + * Check if noscript notice should be displayed + * + * @return boolean + */ + public function displayNoscriptNotice() + { + return Mage::getStoreConfig('web/browser_capabilities/javascript'); + } + } diff --git a/app/code/core/Mage/Adminhtml/Block/Page/Menu.php b/app/code/core/Mage/Adminhtml/Block/Page/Menu.php index e74b930f4c..63bbad193e 100644 --- a/app/code/core/Mage/Adminhtml/Block/Page/Menu.php +++ b/app/code/core/Mage/Adminhtml/Block/Page/Menu.php @@ -52,8 +52,8 @@ public function getCacheLifetime() public function getCacheKey() { // getting roles for current user, for now one role per user - $roles = implode('', Mage::getSingleton('admin/session')->getUser()->getRoles()); - return 'admin_top_nav_'.$this->getActive().'_'.$roles.'_'.Mage::app()->getLocale()->getLocaleCode(); + $id = Mage::getSingleton('admin/session')->getUser()->getId(); + return 'admin_top_nav_'.$this->getActive().'_'.$id.'_'.Mage::app()->getLocale()->getLocaleCode(); } public function getMenuArray() @@ -150,6 +150,14 @@ protected function _checkDepends(Varien_Simplexml_Element $depends) } } + if ($depends->config) { + foreach ($depends->config as $path) { + if (!Mage::getStoreConfigFlag((string)$path)) { + return false; + } + } + } + return true; } diff --git a/app/code/core/Mage/Adminhtml/Block/Page/Notices.php b/app/code/core/Mage/Adminhtml/Block/Page/Notices.php new file mode 100644 index 0000000000..43040bae20 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Block/Page/Notices.php @@ -0,0 +1,57 @@ + + */ +class Mage_Adminhtml_Block_Page_Notices extends Mage_Adminhtml_Block_Template +{ + + /** + * Check if noscript notice should be displayed + * + * @return boolean + */ + public function displayNoscriptNotice() + { + return Mage::getStoreConfig('web/browser_capabilities/javascript'); + } + + /** + * Check if demo store notice should be displayed + * + * @return boolean + */ + public function displayDemoNotice() + { + return Mage::getStoreConfig('design/head/demonotice'); + } + +} diff --git a/app/code/core/Mage/Adminhtml/Block/Permissions/Editroles.php b/app/code/core/Mage/Adminhtml/Block/Permissions/Editroles.php index 558bfbece0..5c15a7b30f 100644 --- a/app/code/core/Mage/Adminhtml/Block/Permissions/Editroles.php +++ b/app/code/core/Mage/Adminhtml/Block/Permissions/Editroles.php @@ -36,14 +36,12 @@ public function __construct() protected function _prepareLayout() { - $roleId = $this->getRequest()->getParam('rid', false); - $role = Mage::getModel("admin/roles") - ->load($roleId); + $role = Mage::registry('current_role'); $this->addTab('info', $this->getLayout()->createBlock('adminhtml/permissions_tab_roleinfo')->setRole($role)->setActive(true)); $this->addTab('account', $this->getLayout()->createBlock('adminhtml/permissions_tab_rolesedit', 'adminhtml.permissions.tab.rolesedit')); - if (intval($roleId) > 0) { + if ($role->getId()) { $this->addTab('roles', array( 'label' => Mage::helper('adminhtml')->__('Role Users'), 'title' => Mage::helper('adminhtml')->__('Role Users'), diff --git a/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit.php b/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit.php index 7adee44d3c..90fedd0dca 100644 --- a/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit.php +++ b/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit.php @@ -46,11 +46,22 @@ public function __construct() $this->_updateButton('save', 'label', Mage::helper('catalogrule')->__('Save Rule')); $this->_updateButton('delete', 'label', Mage::helper('catalogrule')->__('Delete Rule')); - $this->_addButton('save_apply', array( - 'class'=>'save', - 'label'=>Mage::helper('catalogrule')->__('Save and Apply'), - 'onclick'=>"$('rule_auto_apply').value=1; editForm.submit()", - )); + $rule = Mage::registry('current_promo_catalog_rule'); + + if (!$rule->isDeleteable()) { + $this->_removeButton('delete'); + } + + if (!$rule->isReadonly()) { + $this->_addButton('save_apply', array( + 'class'=>'save', + 'label'=>Mage::helper('catalogrule')->__('Save and Apply'), + 'onclick'=>"$('rule_auto_apply').value=1; editForm.submit()", + )); + } else { + $this->_removeButton('reset'); + $this->_removeButton('save'); + } } public function getHeaderText() diff --git a/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit/Tab/Actions.php b/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit/Tab/Actions.php index a667e44cfd..4697460f54 100644 --- a/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit/Tab/Actions.php +++ b/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit/Tab/Actions.php @@ -78,8 +78,14 @@ protected function _prepareForm() //$form->setUseContainer(true); + if ($model->isReadonly()) { + foreach ($fieldset->getElements() as $element) { + $element->setReadonly(true, true); + } + } + $this->setForm($form); return parent::_prepareForm(); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit/Tab/Main.php b/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit/Tab/Main.php index ae3df4c5d9..1c7edbab7a 100644 --- a/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit/Tab/Main.php +++ b/app/code/core/Mage/Adminhtml/Block/Promo/Catalog/Edit/Tab/Main.php @@ -146,8 +146,14 @@ protected function _prepareForm() //$form->setUseContainer(true); + if ($model->isReadonly()) { + foreach ($fieldset->getElements() as $element) { + $element->setReadonly(true, true); + } + } + $this->setForm($form); return parent::_prepareForm(); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit.php b/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit.php index 36b5be14cd..2d31ffa410 100644 --- a/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit.php +++ b/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit.php @@ -45,7 +45,18 @@ public function __construct() $this->_updateButton('save', 'label', Mage::helper('salesrule')->__('Save Rule')); $this->_updateButton('delete', 'label', Mage::helper('salesrule')->__('Delete Rule')); - + + $rule = Mage::registry('current_promo_quote_rule'); + + if (!$rule->isDeleteable()) { + $this->_removeButton('delete'); + } + + if ($rule->isReadonly()) { + $this->_removeButton('save'); + $this->_removeButton('reset'); + } + #$this->setTemplate('promo/quote/edit.phtml'); } @@ -59,7 +70,7 @@ public function getHeaderText() return Mage::helper('salesrule')->__('New Rule'); } } - + public function getProductsJson() { return '{}'; diff --git a/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Actions.php b/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Actions.php index 6710db42a8..099e94451b 100644 --- a/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Actions.php +++ b/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Actions.php @@ -112,6 +112,11 @@ protected function _prepareForm() $form->setValues($model->getData()); + if ($model->isReadonly()) { + foreach ($fieldset->getElements() as $element) { + $element->setReadonly(true, true); + } + } //$form->setUseContainer(true); $this->setForm($form); @@ -119,4 +124,4 @@ protected function _prepareForm() return parent::_prepareForm(); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Main.php b/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Main.php index 49c7e32f36..2961cf376c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Main.php +++ b/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Main.php @@ -175,10 +175,16 @@ protected function _prepareForm() $form->setValues($model->getData()); + if ($model->isReadonly()) { + foreach ($fieldset->getElements() as $element) { + $element->setReadonly(true, true); + } + } + //$form->setUseContainer(true); $this->setForm($form); return parent::_prepareForm(); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Promo/Widget/Chooser/Sku.php b/app/code/core/Mage/Adminhtml/Block/Promo/Widget/Chooser/Sku.php index 91175c4fb6..64869d5370 100644 --- a/app/code/core/Mage/Adminhtml/Block/Promo/Widget/Chooser/Sku.php +++ b/app/code/core/Mage/Adminhtml/Block/Promo/Widget/Chooser/Sku.php @@ -90,7 +90,8 @@ protected function _prepareCollection() ->addAttributeToSelect('name') ->addAttributeToFilter('type_id', array('in'=>array( Mage_Catalog_Model_Product_Type::TYPE_SIMPLE, - Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE + Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE, + Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE ))); $this->setCollection($collection); diff --git a/app/code/core/Mage/Adminhtml/Block/Report/Product/Downloads/Grid.php b/app/code/core/Mage/Adminhtml/Block/Report/Product/Downloads/Grid.php index dc94b6cfda..83bcf80592 100644 --- a/app/code/core/Mage/Adminhtml/Block/Report/Product/Downloads/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Report/Product/Downloads/Grid.php @@ -91,7 +91,8 @@ protected function _prepareColumns() 'align' => 'right', 'filter' => false, 'index' => 'purchases', - 'type' => 'number' + 'type' => 'number', + 'renderer' => 'adminhtml/report_product_downloads_renderer_purchases', )); $this->addColumn('downloads', array( diff --git a/app/code/core/Mage/Adminhtml/Block/Report/Product/Downloads/Renderer/Purchases.php b/app/code/core/Mage/Adminhtml/Block/Report/Product/Downloads/Renderer/Purchases.php new file mode 100644 index 0000000000..3614541977 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Block/Report/Product/Downloads/Renderer/Purchases.php @@ -0,0 +1,50 @@ + + */ +class Mage_Adminhtml_Block_Report_Product_Downloads_Renderer_Purchases + extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract +{ + /** + * Renders Purchases value + * + * @param Varien_Object $row + * @return string + */ + public function render(Varien_Object $row) + { + if ( ($value = $row->getData($this->getColumn()->getIndex())) > 0) { + return $value; + } + return $this->__('Unlimited'); + } +} \ No newline at end of file diff --git a/app/code/core/Mage/Adminhtml/Block/Review/Grid.php b/app/code/core/Mage/Adminhtml/Block/Review/Grid.php index 7eb54b0e9e..1f3349bd21 100644 --- a/app/code/core/Mage/Adminhtml/Block/Review/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Review/Grid.php @@ -200,7 +200,7 @@ protected function _prepareColumns() 'sortable' => false )); - $this->addRssList('*/rss_catalog/review', Mage::helper('catalog')->__('Pending Reviews RSS')); + $this->addRssList('rss/catalog/review', Mage::helper('catalog')->__('Pending Reviews RSS')); return parent::_prepareColumns(); } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php index e19c85b9b7..0f74c57b5d 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Items/Abstract.php @@ -385,8 +385,22 @@ public function canCreateShipment() return false; } + /** + * Check availability to edit quantity of item + * + * @return boolean + */ public function canEditQty() { + /** + * Disable editing of quantity of item if creating of shipment forced + * and ship partially disabled for order + */ + if ($this->getOrder()->getForcedDoShipmentWithInvoice() + && ($this->canShipPartially($this->getOrder()) || $this->canShipPartiallyItem($this->getOrder())) + ) { + return false; + } if ($this->getOrder()->getPayment()->canCapture()) { return $this->getOrder()->getPayment()->canCapturePartial(); } @@ -439,18 +453,36 @@ public function canReturnToStock() { } } - public function canShipPartially() + /** + * Return true if can ship partially + * + * @param Mage_Sales_Model_Order|null $order + * @return boolean + */ + public function canShipPartially($order = null) { - $value = Mage::registry('current_shipment')->getOrder()->getCanShipPartially(); + if (is_null($order) || !$order instanceof Mage_Sales_Model_Order) { + $order = Mage::registry('current_shipment')->getOrder(); + } + $value = $order->getCanShipPartially(); if (!is_null($value) && !$value) { return false; } return true; } - public function canShipPartiallyItem() + /** + * Return true if can ship items partially + * + * @param Mage_Sales_Model_Order|null $order + * @return boolean + */ + public function canShipPartiallyItem($order = null) { - $value = Mage::registry('current_shipment')->getOrder()->getCanShipPartiallyItem(); + if (is_null($order) || !$order instanceof Mage_Sales_Model_Order) { + $order = Mage::registry('current_shipment')->getOrder(); + } + $value = $order->getCanShipPartiallyItem(); if (!is_null($value) && !$value) { return false; } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Abstract.php index 525813dcec..db7e9dd82a 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Abstract.php @@ -33,13 +33,6 @@ */ abstract class Mage_Adminhtml_Block_Sales_Order_Create_Abstract extends Mage_Adminhtml_Block_Widget { - - public function __construct() - { - parent::__construct(); - $this->setTemplate('sales/order/create/abstract.phtml'); - } - /** * Retrieve create order model object * diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Address.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Address.php index be477daf50..8b70bfb69c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Address.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Address.php @@ -34,11 +34,6 @@ class Mage_Adminhtml_Block_Sales_Order_Create_Billing_Address extends Mage_Adminhtml_Block_Sales_Order_Create_Form_Address { - protected function _prepareLayout() - { - return parent::_prepareLayout(); - } - public function getHeaderText() { return Mage::helper('sales')->__('Billing Address'); diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Method.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Method.php index 230f382e58..87d16186f5 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Method.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Method.php @@ -34,7 +34,6 @@ class Mage_Adminhtml_Block_Sales_Order_Create_Billing_Method extends Mage_Adminhtml_Block_Sales_Order_Create_Abstract { - public function __construct() { parent::__construct(); @@ -50,11 +49,4 @@ public function getHeaderCssClass() { return 'head-payment-method'; } - - protected function _prepareLayout() - { - $this->setChild('form', $this->getLayout()->createBlock('adminhtml/sales_order_create_billing_method_form')); - return parent::_prepareLayout(); - } - } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Method/Form.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Method/Form.php index d1d2157554..c2312c89ed 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Method/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Billing/Method/Form.php @@ -33,13 +33,6 @@ */ class Mage_Adminhtml_Block_Sales_Order_Create_Billing_Method_Form extends Mage_Payment_Block_Form_Container { - - public function __construct() - { - parent::__construct(); - $this->setTemplate('sales/order/create/billing/method/form.phtml'); - } - /** * Check payment method model * diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Comment.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Comment.php index 9434f612cd..d08f88ac00 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Comment.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Comment.php @@ -33,12 +33,6 @@ class Mage_Adminhtml_Block_Sales_Order_Create_Comment extends Mage_Adminhtml_Blo { protected $_form; - public function __construct() - { - parent::__construct(); - $this->setTemplate('sales/order/create/comment.phtml'); - } - public function getHeaderCssClass() { return 'head-comment'; diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Coupons.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Coupons.php index fb15230c20..721e17ef87 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Coupons.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Coupons.php @@ -39,7 +39,6 @@ public function __construct() { parent::__construct(); $this->setId('sales_order_create_coupons_form'); - $this->setTemplate('sales/order/create/coupons/form.phtml'); } public function getCouponCode() @@ -56,15 +55,4 @@ public function getHeaderCssClass() { return 'head-promo-quote'; } - - protected function _prepareLayout() - { - $this->setChild('form', $this->getLayout()->createBlock('adminhtml/sales_order_create_coupons_form')); - return parent::_prepareLayout(); - } - - protected function _toHtml() - { - return parent::_toHtml(); - } } \ No newline at end of file diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Coupons/Form.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Coupons/Form.php index d853d1866b..fc2c6387cb 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Coupons/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Coupons/Form.php @@ -39,7 +39,6 @@ public function __construct() { parent::__construct(); $this->setId('sales_order_create_coupons_form'); - $this->setTemplate('sales/order/create/coupons/form.phtml'); } public function getCouponCode() diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Customer.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Customer.php index 76f109854c..fac6a91052 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Customer.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Customer.php @@ -41,12 +41,6 @@ public function __construct() $this->setId('sales_order_create_customer'); } - protected function _prepareLayout() - { - $this->setChild('grid', $this->getLayout()->createBlock('adminhtml/sales_order_create_customer_grid')); - return parent::_prepareLayout(); - } - public function getHeaderText() { return Mage::helper('sales')->__('Please select a customer'); diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Data.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Data.php index 13a576ea1c..23021a7218 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Data.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Data.php @@ -33,35 +33,6 @@ */ class Mage_Adminhtml_Block_Sales_Order_Create_Data extends Mage_Adminhtml_Block_Sales_Order_Create_Abstract { - public function __construct() - { - parent::__construct(); - $this->setTemplate('sales/order/create/data.phtml'); - } - - protected function _prepareLayout() - { - $childNames = array( - 'sidebar', - 'form_account', - 'shipping_address', - 'billing_address', - 'shipping_method', - 'billing_method', - 'newsletter', - 'search', - 'items', - 'comment', - 'totals', - 'giftmessage' - ); - - foreach ($childNames as $name) { - $this->setChild($name, $this->getLayout()->createBlock('adminhtml/sales_order_create_' . $name)); - } - return parent::_prepareLayout(); - } - /** * Retrieve avilable currency codes * diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form.php index f33e722f68..93a6f9fcd8 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form.php @@ -38,26 +38,6 @@ public function __construct() { parent::__construct(); $this->setId('sales_order_create_form'); - $this->setTemplate('sales/order/create/form.phtml'); - } - - protected function _prepareLayout() - { - $this->setChild('data', $this->getLayout()->createBlock('adminhtml/sales_order_create_data')); - $childNames = array( - 'customer', - 'store', - 'data', - 'messages', - ); - - foreach ($childNames as $name) { - $this->setChild($name, $this->getLayout()->createBlock('adminhtml/sales_order_create_' . $name)); - } - $this->getLayout()->getBlock('head') - ->addJs('mage/adminhtml/sales.js') - ->addJs('mage/adminhtml/giftmessage.js'); - return parent::_prepareLayout(); } /** @@ -124,4 +104,4 @@ public function getOrderDataJson() } return Zend_Json::encode($data); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form/Account.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form/Account.php index d2e3787315..4fc786e3c2 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form/Account.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form/Account.php @@ -33,12 +33,6 @@ class Mage_Adminhtml_Block_Sales_Order_Create_Form_Account extends Mage_Adminhtm { protected $_form; - public function __construct() - { - parent::__construct(); - $this->setTemplate('sales/order/create/form/account.phtml'); - } - protected function _prepareLayout() { Varien_Data_Form::setElementRenderer( @@ -71,12 +65,8 @@ public function getForm() protected function _prepareForm() { if (!$this->_form) { - if ($this->getQuote()->getCustomerIsGuest()) { - $display = array('email' => 1); - } - else { - $display = array('group_id' => 1, 'email' =>2); - } + + $display = $this->getDisplayFields(); $this->_form = new Varien_Data_Form(); $fieldset = $this->_form->addFieldset('main', array()); @@ -86,13 +76,15 @@ protected function _prepareForm() if (!array_key_exists($attribute->getAttributeCode(), $display)) { continue; } + if ($inputType = $attribute->getFrontend()->getInputType()) { + $field = $display[$attribute->getAttributeCode()]; $element = $fieldset->addField($attribute->getAttributeCode(), $inputType, array( 'name' => $attribute->getAttributeCode(), 'label' => $attribute->getFrontend()->getLabel(), - 'class' => $attribute->getFrontend()->getClass(), - 'required' => $attribute->getIsRequired(), + 'class' => isset($field['class']) ? $field['class'] : $attribute->getFrontend()->getClass(), + 'required' => isset($field['required']) ? $field['required'] : $attribute->getIsRequired(), ) ) ->setEntityAttribute($attribute) @@ -126,6 +118,32 @@ public function _sortMethods($a, $b) return 0; } + /** + * Return new customer account fields for order + * + * @return array + */ + public function getDisplayFields() + { + $fields = array( + 'group_id' => array( + 'order' => 1 + ), + 'email' => array( + 'order' => 2, + 'class' => 'validate-email', + 'required' => false + ), + ); + + if ($this->getQuote()->getCustomerIsGuest()) { + unset($fields['group_id']); + } + + return $fields; + } + + public function getCustomerData() { $data = $this->getCustomer()->getData(); diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form/Address.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form/Address.php index e656ca83eb..620a56ae62 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form/Address.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Form/Address.php @@ -33,12 +33,6 @@ class Mage_Adminhtml_Block_Sales_Order_Create_Form_Address extends Mage_Adminhtm { protected $_form; - public function __construct() - { - parent::__construct(); - $this->setTemplate('sales/order/create/form/address.phtml'); - } - protected function _prepareLayout() { Varien_Data_Form::setElementRenderer( diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Giftmessage.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Giftmessage.php index 3e4dc70cf2..66a7fef205 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Giftmessage.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Giftmessage.php @@ -34,16 +34,6 @@ */ class Mage_Adminhtml_Block_Sales_Order_Create_Giftmessage extends Mage_Adminhtml_Block_Sales_Order_Create_Abstract { - - /** - * Constructor - */ - public function __construct() - { - parent::__construct(); - $this->setTemplate('sales/order/create/giftmessage.phtml'); - } - /** * Generate form for editing of gift message for entity * diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Items.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Items.php index 9a5484dee5..a612869bda 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Items.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Items.php @@ -38,15 +38,6 @@ public function __construct() { parent::__construct(); $this->setId('sales_order_create_items'); - $this->setTemplate('sales/order/create/items.phtml'); - } - - protected function _prepareLayout() - { - $this->setChild('grid', - $this->getLayout()->createBlock('adminhtml/sales_order_create_items_grid') - ); - return parent::_prepareLayout(); } public function getHeaderText() diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Items/Grid.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Items/Grid.php index 18c86a0c14..604e07afd2 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Items/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Items/Grid.php @@ -44,15 +44,6 @@ public function __construct() { parent::__construct(); $this->setId('sales_order_create_search_grid'); - $this->setTemplate('sales/order/create/items/grid.phtml'); - } - - protected function _prepareLayout() - { - $this->setChild('coupons', - $this->getLayout()->createBlock('adminhtml/sales_order_create_coupons') - ); - return parent::_prepareLayout(); } public function getItems() @@ -104,7 +95,7 @@ public function isGiftMessagesAvailable($item=null) { if(is_null($item)) { return $this->helper('giftmessage/message')->getIsMessagesAvailable( - 'main', $this->getQuote(), $this->getStore() + 'items', $this->getQuote(), $this->getStore() ); } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Load.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Load.php new file mode 100644 index 0000000000..d7b1c520ea --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Load.php @@ -0,0 +1,49 @@ + + */ + +class Mage_Adminhtml_Block_Sales_Order_Create_Load extends Mage_Core_Block_Template +{ + protected function _toHtml() + { + $result = array(); + foreach ($this->getSortedChildren() as $name) { + if (!$block = $this->getChild($name)) { + $result[$name] = Mage::helper('sales')->__('Invalid block: %s', $name); + } else { + $result[$name] = $block->toHtml(); + } + } + return Zend_Json::encode($result); + } +} diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Newsletter.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Newsletter.php index 9dba98d44f..9918fc7c89 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Newsletter.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Newsletter.php @@ -51,12 +51,6 @@ public function getHeaderCssClass() return 'head-newsletter-list'; } - protected function _prepareLayout() - { - $this->setChild('form', $this->getLayout()->createBlock('adminhtml/sales_order_create_newsletter_form')); - return parent::_prepareLayout(); - } - protected function _toHtml() { if (! Mage::getSingleton('adminhtml/quote')->getIsOldCustomer()) { diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Newsletter/Form.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Newsletter/Form.php index 5558a5539a..a1a015613e 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Newsletter/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Newsletter/Form.php @@ -39,7 +39,6 @@ public function __construct() { parent::__construct(); $this->setId('sales_order_create_newsletter_form'); - $this->setTemplate('sales/order/create/newsletter/form.phtml'); } } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Search.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Search.php index a001c0f846..4558348465 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Search.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Search.php @@ -46,12 +46,6 @@ public function getHeaderText() return Mage::helper('sales')->__('Please select products to add'); } - protected function _prepareLayout() - { - $this->setChild('grid', $this->getLayout()->createBlock('adminhtml/sales_order_create_search_grid')); - return parent::_prepareLayout(); - } - public function getButtonsHtml() { $addButtonData = array( diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Search/Grid.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Search/Grid.php index 98860a92a4..ccc402d4f8 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Search/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Search/Grid.php @@ -152,7 +152,7 @@ protected function _prepareColumns() )); if($this->helper('giftmessage/message')->getIsMessagesAvailable( - 'main', $this->getQuote(), $this->getStore() + 'items', $this->getQuote(), $this->getStore() )) { $this->addColumn('giftmessage', array( 'filter' => false, @@ -160,7 +160,7 @@ protected function _prepareColumns() 'header' => Mage::helper('sales')->__('Gift'), 'renderer' => 'adminhtml/sales_order_create_search_grid_renderer_giftmessage', 'field_name'=> 'giftmessage', - 'inline_css'=> 'checkbox', + 'inline_css'=> 'checkbox input-text', 'align' => 'center', 'index' => 'entity_id', 'values' => $this->_getGiftmessageSaveModel()->getAllowQuoteItemsProducts(), diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Address.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Address.php index 3145376925..268e411bb4 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Address.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Address.php @@ -34,11 +34,6 @@ class Mage_Adminhtml_Block_Sales_Order_Create_Shipping_Address extends Mage_Adminhtml_Block_Sales_Order_Create_Form_Address { - protected function _prepareLayout() - { - return parent::_prepareLayout(); - } - public function getHeaderText() { return Mage::helper('sales')->__('Shipping Address'); diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Method.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Method.php index a0680e83d5..f36f45d15a 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Method.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Method.php @@ -50,11 +50,4 @@ public function getHeaderCssClass() { return 'head-shipping-method'; } - - protected function _prepareLayout() - { - $this->setChild('form', $this->getLayout()->createBlock('adminhtml/sales_order_create_shipping_method_form')); - return parent::_prepareLayout(); - } - } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Method/Form.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Method/Form.php index b2d1746ae9..5c5148f404 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Method/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Shipping/Method/Form.php @@ -39,7 +39,6 @@ public function __construct() { parent::__construct(); $this->setId('sales_order_create_shipping_method_form'); - $this->setTemplate('sales/order/create/shipping/method/form.phtml'); } /** diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar.php index 00ca5e3019..1734a895e9 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar.php @@ -34,14 +34,6 @@ class Mage_Adminhtml_Block_Sales_Order_Create_Sidebar extends Mage_Adminhtml_Block_Sales_Order_Create_Abstract { - - public function __construct() - { - parent::__construct(); - $this->setId('sales_order_create_sidebar'); - $this->setTemplate('sales/order/create/sidebar.phtml'); - } - protected function _prepareLayout() { if ($this->getCustomerId()) { @@ -53,13 +45,7 @@ protected function _prepareLayout() )); $this->setChild('top_button', $button); } - $this->setChild('cart', $this->getLayout()->createBlock('adminhtml/sales_order_create_sidebar_cart')); - $this->setChild('wishlist', $this->getLayout()->createBlock('adminhtml/sales_order_create_sidebar_wishlist')); - $this->setChild('reorder', $this->getLayout()->createBlock('adminhtml/sales_order_create_sidebar_reorder')); - $this->setChild('viewed', $this->getLayout()->createBlock('adminhtml/sales_order_create_sidebar_viewed')); - $this->setChild('compared', $this->getLayout()->createBlock('adminhtml/sales_order_create_sidebar_compared')); - $this->setChild('pcompared', $this->getLayout()->createBlock('adminhtml/sales_order_create_sidebar_pcompared')); - $this->setChild('pviewed', $this->getLayout()->createBlock('adminhtml/sales_order_create_sidebar_pviewed')); + if ($this->getCustomerId()) { $button = clone $button; $button->unsId(); diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Abstract.php index d99c3450f1..55870e8c5c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Abstract.php @@ -35,12 +35,6 @@ class Mage_Adminhtml_Block_Sales_Order_Create_Sidebar_Abstract extends Mage_Admi { protected $_sidebarStorageAction = 'add'; - public function __construct() - { - parent::__construct(); - $this->setTemplate('sales/order/create/sidebar/items.phtml'); - } - /** * Return name of sidebar storage action * diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Compared.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Compared.php index 8e42948d13..2a0dffe6ff 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Compared.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Compared.php @@ -60,7 +60,7 @@ public function getItemCollection() $collection = $collection->getItemCollection() ->useProductItem(true) ->setStoreId($this->getQuote()->getStoreId()) - ->setStoreId($this->getStoreId()) + ->addStoreFilter($this->getQuote()->getStoreId()) ->setCustomerId($this->getCustomerId()) ->addAttributeToSelect('name') ->addAttributeToSelect('price') diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Pcompared.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Pcompared.php index bbfe1d7bbc..9c0ec3cd5f 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Pcompared.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Pcompared.php @@ -70,6 +70,8 @@ public function getItemCollection() // prepare products collection and apply visitors log to it $productCollection = Mage::getModel('catalog/product')->getCollection() + ->setStoreId($this->getQuote()->getStoreId()) + ->addStoreFilter($this->getQuote()->getStoreId()) ->addAttributeToSelect('name') ->addAttributeToSelect('price') ->addAttributeToSelect('small_image'); diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Pviewed.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Pviewed.php index a8903feccf..7e160b4e33 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Pviewed.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Pviewed.php @@ -75,6 +75,7 @@ public function getItemCollection() $productCollection = Mage::getModel('catalog/product') ->getCollection() ->setStoreId($this->getQuote()->getStoreId()) + ->addStoreFilter($this->getQuote()->getStoreId()) ->addAttributeToSelect('name') ->addAttributeToSelect('price') ->addAttributeToSelect('small_image') diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Reorder.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Reorder.php index 2de2ab80f5..72428b1b73 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Reorder.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar/Reorder.php @@ -49,21 +49,25 @@ public function getHeaderText() return Mage::helper('sales')->__('Last ordered items'); } + /** + * Retrieve last order on current website + * + * @return Mage_Sales_Model_Order|false + */ public function getLastOrder() { - $orders = Mage::getResourceModel('sales/order_collection') + $storeIds = $this->getQuote()->getStore()->getWebsite()->getStoreIds(); + $collection = Mage::getResourceModel('sales/order_collection') ->addAttributeToSelect('*') ->addAttributeToFilter('customer_id', $this->getCustomerId()) + ->addAttributeToFilter('store_id', array('in' => $storeIds)) ->addAttributeToSort('created_at', 'desc') + ->setPage(1, 1) ->load(); - if (!$orders->getSize()) { - return false; - } - - foreach ($orders as $order) { - $order = Mage::getModel('sales/order')->load($order->getId()); + foreach ($collection as $order) { return $order; } + return false; } /** diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Store.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Store.php index 59d291a7b9..e9f5953d6c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Store.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Store.php @@ -41,12 +41,6 @@ public function __construct() $this->setId('sales_order_create_store'); } - protected function _prepareLayout() - { - $this->setChild('select', $this->getLayout()->createBlock('adminhtml/sales_order_create_store_select')); - return parent::_prepareLayout(); - } - public function getHeaderText() { return Mage::helper('sales')->__('Please select a store'); diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Store/Select.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Store/Select.php index c057cfe168..d42b4e9f0c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Store/Select.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Store/Select.php @@ -36,6 +36,5 @@ public function __construct() { parent::__construct(); $this->setId('sc_store_select'); - $this->setTemplate('sales/order/create/store/select.phtml'); } } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Totals.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Totals.php index e9363a3aa2..04333ca3be 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Totals.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Totals.php @@ -41,7 +41,6 @@ public function __construct() { parent::__construct(); $this->setId('sales_order_create_totals'); - $this->setTemplate('sales/order/create/totals.phtml'); } public function getTotals() diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Totals/Table.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Totals/Table.php index 9dc8ede3b5..6d69b22104 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Totals/Table.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Totals/Table.php @@ -41,7 +41,6 @@ public function __construct() { parent::__construct(); $this->setId('sales_order_create_totals_table'); - $this->setTemplate('sales/order/create/totals/table.phtml'); } } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Creditmemo/Create/Items.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Creditmemo/Create/Items.php index 6858209b35..c50e45035c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Creditmemo/Create/Items.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Creditmemo/Create/Items.php @@ -128,11 +128,11 @@ public function getOrderTotalbarData() { $totalbarData = array(); $this->setPriceDataObject($this->getOrder()); - $totalbarData[] = array(Mage::helper('sales')->__('Paid Amount'), $this->displayPriceAttribute('base_total_invoiced'), false); - $totalbarData[] = array(Mage::helper('sales')->__('Refund Amount'), $this->displayPriceAttribute('base_total_refunded'), false); - $totalbarData[] = array(Mage::helper('sales')->__('Shipping Amount'), $this->displayPriceAttribute('base_shipping_invoiced'), false); - $totalbarData[] = array(Mage::helper('sales')->__('Shipping Refund'), $this->displayPriceAttribute('base_shipping_refunded'), false); - $totalbarData[] = array(Mage::helper('sales')->__('Order Grand Total'), $this->displayPriceAttribute('base_grand_total'), true); + $totalbarData[] = array(Mage::helper('sales')->__('Paid Amount'), $this->displayPriceAttribute('total_invoiced'), false); + $totalbarData[] = array(Mage::helper('sales')->__('Refund Amount'), $this->displayPriceAttribute('total_refunded'), false); + $totalbarData[] = array(Mage::helper('sales')->__('Shipping Amount'), $this->displayPriceAttribute('shipping_invoiced'), false); + $totalbarData[] = array(Mage::helper('sales')->__('Shipping Refund'), $this->displayPriceAttribute('shipping_refunded'), false); + $totalbarData[] = array(Mage::helper('sales')->__('Order Grand Total'), $this->displayPriceAttribute('grand_total'), true); return $totalbarData; } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create.php index f4101064f4..34b5d918a7 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create.php @@ -65,7 +65,13 @@ public function getInvoice() public function getHeaderText() { - $header = Mage::helper('sales')->__('New Invoice for Order #%s', + if ($this->getInvoice()->getOrder()->getForcedDoShipmentWithInvoice()) { + $_label = ' and Shipment'; + } else { + $_label = ''; + } + $header = Mage::helper('sales')->__('New Invoice%s for Order #%s', + $_label, $this->getInvoice()->getOrder()->getRealOrderId() ); /*$header = Mage::helper('sales')->__('New Invoice for Order #%s | Order Date: %s | Customer Name: %s', diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create/Form.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create/Form.php index 3d5024932a..60fc8658d8 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create/Form.php @@ -119,4 +119,14 @@ public function canShipPartiallyItem() } return true; } + + /** + * Return forced creating of shipment flag + * + * @return integer + */ + public function getForcedShipmentCreate() + { + return (int) $this->getOrder()->getForcedDoShipmentWithInvoice(); + } } \ No newline at end of file diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create/Items.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create/Items.php index 007659eeb9..c0239aafce 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create/Items.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/Create/Items.php @@ -34,6 +34,8 @@ class Mage_Adminhtml_Block_Sales_Order_Invoice_Create_Items extends Mage_Adminhtml_Block_Sales_Items_Abstract { + protected $_disableSubmitButton = false; + /** * Prepare child blocks * @@ -50,19 +52,39 @@ protected function _beforeToHtml() 'onclick' => $onclick, )) ); - + $this->_disableSubmitButton = true; + $_submitButtonClass = ' disabled'; + foreach ($this->getInvoice()->getAllItems() as $item) { + if ($item->getQty() || $this->getSource()->getData('base_grand_total')) { + $this->_disableSubmitButton = false; + $_submitButtonClass = ''; + break; + } + } + $_submitLabel = $this->getOrder()->getForcedDoShipmentWithInvoice()?'Submit Invoice and Shipment':'Submit Invoice'; $this->setChild( 'submit_button', $this->getLayout()->createBlock('adminhtml/widget_button')->setData(array( - 'label' => Mage::helper('sales')->__('Submit Invoice'), - 'class' => 'save submit-button', + 'label' => Mage::helper('sales')->__('%s', $_submitLabel), + 'class' => 'save submit-button' . $_submitButtonClass, 'onclick' => '$(\'edit_form\').submit()', + 'disabled' => $this->_disableSubmitButton )) ); return parent::_prepareLayout(); } + /** + * Get is submit button disabled or not + * + * @return boolean + */ + public function getDisableSubmitButton() + { + return $this->_disableSubmitButton; + } + /** * Retrieve invoice order * @@ -86,7 +108,7 @@ public function getSource() /** * Retrieve invoice model instance * - * @return Mage_Sales_Model_Invoice + * @return Mage_Sales_Model_Order_Invoice */ public function getInvoice() { diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/View.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/View.php index a493009f6d..c3a8e754b5 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/View.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Invoice/View.php @@ -54,13 +54,17 @@ public function __construct() ); } - if ($this->getInvoice()->getOrder()->canCreditmemo() && !$this->getInvoice()->getIsUsedForRefund()) { - $this->_addButton('capture', array( - 'label' => Mage::helper('sales')->__('Credit Memo'), - 'class' => 'save', - 'onclick' => 'setLocation(\''.$this->getCreditMemoUrl().'\')' - ) - ); + if ($this->getInvoice()->getOrder()->canCreditmemo()) { + if ($this->getInvoice()->getOrder()->getPayment()->canRefundPartialPerInvoice() + || !$this->getInvoice()->getIsUsedForRefund()) + { + $this->_addButton('capture', array( + 'label' => Mage::helper('sales')->__('Credit Memo'), + 'class' => 'save', + 'onclick' => 'setLocation(\''.$this->getCreditMemoUrl().'\')' + ) + ); + } } if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/capture') diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/Create.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/Create.php index 383f244bd2..f1916d7dc6 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/Create.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/Create.php @@ -59,8 +59,7 @@ public function getShipment() public function getHeaderText() { - $header = Mage::helper('sales') - ->__('New Shipment for Order #%s', $this->getShipment()->getOrder()->getRealOrderId()); + $header = Mage::helper('sales')->__('New Shipment for Order #%s', $this->getShipment()->getOrder()->getRealOrderId()); return $header; } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/View.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/View.php index d719b6d78a..3ac1eafd64 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/View.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Shipment/View.php @@ -76,8 +76,7 @@ public function getHeaderText() $emailSent = Mage::helper('sales')->__('Shipment email not sent'); } - $header = Mage::helper('sales') - ->__('Shipment #%s (%s)', $this->getShipment()->getIncrementId(), $emailSent); + $header = Mage::helper('sales')->__('Shipment #%s (%s)', $this->getShipment()->getIncrementId(), $emailSent); return $header; } diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php index cf75fcb5e1..0da3ca7258 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php @@ -100,13 +100,15 @@ public function __construct() } if ($this->_isAllowedAction('invoice') && $this->getOrder()->canInvoice()) { + $_label = $this->getOrder()->getForcedDoShipmentWithInvoice()?'Invoice and Ship':'Invoice'; $this->_addButton('order_invoice', array( - 'label' => Mage::helper('sales')->__('Invoice'), + 'label' => Mage::helper('sales')->__('%s', $_label), 'onclick' => 'setLocation(\'' . $this->getInvoiceUrl() . '\')', )); } - if ($this->_isAllowedAction('ship') && $this->getOrder()->canShip()) { + if ($this->_isAllowedAction('ship') && $this->getOrder()->canShip() + && !$this->getOrder()->getForcedDoShipmentWithInvoice()) { $this->_addButton('order_ship', array( 'label' => Mage::helper('sales')->__('Ship'), 'onclick' => 'setLocation(\'' . $this->getShipUrl() . '\')', @@ -143,8 +145,14 @@ public function getOrderId() public function getHeaderText() { - $text = Mage::helper('sales')->__('Order # %s | Order Date %s', + if ($_extOrderId = $this->getOrder()->getExtOrderId()) { + $_extOrderId = '[' . $_extOrderId . '] '; + } else { + $_extOrderId = ''; + } + $text = Mage::helper('sales')->__('Order # %s %s| Order Date %s', $this->getOrder()->getRealOrderId(), + $_extOrderId, $this->formatDate($this->getOrder()->getCreatedAtDate(), 'medium', true) ); return $text; diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/History.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/History.php index d48970b491..f25ee20f51 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/History.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/History.php @@ -70,11 +70,12 @@ public function getOrder() public function canAddComment() { - return Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/comment'); + return Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/comment') && + $this->getOrder()->canComment(); } public function getSubmitUrl() { return $this->getUrl('*/*/addComment', array('order_id'=>$this->getOrder()->getId())); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Info.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Info.php index c01636af97..b57442a6e6 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Info.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Info.php @@ -76,6 +76,14 @@ public function getCustomerGroupName() return null; } + public function getCustomerViewUrl() + { + if ($this->getOrder()->getCustomerIsGuest()) { + return false; + } + return $this->getUrl('*/customer/edit', array('id' => $this->getOrder()->getCustomerId())); + } + public function getViewUrl($orderId) { return $this->getUrl('*/sales_order/view', array('order_id'=>$orderId)); diff --git a/app/code/core/Mage/Adminhtml/Block/Store/Switcher.php b/app/code/core/Mage/Adminhtml/Block/Store/Switcher.php index a849dcd179..7d4d1d1692 100644 --- a/app/code/core/Mage/Adminhtml/Block/Store/Switcher.php +++ b/app/code/core/Mage/Adminhtml/Block/Store/Switcher.php @@ -33,8 +33,16 @@ */ class Mage_Adminhtml_Block_Store_Switcher extends Mage_Adminhtml_Block_Template { + /** + * @var array + */ protected $_storeIds; + /** + * @var bool + */ + protected $_hasDefaultOption = true; + public function __construct() { parent::__construct(); @@ -44,6 +52,9 @@ public function __construct() $this->setDefaultStoreName($this->__('All Store Views')); } + /** + * Deprecated + */ public function getWebsiteCollection() { $collection = Mage::getModel('core/website')->getResourceCollection(); @@ -56,6 +67,27 @@ public function getWebsiteCollection() return $collection->load(); } + /** + * Get websites + * + * @return array + */ + public function getWebsites() + { + $websites = Mage::app()->getWebsites(); + if ($websiteIds = $this->getWebsiteIds()) { + foreach ($websites as $websiteId => $website) { + if (!in_array($websiteId, $websiteIds)) { + unset($websites[$websiteId]); + } + } + } + return $websites; + } + + /** + * Deprecated + */ public function getGroupCollection($website) { if (!$website instanceof Mage_Core_Model_Website) { @@ -64,6 +96,23 @@ public function getGroupCollection($website) return $website->getGroupCollection(); } + /** + * Get store groups for specified website + * + * @param Mage_Core_Model_Website $website + * @return array + */ + public function getStoreGroups($website) + { + if (!$website instanceof Mage_Core_Model_Website) { + $website = Mage::app()->getWebsite($website); + } + return $website->getGroups(); + } + + /** + * Deprecated + */ public function getStoreCollection($group) { if (!$group instanceof Mage_Core_Model_Store_Group) { @@ -77,12 +126,34 @@ public function getStoreCollection($group) return $stores; } + /** + * Get store views for specified store group + * + * @param Mage_Core_Model_Store_Group $group + * @return array + */ + public function getStores($group) + { + if (!$group instanceof Mage_Core_Model_Store_Group) { + $group = Mage::app()->getGroup($group); + } + $stores = $group->getStores(); + if ($storeIds = $this->getStoreIds()) { + foreach ($stores as $storeId => $store) { + if (!in_array($storeId, $storeIds)) { + unset($stores[$storeId]); + } + } + } + return $stores; + } + public function getSwitchUrl() { if ($url = $this->getData('switch_url')) { return $url; } - return $this->getUrl('*/*/*', array('_current'=>true, 'store'=>null)); + return $this->getUrl('*/*/*', array('_current' => true, 'store' => null)); } public function getStoreId() @@ -113,4 +184,18 @@ protected function _toHtml() } return ''; } -} \ No newline at end of file + + /** + * Set/Get whether the switcher should show default option + * + * @param bool $hasDefaultOption + * @return bool + */ + public function hasDefaultOption($hasDefaultOption = null) + { + if (null !== $hasDefaultOption) { + $this->_hasDefaultOption = $hasDefaultOption; + } + return $this->_hasDefaultOption; + } +} diff --git a/app/code/core/Mage/Adminhtml/Block/System/Cache/Edit.php b/app/code/core/Mage/Adminhtml/Block/System/Cache/Edit.php index 89333db0ed..be2e1cf7f9 100644 --- a/app/code/core/Mage/Adminhtml/Block/System/Cache/Edit.php +++ b/app/code/core/Mage/Adminhtml/Block/System/Cache/Edit.php @@ -153,6 +153,15 @@ public function getCatalogData() ) ), ), + 'rebuild_catalog_index' => array( + 'label' => Mage::helper('adminhtml')->__('Rebuild Catalog Index'), + 'buttons' => array( + array( + 'name' => 'rebuild_catalog_index', + 'action' => Mage::helper('adminhtml')->__('Rebuild'), + ) + ), + ), 'rebuild_flat_catalog_category' => array( 'label' => Mage::helper('adminhtml')->__('Rebuild Flat Catalog Category'), 'buttons' => array( diff --git a/app/code/core/Mage/Adminhtml/Block/System/Cache/Form.php b/app/code/core/Mage/Adminhtml/Block/System/Cache/Form.php index 8dbe48bb95..0ba5906ceb 100644 --- a/app/code/core/Mage/Adminhtml/Block/System/Cache/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/System/Cache/Form.php @@ -62,7 +62,7 @@ public function initForm() foreach (Mage::helper('core')->getCacheTypes() as $type=>$label) { $fieldset->addField('enable_'.$type, 'checkbox', array( 'name'=>'enable['.$type.']', - 'label'=>$label, + 'label'=>Mage::helper('adminhtml')->__($label), 'value'=>1, 'checked'=>(int)Mage::app()->useCache($type), //'options'=>$options, @@ -76,7 +76,7 @@ public function initForm() foreach (Mage::helper('core')->getCacheBetaTypes() as $type=>$label) { $fieldset->addField('beta_enable_'.$type, 'checkbox', array( 'name'=>'beta['.$type.']', - 'label'=>$label, + 'label'=>Mage::helper('adminhtml')->__($label), 'value'=>1, 'checked'=>(int)Mage::app()->useCache($type), )); diff --git a/app/code/core/Mage/Adminhtml/Block/System/Config/Form.php b/app/code/core/Mage/Adminhtml/Block/System/Config/Form.php index d313ce00cf..8f1bc6b8c7 100644 --- a/app/code/core/Mage/Adminhtml/Block/System/Config/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/System/Config/Form.php @@ -209,7 +209,6 @@ public function initFields($fieldset, $group, $section, $fieldPrefix='', $labelP usort($elements, array($this, '_sortForm')); foreach ($elements as $e) { - if (!$this->_canShowField($e)) { continue; } @@ -246,7 +245,6 @@ public function initFields($fieldset, $group, $section, $fieldPrefix='', $labelP $model->setPath($path)->setValue($data)->afterLoad(); $data = $model->getValue(); } - $field = $fieldset->addField($id, $fieldType, array( 'name' => $name, 'label' => $label, @@ -260,6 +258,11 @@ public function initFields($fieldset, $group, $section, $fieldPrefix='', $labelP 'can_use_default_value' => $this->canUseDefaultValue((int)$e->show_in_default), 'can_use_website_value' => $this->canUseWebsiteValue((int)$e->show_in_website), )); + + if (isset($e->validate)) { + $field->addClass($e->validate); + } + if (isset($e->frontend_type) && 'multiselect' === (string)$e->frontend_type && isset($e->can_be_empty)) { $field->setCanBeEmpty(true); } diff --git a/app/code/core/Mage/Adminhtml/Block/System/Store/Edit.php b/app/code/core/Mage/Adminhtml/Block/System/Store/Edit.php index 4e16aab85e..9a93fa9670 100644 --- a/app/code/core/Mage/Adminhtml/Block/System/Store/Edit.php +++ b/app/code/core/Mage/Adminhtml/Block/System/Store/Edit.php @@ -71,6 +71,9 @@ public function __construct() if (!Mage::registry('store_data')->isCanDelete()) { $this->_removeButton('delete'); } + if (Mage::registry('store_data')->isReadOnly()) { + $this->_removeButton('save')->_removeButton('reset'); + } } /** diff --git a/app/code/core/Mage/Adminhtml/Block/System/Store/Edit/Form.php b/app/code/core/Mage/Adminhtml/Block/System/Store/Edit/Form.php index 10b09a42ab..1d590f9d09 100644 --- a/app/code/core/Mage/Adminhtml/Block/System/Store/Edit/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/System/Store/Edit/Form.php @@ -88,21 +88,24 @@ protected function _prepareForm() 'name' => 'website[name]', 'label' => Mage::helper('core')->__('Name'), 'value' => $websiteModel->getName(), - 'required' => true + 'required' => true, + 'disabled' => $websiteModel->isReadOnly(), )); $fieldset->addField('website_code', 'text', array( 'name' => 'website[code]', 'label' => Mage::helper('core')->__('Code'), 'value' => $websiteModel->getCode(), - 'required' => true + 'required' => true, + 'disabled' => $websiteModel->isReadOnly(), )); $fieldset->addField('website_sort_order', 'text', array( 'name' => 'website[sort_order]', 'label' => Mage::helper('core')->__('Sort order'), 'value' => $websiteModel->getSortOrder(), - 'required' => false + 'required' => false, + 'disabled' => $websiteModel->isReadOnly(), )); if (Mage::registry('store_action') == 'edit') { @@ -113,7 +116,8 @@ protected function _prepareForm() 'label' => Mage::helper('core')->__('Default Store'), 'value' => $websiteModel->getDefaultGroupId(), 'values' => $groups, - 'required' => false + 'required' => false, + 'disabled' => $websiteModel->isReadOnly(), )); } @@ -121,7 +125,8 @@ protected function _prepareForm() $fieldset->addField('is_default', 'checkbox', array( 'name' => 'website[is_default]', 'label' => Mage::helper('core')->__('Set as default'), - 'value' => 1 + 'value' => 1, + 'disabled' => $websiteModel->isReadOnly(), )); } else { @@ -153,7 +158,8 @@ protected function _prepareForm() 'label' => Mage::helper('core')->__('Website'), 'value' => $groupModel->getWebsiteId(), 'values' => $websites, - 'required' => true + 'required' => true, + 'disabled' => $groupModel->isReadOnly(), )); if ($groupModel->getId() && $groupModel->getWebsite()->getDefaultGroupId() == $groupModel->getId()) { @@ -180,7 +186,8 @@ protected function _prepareForm() 'name' => 'group[name]', 'label' => Mage::helper('core')->__('Name'), 'value' => $groupModel->getName(), - 'required' => true + 'required' => true, + 'disabled' => $groupModel->isReadOnly(), )); $categories = Mage::getModel('adminhtml/system_config_source_category')->toOptionArray(); @@ -190,7 +197,8 @@ protected function _prepareForm() 'label' => Mage::helper('core')->__('Root Category'), 'value' => $groupModel->getRootCategoryId(), 'values' => $categories, - 'required' => true + 'required' => true, + 'disabled' => $groupModel->isReadOnly(), )); if (Mage::registry('store_action') == 'edit') { @@ -201,7 +209,8 @@ protected function _prepareForm() 'label' => Mage::helper('core')->__('Default Store View'), 'value' => $groupModel->getDefaultStoreId(), 'values' => $stores, - 'required' => false + 'required' => false, + 'disabled' => $groupModel->isReadOnly(), )); } @@ -239,7 +248,8 @@ protected function _prepareForm() 'label' => Mage::helper('core')->__('Store'), 'value' => $storeModel->getGroupId(), 'values' => $groups, - 'required' => true + 'required' => true, + 'disabled' => $storeModel->isReadOnly(), )); if ($storeModel->getId() && $storeModel->getGroup()->getDefaultStoreId() == $storeModel->getId()) { if ($storeModel->getGroup() && $storeModel->getGroup()->getStoresCount() > 1) { @@ -265,13 +275,15 @@ protected function _prepareForm() 'name' => 'store[name]', 'label' => Mage::helper('core')->__('Name'), 'value' => $storeModel->getName(), - 'required' => true + 'required' => true, + 'disabled' => $storeModel->isReadOnly(), )); $fieldset->addField('store_code', 'text', array( 'name' => 'store[code]', 'label' => Mage::helper('core')->__('Code'), 'value' => $storeModel->getCode(), - 'required' => true + 'required' => true, + 'disabled' => $storeModel->isReadOnly(), )); $fieldset->addField('store_is_active', 'select', array( @@ -281,14 +293,16 @@ protected function _prepareForm() 'options' => array( 0 => Mage::helper('adminhtml')->__('Disabled'), 1 => Mage::helper('adminhtml')->__('Enabled')), - 'required' => true + 'required' => true, + 'disabled' => $storeModel->isReadOnly(), )); $fieldset->addField('store_sort_order', 'text', array( 'name' => 'store[sort_order]', 'label' => Mage::helper('core')->__('Sort order'), 'value' => $storeModel->getSortOrder(), - 'required' => false + 'required' => false, + 'disabled' => $storeModel->isReadOnly(), )); $fieldset->addField('store_is_default', 'hidden', array( @@ -300,7 +314,8 @@ protected function _prepareForm() $fieldset->addField('store_store_id', 'hidden', array( 'name' => 'store[store_id]', 'no_span' => true, - 'value' => $storeModel->getId() + 'value' => $storeModel->getId(), + 'disabled' => $storeModel->isReadOnly(), )); } diff --git a/app/code/core/Mage/Adminhtml/Block/Template.php b/app/code/core/Mage/Adminhtml/Block/Template.php index 34ef782974..d7ca2c6184 100644 --- a/app/code/core/Mage/Adminhtml/Block/Template.php +++ b/app/code/core/Mage/Adminhtml/Block/Template.php @@ -52,4 +52,21 @@ public function getFormKey() { return Mage::getSingleton('core/session')->getFormKey(); } + + /** + * Check whether or not the module output is enabled + * + * Because many module blocks belong to Adminhtml module, + * the feature "Disable module output" doesn't cover Admin area + * + * @param string $moduleName Full module name + * @return boolean + */ + public function isOutputEnabled($moduleName = null) + { + if ($moduleName === null) { + $moduleName = $this->getModuleName(); + } + return !Mage::getStoreConfigFlag('advanced/modules_disable_output/' . $moduleName); + } } diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Container.php b/app/code/core/Mage/Adminhtml/Block/Widget/Container.php index 641a7c0034..6669c899d9 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Container.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Container.php @@ -95,6 +95,17 @@ protected function _removeButton($id) return $this; } + /** + * Public wrapper for the _removeButton() method + * + * @param string $id + * @return Mage_Adminhtml_Block_Widget_Container + */ + public function removeButton($id) + { + return $this->_removeButton($id); + } + /** * Update specified button property * @@ -203,4 +214,14 @@ public function hasFooterButtons() return false; } + /** + * Prepare html output + * + * @return string + */ + protected function _toHtml() + { + Mage::dispatchEvent('adminhtml_widget_container_html_before', array('block' => $this)); + return parent::_toHtml(); + } } diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Form.php b/app/code/core/Mage/Adminhtml/Block/Widget/Form.php index 59572f141d..86f66cb3bc 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Form.php @@ -138,9 +138,6 @@ protected function _beforeToHtml() { $this->_prepareForm(); $this->_initFormValues(); - Mage::dispatchEvent('adminhtml_widget_form_before_tohtml', - array('form' => $this->getForm(), 'layout' => $this->getLayout()) - ); return parent::_beforeToHtml(); } diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index 4e3e23b411..b37c891ce8 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -117,8 +117,6 @@ class Mage_Adminhtml_Block_Widget_Grid extends Mage_Adminhtml_Block_Widget */ protected $_filterVisibility = true; - protected $_filterValues = false; - /** * Massage block visibility * @@ -312,7 +310,6 @@ public function getColumns() protected function _setFilterValues($data) { - $this->_filterValues = $data; foreach ($this->getColumns() as $columnId => $column) { if (isset($data[$columnId]) && (!empty($data[$columnId]) || strlen($data[$columnId]) > 0) && $column->getFilter()) { $column->getFilter()->setValue($data[$columnId]); @@ -368,10 +365,6 @@ protected function _prepareCollection() $this->_setFilterValues($this->_defaultFilter); } - Mage::dispatchEvent('adminhtml_widget_grid_filter_collection', - array('collection' => $this->getCollection(), 'filter_values' => $this->_filterValues) - ); - if (isset($this->_columns[$columnId]) && $this->_columns[$columnId]->getIndex()) { $dir = (strtolower($dir)=='desc') ? 'desc' : 'asc'; $this->_columns[$columnId]->setDir($dir); diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Abstract.php index 5933f0d86c..07ea9ce4ab 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Abstract.php @@ -117,9 +117,12 @@ public function renderHeader() public function renderProperty() { $out = ''; - if ($this->getColumn()->getEditable() && !$this->getColumn()->getEditOnly()) { - $out .= ' span="2"'; - } + /** + * Now we generate 2 "col" definition instead span=2 + */ +// if ($this->getColumn()->getEditable() && !$this->getColumn()->getEditOnly()) { +// $out .= ' span="2"'; +// } $width = $this->_defaultWidth; diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Options.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Options.php index 4da8df00d2..381963cc74 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Options.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Options.php @@ -33,15 +33,27 @@ */ class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Options extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Text { + /** + * Render a grid cell as options + * + * @param Varien_Object $row + * @return string + */ public function render(Varien_Object $row) { $options = $this->getColumn()->getOptions(); + $showMissingOptionValues = (bool)$this->getColumn()->getShowMissingOptionValues(); if (!empty($options) && is_array($options)) { $value = $row->getData($this->getColumn()->getIndex()); if (is_array($value)) { $res = array(); foreach ($value as $item) { - $res[] = isset($options[$item]) ? $options[$item] : $item; + if (isset($options[$item])) { + $res[] = $options[$item]; + } + elseif ($showMissingOptionValues) { + $res[] = $item; + } } return implode(', ', $res); } @@ -51,4 +63,4 @@ public function render(Varien_Object $row) return ''; } } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Store.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Store.php index 730b6017a8..505b908849 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Store.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Store.php @@ -51,61 +51,51 @@ protected function _getShowAllStoresLabelFlag() return $this->getColumn()->getData('skipAllStoresLabel')?$this->getColumn()->getData('skipAllStoresLabel'):$this->_skipAllStoresLabel; } + /** + * Render row store views + * + * @param Varien_Object $row + * @return string + */ public function render(Varien_Object $row) { $skipAllStoresLabel = $this->_getShowAllStoresLabelFlag(); $origStores = $row->getData($this->getColumn()->getIndex()); + $showNumericStores = (bool)$this->getColumn()->getShowNumericStores(); $stores = array(); - if (is_array($origStores)) { - foreach ($origStores as $origStore) { - if (is_numeric($origStore) && $origStore == 0) { + if (!is_array($origStores)) { + $origStores = array($origStores); + } + foreach ($origStores as $origStore) { + if (is_numeric($origStore)) { + if (0 == $origStore) { if (!$skipAllStoresLabel) { $stores[] = Mage::helper('adminhtml')->__('All Store Views'); } } - elseif (is_numeric($origStore) && $storeName = $this->_getStoreModel()->getStoreName($origStore)) { + elseif ($storeName = $this->_getStoreModel()->getStoreName($origStore)) { if ($this->getColumn()->getStoreView()) { $store = $this->_getStoreModel()->getStoreNameWithWebsite($origStore); } else { $store = $this->_getStoreModel()->getStoreNamePath($origStore); } $layers = array(); - foreach (explode('/', $store) as $key=>$value) { - $layers[] = str_repeat(" ", $key*3).$value; + foreach (explode('/', $store) as $key => $value) { + $layers[] = str_repeat(" ", $key * 3) . $value; } $stores[] = implode('
', $layers); } - else { + elseif ($showNumericStores) { $stores[] = $origStore; } } - } - else { - if (is_numeric($origStores) && $storeName = $this->_getStoreModel()->getStoreName($origStores)) { - if ($this->getColumn()->getStoreView()) { - $store = $this->_getStoreModel()->getStoreNameWithWebsite($origStores); - } else { - $store = $this->_getStoreModel()->getStoreNamePath($origStores); - } - $layers = array(); - foreach (explode('/', $store) as $key=>$value) { - $layers[] = str_repeat(" ", $key*3).$value; - } - $stores[] = implode('
', $layers); - } - elseif (is_numeric($origStores) && $origStores == 0) { - if (!$skipAllStoresLabel) { - $stores[] = Mage::helper('adminhtml')->__('All Store Views'); - } - } - elseif (is_null($origStores) && $row->getStoreName()) { - return $row->getStoreName() . ' ' . $this->__('[deleted]'); + elseif (is_null($origStore) && $row->getStoreName()) { + $stores[] = $row->getStoreName() . ' ' . $this->__('[deleted]'); } else { - $stores[] = $origStores; + $stores[] = $origStore; } } - return $stores ? join('
', $stores) : ' '; } diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php index 6981bfa1ec..05381dc54f 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php @@ -45,13 +45,11 @@ public function __construct() $this->setTemplate('widget/grid/container.phtml'); - if( $this->_enabledAddNewButton() === true ) { - $this->_addButton('add', array( - 'label' => $this->getAddButtonLabel(), - 'onclick' => 'setLocation(\'' . $this->getCreateUrl() .'\')', - 'class' => 'add', - )); - } + $this->_addButton('add', array( + 'label' => $this->getAddButtonLabel(), + 'onclick' => 'setLocation(\'' . $this->getCreateUrl() .'\')', + 'class' => 'add', + )); } protected function _prepareLayout() @@ -100,9 +98,4 @@ public function getHeaderWidth() { return 'width:50%;'; } - - protected function _enabledAddNewButton() - { - return true; - } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Controller/Action.php b/app/code/core/Mage/Adminhtml/Controller/Action.php index 32df005e11..322582f8df 100644 --- a/app/code/core/Mage/Adminhtml/Controller/Action.php +++ b/app/code/core/Mage/Adminhtml/Controller/Action.php @@ -33,9 +33,15 @@ */ class Mage_Adminhtml_Controller_Action extends Mage_Core_Controller_Varien_Action { - const FLAG_IS_URLS_CHECKED = 'check_url_settings'; + /** + * Array of actions which can be processed without secret key validation + * + * @var array + */ + protected $_publicActions = array(); + /** * Used module name in current adminhtml controller */ @@ -107,11 +113,6 @@ protected function _addJs(Mage_Core_Block_Abstract $block) return $this; } - public function hasAction($action) - { - return true; - } - /** * Controller predispatch method * @@ -126,9 +127,7 @@ public function preDispatch() $this->getLayout()->setArea('adminhtml'); Mage::dispatchEvent('adminhtml_controller_action_predispatch_start', array()); - parent::preDispatch(); - $_isValidFormKey = true; $_isValidSecretKey = true; $_keyErrorMsg = ''; @@ -150,7 +149,7 @@ public function preDispatch() 'message' => $_keyErrorMsg ))); } else { - $this->_redirect('*/index/index'); + $this->_redirect( Mage::getSingleton('admin/session')->getUser()->getStartupPageUrl() ); } return $this; } @@ -345,16 +344,6 @@ protected function _redirect($path, $arguments=array()) protected function _forward($action, $controller = null, $module = null, array $params = null) { $this->_getSession()->setIsUrlNotice($this->getFlag('', self::FLAG_IS_URLS_CHECKED)); - - // Save original values for controller and action included in secret key Urls - $_urlModel = Mage::getSingleton('adminhtml/url'); - if (!$_urlModel->getOriginalControllerName()) { - $_urlModel->setOriginalControllerName($this->getRequest()->getControllerName()); - } - if (!$_urlModel->getOriginalActionName()) { - $_urlModel->setOriginalActionName($this->getRequest()->getActionName()); - } - return parent::_forward($action, $controller, $module, $params); } @@ -370,7 +359,6 @@ public function getUrl($route='', $params=array()) return Mage::helper('adminhtml')->getUrl($route, $params); } - /** * Validate Secret Key * @@ -378,10 +366,12 @@ public function getUrl($route='', $params=array()) */ protected function _validateSecretKey() { - $url = Mage::getSingleton('adminhtml/url'); + if (is_array($this->_publicActions) && in_array($this->getRequest()->getActionName(), $this->_publicActions)) { + return true; + } if (!($secretKey = $this->getRequest()->getParam(Mage_Adminhtml_Model_Url::SECRET_KEY_PARAM_NAME, null)) - || $secretKey != $url->getSecretKey($url->getOriginalControllerName(), $url->getOriginalActionName())) { + || $secretKey != Mage::getSingleton('adminhtml/url')->getSecretKey()) { return false; } return true; diff --git a/app/code/core/Mage/Adminhtml/Helper/Data.php b/app/code/core/Mage/Adminhtml/Helper/Data.php index 354fe4812b..b4f350c8ea 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Data.php +++ b/app/code/core/Mage/Adminhtml/Helper/Data.php @@ -48,13 +48,15 @@ public function setPageHelpUrl($url=null) { if (is_null($url)) { $request = Mage::app()->getRequest(); + $frontModule = $request->getControllerModule(); + if (!$frontModule) { + $frontName = $request->getModuleName(); + $router = Mage::app()->getFrontController()->getRouterByFrontName($frontName); - $frontName = $request->getModuleName(); - $router = Mage::app()->getFrontController()->getRouterByFrontName($frontName); - - $frontModule = $router->getModuleByFrontName($frontName); - if (is_array($frontModule)) { - $frontModule = $frontModule[0]; + $frontModule = $router->getModuleByFrontName($frontName); + if (is_array($frontModule)) { + $frontModule = $frontModule[0]; + } } $url = 'http://www.magentocommerce.com/gethelp/'; $url.= Mage::app()->getLocale()->getLocaleCode().'/'; diff --git a/app/code/core/Mage/Adminhtml/Model/Config.php b/app/code/core/Mage/Adminhtml/Model/Config.php index ce08e9d665..00ce628401 100644 --- a/app/code/core/Mage/Adminhtml/Model/Config.php +++ b/app/code/core/Mage/Adminhtml/Model/Config.php @@ -84,27 +84,8 @@ protected function _initSectionsAndTabs() { $mergeConfig = Mage::getModel('core/config_base'); - $config = Mage::getConfig(); - $modules = $config->getNode('modules')->children(); + $config = Mage::getConfig()->loadModulesConfiguration('system.xml'); - // check if local modules are disabled - $disableLocalModules = (string)$config->getNode('global/disable_local_modules'); - $disableLocalModules = !empty($disableLocalModules) && (('true' === $disableLocalModules) || ('1' === $disableLocalModules)); - - foreach ($modules as $modName=>$module) { - if ($module->is('active')) { - if ($disableLocalModules && ('local' === (string)$module->codePool)) { - continue; - } - - $configFile = $config->getModuleDir('etc', $modName).DS.'system.xml'; - - if ($mergeConfig->loadFile($configFile)) { - $config->extend($mergeConfig, true); - } - } - } - #$config->applyExtends(); $this->_sections = $config->getNode('sections'); $this->_tabs = $config->getNode('tabs'); diff --git a/app/code/core/Mage/Adminhtml/Model/Sales/Order/Create.php b/app/code/core/Mage/Adminhtml/Model/Sales/Order/Create.php index c8ff052b06..2b3692e666 100644 --- a/app/code/core/Mage/Adminhtml/Model/Sales/Order/Create.php +++ b/app/code/core/Mage/Adminhtml/Model/Sales/Order/Create.php @@ -1312,7 +1312,8 @@ protected function _getNewCustomerEmail($customer) $email = $this->getData('account/email'); if (empty($email)) { $host = $this->getSession()->getStore()->getConfig(Mage_Customer_Model_Customer::XML_PATH_DEFAULT_EMAIL_DOMAIN); - $email = $customer->getIncrementId().'@'. $host; + $account = $customer->getIncrementId() ? $customer->getIncrementId() : time(); + $email = $account.'@'. $host; } return $email; } diff --git a/app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Email/Address.php b/app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Email/Address.php new file mode 100644 index 0000000000..a6971421d6 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Email/Address.php @@ -0,0 +1,45 @@ + + */ +class Mage_Adminhtml_Model_System_Config_Backend_Email_Address extends Mage_Core_Model_Config_Data +{ + protected function _beforeSave() + { + $value = $this->getValue(); + if (!Zend_Validate::is($value, 'EmailAddress')) { + Mage::throwException(Mage::helper('adminhtml')->__('Invalid email address "%s"', $value)); + } + return $this; + } +} \ No newline at end of file diff --git a/app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Email/Sender.php b/app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Email/Sender.php new file mode 100644 index 0000000000..8e8e368af8 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Email/Sender.php @@ -0,0 +1,45 @@ + + */ +class Mage_Adminhtml_Model_System_Config_Backend_Email_Sender extends Mage_Core_Model_Config_Data +{ + protected function _beforeSave() + { + $value = $this->getValue(); + if (!preg_match("/^[A-Za-z0-9_\s]+$/", $value)) { + Mage::throwException(Mage::helper('adminhtml')->__('Invalid sender name "%s"', $value)); + } + return $this; + } +} \ No newline at end of file diff --git a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Website.php b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Website.php index 1ba3b4f9ee..7419f9bfb5 100644 --- a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Website.php +++ b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Website.php @@ -33,19 +33,14 @@ public function toOptionArray() { if (!$this->_options) { $this->_options = array(); - foreach (Mage::getConfig()->getNode('websites')->children() as $code=>$config) { - $id = (string)$config->system->website->id; - $name = (string)$config->system->website->name; + foreach (Mage::app()->getWebsites() as $website) { + $id = $website->getId(); + $name = $website->getName(); if ($id!=0) { $this->_options[] = array('value'=>$id, 'label'=>$name); } } } - return $this->_cleanupOptions($this->_options); + return $this->_options; } - - protected function _cleanupOptions($options) - { - return $options; - } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/Model/System/Store.php b/app/code/core/Mage/Adminhtml/Model/System/Store.php index 85b7be37c7..f958984205 100644 --- a/app/code/core/Mage/Adminhtml/Model/System/Store.php +++ b/app/code/core/Mage/Adminhtml/Model/System/Store.php @@ -59,6 +59,11 @@ class Mage_Adminhtml_Model_System_Store extends Varien_Object */ protected $_storeCollection; + /** + * @var bool + */ + private $_isAdminScopeAllowed = true; + /** * Init model * Load Website, Group and Store collections @@ -77,11 +82,7 @@ public function __construct() */ protected function _loadWebsiteCollection() { - $this->_websiteCollection = array(); - foreach (Mage::getModel('core/website')->getCollection() as $website) { - $this->_websiteCollection[$website->getId()] = $website; - } - $this->_cleanupCollection(); + $this->_websiteCollection = Mage::app()->getWebsites(); return $this; } @@ -93,10 +94,11 @@ protected function _loadWebsiteCollection() protected function _loadGroupCollection() { $this->_groupCollection = array(); - foreach (Mage::getModel('core/store_group')->getCollection() as $group) { - $this->_groupCollection[$group->getId()] = $group; + foreach (Mage::app()->getWebsites() as $website) { + foreach ($website->getGroups() as $group) { + $this->_groupCollection[$group->getId()] = $group; + } } - $this->_cleanupCollection(); return $this; } @@ -107,20 +109,11 @@ protected function _loadGroupCollection() */ protected function _loadStoreCollection() { - $this->_storeCollection = array(); - foreach (Mage::getModel('core/store')->getCollection() as $store) { - $this->_storeCollection[$store->getId()] = $store; - } - $this->_cleanupCollection(); + $this->_storeCollection = Mage::app()->getStores(); return $this; } - protected function _cleanupCollection() - { - return $this; - } - - protected function _getDefaultStoreOptions($empty=false, $all=false) + public function getStoreValuesForForm($empty = false, $all = false) { $options = array(); if ($empty) { @@ -129,25 +122,13 @@ protected function _getDefaultStoreOptions($empty=false, $all=false) 'value' => '' ); } - if ($all) { + if ($all && $this->_isAdminScopeAllowed) { $options[] = array( 'label' => Mage::helper('adminhtml')->__('All Store Views'), 'value' => 0 ); } - return $options; - } - - protected function _forceDisableWebsitesAll() - { - return false; - } - - public function getStoreValuesForForm($empty = false, $all = false) - { - $options = $this->_getDefaultStoreOptions($empty, $all); - foreach ($this->_websiteCollection as $website) { $websiteShow = false; foreach ($this->_groupCollection as $group) { @@ -195,7 +176,7 @@ public function getWebsiteValuesForForm($empty = false, $all = false) 'value' => '' ); } - if ($all && !$this->_forceDisableWebsitesAll()) { + if ($all && $this->_isAdminScopeAllowed) { $options[] = array( 'label' => Mage::helper('adminhtml')->__('Admin'), 'value' => 0 @@ -211,28 +192,48 @@ public function getWebsiteValuesForForm($empty = false, $all = false) return $options; } - public function getWebsiteValuesForGridFilter() + /** + * Get websites as id => name associative array + * + * @param bool $withDefault + * @param string $attribute + * @return array + */ + public function getWebsiteOptionHash($withDefault = false, $attribute = 'name') { $options = array(); - foreach ($this->_websiteCollection as $website) { - $options[$website->getId()] = $website->getName(); + foreach (Mage::app()->getWebsites((bool)$withDefault && $this->_isAdminScopeAllowed) as $website) { + $options[$website->getId()] = $website->getDataUsingMethod($attribute); } return $options; } - public function getStoreValuesForGridFilter() + /** + * Get store views as id => name associative array + * + * @param bool $withDefault + * @param string $attribute + * @return array + */ + public function getStoreOptionHash($withDefault = false, $attribute = 'name') { $options = array(); - foreach ($this->_storeCollection as $store) { - $options[$store->getId()] = $store->getName(); + foreach (Mage::app()->getStores((bool)$withDefault && $this->_isAdminScopeAllowed) as $store) { + $options[$store->getId()] = $store->getDataUsingMethod($attribute); } return $options; } - public function getStoreGroupValuesForGridFilter() + /** + * Get store groups as id => name associative array + * + * @param string $attribute + * @return array + */ + public function getStoreGroupOptionHash($attribute = 'name') { foreach ($this->_groupCollection as $group) { - $options[$group->getId()] = $group->getName(); + $options[$group->getId()] = $group->getDataUsingMethod($attribute); } return $options; } @@ -411,4 +412,16 @@ public function getStoreNamePath($storeId) } return $name; } + + /** + * Specify whether to show admin-scope options + * + * @param bool $value + * @return Mage_Adminhtml_Model_System_Store + */ + public function setIsAdminScopeAllowed($value) + { + $this->_isAdminScopeAllowed = (bool)$value; + return $this; + } } diff --git a/app/code/core/Mage/Adminhtml/Model/Url.php b/app/code/core/Mage/Adminhtml/Model/Url.php index e2c8123562..c474df6183 100644 --- a/app/code/core/Mage/Adminhtml/Model/Url.php +++ b/app/code/core/Mage/Adminhtml/Model/Url.php @@ -100,11 +100,13 @@ public function getUrl($routePath=null, $routeParams=null) public function getSecretKey($controller = null, $action = null) { $salt = Mage::getSingleton('core/session')->getFormKey(); + + $p = explode('/', trim($this->getRequest()->getOriginalPathInfo(), '/')); if (!$controller) { - $controller = $this->getRequest()->getControllerName(); + $controller = !empty($p[1]) ? $p[1] : $this->getRequest()->getControllerName(); } if (!$action) { - $action = $this->getRequest()->getActionName(); + $action = !empty($p[2]) ? $p[2] : $this->getRequest()->getActionName(); } $secret = $controller . $action . $salt; diff --git a/app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php b/app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php index dda56170bc..73ec707e44 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Catalog/CategoryController.php @@ -248,7 +248,8 @@ public function saveAction() $category->setAttributeSetId($category->getDefaultAttributeSetId()); - if (isset($data['category_products'])) { + if (isset($data['category_products']) && + !$category->getProductsReadonly()) { $products = array(); parse_str($data['category_products'], $products); $category->setPostedProducts($products); @@ -309,9 +310,13 @@ public function moveAction() $this->getResponse()->setBody("SUCCESS"); } + catch (Mage_Core_Exception $e) { + $this->getResponse()->setBody($e->getMessage()); + } catch (Exception $e){ $this->getResponse()->setBody(Mage::helper('catalog')->__('Category move error')); } + } /** @@ -340,7 +345,7 @@ public function deleteAction() public function gridAction() { - if (!$category = $this->_initCategory()) { + if (!$category = $this->_initCategory(true)) { return; } $this->getResponse()->setBody( @@ -383,4 +388,4 @@ protected function _isAllowed() { return Mage::getSingleton('admin/session')->isAllowed('catalog/categories'); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/controllers/Catalog/Product/Action/AttributeController.php b/app/code/core/Mage/Adminhtml/controllers/Catalog/Product/Action/AttributeController.php index b5433aeb2b..2c8cfd6abc 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Catalog/Product/Action/AttributeController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Catalog/Product/Action/AttributeController.php @@ -63,6 +63,13 @@ public function saveAction() $websiteRemoveData = $this->getRequest()->getParam('remove_website_ids', array()); $websiteAddData = $this->getRequest()->getParam('add_website_ids', array()); + /* Prepare inventory data item options (use config settings) */ + foreach (Mage::helper('cataloginventory')->getConfigItemOptions() as $option) { + if (isset($inventoryData[$option]) && !isset($inventoryData['use_config_' . $option])) { + $inventoryData['use_config_' . $option] = 0; + } + } + try { if ($attributesData) { $product = Mage::getModel('catalog/product'); diff --git a/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php b/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php index 9318dfd41c..ecac02e5b0 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php @@ -103,6 +103,8 @@ protected function _initProduct() /* @var $attribute Mage_Catalog_Model_Resource_Eav_Attribute */ if(!$attribute->getIsUnique() && $attribute->getFrontend()->getInputType()!='gallery' + && $attribute->getAttributeCode() != 'required_options' + && $attribute->getAttributeCode() != 'has_options' && $attribute->getAttributeCode() != $configProduct->getIdFieldName()) { $data[$attribute->getAttributeCode()] = $configProduct->getData($attribute->getAttributeCode()); } @@ -112,6 +114,8 @@ protected function _initProduct() ->setWebsiteIds($configProduct->getWebsiteIds()); } + $product->setData('_edit_mode', true); + Mage::register('product', $product); Mage::register('current_product', $product); return $product; @@ -213,7 +217,7 @@ public function editAction() if (!Mage::app()->isSingleStoreMode() && ($switchBlock = $this->getLayout()->getBlock('store_switcher'))) { $switchBlock->setDefaultStoreName($this->__('Default Values')) ->setWebsiteIds($product->getWebsiteIds()) - ->setSwitchUrl($this->getUrl('*/*/*', array('_current'=>true, 'active_tab'=>null, 'store'=>null))); + ->setSwitchUrl($this->getUrl('*/*/*', array('_current'=>true, 'active_tab'=>null, 'tab' => null, 'store'=>null))); } $this->getLayout()->getBlock('head')->setCanLoadExtJs(true); @@ -387,6 +391,10 @@ public function bundlesAction() ); } + /** + * Validate product + * + */ public function validateAction() { $response = new Varien_Object(); @@ -397,8 +405,20 @@ public function validateAction() if ($productData && !isset($productData['stock_data']['use_config_manage_stock'])) { $productData['stock_data']['use_config_manage_stock'] = 0; } - $product = Mage::getModel('catalog/product') - ->setId($this->getRequest()->getParam('id')) + $product = Mage::getModel('catalog/product'); + if ($storeId = $this->getRequest()->getParam('store_id')) { + $product->setStoreId($storeId); + } + if ($setId = $this->getRequest()->getParam('set')) { + $product->setAttributeSetId($setId); + } + if ($typeId = $this->getRequest()->getParam('type')) { + $product->setTypeId($typeId); + } + if ($productId = $this->getRequest()->getParam('id')) { + $product->load($productId); + } + $product ->addData($productData) ->validate(); } @@ -435,7 +455,18 @@ protected function _initProductSave() $productData['website_ids'] = array(); } + $wasLockedMedia = false; + if ($product->isLockedAttribute('media')) { + $product->unlockAttribute('media'); + $wasLockedMedia = true; + } + $product->addData($productData); + + if ($wasLockedMedia) { + $product->lockAttribute('media'); + } + if (Mage::app()->isSingleStoreMode()) { $product->setWebsiteIds(array(Mage::app()->getStore(true)->getWebsite()->getId())); } @@ -452,16 +483,16 @@ protected function _initProductSave() * Init product links data (related, upsell, crosssel) */ $links = $this->getRequest()->getPost('links'); - if (isset($links['related'])) { + if (isset($links['related']) && !$product->getRelatedReadonly()) { $product->setRelatedLinkData($this->_decodeInput($links['related'])); } - if (isset($links['upsell'])) { + if (isset($links['upsell']) && !$product->getUpsellReadonly()) { $product->setUpSellLinkData($this->_decodeInput($links['upsell'])); } - if (isset($links['crosssell'])) { + if (isset($links['crosssell']) && !$product->getCrosssellReadonly()) { $product->setCrossSellLinkData($this->_decodeInput($links['crosssell'])); } - if (isset($links['grouped'])) { + if (isset($links['grouped']) && !$product->getGroupedReadonly()) { $product->setGroupedLinkData($this->_decodeInput($links['grouped'])); } @@ -479,21 +510,23 @@ protected function _initProductSave() /** * Initialize data for configurable product */ - if ($data = $this->getRequest()->getPost('configurable_products_data')) { + if (($data = $this->getRequest()->getPost('configurable_products_data')) && !$product->getConfigurableReadonly()) { $product->setConfigurableProductsData(Zend_Json::decode($data)); } - if ($data = $this->getRequest()->getPost('configurable_attributes_data')) { + if (($data = $this->getRequest()->getPost('configurable_attributes_data')) && !$product->getConfigurableReadonly()) { $product->setConfigurableAttributesData(Zend_Json::decode($data)); } - $product->setCanSaveConfigurableAttributes((bool)$this->getRequest()->getPost('affect_configurable_product_attributes')); + + $product->setCanSaveConfigurableAttributes((bool)$this->getRequest()->getPost('affect_configurable_product_attributes') && !$product->getConfigurableReadonly()); /** * Initialize product options */ - if (isset($productData['options'])) { + if (isset($productData['options']) && !$product->getOptionsReadonly()) { $product->setProductOptions($productData['options']); } - $product->setCanSaveCustomOptions((bool)$this->getRequest()->getPost('affect_product_custom_options')); + + $product->setCanSaveCustomOptions((bool)$this->getRequest()->getPost('affect_product_custom_options') && !$product->getOptionsReadonly()); Mage::dispatchEvent('catalog_product_prepare_save', array('product' => $product, 'request' => $this->getRequest())); @@ -621,7 +654,7 @@ public function deleteAction() $product->delete(); $this->_getSession()->addSuccess($this->__('Product deleted')); } - catch (Exception $e){ + catch (Exception $e) { $this->_getSession()->addError($e->getMessage()); } } @@ -864,4 +897,4 @@ protected function _isAllowed() return Mage::getSingleton('admin/session')->isAllowed('catalog/products'); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/controllers/Cms/PageController.php b/app/code/core/Mage/Adminhtml/controllers/Cms/PageController.php index d09e2730bb..90a0ea6e30 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Cms/PageController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Cms/PageController.php @@ -105,7 +105,7 @@ public function editAction() ->_addLeft($this->getLayout()->createBlock('adminhtml/cms_page_edit_tabs')); if (Mage::app()->getConfig()->getModuleConfig('Mage_GoogleOptimizer')->is('active', true) - && Mage::helper('googleoptimizer')->isOptimizerActive()) { + && Mage::helper('googleoptimizer')->isOptimizerActiveForCms()) { $this->_addJs($this->getLayout()->createBlock('googleoptimizer/js')->setTemplate('googleoptimizer/js.phtml')); } $this->renderLayout(); diff --git a/app/code/core/Mage/Adminhtml/controllers/CustomerController.php b/app/code/core/Mage/Adminhtml/controllers/CustomerController.php index 9cc40c8746..9fd89d8fc1 100644 --- a/app/code/core/Mage/Adminhtml/controllers/CustomerController.php +++ b/app/code/core/Mage/Adminhtml/controllers/CustomerController.php @@ -527,9 +527,11 @@ public function massDeleteAction() Mage::getSingleton('adminhtml/session')->addError(Mage::helper('adminhtml')->__('Please select customer(s)')); } else { try { + $customer = Mage::getModel('customer/customer'); foreach ($customersIds as $customerId) { - $customer = Mage::getModel('customer/customer')->load($customerId); - $customer->delete(); + $customer->reset() + ->load($customerId) + ->delete(); } Mage::getSingleton('adminhtml/session')->addSuccess( Mage::helper('adminhtml')->__( diff --git a/app/code/core/Mage/Adminhtml/controllers/Newsletter/QueueController.php b/app/code/core/Mage/Adminhtml/controllers/Newsletter/QueueController.php index 55d2d05c02..53a242e9e0 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Newsletter/QueueController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Newsletter/QueueController.php @@ -156,6 +156,7 @@ public function editAction() $queue = Mage::getSingleton('newsletter/queue') ->load($this->getRequest()->getParam('id')); + Mage::register('current_queue', $queue); $this->loadLayout(); diff --git a/app/code/core/Mage/Adminhtml/controllers/Newsletter/TemplateController.php b/app/code/core/Mage/Adminhtml/controllers/Newsletter/TemplateController.php index c77d486fe1..3084629c3a 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Newsletter/TemplateController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Newsletter/TemplateController.php @@ -20,74 +20,111 @@ * * @category Mage * @package Mage_Adminhtml - * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com) + * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ - /** - * Newsletter admin controller + * Manage Newsletter Template Controller * * @category Mage * @package Mage_Adminhtml - * @author Magento Core Team + * @author Magento Core Team */ class Mage_Adminhtml_Newsletter_TemplateController extends Mage_Adminhtml_Controller_Action { - public function indexAction() + /** + * View Templates list + * + */ + public function indexAction () { if ($this->getRequest()->getQuery('ajax')) { $this->_forward('grid'); return; } - - $this->loadLayout(); + $this->loadLayout(); $this->_setActiveMenu('newsletter/template'); - $this->_addBreadcrumb(Mage::helper('newsletter')->__('Newsletter Templates'), Mage::helper('newsletter')->__('Newsletter Templates')); - + $this->_addBreadcrumb(Mage::helper('newsletter')->__('Newsletter Templates'), Mage::helper('newsletter')->__('Newsletter Templates')); $this->_addContent($this->getLayout()->createBlock('adminhtml/newsletter_template', 'template')); $this->renderLayout(); } - public function gridAction() + /** + * JSON Grid Action + * + */ + public function gridAction () { - $this->getResponse()->setBody($this->getLayout()->createBlock('adminhtml/newsletter_template_grid')->toHtml()); + $this->loadLayout(); + $grid = $this->getLayout()->createBlock('adminhtml/newsletter_template_grid') + ->toHtml(); + $this->getResponse()->setBody($grid); } + /** + * Create new Nesletter Template + * + */ + public function newAction () + { + $this->_forward('edit'); + } - - public function newAction() + /** + * Edit Newsletter Template + * + */ + public function editAction () { + $model = Mage::getModel('newsletter/template'); + if ($id = $this->getRequest()->getParam('id')) { + $model->load($id); + } + + Mage::register('_current_template', $model); + $this->loadLayout(); $this->_setActiveMenu('newsletter/template'); - $this->_addBreadcrumb(Mage::helper('newsletter')->__('Newsletter Templates'), Mage::helper('newsletter')->__('Newsletter Templates'), $this->getUrl('*/*')); - if ($this->getRequest()->getParam('id')) { - $this->_addBreadcrumb(Mage::helper('newsletter')->__('Edit Template'), Mage::helper('newsletter')->__('Edit Newsletter Template')); - } else { - $this->_addBreadcrumb(Mage::helper('newsletter')->__('New Template'), Mage::helper('newsletter')->__('Create Newsletter Template')); + if ($model->getId()) { + $breadcrumbTitle = Mage::helper('newsletter')->__('Edit Template'); + $breadcrumbLabel = $breadcrumbTitle; + } + else { + $breadcrumbTitle = Mage::helper('newsletter')->__('New Template'); + $breadcrumbLabel = Mage::helper('newsletter')->__('Create Newsletter Template'); } - $this->_addContent($this->getLayout()->createBlock('adminhtml/newsletter_template_edit', 'template_edit') - ->setEditMode((bool)$this->getRequest()->getParam('id'))); - $this->renderLayout(); - } + $this->_addBreadcrumb($breadcrumbLabel, $breadcrumbTitle); + // restore data + if ($values = $this->_getSession()->getData('newsletter_template_form_data', true)) { + $model->addData($values); + } - public function editAction() - { - $this->_forward('new'); + $content = $this->getLayout() + ->createBlock('adminhtml/newsletter_template_edit', 'template_edit') + ->setEditMode($model->getId() > 0); + $this->_addContent($content); + $this->renderLayout(); } - public function saveAction() + /** + * Save Nesletter Template + * + */ + public function saveAction () { $request = $this->getRequest(); $template = Mage::getModel('newsletter/template'); + if ($id = (int)$request->getParam('id')) { $template->load($id); } try { - $template->setTemplateSubject($request->getParam('subject')) + $template->addData($request->getParams()) + ->setTemplateSubject($request->getParam('subject')) ->setTemplateCode($request->getParam('code')) ->setTemplateSenderEmail($request->getParam('sender_email')) ->setTemplateSenderName($request->getParam('sender_name')) @@ -95,74 +132,91 @@ public function saveAction() ->setModifiedAt(Mage::getSingleton('core/date')->gmtDate()); if (!$template->getId()) { - $type = constant(Mage::getConfig()->getModelClassName('newsletter/template') . "::TYPE_HTML"); - $template->setTemplateType($type); + $template->setTemplateType(Mage_Newsletter_Model_Template::TYPE_HTML); } - - if($this->getRequest()->getParam('_change_type_flag')) { - $type = constant(Mage::getConfig()->getModelClassName('newsletter/template') . "::TYPE_TEXT"); - $template->setTemplateType($type); + if ($this->getRequest()->getParam('_change_type_flag')) { + $template->setTemplateType(Mage_Newsletter_Model_Template::TYPE_TEXT); } - - if($this->getRequest()->getParam('_save_as_flag')) { + if ($this->getRequest()->getParam('_save_as_flag')) { $template->setId(null); } - $template->save(); $this->_redirect('*/*'); } + catch (Mage_Core_Exception $e) { + $this->_getSession()->addError(nl2br($e->getMessage())); + $this->_getSession()->setData('newsletter_template_form_data', + $this->getRequest()->getParams()); + } catch (Exception $e) { - Mage::getSingleton('adminhtml/session')->setData('newsletter_template_form_data', $this->getRequest()->getParams()); - Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); - $this->_forward('new'); + $this->_getSession()->addException($e, Mage::helper('adminhtml')->__('Error while saving this template. Please try again later.')); + $this->_getSession()->setData('newsletter_template_form_data', $this->getRequest()->getParams()); } - + $this->_forward('new'); } - public function deleteAction() + /** + * Delete newsletter Template + * + */ + public function deleteAction () { - - $template = Mage::getModel('newsletter/template'); - $id = (int)$this->getRequest()->getParam('id'); - $template->load($id); - if($template->getId()) { + $template = Mage::getModel('newsletter/template') + ->load($this->getRequest()->getParam('id')); + if ($template->getId()) { try { $template->delete(); } + catch (Mage_Core_Exception $e) { + $this->_getSession()->addError($e->getMessage()); + } catch (Exception $e) { - // Nothing + $this->_getSession()->addException($e, Mage::helper('adminhtml')->__('Error while deleting this template. Please try again later.')); } } $this->_redirect('*/*'); } - public function previewAction() + /** + * Preview Newsletter template + * + */ + public function previewAction () { $this->loadLayout('preview'); $this->renderLayout(); } - public function toqueueAction() + /** + * Queue Newsletter + * + */ + public function toqueueAction () { - $template = Mage::getModel('newsletter/template') - ->load($this->getRequest()->getParam('id')); - - if(!$template->getIsSystem()) { + $template = Mage::getModel('newsletter/template') + ->load($this->getRequest()->getParam('id')); + if (!$template->getIsSystem()) { $template->preprocess(); - - $queue = Mage::getModel('newsletter/queue') - ->setTemplateId($this->getRequest()->getParam('id')) - ->setQueueStatus(Mage_Newsletter_Model_Queue::STATUS_NEVER); - - $queue->save(); - $template->save(); - - $this->_redirect('*/newsletter_queue/edit', array('id'=>$queue->getId())); + $queue = Mage::getModel('newsletter/queue') + ->setTemplateId($template->getId()) + ->setQueueStatus(Mage_Newsletter_Model_Queue::STATUS_NEVER) + ->save(); + $template->save(); + $this->_redirect('*/newsletter_queue/edit', array('id' => $queue->getId())); + } + else { + $this->_redirect('*/*'); } } - protected function _isAllowed() + /** + * Check is allowed access + * + * @return bool + */ + protected function _isAllowed () { - return Mage::getSingleton('admin/session')->isAllowed('newsletter/template'); + return Mage::getSingleton('admin/session') + ->isAllowed('newsletter/template'); } -} \ No newline at end of file +} diff --git a/app/code/core/Mage/Adminhtml/controllers/Permissions/RoleController.php b/app/code/core/Mage/Adminhtml/controllers/Permissions/RoleController.php index 98f1b00318..e07b2c5df5 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Permissions/RoleController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Permissions/RoleController.php @@ -1,190 +1,198 @@ - - */ -class Mage_Adminhtml_Permissions_RoleController extends Mage_Adminhtml_Controller_Action -{ - - protected function _initAction() - { - $this->loadLayout(); - $this->_setActiveMenu('system/acl'); - $this->_addBreadcrumb($this->__('System'), $this->__('System')); - $this->_addBreadcrumb($this->__('Permissions'), $this->__('Permissions')); - $this->_addBreadcrumb($this->__('Roles'), $this->__('Roles')); - return $this; - } - - public function indexAction() - { - $this->_initAction(); - - $this->renderLayout(); - } - - public function roleGridAction() - { - $this->loadLayout(); - $this->getResponse()->setBody($this->getLayout()->getBlock('adminhtml.permission.role.grid')->toHtml()); - } - - public function editRoleAction() - { - $this->_initAction(); - - $roleId = $this->getRequest()->getParam('rid'); - if( intval($roleId) > 0 ) { - $breadCrumb = $this->__('Edit Role'); - $breadCrumbTitle = $this->__('Edit Role'); - } else { - $breadCrumb = $this->__('Add new Role'); - $breadCrumbTitle = $this->__('Add new Role'); - } - $this->_addBreadcrumb($breadCrumb, $breadCrumbTitle); - - $this->getLayout()->getBlock('head')->setCanLoadExtJs(true); - - $this->_addContent( - $this->getLayout()->createBlock('adminhtml/permissions_buttons') - ->setRoleId($roleId) - ->setRoleInfo(Mage::getModel('admin/roles')->load($roleId)) - ->setTemplate('permissions/roleinfo.phtml') - ); - $this->_addJs($this->getLayout()->createBlock('adminhtml/template')->setTemplate('permissions/role_users_grid_js.phtml')); - $this->renderLayout(); - } - - public function deleteAction() - { - $rid = $this->getRequest()->getParam('rid', false); - $currentUser = Mage::getModel('admin/user')->setId(Mage::getSingleton('admin/session')->getUser()->getId()); - if ( in_array($rid, $currentUser->getRoles()) ) { - Mage::getSingleton('adminhtml/session')->addError($this->__('You can not delete self assigned roles.')); - $this->_redirect('*/*/editrole', array('rid' => $rid)); - return; - } - - try { - Mage::getModel("admin/roles")->setId($rid)->delete(); - Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Role successfully deleted.')); - } catch (Exception $e) { - Mage::getSingleton('adminhtml/session')->addError($this->__('Error while deleting this role. Please try again later.')); - } - - $this->_redirect("*/*/"); - } - - public function saveRoleAction() - { - $rid = $this->getRequest()->getParam('role_id', false); - $resource = explode(',', $this->getRequest()->getParam('resource', false)); - $roleUsers = $this->getRequest()->getParam('in_role_user', null); - parse_str($roleUsers, $roleUsers); - $roleUsers = array_keys($roleUsers); - - $isAll = $this->getRequest()->getParam('all'); - if ($isAll) - $resource = array("all"); - - try { - $role = Mage::getModel("admin/roles") - ->setId($rid) - ->setName($this->getRequest()->getParam('rolename', false)) - ->setPid($this->getRequest()->getParam('parent_id', false)) - ->setRoleType('G'); - Mage::dispatchEvent('admin_permissions_role_prepare_save', array('object' => $role, 'request' => $this->getRequest())); - $role->save(); - - Mage::getModel("admin/rules") - ->setRoleId($role->getId()) - ->setResources($resource) - ->saveRel(); - - $oldRoleUsers = Mage::getModel("admin/roles")->setId($role->getId())->getRoleUsers($role); - if ( sizeof($oldRoleUsers) > 0 ) { - foreach($oldRoleUsers as $oUid) { - $this->_deleteUserFromRole($oUid, $role->getId()); - } - } - if ( $roleUsers ) { - foreach ($roleUsers as $nRuid) { - $this->_addUserToRole($nRuid, $role->getId()); - } - } - $rid = $role->getId(); - Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Role successfully saved.')); - } catch (Exception $e) { - Mage::getSingleton('adminhtml/session')->addError($this->__('Error while saving this role. Please try again later.')); - } - - //$this->getResponse()->setRedirect($this->getUrl("*/*/editrole/rid/$rid")); - $this->_redirect('*/*/editrole', array('rid' => $rid)); - return; - } - - public function editrolegridAction() - { - $this->getResponse()->setBody($this->getLayout()->createBlock('adminhtml/permissions_role_grid_user')->toHtml()); - } - - protected function _deleteUserFromRole($userId, $roleId) - { - try { - Mage::getModel("admin/user") - ->setRoleId($roleId) - ->setUserId($userId) - ->deleteFromRole(); - } catch (Exception $e) { - throw $e; - return false; - } - return true; - } - - protected function _addUserToRole($userId, $roleId) - { - $user = Mage::getModel("admin/user")->load($userId); - $user->setRoleId($roleId)->setUserId($userId); - - if( $user->roleUserExists() === true ) { - return false; - } else { - $user->add(); - return true; - } - } - - protected function _isAllowed() - { - return Mage::getSingleton('admin/session')->isAllowed('system/acl/roles'); - } + + */ +class Mage_Adminhtml_Permissions_RoleController extends Mage_Adminhtml_Controller_Action +{ + + protected function _initAction() + { + $this->loadLayout(); + $this->_setActiveMenu('system/acl'); + $this->_addBreadcrumb($this->__('System'), $this->__('System')); + $this->_addBreadcrumb($this->__('Permissions'), $this->__('Permissions')); + $this->_addBreadcrumb($this->__('Roles'), $this->__('Roles')); + return $this; + } + + protected function _initRole($requestVariable = 'rid') + { + Mage::register('current_role', Mage::getModel('admin/roles')->load($this->getRequest()->getParam($requestVariable))); + return Mage::registry('current_role'); + } + + public function indexAction() + { + $this->_initAction(); + + $this->renderLayout(); + } + + public function roleGridAction() + { + $this->loadLayout(); + $this->getResponse()->setBody($this->getLayout()->getBlock('adminhtml.permission.role.grid')->toHtml()); + } + + public function editRoleAction() + { + $role = $this->_initRole(); + $this->_initAction(); + + if ($role->getId()) { + $breadCrumb = $this->__('Edit Role'); + $breadCrumbTitle = $this->__('Edit Role'); + } else { + $breadCrumb = $this->__('Add new Role'); + $breadCrumbTitle = $this->__('Add new Role'); + } + $this->_addBreadcrumb($breadCrumb, $breadCrumbTitle); + + $this->getLayout()->getBlock('head')->setCanLoadExtJs(true); + + $this->_addContent( + $this->getLayout()->createBlock('adminhtml/permissions_buttons') + ->setRoleId($role->getId()) + ->setRoleInfo($role) + ->setTemplate('permissions/roleinfo.phtml') + ); + $this->_addJs($this->getLayout()->createBlock('adminhtml/template')->setTemplate('permissions/role_users_grid_js.phtml')); + $this->renderLayout(); + } + + public function deleteAction() + { + $rid = $this->getRequest()->getParam('rid', false); + $currentUser = Mage::getModel('admin/user')->setId(Mage::getSingleton('admin/session')->getUser()->getId()); + if ( in_array($rid, $currentUser->getRoles()) ) { + Mage::getSingleton('adminhtml/session')->addError($this->__('You can not delete self assigned roles.')); + $this->_redirect('*/*/editrole', array('rid' => $rid)); + return; + } + + try { + Mage::getModel("admin/roles")->setId($rid)->delete(); + Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Role successfully deleted.')); + } catch (Exception $e) { + Mage::getSingleton('adminhtml/session')->addError($this->__('Error while deleting this role. Please try again later.')); + } + + $this->_redirect("*/*/"); + } + + public function saveRoleAction() + { + $rid = $this->getRequest()->getParam('role_id', false); + $resource = explode(',', $this->getRequest()->getParam('resource', false)); + $roleUsers = $this->getRequest()->getParam('in_role_user', null); + parse_str($roleUsers, $roleUsers); + $roleUsers = array_keys($roleUsers); + + $isAll = $this->getRequest()->getParam('all'); + if ($isAll) + $resource = array("all"); + + try { + $role = Mage::getModel("admin/roles") + ->setId($rid) + ->setName($this->getRequest()->getParam('rolename', false)) + ->setPid($this->getRequest()->getParam('parent_id', false)) + ->setRoleType('G'); + Mage::dispatchEvent('admin_permissions_role_prepare_save', array('object' => $role, 'request' => $this->getRequest())); + $role->save(); + + Mage::getModel("admin/rules") + ->setRoleId($role->getId()) + ->setResources($resource) + ->saveRel(); + + $oldRoleUsers = Mage::getModel("admin/roles")->setId($role->getId())->getRoleUsers($role); + if ( sizeof($oldRoleUsers) > 0 ) { + foreach($oldRoleUsers as $oUid) { + $this->_deleteUserFromRole($oUid, $role->getId()); + } + } + if ( $roleUsers ) { + foreach ($roleUsers as $nRuid) { + $this->_addUserToRole($nRuid, $role->getId()); + } + } + $rid = $role->getId(); + Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Role successfully saved.')); + } catch (Mage_Core_Exception $e) { + Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); + } catch (Exception $e) { + Mage::getSingleton('adminhtml/session')->addError($this->__('Error while saving this role. Please try again later.')); + } + + //$this->getResponse()->setRedirect($this->getUrl("*/*/editrole/rid/$rid")); + $this->_redirect('*/*/editrole', array('rid' => $rid)); + return; + } + + public function editrolegridAction() + { + $this->getResponse()->setBody($this->getLayout()->createBlock('adminhtml/permissions_role_grid_user')->toHtml()); + } + + protected function _deleteUserFromRole($userId, $roleId) + { + try { + Mage::getModel("admin/user") + ->setRoleId($roleId) + ->setUserId($userId) + ->deleteFromRole(); + } catch (Exception $e) { + throw $e; + return false; + } + return true; + } + + protected function _addUserToRole($userId, $roleId) + { + $user = Mage::getModel("admin/user")->load($userId); + $user->setRoleId($roleId)->setUserId($userId); + + if( $user->roleUserExists() === true ) { + return false; + } else { + $user->add(); + return true; + } + } + + protected function _isAllowed() + { + return Mage::getSingleton('admin/session')->isAllowed('system/acl/roles'); + } } \ No newline at end of file diff --git a/app/code/core/Mage/Adminhtml/controllers/Promo/CatalogController.php b/app/code/core/Mage/Adminhtml/controllers/Promo/CatalogController.php index 2e405e46fe..41a3479173 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Promo/CatalogController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Promo/CatalogController.php @@ -96,30 +96,26 @@ public function editAction() public function saveAction() { if ($data = $this->getRequest()->getPost()) { - $model = Mage::getModel('catalogrule/rule'); -// if ($id = $this->getRequest()->getParam('page_id')) { -// $model->load($id); -// if ($id != $model->getId()) { -// Mage::getSingleton('adminhtml/session')->addError(Mage::helper('catalogrule')->__('The page you are trying to save no longer exists')); -// Mage::getSingleton('adminhtml/session')->setPageData($data); -// $this->_redirect('*/*/edit', array('page_id' => $this->getRequest()->getParam('page_id'))); -// return; -// } -// } - $data['conditions'] = $data['rule']['conditions']; - //$data['actions'] = $data['rule']['actions']; - unset($data['rule']); + try { + $model = Mage::getModel('catalogrule/rule'); + if ($id = $this->getRequest()->getParam('rule_id')) { + $model->load($id); + if ($id != $model->getId()) { + Mage::throwException(Mage::helper('catalogrule')->__('Wrong rule specified.')); + } + } + $data['conditions'] = $data['rule']['conditions']; + unset($data['rule']); - if (!empty($data['auto_apply'])) { - $autoApply = true; - unset($data['auto_apply']); - } else { - $autoApply = false; - } + if (!empty($data['auto_apply'])) { + $autoApply = true; + unset($data['auto_apply']); + } else { + $autoApply = false; + } - $model->loadPost($data); - Mage::getSingleton('adminhtml/session')->setPageData($model->getData()); - try { + $model->loadPost($data); + Mage::getSingleton('adminhtml/session')->setPageData($model->getData()); $model->save(); Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('catalogrule')->__('Rule was successfully saved')); diff --git a/app/code/core/Mage/Adminhtml/controllers/Promo/QuoteController.php b/app/code/core/Mage/Adminhtml/controllers/Promo/QuoteController.php index 073e736090..cf1d0477c5 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Promo/QuoteController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Promo/QuoteController.php @@ -102,32 +102,30 @@ public function editAction() public function saveAction() { if ($data = $this->getRequest()->getPost()) { - $model = Mage::getModel('salesrule/rule'); + try { + $model = Mage::getModel('salesrule/rule'); - if ($id = $this->getRequest()->getParam('id')) { - $model->load($id); - if ($id != $model->getId()) { - Mage::getSingleton('adminhtml/session')->addError(Mage::helper('salesrule')->__('The page you are trying to save no longer exists')); - Mage::getSingleton('adminhtml/session')->setPageData($data); - $this->_redirect('*/*/edit', array('page_id' => $this->getRequest()->getParam('page_id'))); - return; + if ($id = $this->getRequest()->getParam('rule_id')) { + $model->load($id); + if ($id != $model->getId()) { + Mage::throwException(Mage::helper('salesrule')->__('Wrong rule specified.')); + } } - } - if (isset($data['simple_action']) && $data['simple_action'] == 'by_percent' && isset($data['discount_amount'])) { - $data['discount_amount'] = min(100,$data['discount_amount']); - } - if (isset($data['rule']['conditions'])) { - $data['conditions'] = $data['rule']['conditions']; - } - if (isset($data['rule']['actions'])) { - $data['actions'] = $data['rule']['actions']; - } - unset($data['rule']); + if (isset($data['simple_action']) && $data['simple_action'] == 'by_percent' && isset($data['discount_amount'])) { + $data['discount_amount'] = min(100,$data['discount_amount']); + } + if (isset($data['rule']['conditions'])) { + $data['conditions'] = $data['rule']['conditions']; + } + if (isset($data['rule']['actions'])) { + $data['actions'] = $data['rule']['actions']; + } + unset($data['rule']); - $model->loadPost($data); + $model->loadPost($data); + + Mage::getSingleton('adminhtml/session')->setPageData($model->getData()); - Mage::getSingleton('adminhtml/session')->setPageData($model->getData()); - try { $model->save(); Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('salesrule')->__('Rule was successfully saved')); Mage::getSingleton('adminhtml/session')->setPageData(false); diff --git a/app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php b/app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php index 985106a714..c8e00a5807 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreateController.php @@ -209,7 +209,12 @@ protected function _processData() $this->_getOrderCreateModel()->getQuote()->getPayment()->addData($paymentData); } + $eventData = array( + 'order_create_model' => $this->_getOrderCreateModel(), + 'request' => $this->getRequest()->getPost(), + ); + Mage::dispatchEvent('adminhtml_sales_order_create_process_data', $eventData); $this->_getOrderCreateModel() ->initRuleData() @@ -258,14 +263,9 @@ protected function _processData() public function indexAction() { $this->loadLayout(); - $this->getLayout()->getBlock('left')->setIsCollapsed(true); $this->_initSession() ->_setActiveMenu('sales/order') - ->_addContent($this->getLayout()->createBlock('adminhtml/sales_order_create')) - ->_addJs($this->getLayout()->createBlock('adminhtml/template')->setTemplate( - 'sales/order/create/js.phtml' - )) ->renderLayout(); } @@ -318,33 +318,26 @@ public function loadBlockAction() $asJson= $this->getRequest()->getParam('json'); $block = $this->getRequest()->getParam('block'); - $res = array(); + + $update = $this->getLayout()->getUpdate(); + if ($asJson) { + $update->addHandle('adminhtml_sales_order_create_load_block_json'); + } else { + $update->addHandle('adminhtml_sales_order_create_load_block_plain'); + } if ($block) { $blocks = explode(',', $block); - - if ($asJson && !in_array('messages', $blocks)) { - $blocks[] = 'messages'; + if ($asJson && !in_array('message', $blocks)) { + $blocks[] = 'message'; } foreach ($blocks as $block) { - $blockName = 'adminhtml/sales_order_create_'.$block; - try { - $blockObject = $this->getLayout()->createBlock($blockName); - $res[$block] = $blockObject->toHtml(); - } - catch (Exception $e){ - $res[$block] = $this->__('Can not create block "%s"', $blockName); - } + $update->addHandle('adminhtml_sales_order_create_load_block_' . $block); } } - - if ($asJson) { - $this->getResponse()->setBody(Zend_Json::encode($res)); - } - else { - $this->getResponse()->setBody(implode('', $res)); - } + $this->loadLayoutUpdates()->generateLayoutXml()->generateLayoutBlocks(); + $this->getResponse()->setBody($this->getLayout()->getBlock('content')->toHtml()); } /** diff --git a/app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreditmemoController.php b/app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreditmemoController.php index 889a5cbd3e..0389e8dd32 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreditmemoController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Sales/Order/CreditmemoController.php @@ -210,6 +210,12 @@ protected function _initCreditmemo($update = false) $creditmemo->collectTotals(); } + $args = array( + 'creditmemo' => $creditmemo, + 'request' => $this->getRequest(), + ); + Mage::dispatchEvent('adminhtml_sales_order_creditmemo_register_before', $args); + Mage::register('current_creditmemo', $creditmemo); return $creditmemo; } @@ -310,7 +316,7 @@ public function saveAction() $data = $this->getRequest()->getPost('creditmemo'); try { if ($creditmemo = $this->_initCreditmemo()) { - if ($creditmemo->getGrandTotal() <=0) { + if (($creditmemo->getGrandTotal() <=0) && (!$creditmemo->getAllowZeroGrandTotal())) { Mage::throwException( $this->__('Credit Memo total must be positive.') ); diff --git a/app/code/core/Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php b/app/code/core/Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php index fe03f4d3ec..5350dc1741 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php @@ -81,9 +81,14 @@ protected function _initInvoice($update = false) $invoice = $convertor->toInvoice($order); $savedQtys = $this->_getItemQtys(); + /* @var $orderItem Mage_Sales_Model_Order_Item */ foreach ($order->getAllItems() as $orderItem) { - if (!$orderItem->isDummy() && !$orderItem->getQtyToInvoice()) { + if (!$orderItem->isDummy() && !$orderItem->getQtyToInvoice() && $orderItem->getLockedDoInvoice()) { + continue; + } + + if ($order->getForcedDoShipmentWithInvoice() && $orderItem->getLockedDoShip()) { continue; } @@ -159,7 +164,7 @@ protected function _prepareShipment($invoice) $qty = $item->getQtyToShip(); } - if (!$item->isDummy(true) && !$item->getQtyToShip()) { + if (!$item->isDummy(true) && !$item->getQtyToShip() && $item->getLockedDoShip()) { continue; } @@ -308,7 +313,7 @@ public function saveAction() ->addObject($invoice) ->addObject($invoice->getOrder()); $shipment = false; - if (!empty($data['do_shipment'])) { + if (!empty($data['do_shipment']) || (int) $invoice->getOrder()->getForcedDoShipmentWithInvoice()) { $shipment = $this->_prepareShipment($invoice); if ($shipment) { $shipment->setEmailSent($invoice->getEmailSent()); diff --git a/app/code/core/Mage/Adminhtml/controllers/Sales/Order/ShipmentController.php b/app/code/core/Mage/Adminhtml/controllers/Sales/Order/ShipmentController.php index b6f2dceec5..b147784b6f 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Sales/Order/ShipmentController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Sales/Order/ShipmentController.php @@ -66,6 +66,13 @@ protected function _initShipment() $this->_getSession()->addError($this->__('Order not longer exist.')); return false; } + /** + * Check shipment is available to create separate from invoice + */ + if ($order->getForcedDoShipmentWithInvoice()) { + $this->_getSession()->addError($this->__('Can not do shipment for order separate from invoice.')); + return false; + } /** * Check shipment create availability */ diff --git a/app/code/core/Mage/Adminhtml/controllers/Sales/OrderController.php b/app/code/core/Mage/Adminhtml/controllers/Sales/OrderController.php index 5b24fc919c..26e22e00c9 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Sales/OrderController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Sales/OrderController.php @@ -33,6 +33,13 @@ */ class Mage_Adminhtml_Sales_OrderController extends Mage_Adminhtml_Controller_Action { + /** + * Array of actions which can be processed without secret key validation + * + * @var array + */ + protected $_publicActions = array('view'); + /** * Additional initialization * diff --git a/app/code/core/Mage/Adminhtml/controllers/System/CacheController.php b/app/code/core/Mage/Adminhtml/controllers/System/CacheController.php index da4a917304..0a7bca9032 100644 --- a/app/code/core/Mage/Adminhtml/controllers/System/CacheController.php +++ b/app/code/core/Mage/Adminhtml/controllers/System/CacheController.php @@ -65,7 +65,7 @@ public function saveAction() $postData = $this->getRequest()->getPost(); if (empty($postData)) { $this->_redirect('*/*'); - return $this; + return; } /** @@ -78,8 +78,9 @@ public function saveAction() $e = $this->getRequest()->getPost('enable'); $enable = array(); - $clean = array(); - foreach (Mage::helper('core')->getCacheTypes() as $type=>$label) { + $clean = array(); + $cacheTypes = array_keys(Mage::helper('core')->getCacheTypes()); + foreach ($cacheTypes as $type) { $flag = $allCache!='disable' && (!empty($e[$type]) || $allCache=='enable'); $enable[$type] = $flag ? 1 : 0; if ($allCache=='' && !$flag) { @@ -88,7 +89,9 @@ public function saveAction() } $beta = $this->getRequest()->getPost('beta'); - foreach (Mage::helper('core')->getCacheBetaTypes() as $type=>$label) { + $betaCache = array_keys(Mage::helper('core')->getCacheBetaTypes()); + + foreach ($betaCache as $type) { if (empty($beta[$type])) { $clean[] = $type; } else { @@ -217,6 +220,19 @@ public function saveAction() } break; + case 'rebuild_catalog_index': + try { + Mage::getSingleton('catalog/index')->rebuild(); + $this->_getSession()->addSuccess(Mage::helper('adminhtml')->__('Catalog Index was rebuilt successfully')); + } + catch (Mage_Core_Exception $e) { + $this->_getSession()->addError($e->getMessage()); + } + catch (Exception $e) { + $this->_getSession()->addException($e, Mage::helper('adminhtml')->__('Catalog Index rebuild error. Please try again later')); + } + break; + case 'rebuild_flat_catalog_category': try { Mage::getResourceModel('catalog/category_flat')->rebuild(); @@ -239,8 +255,6 @@ public function saveAction() $this->_getSession()->addError($e->getMessage()); } catch (Exception $e) { - echo $e; - die(); $this->_getSession()->addException($e, Mage::helper('adminhtml')->__('Flat Catalog Product rebuild error. Please try again later')); } break; diff --git a/app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php b/app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php index 3983456e2a..959e271762 100644 --- a/app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php +++ b/app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php @@ -123,7 +123,6 @@ public function saveAction() } try { - Mage::app()->cleanCache(array(Mage_Core_Model_Config::CACHE_TAG)); if (!$this->_isSectionAllowed($this->getRequest()->getParam('section'))) { throw new Exception(Mage::helper('adminhtml')->__('This section is not allowed.')); } diff --git a/app/code/core/Mage/Adminhtml/controllers/System/StoreController.php b/app/code/core/Mage/Adminhtml/controllers/System/StoreController.php index ee65950e22..0e07843d74 100644 --- a/app/code/core/Mage/Adminhtml/controllers/System/StoreController.php +++ b/app/code/core/Mage/Adminhtml/controllers/System/StoreController.php @@ -106,28 +106,31 @@ public function editStoreAction() switch (Mage::registry('store_type')) { case 'website': $itemId = $this->getRequest()->getParam('website_id', null); - $model = Mage::getModel('core/website')->load($itemId); + $model = Mage::getModel('core/website'); $notExists = Mage::helper('core')->__("Website doesn't exist"); $codeBase = Mage::helper('core')->__('Before modifying the website code please make sure that it is not used in index.php'); break; case 'group': $itemId = $this->getRequest()->getParam('group_id', null); - $model = Mage::getModel('core/store_group')->load($itemId); + $model = Mage::getModel('core/store_group'); $notExists = Mage::helper('core')->__("Store doesn't exist"); $codeBase = false; break; case 'store': $itemId = $this->getRequest()->getParam('store_id', null); - $model = Mage::getModel('core/store')->load($itemId); + $model = Mage::getModel('core/store'); $notExists = Mage::helper('core')->__("Store view doesn't exist"); $codeBase = Mage::helper('core')->__('Before modifying the store view code please make sure that it is not used in index.php'); break; } + if (null !== $itemId) { + $model->load($itemId); + } if ($model->getId() || Mage::registry('store_action') == 'add') { Mage::register('store_data', $model); - if (Mage::registry('store_action') == 'edit' && $codeBase) { + if (Mage::registry('store_action') == 'edit' && $codeBase && !$model->isReadOnly()) { $this->_getSession()->addNotice($codeBase); } diff --git a/app/code/core/Mage/AmazonPayments/Model/Api/Cba.php b/app/code/core/Mage/AmazonPayments/Model/Api/Cba.php index 98872eff78..682051630f 100644 --- a/app/code/core/Mage/AmazonPayments/Model/Api/Cba.php +++ b/app/code/core/Mage/AmazonPayments/Model/Api/Cba.php @@ -655,6 +655,27 @@ public function parseOrder($xmlData) return $parsedOrder; } + /** + * Parsing xml notification for amazon order id + * + * @param string $xmlData + * @return array + */ + public function parseOrderReadyToShipNotification($xmlData) + { + $readyToShipData = array(); + if (strlen(trim($xmlData))) { + $xml = simplexml_load_string($xmlData, 'Varien_Simplexml_Element'); + $aOrderId = (string) $xml->descend('ProcessedOrder/AmazonOrderID'); + $readyToShipData['amazon_order_id'] = $aOrderId; + $readyToShipData['items'] = array(); + foreach ($xml->descend('ProcessedOrder/ProcessedOrderItems/ProcessedOrderItem') as $item) { + $readyToShipData['items'][(string)$item->AmazonOrderItemCode] = (string)$item->Quantity; + } + } + return $readyToShipData; + } + public function parseCancelNotification($xmlData) { $cancelData = array(); @@ -882,6 +903,20 @@ public function getDocumentApi() return $this->getData('document_api'); } + /** + * Associate Magento real order id with Amazon order id + * + * @param Mage_Sales_Model_Order $order + * @return Mage_AmazonPayments_Model_Api_Cba + */ + public function syncOrder($order) + { + if ($order->getId()) { + $this->getDocumentApi()->sendAcknowledgement($order); + } + return $this; + } + /** * Cancel order * @@ -926,32 +961,33 @@ public function confirmShipment($shipment) 'qty' => $item->getQty() ); } - $carrier = $shipment->getOrder()->getShippingCarrier(); - $carrierCode = ''; - $carrierMethod = ''; + $carrierName = ''; + $shippingMethod = ''; $trackNumber = ''; /** * Magento track numbers is not connected with items. * Get only first track number */ foreach ($shipment->getAllTracks() as $track) { + $carrierName = $track->getTitle(); $trackNumber = $track->getNumber(); break; } - $_shipping = explode('_', $shipment->getOrder()->getShippingMethod()); - if ($_shipping && count($_shipping) >= 2) { - $carrierCode = $_shipping[0]; - $carrierMethod = $carrier->getCode('method', $_shipping[1]); + if (preg_match("/\((.+)\)/", $shipment->getOrder()->getShippingDescription(), $_result)) { + $shippingMethod = $_result[1]; } $this->getDocumentApi()->confirmShipment( $shipment->getOrder()->getExtOrderId(), - $carrierCode, - $carrierMethod, + $carrierName, + $shippingMethod, $items, $trackNumber ); + $shipment->addComment( + Mage::helper('amazonpayments')->__('Shipment was created with Checkout by Amazon.') + ); return $this; } diff --git a/app/code/core/Mage/AmazonPayments/Model/Api/Cba/Document.php b/app/code/core/Mage/AmazonPayments/Model/Api/Cba/Document.php index 40c9659106..9cf3f03ee8 100644 --- a/app/code/core/Mage/AmazonPayments/Model/Api/Cba/Document.php +++ b/app/code/core/Mage/AmazonPayments/Model/Api/Cba/Document.php @@ -42,6 +42,7 @@ class Mage_AmazonPayments_Model_Api_Cba_Document extends Varien_Object protected $_merchantInfo = array(); protected $_client = null; protected $_result = null; + protected $_proccessFailed = false; protected $_options = array( 'trace' => true, 'timeout' => '20', @@ -170,11 +171,12 @@ protected function _proccessRequest($method, $params) { if ($this->getClient()) { $this->_result = null; + $this->_proccessFailed = false; try { $this->_result = $this->getClient() ->call($method, $params, $this->_options); } catch (Exception $e) { - Zend_Debug::dump($e->getMessage()); + $this->_proccessFailed = true; } } return $this; @@ -241,6 +243,42 @@ public function getPendingDocuments() return $this->_result; } + /** + * Associate Magento real order id with Amazon order id + * + * @param Mage_Sales_Model_Order $order + * @return string + */ + public function sendAcknowledgement($order) + { + $_document = ' + +
+ 1.01 + ' . $this->getMerchantIdentifier() . ' +
+ OrderAcknowledgement + + 1 + Update + + ' . $order->getExtOrderId() . ' + ' . $order->getRealOrderId() . ' + Success + + +
'; + + $params = array( + 'merchant' => $this->getMerchantInfo(), + 'messageType' => self::MESSAGE_TYPE_ACKNOWLEDGEMENT, + 'doc' => $this->_createAttachment($_document) + ); + + $this->_proccessRequest('postDocument', $params); + return $this->_result; + } + /** * Cancel order * @@ -351,13 +389,13 @@ public function refund($payment, $amount) * Confirm creating of shipment * * @param string $aOrderId - * @param string $carrierCode - * @param string $carrierMethod + * @param string $carrierName + * @param string $shippingMethod * @param array $items * @param string $trackNumber * @return string Amazon Transaction Id */ - public function confirmShipment($aOrderId, $carrierCode, $carrierMethod, $items, $trackNumber = '') + public function confirmShipment($aOrderId, $carrierName, $shippingMethod, $items, $trackNumber = '') { $fulfillmentDate = gmdate('Y-m-d\TH:i:s'); $_document = ' @@ -373,8 +411,8 @@ public function confirmShipment($aOrderId, $carrierCode, $carrierMethod, $items, ' . $aOrderId . ' ' . $fulfillmentDate . ' - ' . strtoupper($carrierCode) . ' - ' . $carrierMethod . ' + ' . strtoupper($carrierName) . ' + ' . $shippingMethod . ' ' . $trackNumber .' '; foreach ($items as $item) { diff --git a/app/code/core/Mage/AmazonPayments/Model/Payment/Asp.php b/app/code/core/Mage/AmazonPayments/Model/Payment/Asp.php index 1b2aeddb20..cc409cc7f4 100644 --- a/app/code/core/Mage/AmazonPayments/Model/Payment/Asp.php +++ b/app/code/core/Mage/AmazonPayments/Model/Payment/Asp.php @@ -229,6 +229,7 @@ public function processEventRedirect() */ public function processEventReturnSuccess() { + $this->getOrder()->sendNewOrderEmail(); $this->getOrder()->addStatusToHistory( $this->getOrder()->getStatus(), Mage::helper('amazonpayments')->__('Customer successfully returned from Amazon Simple Pay site') diff --git a/app/code/core/Mage/AmazonPayments/Model/Payment/Cba.php b/app/code/core/Mage/AmazonPayments/Model/Payment/Cba.php index 33faab2be0..5a6afc39cc 100644 --- a/app/code/core/Mage/AmazonPayments/Model/Payment/Cba.php +++ b/app/code/core/Mage/AmazonPayments/Model/Payment/Cba.php @@ -138,12 +138,25 @@ public function capture(Varien_Object $payment, $amount) return $this; } + public function processInvoice($invoice, $payment) + { + parent::processInvoice($invoice, $payment); + $invoice->addComment( + Mage::helper('amazonpayments')->__('Invoice was created with Checkout by Amazon.') + ); + return $this; + } + public function cancel(Varien_Object $payment) { if ($this->_skipProccessDocument) { return $this; } $this->getApi()->cancel($payment->getOrder()); + $payment->getOrder()->addStatusToHistory( + $payment->getOrder()->getStatus(), + Mage::helper('amazonpayments')->__('Order was canceled with Checkout by Amazon.') + ); return $this; } @@ -159,6 +172,9 @@ public function refund(Varien_Object $payment, $amount) return $this; } $this->getApi()->refund($payment, $amount); + $payment->getCreditmemo()->addComment( + Mage::helper('amazonpayments')->__('Refund was created with Checkout by Amazon.') + ); return $this; } @@ -234,8 +250,8 @@ public function handleNotification($_request) $this->_createNewOrder($newOrderDetails); break; case 'OrderReadyToShipNotification': - $amazonOrderDetails = $this->getApi()->parseOrder($_request['NotificationData']); - $this->_proccessOrder($amazonOrderDetails); + $orderReadyToShipDetails = $this->getApi()->parseOrder($_request['NotificationData']); + $this->_proccessOrder($orderReadyToShipDetails); break; case 'OrderCancelledNotification': $cancelDetails = $this->getApi()->parseCancelNotification($_request['NotificationData']); @@ -264,10 +280,15 @@ public function handleNotification($_request) */ protected function _createNewOrder(array $newOrderDetails) { + /* @var $order Mage_Sales_Model_Order */ if (array_key_exists('amazonOrderID', $newOrderDetails)) { $_order = Mage::getModel('sales/order') ->loadByAttribute('ext_order_id', $newOrderDetails['amazonOrderID']); if ($_order->getId()) { + /** + * associate real order id with Amazon order + */ + $this->getApi()->syncOrder($_order); $_order = null; return $this; } @@ -331,8 +352,6 @@ protected function _createNewOrder(array $newOrderDetails) } } } - /** @todo save shipping method */ -// $this->getQuote()->getShippingAddress()->setShippingMethod($shippingMethod); $billing->setCountryId($_address['countryCode']) ->setRegion($_address['regionCode']) @@ -372,8 +391,9 @@ protected function _createNewOrder(array $newOrderDetails) $order->setBillingAddress($convertQuote->addressToOrderAddress($billing)) ->setShippingAddress($convertQuote->addressToOrderAddress($shipping)); - $order->setShippingMethod($shipping->getShippingMethod()); - $order->setShippingDescription($_shippingDesc); + $order->setShippingMethod($shipping->getShippingMethod()) + ->setShippingDescription($_shippingDesc) + ->setForcedDoShipmentWithInvoice(true); $order->setPayment($convertQuote->paymentToOrderPayment($quote->getPayment())); @@ -386,8 +406,8 @@ protected function _createNewOrder(array $newOrderDetails) foreach ($quote->getAllItems() as $item) { /* @var $item Mage_Sales_Model_Quote_Item */ $order->addItem($convertQuote->itemToOrderItem($item)); - $orderItem = $order->getItemByQuoteItemId($item->getId()); /* @var $orderItem Mage_Sales_Model_Order_Item */ + $orderItem = $order->getItemByQuoteItemId($item->getId()); $orderItem->setExtOrderItemId($newOrderDetails['items'][$item->getId()]['AmazonOrderItemCode']); $orderItemOptions = $orderItem->getProductOptions(); $orderItemOptions['amazon_amounts'] = serialize(array( @@ -398,12 +418,19 @@ protected function _createNewOrder(array $newOrderDetails) 'shipping_promo' => $newOrderDetails['items'][$item->getId()]['shipping_promo'] )); $orderItem->setProductOptions($orderItemOptions); + $orderItem->setLockedDoInvoice(true) + ->setLockedDoShip(true); } $order->place(); + $order->addStatusToHistory( + $order->getStatus(), + Mage::helper('amazonpayments')->__('New Order Notification received from Checkout by Amazon service.') + ); + $customer = $quote->getCustomer(); - if (isset($customer) && $customer) { // && $quote->getCheckoutMethod()==Mage_Sales_Model_Quote::CHECKOUT_METHOD_REGISTER) { + if ($customer && $customer->getId()) { $order->setCustomerId($customer->getId()) ->setCustomerEmail($customer->getEmail()) ->setCustomerPrefix($customer->getPrefix()) @@ -413,10 +440,12 @@ protected function _createNewOrder(array $newOrderDetails) ->setCustomerSuffix($customer->getSuffix()) ->setCustomerGroupId($customer->getGroupId()) ->setCustomerTaxClassId($customer->getTaxClassId()); + } else { + $quote->setCustomerEmail($newOrderDetails['buyerEmailAddress']) + ->setCustomerIsGuest(true) + ->setCustomerGroupId(Mage_Customer_Model_Group::NOT_LOGGED_IN_ID); } - $order->save(); - $quote->setIsActive(false); $quote->save(); @@ -427,6 +456,10 @@ protected function _createNewOrder(array $newOrderDetails) $this->getCheckout()->setLastRealOrderId($order->getIncrementId()); $order->sendNewOrderEmail(); + /** + * associate real order id with Amazon order + */ + $this->getApi()->syncOrder($order); return $this; } @@ -438,14 +471,23 @@ protected function _createNewOrder(array $newOrderDetails) */ protected function _proccessOrder($amazonOrderDetails) { - if ($quoteId = $newOrderDetails['ClientRequestId']) { - if ($order = Mage::getModel('sales/order')->loadByAttribute('quote_id', $quoteId)) { - /* @var $order Mage_Sales_Model_Order */ - - $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING); - $order->setStatus('Processing'); - $order->setIsNotified(false); - $order->save(); + if (array_key_exists('amazon_order_id', $amazonOrderDetails)) { + $order = Mage::getModel('sales/order') + ->loadByAttribute('ext_order_id', $amazonOrderDetails['amazon_order_id']); + /* @var $order Mage_Sales_Model_Order */ + if ($order->getId()) { + /* @var $item Mage_Sales_Model_Order_Item */ + foreach ($order->getAllVisibleItems() as $item) { + if (array_key_exists($item->getExtOrderItemId(), $amazonOrderDetails['items'])) { + $item->setLockedDoInvoice(false) + ->setLockedDoShip(false) + ->save(); + } + } + $order->addStatusToHistory( + $order->getStatus(), + Mage::helper('amazonpayments')->__('Order Ready To Ship Notification received form Checkout by Amazon service.') + )->save(); } } return true; @@ -465,7 +507,11 @@ protected function _cancelOrder($cancelDetails) /* @var $order Mage_Sales_Model_Order */ if ($order->getId()) { try { - $order->cancel()->save(); + $order->cancel() + ->addStatusToHistory( + $order->getStatus(), + Mage::helper('amazonpayments')->__('Cancel Order Notification received from Checkout by Amazon service.') + )->save(); } catch (Exception $e) { return false; } diff --git a/app/code/core/Mage/AmazonPayments/controllers/AspController.php b/app/code/core/Mage/AmazonPayments/controllers/AspController.php index 3d49be1a06..8ac1cf1bcd 100644 --- a/app/code/core/Mage/AmazonPayments/controllers/AspController.php +++ b/app/code/core/Mage/AmazonPayments/controllers/AspController.php @@ -61,22 +61,32 @@ public function getSession() public function payAction() { $session = $this->getSession(); - $session->setAmazonAspQuoteId($session->getQuoteId()); - $session->setAmazonAspLastRealOrderId($session->getLastRealOrderId()); - - $order = Mage::getModel('sales/order'); - $order->loadByIncrementId($session->getLastRealOrderId()); + $quoteId = $session->getQuoteId(); + $lastRealOrderId = $session->getLastRealOrderId(); + if (is_null($quoteId) || is_null($lastRealOrderId)){ + $this->_redirect('checkout/cart/'); + } else { + $session->setAmazonAspQuoteId($quoteId); + $session->setAmazonAspLastRealOrderId($lastRealOrderId); - $payment = $this->getPayment(); - $payment->setOrder($order); - - $payment->processEventRedirect(); - Mage::register('amazonpayments_payment_asp', $payment); - $this->loadLayout(); - $this->renderLayout(); - - $session->unsQuoteId(); - $session->unsLastRealOrderId(); + $order = Mage::getModel('sales/order'); + $order->loadByIncrementId($lastRealOrderId); + + $payment = $this->getPayment(); + $payment->setOrder($order); + $payment->processEventRedirect(); + + Mage::register('amazonpayments_payment_asp', $payment); + $this->loadLayout(); + $this->renderLayout(); + + $quote = $session->getQuote(); + $quote->setIsActive(false); + $quote->save(); + + $session->setQuoteId(null); + $session->setLastRealOrderId(null); + } } /** @@ -85,24 +95,26 @@ public function payAction() * */ public function returnSuccessAction() - { + { $session = $this->getSession(); - + + $orderId = $session->getAmazonAspLastRealOrderId(); + $quoteId = $session->getAmazonAspQuoteId(true); + $order = Mage::getModel('sales/order'); - $order->loadByIncrementId($session->getAmazonAspLastRealOrderId()); + $order->loadByIncrementId($orderId); - if ($order->isEmpty()) { - return false; + if ($order->isEmpty()) { return false; } - + $payment = $this->getPayment(); $payment->setOrder($order); $payment->processEventReturnSuccess(); - - $session->setQuoteId($session->getAmazonAspQuoteId(true)); + + $session->setQuoteId($quoteId); $session->getQuote()->setIsActive(false)->save(); - $session->setLastRealOrderId($session->getAmazonAspLastRealOrderId(true)); - + $session->setLastRealOrderId($orderId); + $this->_redirect('checkout/onepage/success'); } diff --git a/app/code/core/Mage/Api/Model/Config.php b/app/code/core/Mage/Api/Model/Config.php index f0125a6f3d..50492199bb 100644 --- a/app/code/core/Mage/Api/Model/Config.php +++ b/app/code/core/Mage/Api/Model/Config.php @@ -62,36 +62,7 @@ protected function _construct() } } - $mergeConfig = Mage::getModel('core/config_base'); - - $config = Mage::getConfig(); - $modules = $config->getNode('modules')->children(); - - // check if local modules are disabled - $disableLocalModules = (string)$config->getNode('global/disable_local_modules'); - $disableLocalModules = !empty($disableLocalModules) && (('true' === $disableLocalModules) || ('1' === $disableLocalModules)); - - $configFile = $config->getModuleDir('etc', 'Mage_Api').DS.'api.xml'; - - - if ($mergeConfig->loadFile($configFile)) { - $config->extend($mergeConfig, true); - } - - foreach ($modules as $modName=>$module) { - if ($module->is('active')) { - if (($disableLocalModules && ('local' === (string)$module->codePool)) || $modName=='Mage_Api') { - continue; - } - - $configFile = $config->getModuleDir('etc', $modName).DS.'api.xml'; - - if ($mergeConfig->loadFile($configFile)) { - $config->extend($mergeConfig, true); - } - } - } - + $config = Mage::getConfig()->loadModulesConfiguration('api.xml'); $this->setXml($config->getNode('api')); if (Mage::app()->useCache('config_api')) { diff --git a/app/code/core/Mage/Api/Model/Mysql4/User.php b/app/code/core/Mage/Api/Model/Mysql4/User.php index 56b948c026..53a6dcf480 100644 --- a/app/code/core/Mage/Api/Model/Mysql4/User.php +++ b/app/code/core/Mage/Api/Model/Mysql4/User.php @@ -69,15 +69,52 @@ protected function _initUniqueFields() public function recordLogin(Mage_Api_Model_User $user) { $data = array( - 'logdate' => now(), 'lognum' => $user->getLognum()+1, - 'sessid' => $user->getSessid() ); $condition = $this->_getWriteAdapter()->quoteInto('user_id=?', $user->getUserId()); $this->_getWriteAdapter()->update($this->getTable('api/user'), $data, $condition); return $this; } + public function recordSession(Mage_Api_Model_User $user) + { + $select = $this->_getReadAdapter()->select() + ->from($this->getTable('api/session'), 'user_id') + ->where('user_id = ?', $user->getId()) + ->where('sessid = ?', $user->getSessid()); + $logdate = now(); + if ($this->_getReadAdapter()->fetchRow($select)) { + $this->_getWriteAdapter()->update( + $this->getTable('api/session'), + array ('logdate' => $logdate), + $this->_getReadAdapter()->quoteInto('user_id = ?', $user->getId()) . ' AND ' + . $this->_getReadAdapter()->quoteInto('sessid = ?', $user->getSessid()) + ); + } else { + $this->_getWriteAdapter()->insert( + $this->getTable('api/session'), + array( + 'user_id' => $user->getId(), + 'logdate' => $logdate, + 'sessid' => $user->getSessid() + ) + ); + } + $user->setLogdate($logdate); + return $this; + } + + public function cleanOldSessions(Mage_Api_Model_User $user) + { + $timeout = Mage::getStoreConfig('api/config/session_timeout'); + $this->_getWriteAdapter()->delete( + $this->getTable('api/session'), + $this->_getReadAdapter()->quoteInto('user_id = ?', $user->getId()) . ' AND ' + . new Zend_Db_Expr('(UNIX_TIMESTAMP(\'' . now() . '\') - UNIX_TIMESTAMP(logdate)) > ' . $timeout) + ); + return $this; + } + public function loadByUsername($username) { $select = $this->_getReadAdapter()->select()->from($this->getTable('api/user')) @@ -87,9 +124,27 @@ public function loadByUsername($username) public function loadBySessId ($sessId) { - $select = $this->_getReadAdapter()->select()->from($this->getTable('api/user')) - ->where('sessid=:sessid'); - return $this->_getReadAdapter()->fetchRow($select, array('sessid'=>$sessId)); + $select = $this->_getReadAdapter()->select() + ->from($this->getTable('api/session')) + ->where('sessid = ?', $sessId); + if ($apiSession = $this->_getReadAdapter()->fetchRow($select)) { + $selectUser = $this->_getReadAdapter()->select() + ->from($this->getTable('api/user')) + ->where('user_id = ?', $apiSession['user_id']); + if ($user = $this->_getReadAdapter()->fetchRow($selectUser)) { + return array_merge($user, $apiSession); + } + } + return array(); + } + + public function clearBySessId($sessid) + { + $this->_getWriteAdapter()->delete( + $this->getTable('api/session'), + $this->_getReadAdapter()->quoteInto('sessid = ?', $sessid) + ); + return $this; } public function hasAssigned2Role($user) diff --git a/app/code/core/Mage/Api/Model/Server/V2/Handler.php b/app/code/core/Mage/Api/Model/Server/V2/Handler.php index c76365f1bb..ed9adff0ee 100644 --- a/app/code/core/Mage/Api/Model/Server/V2/Handler.php +++ b/app/code/core/Mage/Api/Model/Server/V2/Handler.php @@ -46,8 +46,8 @@ public function __call( $function, $args ) { $sessionId = array_shift( $args ); $apiKey = ''; - $config = Mage::getConfig(); - foreach ($config->getNode('api/v2/resources_function_prefix')->children() as $resource => $prefix) { + $nodes = Mage::getSingleton('api/config')->getNode('v2/resources_function_prefix')->children(); + foreach ($nodes as $resource => $prefix) { $prefix = $prefix->asArray(); if (false !== strpos($function, $prefix)) { $method = substr($function, strlen($prefix)); diff --git a/app/code/core/Mage/Api/Model/Session.php b/app/code/core/Mage/Api/Model/Session.php index ef3b6c561e..705cdf5b59 100644 --- a/app/code/core/Mage/Api/Model/Session.php +++ b/app/code/core/Mage/Api/Model/Session.php @@ -34,19 +34,53 @@ class Mage_Api_Model_Session extends Mage_Core_Model_Session_Abstract { public $sessionIds = array(); + protected $_currentSessId = null; public function start($sessionName=null) { - parent::start($sessionName=null); +// parent::start($sessionName=null); + $this->_currentSessId = md5(time() . $sessionName); $this->sessionIds[] = $this->getSessionId(); return $this; } + public function init($namespace, $sessionName=null) + { + if (is_null($this->_currentSessId)) { + $this->start(); + } + return $this; + } + + public function getSessionId() + { + return $this->_currentSessId; + } + + public function setSessionId($sessId = null) + { + if (!is_null($sessId)) { + $this->_currentSessId = $sessId; + } + return $this; + } + public function revalidateCookie() { // In api we don't use cookies } + public function clear() { + if ($sessId = $this->getSessionId()) { + try { + Mage::getModel('api/user')->logoutBySessId($sessId); + } catch (Exception $e) { + return false; + } + } + return true; + } + public function login($username, $apiKey) { if (empty($username) || empty($apiKey)) { @@ -161,10 +195,14 @@ protected function _renewBySessId ($sessId) if (!$user->getId() || !$user->getSessid()) { return false; } + if ($user->getSessid() == $sessId && !$this->isSessionExpired($user)) { $this->setUser($user); $this->setAcl(Mage::getResourceModel('api/acl')->loadAcl()); - $user->getResource()->recordLogin($user); + + $user->getResource()->recordLogin($user) + ->recordSession($user); + return true; } return false; diff --git a/app/code/core/Mage/Api/Model/User.php b/app/code/core/Mage/Api/Model/User.php index f8269fbc98..2ada3a1a8b 100644 --- a/app/code/core/Mage/Api/Model/User.php +++ b/app/code/core/Mage/Api/Model/User.php @@ -166,7 +166,9 @@ public function login($username, $apiKey) $sessId = $this->getSessid(); if ($this->authenticate($username, $apiKey)) { $this->setSessid($sessId); - $this->getResource()->recordLogin($this); + $this->getResource()->cleanOldSessions($this) + ->recordLogin($this) + ->recordSession($this); Mage::dispatchEvent('api_user_authenticated', array( 'model' => $this, 'api_key' => $apiKey, @@ -194,6 +196,12 @@ public function loadBySessId ($sessId) return $this; } + public function logoutBySessId($sessid) + { + $this->getResource()->clearBySessId($sessid); + return $this; + } + public function hasAssigned2Role($user) { return $this->getResource()->hasAssigned2Role($user); diff --git a/app/code/core/Mage/Api/Model/Wsdl/Config.php b/app/code/core/Mage/Api/Model/Wsdl/Config.php index 0969038ea0..62137dad3b 100644 --- a/app/code/core/Mage/Api/Model/Wsdl/Config.php +++ b/app/code/core/Mage/Api/Model/Wsdl/Config.php @@ -60,7 +60,7 @@ public static function getNamespacesPrefix() { if (is_null(self::$_namespacesPrefix)) { self::$_namespacesPrefix = array(); - $config = Mage::getConfig()->getNode('api/v2/wsdl/prefix')->children(); + $config = Mage::getSingleton('api/config')->getNode('v2/wsdl/prefix')->children(); foreach ($config as $prefix => $namespace) { self::$_namespacesPrefix[$namespace->asArray()] = $prefix; } @@ -93,54 +93,25 @@ public function init() $this->setCacheChecksum(null); $saveCache = true; - // check if local modules are disabled - $disableLocalModules = (string)$this->getNode('global/disable_local_modules'); - $disableLocalModules = !empty($disableLocalModules) && (('true' === $disableLocalModules) || ('1' === $disableLocalModules)); - - if ($disableLocalModules) { - /** - * Reset include path - */ - $codeDir = Mage::getConfig()->getOptions()->getCodeDir(); - $libDir = Mage::getConfig()->getOptions()->getLibDir(); - - set_include_path( - // excluded '/app/code/local' - BP . DS . 'app' . DS . 'code' . DS . 'community' . PS . - BP . DS . 'app' . DS . 'code' . DS . 'core' . PS . - BP . DS . 'lib' . PS . - Mage::registry('original_include_path') - ); - } - - if (Mage::isInstalled()) { - if (Mage::app()->useCache('config')) { - $loaded = $this->loadCache(); - if ($loaded) { - return $this; - } + if (Mage::app()->useCache('config')) { + $loaded = $this->loadCache(); + if ($loaded) { + return $this; } } $mergeWsdl = new Mage_Api_Model_Wsdl_Config_Base(); $mergeWsdl->setHandler($this->getHandler()); - $modules = Mage::getConfig()->getNode('modules')->children(); + /** + * Exclude Mage_Api wsdl xml file because it used for previous version + * of API wsdl declaration + */ + $mergeWsdl->addLoadedFile(Mage::getConfig()->getModuleDir('etc', "Mage_Api").DS.'wsdl.xml'); $baseWsdlFile = Mage::getConfig()->getModuleDir('etc', "Mage_Api").DS.'wsdl2.xml'; $this->loadFile($baseWsdlFile); - - foreach ($modules as $modName=>$module) { - if ($module->is('active') && $modName != 'Mage_Api') { - if ($disableLocalModules && ('local' === (string)$module->codePool)) { - continue; - } - $wsdlFile = Mage::getConfig()->getModuleDir('etc', $modName).DS.'wsdl.xml'; - if ($mergeWsdl->loadFile($wsdlFile)) { - $this->extend($mergeWsdl, true); - } - } - } + Mage::getConfig()->loadModulesConfiguration('wsdl.xml', $this, $mergeWsdl); if (Mage::app()->useCache('config')) { $this->saveCache(array('config')); diff --git a/app/code/core/Mage/Api/Model/Wsdl/Config/Base.php b/app/code/core/Mage/Api/Model/Wsdl/Config/Base.php index f002d6478f..903fdb59df 100644 --- a/app/code/core/Mage/Api/Model/Wsdl/Config/Base.php +++ b/app/code/core/Mage/Api/Model/Wsdl/Config/Base.php @@ -40,6 +40,8 @@ class Mage_Api_Model_Wsdl_Config_Base extends Varien_Simplexml_Config */ protected $_wsdlVariables = null; + protected $_loadedFiles = array(); + public function __construct($sourceData=null) { $this->_elementClass = 'Mage_Api_Model_Wsdl_Config_Element'; @@ -91,4 +93,24 @@ public function processFileData($text) return $text; } + + public function addLoadedFile($file) + { + if (!in_array($file, $this->_loadedFiles)) { + $this->_loadedFiles[] = $file; + } + return $this; + } + + public function loadFile($file) + { + if (in_array($file, $this->_loadedFiles)) { + return false; + } + $res = parent::loadFile($file); + if ($res) { + $this->addLoadedFile($file); + } + return $this; + } } diff --git a/app/code/core/Mage/Api/etc/config.xml b/app/code/core/Mage/Api/etc/config.xml index c53162612a..10bc616533 100644 --- a/app/code/core/Mage/Api/etc/config.xml +++ b/app/code/core/Mage/Api/etc/config.xml @@ -28,7 +28,7 @@ - 0.8.0 + 0.8.1 @@ -64,6 +64,9 @@ api_user
+ + api_session
+
@@ -87,6 +90,11 @@ + + + + +
diff --git a/app/code/core/Mage/Api/sql/api_setup/mysql4-upgrade-0.8.0-0.8.1.php b/app/code/core/Mage/Api/sql/api_setup/mysql4-upgrade-0.8.0-0.8.1.php new file mode 100644 index 0000000000..69f8c24cd8 --- /dev/null +++ b/app/code/core/Mage/Api/sql/api_setup/mysql4-upgrade-0.8.0-0.8.1.php @@ -0,0 +1,56 @@ + + */ + +/* @var $installer Mage_Core_Model_Resource_Setup */ +$installer = $this; + +$installer->startSetup(); +$installer->run(" + CREATE TABLE `{$installer->getTable('api/session')}` ( + `user_id` mediumint(9) UNSIGNED NOT NULL, + `logdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `sessid` varchar(40) NOT NULL DEFAULT '', + KEY `API_SESSION_USER` (`user_id`), + KEY `API_SESSION_SESSID` (`sessid`), + CONSTRAINT `FK_API_SESSION_USER` FOREIGN KEY (`user_id`) REFERENCES `{$installer->getTable('api/user')}` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Api Sessions'; +"); + +$insertStmt = "INSERT INTO + `{$installer->getTable('api/session')}` (`user_id`, `logdate`, `sessid`) + SELECT `user_id`, `logdate`, `sessid` FROM `{$installer->getTable('api/user')}`"; +$installer->run($insertStmt); +$installer->getConnection()->dropColumn($installer->getTable('api/user'), 'logdate'); +$installer->getConnection()->dropColumn($installer->getTable('api/user'), 'sessid'); + +$installer->endSetup(); \ No newline at end of file diff --git a/app/code/core/Mage/Backup/Model/Mysql4/Db.php b/app/code/core/Mage/Backup/Model/Mysql4/Db.php index 643ac06e5c..6883427017 100644 --- a/app/code/core/Mage/Backup/Model/Mysql4/Db.php +++ b/app/code/core/Mage/Backup/Model/Mysql4/Db.php @@ -36,7 +36,7 @@ class Mage_Backup_Model_Mysql4_Db /** * Read connection * - * @var Zend_Db_Adapter_Abstract + * @var Varien_Db_Adapter_Pdo_Mysql */ protected $_read; @@ -182,6 +182,32 @@ public function getTableStatus($tableName) return false; } + /** + * Quote Table Row + * + * @param string $tableName + * @param array $row + * @return string + */ + protected function _quoteRow($tableName, array $row) + { + $describe = $this->_read->describeTable($tableName); + $rowData = array(); + foreach ($row as $k => $v) { + if (is_null($v)) { + $value = 'NULL'; + } + elseif (in_array(strtolower($describe[$k]['DATA_TYPE']), array('bigint','mediumint','smallint','tinyint'))) { + $value = $v; + } + else { + $value = $this->_read->quoteInto('?', $v); + } + $rowData[] = $value; + } + return '('.join(',', $rowData).')'; + } + /** * Retrive table partical data SQL insert * @@ -207,21 +233,7 @@ public function getTableDataSql($tableName, $count, $offset = 0) $sql .= ','; } - //$sql .= $this->_read->quoteInto('(?)', $row); - $rowData = array(); - foreach ($row as $v) { - if (is_null($v)) { - $value = 'NULL'; - } - elseif (is_numeric($v) && $v == intval($v)) { - $value = $v; - } - else { - $value = $this->_read->quoteInto('?', $v); - } - $rowData[] = $value; - } - $sql .= '('.join(',', $rowData).')'; + $sql .= $this->_quoteRow($tableName, $row); } if (!is_null($sql)) { diff --git a/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php b/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php index e0607b0b9a..ff184cc650 100644 --- a/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php +++ b/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php @@ -43,14 +43,14 @@ public function getElementHtml() $switchAttributeCode = $this->getAttribute()->getAttributeCode().'_type'; $switchAttributeValue = $this->getProduct()->getData($switchAttributeCode); - $html = 'getProduct()->getId() && $this->getAttribute()->getAttributeCode() == 'price' || $this->getElement()->getReadonly() ? ' disabled="disabled"' : '') . '> '; $html .= ''.$elementHtml.''; - if ($this->getDisableChild()) { + if ($this->getDisableChild() && !$this->getElement()->getReadonly()) { $html .= ""; + $js = ''; + + $html .= sprintf($js, $this->helper('directory')->getRegionJson()); return $html; } } diff --git a/app/code/core/Mage/Tax/Model/Calculation.php b/app/code/core/Mage/Tax/Model/Calculation.php index 63c5d7641e..062faa80d3 100644 --- a/app/code/core/Mage/Tax/Model/Calculation.php +++ b/app/code/core/Mage/Tax/Model/Calculation.php @@ -86,7 +86,7 @@ protected function _formCalculationProcess() $process['id'] = "{$id}-{$value}"; $process['rates'][] = $rate; - return $process; + return array($process); } public function getRate($request) @@ -169,14 +169,13 @@ public function getRateRequest($shippingAddress = null, $billingAddress = null, $defaultCustomerGroup = Mage::getStoreConfig('customer/create_account/default_group', $store); $customerTaxClass = Mage::getModel('customer/group')->getTaxClassId($defaultCustomerGroup); } - $request = new Varien_Object(); $request ->setCountryId($address->getCountryId()) ->setRegionId($address->getRegionId()) ->setPostcode($address->getPostcode()) + ->setStore($store) ->setCustomerClassId($customerTaxClass); - return $request; } @@ -205,7 +204,7 @@ public function getRatesForAllCustomerTaxClasses($request) public function getAppliedRates($request) { - $cacheKey = "{$request->getProductClassId()}|{$request->getCustomerClassId()}|{$request->getCountryId()}|{$request->getRegionId()}|{$request->getPostcode()}"; + $cacheKey = "{$request->getStore()->getId()}|{$request->getProductClassId()}|{$request->getCustomerClassId()}|{$request->getCountryId()}|{$request->getRegionId()}|{$request->getPostcode()}"; if (!isset($this->_rateCalculationProcess[$cacheKey])) { $this->_rateCalculationProcess[$cacheKey] = $this->_getResource()->getCalculationProcess($request); } diff --git a/app/code/core/Mage/Tax/etc/config.xml b/app/code/core/Mage/Tax/etc/config.xml index 8e867021e3..33dcc6ff90 100644 --- a/app/code/core/Mage/Tax/etc/config.xml +++ b/app/code/core/Mage/Tax/etc/config.xml @@ -40,15 +40,12 @@ Mage_Tax_Model_Mysql4 - - tax_rate
-
- - tax_rule
-
tax_class
+ + tax_calculation
+
tax_calculation_rate
@@ -58,20 +55,6 @@ tax_calculation_rule
- - - tax_calculation_rule_product_tax_class
-
- - tax_calculation_rule_customer_tax_class
-
- - tax_calculation_rule_rate
-
- - - tax_calculation
-
diff --git a/app/code/core/Mage/Tax/etc/system.xml b/app/code/core/Mage/Tax/etc/system.xml index ac90135abb..49a19dfde4 100644 --- a/app/code/core/Mage/Tax/etc/system.xml +++ b/app/code/core/Mage/Tax/etc/system.xml @@ -121,7 +121,7 @@ - + 30 1 1 @@ -213,4 +213,4 @@ -
\ No newline at end of file + diff --git a/app/code/core/Mage/Tax/sql/tax_setup/mysql4-upgrade-0.7.3-0.7.4.php b/app/code/core/Mage/Tax/sql/tax_setup/mysql4-upgrade-0.7.3-0.7.4.php index a3b53ff066..07fbcb4c03 100644 --- a/app/code/core/Mage/Tax/sql/tax_setup/mysql4-upgrade-0.7.3-0.7.4.php +++ b/app/code/core/Mage/Tax/sql/tax_setup/mysql4-upgrade-0.7.3-0.7.4.php @@ -38,7 +38,7 @@ $installer->startSetup(); -$table = $installer->getTable('tax/rate'); +$table = $installer->getTable('tax_rate'); $installer->getConnection()->dropColumn($table, 'tax_county_id'); $installer->run("update {$table} set tax_postcode='*' where tax_postcode='' or tax_postcode is null"); diff --git a/app/code/core/Mage/Tax/sql/tax_setup/mysql4-upgrade-0.7.5-0.7.6.php b/app/code/core/Mage/Tax/sql/tax_setup/mysql4-upgrade-0.7.5-0.7.6.php index fee418735d..7e311a2692 100644 --- a/app/code/core/Mage/Tax/sql/tax_setup/mysql4-upgrade-0.7.5-0.7.6.php +++ b/app/code/core/Mage/Tax/sql/tax_setup/mysql4-upgrade-0.7.5-0.7.6.php @@ -28,7 +28,7 @@ /* @var $installer Mage_Customer_Model_Entity_Setup */ $installer->startSetup(); -$table = $installer->getTable('tax/rule'); +$table = $installer->getTable('tax_rule'); $installer->run(" ALTER TABLE `{$table}` ADD `priority` SMALLINT( 5 ) NOT NULL; diff --git a/app/code/core/Mage/Usa/Model/Shipping/Carrier/Abstract.php b/app/code/core/Mage/Usa/Model/Shipping/Carrier/Abstract.php index f736c849f6..6c073f9e95 100644 --- a/app/code/core/Mage/Usa/Model/Shipping/Carrier/Abstract.php +++ b/app/code/core/Mage/Usa/Model/Shipping/Carrier/Abstract.php @@ -73,4 +73,35 @@ public function isZipCodeRequired() { return true; } + + /** + * Processing additional validation to check is carrier applicable. + * + * @param Mage_Shipping_Model_Rate_Request $request + * @return Mage_Shipping_Model_Carrier_Abstract|Mage_Shipping_Model_Rate_Result_Error|boolean + */ + public function proccessAdditionalValidation(Mage_Shipping_Model_Rate_Request $request) + { + $maxAllowedWeight = (float) $this->getConfigData('max_package_weight'); + $error = null; + $showMethod = $this->getConfigData('showmethod'); + foreach ($request->getAllItems() as $item) { + if ($item->getProduct() && $item->getProduct()->getId()) { + if ($item->getProduct()->getWeight() > $maxAllowedWeight) { + $error = Mage::getModel('shipping/rate_result_error'); + $error->setCarrier($this->_code) + ->setCarrierTitle($this->getConfigData('title')); + $errorMsg = $this->getConfigData('specificerrmsg'); + $error->setErrorMessage($errorMsg?$errorMsg:Mage::helper('shipping')->__('The shipping module is not available.')); + break; + } + } + } + if (null !== $error && $showMethod) { + return $error; + } elseif (null !== $error) { + return false; + } + return $this; + } } diff --git a/app/code/core/Mage/Usa/etc/system.xml b/app/code/core/Mage/Usa/etc/system.xml index 2525a55621..2673165c71 100644 --- a/app/code/core/Mage/Usa/etc/system.xml +++ b/app/code/core/Mage/Usa/etc/system.xml @@ -246,6 +246,7 @@ select 92 + shipping-skip-hide adminhtml/system_config_source_yesno 1 1 @@ -534,6 +535,7 @@ select 92 + shipping-skip-hide adminhtml/system_config_source_yesno 1 1 @@ -798,6 +800,7 @@ select 92 + shipping-skip-hide adminhtml/system_config_source_yesno 1 1 @@ -983,6 +986,7 @@ select 92 + shipping-skip-hide adminhtml/system_config_source_yesno 1 1 diff --git a/app/code/core/Mage/Wishlist/Block/Customer/Sidebar.php b/app/code/core/Mage/Wishlist/Block/Customer/Sidebar.php index 752fbeb8d6..6906cd6b92 100644 --- a/app/code/core/Mage/Wishlist/Block/Customer/Sidebar.php +++ b/app/code/core/Mage/Wishlist/Block/Customer/Sidebar.php @@ -57,7 +57,7 @@ public function getWishlist() ->addUrlRewrite(); Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection); - Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection); + Mage::getSingleton('catalog/product_visibility')->addVisibleInSiteFilterToCollection($collection); } return $this->_wishlist; diff --git a/app/code/core/Mage/Wishlist/Block/Customer/Wishlist.php b/app/code/core/Mage/Wishlist/Block/Customer/Wishlist.php index 7dd7970f21..3edbc53bf8 100644 --- a/app/code/core/Mage/Wishlist/Block/Customer/Wishlist.php +++ b/app/code/core/Mage/Wishlist/Block/Customer/Wishlist.php @@ -56,7 +56,7 @@ public function getWishlist() ->addStoreFilter(); Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection); - Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection); + Mage::getSingleton('catalog/product_visibility')->addVisibleInSiteFilterToCollection($collection); $this->_wishlistLoaded = true; } diff --git a/app/code/core/Mage/Wishlist/Block/Share/Wishlist.php b/app/code/core/Mage/Wishlist/Block/Share/Wishlist.php index a54a6ccb9a..ff2d3d3a0d 100644 --- a/app/code/core/Mage/Wishlist/Block/Share/Wishlist.php +++ b/app/code/core/Mage/Wishlist/Block/Share/Wishlist.php @@ -61,9 +61,8 @@ public function getWishlist() ->addStoreFilter(); Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($this->_collection); - Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($this->_collection); + Mage::getSingleton('catalog/product_visibility')->addVisibleInSiteFilterToCollection($this->_collection); } - return $this->_collection; } @@ -81,8 +80,8 @@ public function getWishlistCustomer() public function getEscapedDescription($item) { - if ($item->getDescription()) { - return $this->htmlEscape($item->getDescription()); + if ($item->getWishlistItemDescription()) { + return $this->htmlEscape($item->getWishlistItemDescription()); } return ' '; } diff --git a/app/code/core/Mage/Wishlist/Model/Mysql4/Product/Collection.php b/app/code/core/Mage/Wishlist/Model/Mysql4/Product/Collection.php index f364a568cb..5273235ca4 100644 --- a/app/code/core/Mage/Wishlist/Model/Mysql4/Product/Collection.php +++ b/app/code/core/Mage/Wishlist/Model/Mysql4/Product/Collection.php @@ -20,24 +20,33 @@ * * @category Mage * @package Mage_Wishlist - * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com) + * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ /** - * Wishlist product collection + * Wishlist Product collection * * @category Mage * @package Mage_Wishlist - * @author Magento Core Team + * @author Magento Core Team */ -class Mage_Wishlist_Model_Mysql4_Product_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection +class Mage_Wishlist_Model_Mysql4_Product_Collection + extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection { - - public function addWishlistFilter(Mage_Wishlist_Model_Wishlist $wishlist) + /** + * Add wishlist filter to collection + * + * @param Mage_Wishlist_Model_Wishlist $wishlist + * @return Mage_Wishlist_Model_Mysql4_Product_Collection + */ + public function addWishlistFilter(Mage_Wishlist_Model_Wishlist $wishlist) { - $this->_joinFields['e_id'] = array('table'=>'e','field'=>'entity_id'); + $this->_joinFields['e_id'] = array( + 'table' => 'e', + 'field' => 'entity_id' + ); $this->joinTable('wishlist/item', 'product_id=e_id', @@ -49,39 +58,60 @@ public function addWishlistFilter(Mage_Wishlist_Model_Wishlist $wishlist) 'wishlist_id' => 'wishlist_id', 'wishlist_item_id' => 'wishlist_item_id', ), - array('wishlist_id'=>$wishlist->getId()) + array( + 'wishlist_id' => $wishlist->getId(), + 'store_id' => array('in' => $wishlist->getSharedStoreIds()) + ) ); return $this; } - public function addWishListSortOrder($att='added_at', $dir='desc') + /** + * Add wishlist sort order + * + * @param string $att + * @param string $dir + * @return Mage_Wishlist_Model_Mysql4_Product_Collection + */ + public function addWishListSortOrder($attribute = 'added_at', $dir = 'desc') { - $this->setOrder($att, $dir); - return $this; + $this->setOrder($attribute, $dir); + return $this; } + /** + * Add store data (days in wishlist) + * + * @return Mage_Wishlist_Model_Mysql4_Product_Collection + */ public function addStoreData() { - if(!isset($this->_joinFields['e_id'])) { + if (!isset($this->_joinFields['e_id'])) { return $this; } $dayTable = $this->_getAttributeTableAlias('days_in_wishlist'); - $this->joinField('store_name', 'core/store', 'name', 'store_id=store_id') - ->joinField('days_in_wishlist', - 'wishlist/item', - "(TO_DAYS('" . Mage::getSingleton('core/date')->date() . "') - TO_DAYS(DATE_ADD(".$dayTable.".added_at, INTERVAL " .(int) Mage::getSingleton('core/date')->getGmtOffset() . " SECOND)))", - 'wishlist_item_id=wishlist_item_id'); + $this->joinField('store_name', 'core/store', 'name', 'store_id=store_id'); + $this->joinField('days_in_wishlist', + 'wishlist/item', + "(TO_DAYS('" . Mage::getSingleton('core/date')->date() . "') - TO_DAYS(DATE_ADD(".$dayTable.".added_at, INTERVAL " .(int) Mage::getSingleton('core/date')->getGmtOffset() . " SECOND)))", + 'wishlist_item_id=wishlist_item_id' + ); return $this; } + /** + * Rewrite retrieve attribute field name for wishlist attributes + * + * @param string $attributeCode + * @return Mage_Wishlist_Model_Mysql4_Product_Collection + */ protected function _getAttributeFieldName($attributeCode) { - if($attributeCode == 'days_in_wishlist') { + if ($attributeCode == 'days_in_wishlist') { return $this->_joinFields[$attributeCode]['field']; } return parent::_getAttributeFieldName($attributeCode); } - } diff --git a/app/code/core/Mage/Wishlist/Model/Mysql4/Wishlist.php b/app/code/core/Mage/Wishlist/Model/Mysql4/Wishlist.php index 51213151a5..adadc9bbbd 100644 --- a/app/code/core/Mage/Wishlist/Model/Mysql4/Wishlist.php +++ b/app/code/core/Mage/Wishlist/Model/Mysql4/Wishlist.php @@ -63,7 +63,7 @@ public function fetchItemsCount(Mage_Wishlist_Model_Wishlist $wishlist) ->addStoreFilter(); Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection); - Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection); + Mage::getSingleton('catalog/product_visibility')->addVisibleInSiteFilterToCollection($collection); $this->_itemsCount = $collection->getSize(); } diff --git a/app/code/core/Mage/Wishlist/Model/Mysql4/Wishlist/Collection.php b/app/code/core/Mage/Wishlist/Model/Mysql4/Wishlist/Collection.php index ff68419575..ba8495155c 100644 --- a/app/code/core/Mage/Wishlist/Model/Mysql4/Wishlist/Collection.php +++ b/app/code/core/Mage/Wishlist/Model/Mysql4/Wishlist/Collection.php @@ -32,7 +32,7 @@ * @package Mage_Wishlist * @author Magento Core Team */ -class Mage_Wishlist_Model_Mysql4_Wishlist extends Mage_Core_Model_Abstract +class Mage_Wishlist_Model_Mysql4_Wishlist_Collection extends Mage_Core_Model_Abstract { protected function _construct() diff --git a/app/code/core/Mage/Wishlist/Model/Wishlist.php b/app/code/core/Mage/Wishlist/Model/Wishlist.php index 9c87c929ab..44d0f69f3e 100644 --- a/app/code/core/Mage/Wishlist/Model/Wishlist.php +++ b/app/code/core/Mage/Wishlist/Model/Wishlist.php @@ -212,7 +212,7 @@ public function getDataForSave() public function getSharedStoreIds() { if (is_null($this->_storeIds)) { - $this->_storeIds = Mage::app()->getStore()->getWebsite()->getStoreIds(); + $this->_storeIds = $this->getStore()->getWebsite()->getStoreIds(); } return $this->_storeIds; } diff --git a/app/code/core/Mage/Wishlist/controllers/IndexController.php b/app/code/core/Mage/Wishlist/controllers/IndexController.php index 09ca89f310..e4703df373 100644 --- a/app/code/core/Mage/Wishlist/controllers/IndexController.php +++ b/app/code/core/Mage/Wishlist/controllers/IndexController.php @@ -34,6 +34,13 @@ */ class Mage_Wishlist_IndexController extends Mage_Core_Controller_Front_Action { + /** + * Action list where need check enabled cookie + * + * @var array + */ + protected $_cookieCheckActions = array('add'); + public function preDispatch() { parent::preDispatch(); diff --git a/app/code/core/Zend/Cache/Backend/Apc.php b/app/code/core/Zend/Cache/Backend/Apc.php index b686c81483..d8bd9e2d49 100644 --- a/app/code/core/Zend/Cache/Backend/Apc.php +++ b/app/code/core/Zend/Cache/Backend/Apc.php @@ -24,12 +24,12 @@ /** * Zend_Cache_Backend_Interface */ -require_once 'Zend/Cache/Backend/Interface.php'; +#require_once 'Zend/Cache/Backend/Interface.php'; /** * Zend_Cache_Backend */ -require_once 'Zend/Cache/Backend.php'; +#require_once 'Zend/Cache/Backend.php'; /** @@ -106,7 +106,7 @@ protected function _prepareId($origId) */ protected function _prepareTagId($tagId) { - return $this->_prepareId($this->_options['tag_prefix'] . $tagId); + return $this->_options['tag_prefix'] . $tagId; } /** @@ -175,13 +175,13 @@ public function save($data, $id, $tags = array(), $specificLifetime = false) $this->recordTagUsage($tag); $tagid = $this->_prepareTagId($tag); - $old_tags = apc_fetch($tagid); + $old_tags = apc_fetch($this->_prepareId($tagid)); if ($old_tags === false) { $old_tags = array(); } $old_tags[$id] = $id; $this->remove($tagid); - $result2 = apc_store($tagid, $old_tags); + $result2 = apc_store($this->_prepareId($tagid), $old_tags); } } @@ -213,12 +213,12 @@ private function recordTagUsage($tagId) } } - /** - * Remove this tagId from a global array of all tags with self::TAGS_MASTER_ID as the id. - * - * @param $tagId string the id of the tag being removed - * @return bool true if the tag was removed, false otherwise - */ + /** + * Remove this tagId from a global array of all tags with self::TAGS_MASTER_ID as the id. + * + * @param $tagId string the id of the tag being removed + * @return bool true if the tag was removed, false otherwise + */ private function removeTagUsage($tagId) { $tmaster_wrapper = apc_fetch($this->_getTagStorageId()); @@ -245,7 +245,7 @@ private function removeTagUsage($tagId) */ public function remove($id) { - return apc_delete($id); + return apc_delete($this->_prepareId($id)); } /** @@ -277,7 +277,7 @@ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) $idList = array(); foreach ($tags as $tag) { $tagId = $this->_prepareTagId($tag); - $current_idList = apc_fetch($tagId); + $current_idList = apc_fetch($this->_prepareId($tagId)); if (is_array($current_idList)) { $idList = array_merge($idList, $current_idList); } @@ -287,7 +287,7 @@ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) //remove tagIds from the master tag list foreach ($tags as $tag) { $tagId = $this->_prepareTagId($tag); - apc_delete($tagId); + apc_delete($this->_prepareId($tagId)); $this->removeTagUsage($tag); } @@ -306,7 +306,7 @@ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) foreach ($masterTagList as $tag) { $needsUpdate = false; $tagId = $this->_prepareTagId($tag); - $other_tagList = apc_fetch($tagId); + $other_tagList = apc_fetch($this->_prepareId($tagId)); if (is_array($other_tagList) ) { foreach ($other_tagList as $_tagIdx => $otherRefId) { @@ -319,9 +319,9 @@ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) if ($needsUpdate) { //completely remove tags if there are no more items in their array. if ( count($other_tagList) < 1) { - apc_delete($tagId); + apc_delete($this->_prepareId($tagId)); } else { - apc_store($tagId, $other_tagList); + apc_store($this->_prepareId($tagId), $other_tagList); } } } diff --git a/app/code/core/Zend/Cache/Backend/Eaccelerator.php b/app/code/core/Zend/Cache/Backend/Eaccelerator.php new file mode 100644 index 0000000000..6a5d430008 --- /dev/null +++ b/app/code/core/Zend/Cache/Backend/Eaccelerator.php @@ -0,0 +1,338 @@ + '', + 'tag_prefix' => 'EAC_TAG_', + 'tag_storage' => 'EAC_ALL_TAGS' + ); + +/** + * Constructor + * + * @param array $options associative array of options + */ + public function __construct($options = array()) + { + if (!extension_loaded('eaccelerator')) { + Zend_Cache::throwException('The eaccelerator extension must be loaded for using this backend !'); + } + parent::__construct($options); + } + +/** + * Get tag storage cache identifier + * + * @return string + */ + protected function _getTagStorageId() + { + return $this->_prepareId($this->_options['tag_storage']); + } + + /** + * Get all cache ids identifier + * + * @return string + */ + protected function _getCachePrefix() + { + return $this->_options['cache_prefix']; + } + + /** + * Prepare cache identifier + * + * @param string $origId + * @return string + */ + protected function _prepareId($origId) + { + return $this->_getCachePrefix() . $origId; + } + + /** + * Parepare tag identifier + * + * @param string $tagId + * @return string + */ + protected function _prepareTagId($tagId) + { + return $this->_options['tag_prefix'] . $tagId; + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * + * @param string $id cache id + * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested + * @return string cached datas (or false) + */ + public function load($id, $doNotTestCacheValidity = false) + { + $id = $this->_prepareId($id); + + if ($doNotTestCacheValidity) { + $this->_log("Zend_Cache_Backend_Eaccelerator::load() : \$doNotTestCacheValidity=true is unsupported by the Eaccelerator backend"); + } + + $tmp = eaccelerator_get($id); + if (is_array($tmp) && isset($tmp[0])) { + return $tmp[0]; + } else { + return $tmp; + } + return false; + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id cache id + * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $id = $this->_prepareId($id); + $tmp = eaccelerator_get($id); + if (is_array($tmp)) { + return $tmp[1]; + } + return false; + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data datas to cache + * @param string $id cache id + * @param array $tags array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $id = $this->_prepareId($id); + $lifetime = $this->getLifetime($specificLifetime); + $result1 = eaccelerator_put($id, array($data, time()), $lifetime); + $result2 = true; + + if (count($tags) > 0) { + foreach ($tags as $tag) { + $this->recordTagUsage($tag); + + $tagid = $this->_prepareTagId($tag); + $old_tags = eaccelerator_get($this->_prepareId($tagid)); + if ($old_tags === false) { + $old_tags = array(); + } + $old_tags[$id] = $id; + $this->remove($tagid); + $result2 = eaccelerator_put($this->_prepareId($tagid), $old_tags); + } + } + + return $result1 && $result2; + } + + /** + * Save this tagId into a global array of all tags with self::TAGS_MASTER_ID as the id. + * + * @param $tagId string the id of the tag being used + * @return bool true if the tag was set or was already present + */ + private function recordTagUsage($tagId) + { + $old_tmaster_wrapper = eaccelerator_get($this->_getTagStorageId()); + + if (!is_array($old_tmaster_wrapper)) { + $old_tmaster = array(); + } else { + $old_tmaster = $old_tmaster_wrapper[0]; + } + + if (in_array($tagId, $old_tmaster)) { + return true; + } else { + //master tag list has tag ID as both key and value for speed + $old_tmaster[$tagId] = $tagId; + return eaccelerator_put($this->_getTagStorageId(), array($old_tmaster, time())); + } + } + + /** + * Remove this tagId from a global array of all tags with self::TAGS_MASTER_ID as the id. + * + * @param $tagId string the id of the tag being removed + * @return bool true if the tag was removed, false otherwise + */ + private function removeTagUsage($tagId) + { + $tmaster_wrapper = eaccelerator_get($this->_getTagStorageId()); + if (!is_array($tmaster_wrapper)) { + $old_tmaster = array(); + return false; + } else { + $old_tmaster = $tmaster_wrapper[0]; + } + + if (in_array($tagId, $old_tmaster)) { + //master tag list has tag ID as both key and value for speed + unset($old_tmaster[$tagId]); + return eaccelerator_put($this->_getTagStorageId(), array($old_tmaster, time())); + } + return false; + } + + /** + * Remove a cache record + * + * @param string $id cache id + * @return boolean true if no problem + */ + public function remove($id) + { + return eaccelerator_rm($this->_prepareId($id)); + } + + /** + * Clean some cache records + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => remove too old cache entries ($tags is not used) + * 'matchingTag' => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * 'notMatchingTag' => remove cache entries not matching one of the given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode clean mode + * @param array $tags array of tags + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + if ($mode==Zend_Cache::CLEANING_MODE_ALL) { + return eaccelerator_clean(); + } + + if ($mode==Zend_Cache::CLEANING_MODE_OLD) { + $this->_log("Zend_Cache_Backend_Eaccelerator::clean() : CLEANING_MODE_OLD is unsupported by the Eaccelerator backend"); + } + + if ($mode==Zend_Cache::CLEANING_MODE_MATCHING_TAG) { + $idList = array(); + foreach ($tags as $tag) { + $tagId = $this->_prepareTagId($tag); + $current_idList = eaccelerator_get($this->_prepareId($tagId)); + if (is_array($current_idList)) { + $idList = array_merge($idList, $current_idList); + } + } + + //clean up all tags completely + //remove tagIds from the master tag list + foreach ($tags as $tag) { + $tagId = $this->_prepareTagId($tag); + eaccelerator_rm($this->_prepareId($tagId)); + $this->removeTagUsage($tag); + } + + //leave if there were no found IDs + if( count($idList) < 1) { + return true; + } + + //remove the deleted IDs from any other tag references + $masterTagWrapper = eaccelerator_get($this->_getTagStorageId()); + $masterTagList = null; + if (is_array($masterTagWrapper)) { + $masterTagList = $masterTagWrapper[0]; + } + + foreach ($masterTagList as $tag) { + $needsUpdate = false; + $tagId = $this->_prepareTagId($tag); + $other_tagList = eaccelerator_get($this->_prepareId($tagId)); + + if (is_array($other_tagList) ) { + foreach ($other_tagList as $_tagIdx => $otherRefId) { + if ( in_array($otherRefId, $idList)) { + unset($other_tagList[$_tagIdx]); + $needsUpdate = true; + } + } + + if ($needsUpdate) { + //completely remove tags if there are no more items in their array. + if ( count($other_tagList) < 1) { + eaccelerator_rm($this->_prepareId($tagId)); + } else { + eaccelerator_put($this->_prepareId($tagId), $other_tagList); + } + } + } + } + + foreach ($idList as $id) { + eaccelerator_rm($id); + } + return true; + } + + if ($mode==Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG) { + $this->_log("Zend_Cache_Backend_Eaccelerator::clean() : tags are unsupported by the Eaccelerator backend"); + } + return $this; + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * @return boolean + */ + public function isAutomaticCleaningAvailable() + { + return false; + } +} diff --git a/app/code/core/Zend/Cache/Backend/File.php b/app/code/core/Zend/Cache/Backend/File.php index 08ce8c533d..5734f2910b 100644 --- a/app/code/core/Zend/Cache/Backend/File.php +++ b/app/code/core/Zend/Cache/Backend/File.php @@ -23,12 +23,12 @@ /** * @see Zend_Cache_Backend_Interface */ -require_once 'Zend/Cache/Backend/Interface.php'; +#require_once 'Zend/Cache/Backend/Interface.php'; /** * @see Zend_Cache_Backend */ -require_once 'Zend/Cache/Backend.php'; +#require_once 'Zend/Cache/Backend.php'; /** diff --git a/app/code/core/Zend/Cache/Backend/Memcached.php b/app/code/core/Zend/Cache/Backend/Memcached.php index f724b1f3f9..6a2ddbf462 100644 --- a/app/code/core/Zend/Cache/Backend/Memcached.php +++ b/app/code/core/Zend/Cache/Backend/Memcached.php @@ -24,12 +24,12 @@ /** * Zend_Cache_Backend_Interface */ -require_once 'Zend/Cache/Backend/Interface.php'; +#require_once 'Zend/Cache/Backend/Interface.php'; /** * Zend_Cache_Backend */ -require_once 'Zend/Cache/Backend.php'; +#require_once 'Zend/Cache/Backend.php'; /** @@ -180,38 +180,38 @@ public function save($data, $id, $tags = array(), $specificLifetime = false) } else { $flag = 0; } - //DEBUG ADDED TO WATCH ALL THE KEYS - /* + //DEBUG ADDED TO WATCH ALL THE KEYS + /* $old_master_wrapper = $this->_memcache->get('master_ids'); if (! is_array($old_master_wrapper) ) { - $old_master = array(); + $old_master = array(); } else { - $old_master = $old_master_wrapper[0]; + $old_master = $old_master_wrapper[0]; } $old_master[] = $id; $this->_memcache->set('master_ids', array($old_master, time())); - //DEBUG ADDED TO WATCH ALL THE KEYS + //DEBUG ADDED TO WATCH ALL THE KEYS //*/ if (count($tags) > 0) { - } + } $result1 = $this->_memcache->set($id, array($data, time()), $flag, $lifetime); - $result2 = (count($tags) == 0); + $result2 = (count($tags) == 0); if (count($tags) > 0) { - foreach ($tags as $tag) { - $this->recordTagUsage($tag); - $tagid = self::TAGS_PREFIX.$tag; - $old_tags = $this->_memcache->get($tagid); - if ($old_tags === false) { - $old_tags = array(); - } - $old_tags[$id] = $id; - $this->remove($tagid); - $result2 = $this->_memcache->set($tagid, $old_tags); - } - } + foreach ($tags as $tag) { + $this->recordTagUsage($tag); + $tagid = self::TAGS_PREFIX.$tag; + $old_tags = $this->_memcache->get($tagid); + if ($old_tags === false) { + $old_tags = array(); + } + $old_tags[$id] = $id; + $this->remove($tagid); + $result2 = $this->_memcache->set($tagid, $old_tags); + } + } return $result1 && $result2; } @@ -223,19 +223,19 @@ public function save($data, $id, $tags = array(), $specificLifetime = false) * @return bool true if the tag was set or was already present */ private function recordTagUsage($tagId) { - $old_tmaster_wrapper = $this->_memcache->get(self::TAGS_MASTER_ID); - if (! is_array($old_tmaster_wrapper) ) { - $old_tmaster = array(); - } else { - $old_tmaster = $old_tmaster_wrapper[0]; - } - if (in_array( $tagId, $old_tmaster) ) { - return true; - } else { - //master tag list has tag ID as both key and value for speed - $old_tmaster[$tagId] = $tagId; - return $this->_memcache->set(self::TAGS_MASTER_ID, array($old_tmaster, time())); - } + $old_tmaster_wrapper = $this->_memcache->get(self::TAGS_MASTER_ID); + if (! is_array($old_tmaster_wrapper) ) { + $old_tmaster = array(); + } else { + $old_tmaster = $old_tmaster_wrapper[0]; + } + if (in_array( $tagId, $old_tmaster) ) { + return true; + } else { + //master tag list has tag ID as both key and value for speed + $old_tmaster[$tagId] = $tagId; + return $this->_memcache->set(self::TAGS_MASTER_ID, array($old_tmaster, time())); + } } /** @@ -245,19 +245,19 @@ private function recordTagUsage($tagId) { * @return bool true if the tag was removed, false otherwise */ private function removeTagUsage($tagId) { - $tmaster_wrapper = $this->_memcache->get(self::TAGS_MASTER_ID); - if (! is_array($tmaster_wrapper) ) { - $old_tmaster = array(); - return false; - } else { - $old_tmaster = $tmaster_wrapper[0]; - } - if (in_array( $tagId, $old_tmaster) ) { - //master tag list has tag ID as both key and value for speed - unset($old_tmaster[$tagId]); - return $this->_memcache->set(self::TAGS_MASTER_ID, array($old_tmaster, time())); - } - return false; + $tmaster_wrapper = $this->_memcache->get(self::TAGS_MASTER_ID); + if (! is_array($tmaster_wrapper) ) { + $old_tmaster = array(); + return false; + } else { + $old_tmaster = $tmaster_wrapper[0]; + } + if (in_array( $tagId, $old_tmaster) ) { + //master tag list has tag ID as both key and value for speed + unset($old_tmaster[$tagId]); + return $this->_memcache->set(self::TAGS_MASTER_ID, array($old_tmaster, time())); + } + return false; } /** @@ -294,56 +294,56 @@ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) if ($mode==Zend_Cache::CLEANING_MODE_OLD) { $this->_log("Zend_Cache_Backend_Memcached::clean() : CLEANING_MODE_OLD is unsupported by the Memcached backend"); } - if ($mode==Zend_Cache::CLEANING_MODE_MATCHING_TAG) { - $idList = array(); - foreach ($tags as $tag) { - $current_idList = $this->_memcache->get(self::TAGS_PREFIX.$tag); - if (is_array($current_idList)) { - $idList = array_merge($idList, $current_idList); - } - } - //clean up all tags completely - //remove tagIds from the master tag list - foreach ($tags as $tag) { - $this->_memcache->delete(self::TAGS_PREFIX.$tag); - $this->removeTagUsage($tag); - } + if ($mode==Zend_Cache::CLEANING_MODE_MATCHING_TAG) { + $idList = array(); + foreach ($tags as $tag) { + $current_idList = $this->_memcache->get(self::TAGS_PREFIX.$tag); + if (is_array($current_idList)) { + $idList = array_merge($idList, $current_idList); + } + } + //clean up all tags completely + //remove tagIds from the master tag list + foreach ($tags as $tag) { + $this->_memcache->delete(self::TAGS_PREFIX.$tag); + $this->removeTagUsage($tag); + } - //leave if there were no found IDs - if( count($idList) < 1) { - return true; - } + //leave if there were no found IDs + if( count($idList) < 1) { + return true; + } - //remove the deleted IDs from any other tag references - $masterTagWrapper = $this->_memcache->get(self::TAGS_MASTER_ID); - $masterTagList = null; - if (is_array($masterTagWrapper)) { - $masterTagList = $masterTagWrapper[0]; - } - foreach ($masterTagList as $tag) { - $needsUpdate = false; - $other_tagList = $this->_memcache->get(self::TAGS_PREFIX.$tag); - if (is_array($other_tagList) ) { - foreach ($other_tagList as $_tagIdx => $otherRefId) { - if ( in_array($otherRefId, $idList)) { - unset($other_tagList[$_tagIdx]); - $needsUpdate = true; - } - } - if ($needsUpdate) { - //completely remove tags if there are no more items in their array. - if ( count($other_tagList) < 1) { - $this->_memcache->delete(self::TAGS_PREFIX.$tag); - } else { - $this->_memcache->set(self::TAGS_PREFIX.$tag, $other_tagList); - } - } - } - } + //remove the deleted IDs from any other tag references + $masterTagWrapper = $this->_memcache->get(self::TAGS_MASTER_ID); + $masterTagList = null; + if (is_array($masterTagWrapper)) { + $masterTagList = $masterTagWrapper[0]; + } + foreach ($masterTagList as $tag) { + $needsUpdate = false; + $other_tagList = $this->_memcache->get(self::TAGS_PREFIX.$tag); + if (is_array($other_tagList) ) { + foreach ($other_tagList as $_tagIdx => $otherRefId) { + if ( in_array($otherRefId, $idList)) { + unset($other_tagList[$_tagIdx]); + $needsUpdate = true; + } + } + if ($needsUpdate) { + //completely remove tags if there are no more items in their array. + if ( count($other_tagList) < 1) { + $this->_memcache->delete(self::TAGS_PREFIX.$tag); + } else { + $this->_memcache->set(self::TAGS_PREFIX.$tag, $other_tagList); + } + } + } + } - foreach ($idList as $id) { - $this->_memcache->delete($id); - } + foreach ($idList as $id) { + $this->_memcache->delete($id); + } return true; } if ($mode==Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG) { diff --git a/app/design/adminhtml/default/default/layout/compiler.xml b/app/design/adminhtml/default/default/layout/compiler.xml new file mode 100644 index 0000000000..b72bec1793 --- /dev/null +++ b/app/design/adminhtml/default/default/layout/compiler.xml @@ -0,0 +1,35 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/design/adminhtml/default/default/layout/customer.xml b/app/design/adminhtml/default/default/layout/customer.xml index cadfcda0db..15e15bd5f8 100644 --- a/app/design/adminhtml/default/default/layout/customer.xml +++ b/app/design/adminhtml/default/default/layout/customer.xml @@ -32,7 +32,13 @@ - + + + + + + customer_edit_tab_viewcustomer_edit_tab_view + diff --git a/app/design/adminhtml/default/default/layout/main.xml b/app/design/adminhtml/default/default/layout/main.xml index e02882287e..3229b55b5f 100644 --- a/app/design/adminhtml/default/default/layout/main.xml +++ b/app/design/adminhtml/default/default/layout/main.xml @@ -97,6 +97,7 @@ Default layout, loads most of the pages + diff --git a/app/design/adminhtml/default/default/layout/sales.xml b/app/design/adminhtml/default/default/layout/sales.xml index 931d5ee46b..6ac9e5c095 100644 --- a/app/design/adminhtml/default/default/layout/sales.xml +++ b/app/design/adminhtml/default/default/layout/sales.xml @@ -115,7 +115,10 @@ subtotal Subtotal - + + tax_amount + Tax + @@ -158,7 +161,10 @@ subtotal Subtotal - + + tax_amount + Tax + @@ -212,7 +218,10 @@ subtotal Subtotal - + + tax_amount + Tax + @@ -321,6 +330,8 @@ + + @@ -357,6 +368,9 @@ + + + @@ -415,4 +429,284 @@ + + + + true + + + mage/adminhtml/sales.js + mage/adminhtml/giftmessage.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/design/adminhtml/default/default/template/bundle/product/edit/bundle.phtml b/app/design/adminhtml/default/default/template/bundle/product/edit/bundle.phtml index ccef589ab4..360e03943f 100644 --- a/app/design/adminhtml/default/default/template/bundle/product/edit/bundle.phtml +++ b/app/design/adminhtml/default/default/template/bundle/product/edit/bundle.phtml @@ -35,17 +35,16 @@ if(typeof Bundle=='undefined') {

__('Shipment') ?>

- __('Shipment') ?> - - - - - -
-
+ + + + + +
+
@@ -64,6 +63,14 @@ if(typeof Bundle=='undefined') { -
\ No newline at end of file +
diff --git a/app/design/adminhtml/default/default/template/bundle/product/edit/bundle/option/selection.phtml b/app/design/adminhtml/default/default/template/bundle/product/edit/bundle/option/selection.phtml index 5638a17899..197518c5e7 100644 --- a/app/design/adminhtml/default/default/template/bundle/product/edit/bundle/option/selection.phtml +++ b/app/design/adminhtml/default/default/template/bundle/product/edit/bundle/option/selection.phtml @@ -97,7 +97,11 @@ Bundle.Selection.prototype = { evalScripts : true }); - var button = Event.element(event); + if (Event.element(event).tagName.toLowerCase() != 'button') { + var button = Event.element(event).up('button'); + } else { + var button = Event.element(event); + } button.hide(); }, diff --git a/app/design/adminhtml/default/default/template/catalog/category/tree.phtml b/app/design/adminhtml/default/default/template/catalog/category/tree.phtml index a7da00986a..053648f8db 100644 --- a/app/design/adminhtml/default/default/template/catalog/category/tree.phtml +++ b/app/design/adminhtml/default/default/template/catalog/category/tree.phtml @@ -203,11 +203,13 @@ function reRenderTree(event, switcher) } } - if (newStoreId == 0) { - $('add_root_category_button').show(); - } - else { - $('add_root_category_button').hide(); + if ($('add_root_category_button')) { + if (newStoreId == 0) { + $('add_root_category_button').show(); + } + else { + $('add_root_category_button').hide(); + } } // retain current selected category id @@ -471,4 +473,4 @@ function categoryMove(obj) } //]]> - \ No newline at end of file + diff --git a/app/design/adminhtml/default/default/template/catalog/form/renderer/fieldset/element.phtml b/app/design/adminhtml/default/default/template/catalog/form/renderer/fieldset/element.phtml index a5a4b89d8f..3c1263182d 100644 --- a/app/design/adminhtml/default/default/template/catalog/form/renderer/fieldset/element.phtml +++ b/app/design/adminhtml/default/default/template/catalog/form/renderer/fieldset/element.phtml @@ -38,10 +38,10 @@ getScopeLabel() ?> canDisplayUseDefault()): ?> - usedDefault()): ?> checked="checked" onclick="toggleValueElements(this, this.parentNode.parentNode)" value="getAttributeCode() ?>"/> + getReadonly()):?> disabled="disabled" type="checkbox" name="use_default[]" id="getHtmlId() ?>_default"usedDefault()): ?> checked="checked" onclick="toggleValueElements(this, this.parentNode.parentNode)" value="getAttributeCode() ?>"/> getNote()): ?> class="note">getNote()?$_element->getNote():' ' ?> - \ No newline at end of file + diff --git a/app/design/adminhtml/default/default/template/catalog/form/renderer/googleoptimizer/import.phtml b/app/design/adminhtml/default/default/template/catalog/form/renderer/googleoptimizer/import.phtml index 3b165b9389..00b5b26dce 100644 --- a/app/design/adminhtml/default/default/template/catalog/form/renderer/googleoptimizer/import.phtml +++ b/app/design/adminhtml/default/default/template/catalog/form/renderer/googleoptimizer/import.phtml @@ -26,7 +26,7 @@ ?> getElement()->getDisabled()) { + if ($this->getElement()->getDisabled() || $this->getElement()->getReadonly()) { $_disabled = ' disabled="disabled"'; } ?> @@ -52,4 +52,4 @@     - \ No newline at end of file + diff --git a/app/design/adminhtml/default/default/template/catalog/product.phtml b/app/design/adminhtml/default/default/template/catalog/product.phtml index ce14859b63..817f11702d 100644 --- a/app/design/adminhtml/default/default/template/catalog/product.phtml +++ b/app/design/adminhtml/default/default/template/catalog/product.phtml @@ -24,12 +24,17 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> +

__('Manage Products') ?>

- getAddNewButtonHtml() ?> + getButtonsHtml() ?>
@@ -39,4 +44,4 @@
getGridHtml() ?> -
\ No newline at end of file +
diff --git a/app/design/adminhtml/default/default/template/catalog/product/edit.phtml b/app/design/adminhtml/default/default/template/catalog/product/edit.phtml index 86971d7774..96d2b7dcdf 100644 --- a/app/design/adminhtml/default/default/template/catalog/product/edit.phtml +++ b/app/design/adminhtml/default/default/template/catalog/product/edit.phtml @@ -203,6 +203,8 @@ Event.observe(window, 'load', function() { var objName = 'getSelectedTabId() ?>'; if (objName) { obj = $(objName); + //IE fix (bubbling event model) + product_info_tabsJsTabs.setSkipDisplayFirstTab(); product_info_tabsJsTabs.showTabContent(obj); } Product.AttributesBridge.setTabsObject(product_info_tabsJsTabs); diff --git a/app/design/adminhtml/default/default/template/catalog/product/edit/categories.phtml b/app/design/adminhtml/default/default/template/catalog/product/edit/categories.phtml index ed5969376d..4985c0a0fc 100644 --- a/app/design/adminhtml/default/default/template/catalog/product/edit/categories.phtml +++ b/app/design/adminhtml/default/default/template/catalog/product/edit/categories.phtml @@ -85,6 +85,7 @@ Ext.EventManager.onDocumentReady(function() { draggable:false, checked:'getRootNode()->getChecked() ?>', id:'getRootNode()->getId() ?>', + disabled: getRootNode()->getDisabled() ? 'true' : 'false') ?>, uiProvider: Ext.tree.CheckboxNodeUI }); @@ -123,6 +124,9 @@ function bildCategoryTree(parent, config){ } function categoryClick(node, e){ + if (node.disabled) { + return; + } node.getUI().check(!node.getUI().checked()) varienElementMethods.setHasChanges(Event.element(e), e); }; @@ -140,4 +144,4 @@ function categoryRemove(id) { $('product_categories').value = ids.join(','); } - \ No newline at end of file + diff --git a/app/design/adminhtml/default/default/template/catalog/product/edit/options/option.phtml b/app/design/adminhtml/default/default/template/catalog/product/edit/options/option.phtml index 56ffe9e689..dc0899ad02 100644 --- a/app/design/adminhtml/default/default/template/catalog/product/edit/options/option.phtml +++ b/app/design/adminhtml/default/default/template/catalog/product/edit/options/option.phtml @@ -113,6 +113,15 @@ var productOption = { Event.observe(buttons[i], 'click', this.remove.bind(this)); } } + isReadonly()):?> + var inputs = $$('div.product-custom-options button', 'div.product-custom-options input', 'div.product-custom-options select', 'div.product-custom-options textarea'); + for (var i=0, l = inputs.length; i < l; i ++) { + inputs[i].disabled = true; + if (inputs[i].tagName.toLowerCase()=='button') { + inputs[i].addClassName('disabled'); + } + } + } } @@ -336,4 +345,4 @@ productOptionScope.bindScopeCheckbox(); //]]> -
+
isReadonly()):?>
diff --git a/app/design/adminhtml/default/default/template/catalog/product/edit/price/tier.phtml b/app/design/adminhtml/default/default/template/catalog/product/edit/price/tier.phtml index 1302a8e558..9d9323aed2 100644 --- a/app/design/adminhtml/default/default/template/catalog/product/edit/price/tier.phtml +++ b/app/design/adminhtml/default/default/template/catalog/product/edit/price/tier.phtml @@ -27,6 +27,7 @@ getElement()->getHtmlId() ?> getElement()->getClass() ?> getElement()->getName() ?> +getElement()->getReadonly() ?> isMultiWebsites(); ?> getElement()->getLabel() ?> @@ -88,6 +89,11 @@ itemsCount : 0, deleteButton: false, addItem : function () { + + if (arguments.length < 4) { + return; + } + var data = {}; data.website_id = 0; data.group = 'getDefaultCustomerGroup() ?>'; @@ -103,6 +109,16 @@ Element.insert($('_container'), {'bottom':this.template.evaluate(data)}); $('tier_price_row_'+data.index+'_cust_group').value = data.group; $('tier_price_row_'+data.index+'_website').value = data.website_id; + + $('_container').select('input', 'select') + .each(this.disableElement); + $('_container').up('table').select('button') + .each(this.disableElement); + + }, + disableElement: function(elem) { + elem.disabled = true + elem.addClassName('disabled'); }, deleteItem : function(event) { var tr = Event.findElement(event, 'tr'); @@ -117,7 +133,11 @@ getValues() as $_item): ?> tierPriceControl.addItem('', '', '',''); + + $('_container').up('table').select('button') + .each(tierPriceControl.disableElement); + //]]> - \ No newline at end of file + diff --git a/app/design/adminhtml/default/default/template/catalog/product/edit/super/config.phtml b/app/design/adminhtml/default/default/template/catalog/product/edit/super/config.phtml index 1d83f59aee..adb6027a31 100644 --- a/app/design/adminhtml/default/default/template/catalog/product/edit/super/config.phtml +++ b/app/design/adminhtml/default/default/template/catalog/product/edit/super/config.phtml @@ -24,6 +24,7 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> +isReadonly()):?>

__('Create Simple Associated Product') ?>

@@ -32,9 +33,11 @@ getChildHtml('create_empty') ?> getChildHtml('create_from_configurable') ?>
+
getChildHtml('simple'); ?>
+

__('Super product attributes configuration') ?>

@@ -55,12 +58,12 @@
-
+
'{{frontend_label}}'
- + isReadonly()):?> disabled="disabled" class="input-text attribute-label required-entry template no-display" value="'{{label}}'" />
@@ -72,17 +75,17 @@
__('Price:') ?> - + isReadonly()):?> disabled="disabled" class="input-text attribute-price validate-number template no-display" value="'{{pricing_value}}'"/>
-  isReadonly()):?> disabled="disabled" >
getShowUseDefaultPrice()):?>
-   +  isReadonly()):?> disabled="disabled" class="attribute-use-default-value">
@@ -104,7 +107,7 @@
getGridHtml() ?> -
\ No newline at end of file +
diff --git a/app/design/adminhtml/default/default/template/catalog/product/edit/websites.phtml b/app/design/adminhtml/default/default/template/catalog/product/edit/websites.phtml index fa42eeb48c..5fbab41c38 100644 --- a/app/design/adminhtml/default/default/template/catalog/product/edit/websites.phtml +++ b/app/design/adminhtml/default/default/template/catalog/product/edit/websites.phtml @@ -41,7 +41,7 @@ getWebsiteCollection() as $_website): ?>
- hasWebsite($_website->getId())): ?> checked/> + isReadonly()):?> disabled="disabled" class="checkbox website-checkbox" id="product_website_getId() ?>" type="checkbox"hasWebsite($_website->getId())): ?> checked/>
@@ -94,4 +94,4 @@ } } //]]> - \ No newline at end of file + diff --git a/app/design/adminhtml/default/default/template/catalog/product/helper/gallery.phtml b/app/design/adminhtml/default/default/template/catalog/product/helper/gallery.phtml index b59bd82f1d..d20c93ad4e 100644 --- a/app/design/adminhtml/default/default/template/catalog/product/helper/gallery.phtml +++ b/app/design/adminhtml/default/default/template/catalog/product/helper/gallery.phtml @@ -68,13 +68,13 @@ $_block = $this;
__('Roll Over for preview') ?>
- - + getElement()->getReadonly()):?> disabled="disabled" class="input-text" onkeyup="getJsObjectName(); ?>.updateImage('__file__')" onchange="getJsObjectName(); ?>.updateImage('__file__')" /> + getElement()->getReadonly()):?> disabled="disabled" class="input-text validate-number" onkeyup="getJsObjectName(); ?>.updateImage('__file__')" onchange="getJsObjectName(); ?>.updateImage('__file__')" /> getImageTypes() as $typeId=>$type): ?> - + getElement()->getAttributeReadonly($typeId)) :?> disabled="disabled" type="radio" name="" onclick="getJsObjectName(); ?>.setProductImages('__file__')" value="__file__" /> - - + getElement()->getReadonly()):?> disabled="disabled" onclick="getJsObjectName(); ?>.updateImage('__file__')" /> + getElement()->getReadonly()):?> disabled="disabled" onclick="getJsObjectName(); ?>.updateImage('__file__')" /> hasUseDefault()): ?> @@ -84,7 +84,7 @@ $_block = $this; getMediaAttributes() as $_attribute): ?> getElement()->canDisplayUseDefault($_attribute)): ?> - getElement()->getAttributeReadonly($_attribute->getAttributeCode())):?> disabled="disabled" onclick="getJsObjectName(); ?>.updateUseDefault()" getElement()->usedDefault($_attribute)): ?>checked value="getAttributeCode() ?>" /> @@ -98,13 +98,13 @@ $_block = $this;     getImageTypes() as $typeId=>$type): ?> - + getElement()->getAttributeReadonly($typeId)) :?> disabled="disabled" name="" onclick="getJsObjectName(); ?>.setProductImages('no_selection')" value="no_selection" />     - +getElement()->getReadonly()):?> @@ -112,6 +112,7 @@ $_block = $this; +
@@ -119,6 +120,6 @@ $_block = $this; \ No newline at end of file + diff --git a/app/design/adminhtml/default/default/template/catalog/product/tab/inventory.phtml b/app/design/adminhtml/default/default/template/catalog/product/tab/inventory.phtml index 483cf799a7..9302e4bd5c 100644 --- a/app/design/adminhtml/default/default/template/catalog/product/tab/inventory.phtml +++ b/app/design/adminhtml/default/default/template/catalog/product/tab/inventory.phtml @@ -24,6 +24,11 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> +isReadonly()):?> + + + +

__('Inventory') ?>

@@ -34,63 +39,63 @@ - + isReadonly()):?>getProduct()->isComposite()): ?> - - + isReadonly()):?> - + isReadonly()):?> - + isReadonly()):?> - - + isReadonly()):?> - + isReadonly()):?> -
getFieldValue('use_config_manage_stock') || $this->IsNew()) ? 'checked="checked"' : '' ?> - onclick="toggleValueElements(this, this.parentNode);" class="checkbox" /> + onclick="toggleValueElements(this, this.parentNode);" class="checkbox" /> - __('[GLOBAL]') ?>
+ /> __('[GLOBAL]') ?>
+ /> getFieldValue('use_config_min_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> - onclick="toggleValueElements(this, this.parentNode);" /> + onclick="toggleValueElements(this, this.parentNode);" /> - __('[GLOBAL]') ?>
+ /> getFieldValue('use_config_min_sale_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> - onclick="toggleValueElements(this, this.parentNode);" class="checkbox" /> + onclick="toggleValueElements(this, this.parentNode);" class="checkbox" /> - __('[GLOBAL]') ?>
+ /> getFieldValue('use_config_max_sale_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> - onclick="toggleValueElements(this, this.parentNode);" class="checkbox" /> + onclick="toggleValueElements(this, this.parentNode);" class="checkbox" /> - __('[GLOBAL]') ?>
@@ -100,7 +105,7 @@
getFieldValue('use_config_backorders') || $this->IsNew()) ? 'checked="checked"' : '' ?> - onclick="toggleValueElements(this, this.parentNode);" class="checkbox" /> + onclick="toggleValueElements(this, this.parentNode);" class="checkbox" /> - __('[GLOBAL]') ?>
+ /> getFieldValue('use_config_notify_stock_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> - onclick="toggleValueElements(this, this.parentNode);" class="checkbox" /> + onclick="toggleValueElements(this, this.parentNode);" class="checkbox" /> - __('[GLOBAL]') ?>
+ + + + +

getHeader() ?>

+ canRunCompilation()): ?> + getChangeStatusButtonHtml() ?> + getRunButtonHtml() ?> + +
+ +
+
+getBlockHtml('formkey')?> +canRunCompilation()): ?> +
getMessagesBlock()->getGroupedHtml() ?>
+ + +
+

__('Compilation State') ?>

+
+
+ __('Compilation State') ?> + + + + + + + + + + + + + + + + + + + + + +
+ getCompilerStatus()?> +
+ getCompilerState()?> +
+ getCollectedFilesCount() ?> +
+ getCompiledFilesCount() ?> +
+ getCompilationList() as $_frontName => $_classNames) : ?> +
+ +
+ +
+
+
+
+ diff --git a/app/design/adminhtml/default/default/template/customer/tab/addresses.phtml b/app/design/adminhtml/default/default/template/customer/tab/addresses.phtml index 433d8c14bd..0ec2beec71 100644 --- a/app/design/adminhtml/default/default/template/customer/tab/addresses.phtml +++ b/app/design/adminhtml/default/default/template/customer/tab/addresses.phtml @@ -37,22 +37,24 @@
  • + isReadonly()): ?> Remove address Edit address +
    format('html') ?>
    - getId()==$customer->getDefaultBilling()): ?> checked="checked"/> + isReadonly()):?> disabled="disabled" value="getId() ?>" id="address_item_billinggetId() ?>" name="account[default_billing]" title="__('Set as Default Billing Address') ?>"getId()==$customer->getDefaultBilling()): ?> checked="checked"/>   - getId()==$customer->getDefaultShipping()): ?> checked="checked"/> + isReadonly()):?> disabled="disabled" value="getId() ?>" id="address_item_shippinggetId() ?>" name="account[default_shipping]" title="__('Set as Default Shipping Address') ?>"getId()==$customer->getDefaultShipping()): ?> checked="checked"/>  
    @@ -81,24 +83,25 @@ - getTemplatePrefix() ?>
    + isReadonly()): ?> Remove address Edit address +
    __('New Customer Address') ?>
    - + isReadonly()):?> disabled="disabled" type="radio" value="" id="address_item_billing" name="account[default_billing]" title="__('Set as Default Billing Address') ?>"/>   - + isReadonly()):?> disabled="disabled" type="radio" value="" id="address_item_shipping" name="account[default_shipping]" title="__('Set as Default Shipping Address') ?>"/>  
    diff --git a/app/design/adminhtml/default/default/template/customer/tab/view.phtml b/app/design/adminhtml/default/default/template/customer/tab/view.phtml index e79b97814b..e20579a4f6 100644 --- a/app/design/adminhtml/default/default/template/customer/tab/view.phtml +++ b/app/design/adminhtml/default/default/template/customer/tab/view.phtml @@ -79,7 +79,4 @@ $createDateStore = $this->getStoreCreateDate();
    -getSalesHtml(); ?> -
    -
    -getAccordionHtml() ?> \ No newline at end of file +getChildHtml('', true, true); ?> \ No newline at end of file diff --git a/app/design/adminhtml/default/default/template/customer/tab/view/sales.phtml b/app/design/adminhtml/default/default/template/customer/tab/view/sales.phtml index bdd347e167..6c698f4908 100644 --- a/app/design/adminhtml/default/default/template/customer/tab/view/sales.phtml +++ b/app/design/adminhtml/default/default/template/customer/tab/view/sales.phtml @@ -77,3 +77,5 @@
  • +
    +
    \ No newline at end of file diff --git a/app/design/adminhtml/default/default/template/downloadable/product/edit/downloadable.phtml b/app/design/adminhtml/default/default/template/downloadable/product/edit/downloadable.phtml index 2eba974749..0b263ef177 100644 --- a/app/design/adminhtml/default/default/template/downloadable/product/edit/downloadable.phtml +++ b/app/design/adminhtml/default/default/template/downloadable/product/edit/downloadable.phtml @@ -126,6 +126,7 @@ Downloadable.FileUploader.prototype = { this.idName = idName; this.config = config; uploaderTemplate = new Template(this.uploaderText, this.uploaderSyntax); + isReadonly()):?> Element.insert( elmContainer, {'top' : uploaderTemplate.evaluate({ @@ -147,6 +148,7 @@ Downloadable.FileUploader.prototype = { varienGlobalEvents.attachEventHandler('tabChangeBefore', Downloadable.getUploaderObj(type, key).onContainerHideBefore); } new Downloadable.FileList(this.idName, Downloadable.getUploaderObj(type, key)); + } } @@ -252,6 +254,16 @@ Validation.addAllThese([
    +isReadonly()): ?> + + \ No newline at end of file +--> diff --git a/app/design/adminhtml/default/default/template/forgotpassword.phtml b/app/design/adminhtml/default/default/template/forgotpassword.phtml index 3eeb0ef6ff..85c31c4dc0 100644 --- a/app/design/adminhtml/default/default/template/forgotpassword.phtml +++ b/app/design/adminhtml/default/default/template/forgotpassword.phtml @@ -59,7 +59,7 @@
    - « __('Back to Login') ?> + « __('Back to Login') ?>
    diff --git a/app/design/adminhtml/default/default/template/googlebase/types/edit/attributes.phtml b/app/design/adminhtml/default/default/template/googlebase/types/edit/attributes.phtml index 97fc18d574..fbd55b7528 100644 --- a/app/design/adminhtml/default/default/template/googlebase/types/edit/attributes.phtml +++ b/app/design/adminhtml/default/default/template/googlebase/types/edit/attributes.phtml @@ -88,7 +88,7 @@ var attributesSelectTemplate = '
    ' + '' + 'getGbaseAttributesSelectHtml() ?>' + diff --git a/app/design/adminhtml/default/default/template/googleoptimizer/js.phtml b/app/design/adminhtml/default/default/template/googleoptimizer/js.phtml index 22ab0be9e0..3159ab4d39 100644 --- a/app/design/adminhtml/default/default/template/googleoptimizer/js.phtml +++ b/app/design/adminhtml/default/default/template/googleoptimizer/js.phtml @@ -47,14 +47,14 @@ function pushCodes() if ($('page_type').value == '') { $('getTrackingFieldKey() ?>').value = response.code_tracking_variants.unescapeHTML().strip(); } else { - $('getControlFieldKey() ?>').value = response.code_control.unescapeHTML().strip(); - $('getTrackingFieldKey() ?>').value = response.code_tracking_original.unescapeHTML().strip(); - $('getConversionFieldKey() ?>').value = response.code_tracking_conversion.unescapeHTML().strip(); + $('getControlFieldKey() ?>').value = response.code_control.unescapeHTML().strip().replace(/'/g, "'").replace(/"/g, '"'); + $('getTrackingFieldKey() ?>').value = response.code_tracking_original.unescapeHTML().strip().replace(/'/g, "'").replace(/"/g, '"'); + $('getConversionFieldKey() ?>').value = response.code_tracking_conversion.unescapeHTML().strip().replace(/'/g, "'").replace(/"/g, '"'); } } else { - $('getControlFieldKey() ?>').value = response.code_control.unescapeHTML().strip(); - $('getTrackingFieldKey() ?>').value = response.code_tracking.unescapeHTML().strip(); - $('getConversionFieldKey() ?>').value = response.code_conversion.unescapeHTML().strip(); + $('getControlFieldKey() ?>').value = response.code_control.unescapeHTML().strip().replace(/'/g, "'").replace(/"/g, '"'); + $('getTrackingFieldKey() ?>').value = response.code_tracking.unescapeHTML().strip().replace(/'/g, "'").replace(/"/g, '"'); + $('getConversionFieldKey() ?>').value = response.code_conversion.unescapeHTML().strip().replace(/'/g, "'").replace(/"/g, '"'); } } } diff --git a/app/design/adminhtml/default/default/template/login.phtml b/app/design/adminhtml/default/default/template/login.phtml index 22ad500e32..eaa00298af 100644 --- a/app/design/adminhtml/default/default/template/login.phtml +++ b/app/design/adminhtml/default/default/template/login.phtml @@ -56,7 +56,7 @@
    diff --git a/app/design/adminhtml/default/default/template/notification/toolbar.phtml b/app/design/adminhtml/default/default/template/notification/toolbar.phtml index a67b57cf8e..f13ca54bdb 100644 --- a/app/design/adminhtml/default/default/template/notification/toolbar.phtml +++ b/app/design/adminhtml/default/default/template/notification/toolbar.phtml @@ -24,6 +24,11 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> + isShow()): ?>
    - - - - - getChildHtml('head') ?> - - -getBodyClass()?'class="'.$this->getBodyClass().'"':'' ?>> -getChildHtml('notification_window'); ?> -
    -
    - getChildHtml('header') ?> -
    - getChildHtml('menu') ?> -
    - getChildHtml('notification_toolbar'); ?> -
    -
    - getChildHtml('left')): ?> - -
    -
    - getChildHtml('left') ?> -
    -
    -
    -
    getMessagesBlock()->getGroupedHtml() ?>
    - getChildHtml('content') ?> -
    -
    -
    - - -
    getMessagesBlock()->getGroupedHtml() ?>
    - getChildHtml('content') ?> - -
    -
    - -
    - getChildHtml('js') ?> - getChildHtml('profiler') ?> - - -getChildHtml('before_body_end') ?> - - - + + + + + + getChildHtml('head') ?> + + +getBodyClass()?'class="'.$this->getBodyClass().'"':'' ?>> +getChildHtml('notification_window'); ?> +
    + getChildHtml('global_notices') ?> +
    + getChildHtml('header') ?> +
    + getChildHtml('menu') ?> +
    + getChildHtml('notification_toolbar'); ?> +
    +
    + getChildHtml('left')): ?> + +
    +
    + getChildHtml('left') ?> +
    +
    +
    +
    getMessagesBlock()->getGroupedHtml() ?>
    + getChildHtml('content') ?> +
    +
    +
    + + +
    getMessagesBlock()->getGroupedHtml() ?>
    + getChildHtml('content') ?> + +
    +
    + +
    + getChildHtml('js') ?> + getChildHtml('profiler') ?> + + +getChildHtml('before_body_end') ?> + + + diff --git a/app/design/adminhtml/default/default/template/page/js/calendar.phtml b/app/design/adminhtml/default/default/template/page/js/calendar.phtml index 8a203107a4..829fc3e7ea 100644 --- a/app/design/adminhtml/default/default/template/page/js/calendar.phtml +++ b/app/design/adminhtml/default/default/template/page/js/calendar.phtml @@ -68,5 +68,8 @@ Calendar._TT["TT_DATE_FORMAT"] = ; Calendar._TT["WK"] = ; Calendar._TT["TIME"] = "__('Time:');?>"; + +CalendarDateObject._LOCAL_TIMZEONE_OFFSET_SECONDS = getTimezoneOffsetSeconds() ?>; + //]]> diff --git a/app/design/adminhtml/default/default/template/page/notices.phtml b/app/design/adminhtml/default/default/template/page/notices.phtml new file mode 100644 index 0000000000..05b670089f --- /dev/null +++ b/app/design/adminhtml/default/default/template/page/notices.phtml @@ -0,0 +1,44 @@ + + +displayNoscriptNotice()): ?> + + +displayDemoNotice()): ?> +

    __('This is a demo store. Any orders placed through this store will not be honored or fulfilled.') ?>

    + diff --git a/app/design/adminhtml/default/default/template/sales/order/create/abstract.phtml b/app/design/adminhtml/default/default/template/sales/order/create/abstract.phtml index 4c2d6365b9..b38f866f28 100644 --- a/app/design/adminhtml/default/default/template/sales/order/create/abstract.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/create/abstract.phtml @@ -30,6 +30,6 @@

    getHeaderText() ?>

    - getChildHtml() ?> + getChildHtml('', true, true) ?>
    \ No newline at end of file diff --git a/app/design/adminhtml/default/default/template/sales/order/create/billing/method/form.phtml b/app/design/adminhtml/default/default/template/sales/order/create/billing/method/form.phtml index 348cc88c7c..b1def9a9db 100644 --- a/app/design/adminhtml/default/default/template/sales/order/create/billing/method/form.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/create/billing/method/form.phtml @@ -25,6 +25,7 @@ */ ?> hasMethods()): ?> +
    getMethods(); @@ -45,6 +46,7 @@
    +
    __('No Payment Methods') ?> diff --git a/app/design/adminhtml/default/default/template/sales/order/create/form.phtml b/app/design/adminhtml/default/default/template/sales/order/create/form.phtml index 83bb5010e1..bc5d222ed8 100644 --- a/app/design/adminhtml/default/default/template/sales/order/create/form.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/create/form.phtml @@ -32,8 +32,8 @@
    getBlockHtml('formkey')?> -
    - getChildHtml('messages') ?> +
    + getChildHtml('message') ?>
    getChildHtml('customer') ?> diff --git a/app/design/adminhtml/default/default/template/sales/order/create/giftmessage.phtml b/app/design/adminhtml/default/default/template/sales/order/create/giftmessage.phtml index 6d93fab9bb..b3c0174e0c 100644 --- a/app/design/adminhtml/default/default/template/sales/order/create/giftmessage.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/create/giftmessage.phtml @@ -24,8 +24,8 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> - -helper('giftmessage/message')->getIsMessagesAvailable('main', $this->getQuote(), $this->getStoreId())): ?> +getItems(); ?> +helper('giftmessage/message')->getIsMessagesAvailable('main', $this->getQuote(), $this->getStoreId()) || $_items): ?>
    @@ -34,13 +34,15 @@
    -
    -
    __('Add a gift message for the entire order') ?>
    - getFormHtml($this->getQuote(), 'main') ?> -
    + helper('giftmessage/message')->getIsMessagesAvailable('main', $this->getQuote(), $this->getStoreId())): ?> +
    +
    __('Add a gift message for the entire order') ?>
    + getFormHtml($this->getQuote(), 'main') ?> +
    +
    - getItems()): ?> +
    __('Add a gift message for each gift item') ?>
    diff --git a/app/design/adminhtml/default/default/template/sales/order/create/items/grid.phtml b/app/design/adminhtml/default/default/template/sales/order/create/items/grid.phtml index 8ed8a12dd3..b0fa6a13c7 100644 --- a/app/design/adminhtml/default/default/template/sales/order/create/items/grid.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/create/items/grid.phtml @@ -114,9 +114,9 @@ __('Excl. Tax'); ?>: typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> - helper('checkout')->formatPrice($_item->getCalculationPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()); ?> + formatPrice($_item->getCalculationPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()); ?> - helper('checkout')->formatPrice($_item->getCalculationPrice()) ?> + formatPrice($_item->getCalculationPrice()) ?> @@ -125,24 +125,24 @@ typeOfDisplay($_item, 1, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['amount'],true,true); ?>
    + : formatPrice($tax['amount'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 4, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?>
    - __('Total'); ?>:
    helper('checkout')->formatPrice($_item->getCalculationPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()); ?>
    + __('Total'); ?>:
    formatPrice($_item->getCalculationPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()); ?>
    @@ -154,32 +154,32 @@ helper('checkout')->getPriceInclTax($_item); ?> typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> - helper('checkout')->formatPrice($_incl+$_item->getWeeeTaxAppliedAmount()); ?> + formatPrice($_incl+$_item->getWeeeTaxAppliedAmount()); ?> - helper('checkout')->formatPrice($_incl-$_item->getWeeeTaxDisposition()) ?> + formatPrice($_incl-$_item->getWeeeTaxDisposition()) ?> getApplied($_item)): ?>
    typeOfDisplay($_item, 1, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['amount'],true,true); ?>
    + : formatPrice($tax['amount'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 4, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?> - __('Total incl. tax'); ?>:
    helper('checkout')->formatPrice($_incl+$_item->getWeeeTaxAppliedAmount()); ?>
    + __('Total incl. tax'); ?>:
    formatPrice($_incl+$_item->getWeeeTaxAppliedAmount()); ?>
    @@ -211,9 +211,9 @@ __('Excl. Tax'); ?>: typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> - helper('checkout')->formatPrice($_item->getRowTotal()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()); ?> + formatPrice($_item->getRowTotal()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()); ?> - helper('checkout')->formatPrice($_item->getRowTotal()) ?> + formatPrice($_item->getRowTotal()) ?> @@ -222,24 +222,24 @@ typeOfDisplay($_item, 1, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount'],true,true); ?>
    + : formatPrice($tax['row_amount'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 4, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?>
    - __('Total'); ?>:
    helper('checkout')->formatPrice($_item->getCalculationPrice()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()); ?>
    + __('Total'); ?>:
    formatPrice($_item->getCalculationPrice()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()); ?>
    @@ -251,32 +251,32 @@ helper('checkout')->getSubtotalInclTax($_item); ?> typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> - helper('checkout')->formatPrice($_incl+$_item->getWeeeTaxAppliedRowAmount()); ?> + formatPrice($_incl+$_item->getWeeeTaxAppliedRowAmount()); ?> - helper('checkout')->formatPrice($_incl-$_item->getWeeeTaxRowDisposition()) ?> + formatPrice($_incl-$_item->getWeeeTaxRowDisposition()) ?> getApplied($_item)): ?>
    typeOfDisplay($_item, 1, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount'],true,true); ?>
    + : formatPrice($tax['row_amount'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 4, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?> - __('Total incl. tax'); ?>:
    helper('checkout')->formatPrice($_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
    + __('Total incl. tax'); ?>:
    formatPrice($_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
    @@ -297,9 +297,9 @@ __('Excl. Tax'); ?>: typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> - helper('checkout')->formatPrice($_item->getRowTotalWithDiscount()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()); ?> + formatPrice($_item->getRowTotalWithDiscount()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()); ?> - helper('checkout')->formatPrice($_item->getRowTotalWithDiscount()) ?> + formatPrice($_item->getRowTotalWithDiscount()) ?> @@ -308,24 +308,24 @@ typeOfDisplay($_item, 1, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount'],true,true); ?>
    + : formatPrice($tax['row_amount'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 4, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?>
    - __('Total'); ?>:
    helper('checkout')->formatPrice($_item->getCalculationPrice()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()); ?>
    + __('Total'); ?>:
    formatPrice($_item->getCalculationPrice()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()); ?>
    @@ -337,32 +337,32 @@ getRowTotalWithDiscount()+$_item->getTaxAmount(); ?> typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> - helper('checkout')->formatPrice($_incl+$_item->getWeeeTaxAppliedRowAmount()); ?> + formatPrice($_incl+$_item->getWeeeTaxAppliedRowAmount()); ?> - helper('checkout')->formatPrice($_incl-$_item->getWeeeTaxRowDisposition()) ?> + formatPrice($_incl-$_item->getWeeeTaxRowDisposition()) ?> getApplied($_item)): ?>
    typeOfDisplay($_item, 1, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount'],true,true); ?>
    + : formatPrice($tax['row_amount'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 4, 'sales')): ?> getApplied($_item) as $tax): ?> - : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    + : formatPrice($tax['row_amount_incl_tax'],true,true); ?>
    typeOfDisplay($_item, 2, 'sales')): ?> - __('Total incl. tax'); ?>:
    helper('checkout')->formatPrice($_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
    + __('Total incl. tax'); ?>:
    formatPrice($_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
    @@ -398,7 +398,7 @@ getButtonHtml($this->helper('sales')->__('Update Items and Qty\'s'),'order.itemsUpdate()'); ?> -
    getChildHtml('coupons') ?>
    +
    getChildHtml() ?>

    diff --git a/app/design/adminhtml/default/default/template/sales/order/create/sidebar.phtml b/app/design/adminhtml/default/default/template/sales/order/create/sidebar.phtml index f96a4c8960..900b8e3807 100644 --- a/app/design/adminhtml/default/default/template/sales/order/create/sidebar.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/create/sidebar.phtml @@ -26,11 +26,16 @@ ?>

    helper('sales')->__('Customer\'s Current Activities') ?>

    +getChildHtml('top_button'); ?> getChild() as $_child): ?> -
    - canDisplay($_child)): ?> - getChildHtml($_child->getBlockAlias()) ?> + getBlockAlias(); ?> + +
    + canDisplay($_child)): ?> + getChildHtml($_alias) ?> + +
    -
    +getChildHtml('bottom_button'); ?>
    \ No newline at end of file diff --git a/app/design/adminhtml/default/default/template/sales/order/creditmemo/create/items.phtml b/app/design/adminhtml/default/default/template/sales/order/creditmemo/create/items.phtml index ee8127c495..5cb20c0892 100644 --- a/app/design/adminhtml/default/default/template/sales/order/creditmemo/create/items.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/creditmemo/create/items.phtml @@ -109,8 +109,10 @@

    + getChildHtml('submit_before') ?> getChildHtml('submit_offline') ?> getChildHtml('submit_button') ?> + getChildHtml('submit_after') ?>
    diff --git a/app/design/adminhtml/default/default/template/sales/order/invoice/create/form.phtml b/app/design/adminhtml/default/default/template/sales/order/invoice/create/form.phtml index 433ad98dd8..3e49fc7464 100644 --- a/app/design/adminhtml/default/default/template/sales/order/invoice/create/form.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/invoice/create/form.phtml @@ -86,10 +86,23 @@
    -

    __('Items to Invoice') ?>

    + getForcedShipmentCreate()?'Items to Invoice and Ship':'Items to Invoice'; + ?> +

    __('%s', $_itemsGridLabel) ?>

    getChildHtml('order_items') ?>
    - \ No newline at end of file + + \ No newline at end of file diff --git a/app/design/adminhtml/default/default/template/sales/order/invoice/create/items.phtml b/app/design/adminhtml/default/default/template/sales/order/invoice/create/items.phtml index d8c7cc3e15..df3da9c582 100644 --- a/app/design/adminhtml/default/default/template/sales/order/invoice/create/items.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/invoice/create/items.phtml @@ -144,6 +144,7 @@ //getDisableSubmitButton() ?>; var fields = $$('.qty-input'); updateButtons.each(function (elem) {elem.disabled=true;elem.addClassName('disabled');}); @@ -165,7 +166,9 @@ function checkButtonsRelation() { updateButtons.each(function (elem) {elem.disabled=false;elem.removeClassName('disabled');}); } else { - submitButtons.each(function (elem) {elem.disabled=false;elem.removeClassName('disabled');}); + if (enableSubmitButtons) { + submitButtons.each(function (elem) {elem.disabled=false;elem.removeClassName('disabled');}); + } updateButtons.each(function (elem) {elem.disabled=true;elem.addClassName('disabled');}); } } diff --git a/app/design/adminhtml/default/default/template/sales/order/invoice/create/items/renderer/default.phtml b/app/design/adminhtml/default/default/template/sales/order/invoice/create/items/renderer/default.phtml index 0d03440754..ce7169dbba 100644 --- a/app/design/adminhtml/default/default/template/sales/order/invoice/create/items/renderer/default.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/invoice/create/items/renderer/default.phtml @@ -34,7 +34,7 @@ helper('tax')->displayCartBothPrices()): ?> __('Excl. Tax'); ?>: - + typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> displayPrices( @@ -45,8 +45,8 @@ displayPrices($_item->getBasePrice(), $_item->getPrice()) ?> - - + + getApplied($_item)): ?>
    typeOfDisplay($_item, 1, 'sales')): ?> @@ -66,7 +66,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    @@ -89,13 +89,13 @@ helper('checkout')->getPriceInclTax($_item); ?> helper('checkout')->getBasePriceInclTax($_item); ?> - + typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?> displayPrices($_baseIncl-$_item->getBaseWeeeTaxDisposition(), $_incl-$_item->getWeeeTaxDisposition()) ?> - + getApplied($_item)): ?>
    typeOfDisplay($_item, 1, 'sales')): ?> @@ -115,7 +115,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?>
    @@ -139,7 +139,7 @@ helper('tax')->displayCartBothPrices()): ?> __('Excl. Tax'); ?>: - + typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> displayPrices( @@ -150,8 +150,8 @@ displayPrices($_item->getBaseRowTotal(), $_item->getRowTotal()) ?> - - + + getApplied($_item)): ?> typeOfDisplay($_item, 1, 'sales')): ?> @@ -170,7 +170,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    @@ -198,10 +198,10 @@ displayPrices($_baseIncl-$_item->getBaseWeeeTaxRowDisposition(), $_incl-$_item->getWeeeTaxRowDisposition()) ?> - - + + getApplied($_item)): ?> - +
    typeOfDisplay($_item, 1, 'sales')): ?> @@ -220,7 +220,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmount(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
    diff --git a/app/design/adminhtml/default/default/template/sales/order/invoice/create/tracking.phtml b/app/design/adminhtml/default/default/template/sales/order/invoice/create/tracking.phtml index b13367b6a6..cc8771e3cd 100644 --- a/app/design/adminhtml/default/default/template/sales/order/invoice/create/tracking.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/invoice/create/tracking.phtml @@ -32,6 +32,9 @@ trackingControl = { this.index++; var data = {index:this.index}; Element.insert($('track_row_container'), {bottom: this.template.evaluate(data)}); + $('trackingC' + this.index).disabled = false; + $('trackingT' + this.index).disabled = false; + $('trackingN' + this.index).disabled = false; this.bindCurrierOnchange(); }, deleteRow : function(event) { @@ -84,14 +87,14 @@ trackingControl = { - getCarriers() as $_code=>$_name): ?> - - + + __('Delete') ?> @@ -99,6 +102,6 @@ trackingControl = {
    diff --git a/app/design/adminhtml/default/default/template/sales/order/invoice/view/items/renderer/configurable.phtml b/app/design/adminhtml/default/default/template/sales/order/invoice/view/items/renderer/configurable.phtml index c0eee5c57e..a50773b564 100644 --- a/app/design/adminhtml/default/default/template/sales/order/invoice/view/items/renderer/configurable.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/invoice/view/items/renderer/configurable.phtml @@ -34,7 +34,7 @@ helper('tax')->displayCartBothPrices()): ?> __('Excl. Tax'); ?>: - + typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> displayPrices( @@ -45,8 +45,8 @@ displayPrices($_item->getBasePrice(), $_item->getPrice()) ?> - - + + getApplied($_item)): ?>
    typeOfDisplay($_item, 1, 'sales')): ?> @@ -66,7 +66,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    @@ -89,13 +89,13 @@ helper('checkout')->getPriceInclTax($_item); ?> helper('checkout')->getBasePriceInclTax($_item); ?> - + typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?> displayPrices($_baseIncl-$_item->getBaseWeeeTaxDisposition(), $_incl-$_item->getWeeeTaxDisposition()) ?> - + getApplied($_item)): ?>
    typeOfDisplay($_item, 1, 'sales')): ?> @@ -115,7 +115,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?>
    @@ -139,7 +139,7 @@ helper('tax')->displayCartBothPrices()): ?> __('Excl. Tax'); ?>: - + typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> displayPrices( @@ -150,8 +150,8 @@ displayPrices($_item->getBaseRowTotal(), $_item->getRowTotal()) ?> - - + + getApplied($_item)): ?> typeOfDisplay($_item, 1, 'sales')): ?> @@ -170,7 +170,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    @@ -198,10 +198,10 @@ displayPrices($_baseIncl-$_item->getBaseWeeeTaxRowDisposition(), $_incl-$_item->getWeeeTaxRowDisposition()) ?> - - + + getApplied($_item)): ?> - +
    typeOfDisplay($_item, 1, 'sales')): ?> @@ -220,7 +220,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmount(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
    diff --git a/app/design/adminhtml/default/default/template/sales/order/invoice/view/items/renderer/default.phtml b/app/design/adminhtml/default/default/template/sales/order/invoice/view/items/renderer/default.phtml index 84f5a1a662..0776413e69 100644 --- a/app/design/adminhtml/default/default/template/sales/order/invoice/view/items/renderer/default.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/invoice/view/items/renderer/default.phtml @@ -34,7 +34,7 @@ helper('tax')->displayCartBothPrices()): ?> __('Excl. Tax'); ?>: - + typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> displayPrices( @@ -45,8 +45,8 @@ displayPrices($_item->getBasePrice(), $_item->getPrice()) ?> - - + + getApplied($_item)): ?>
    typeOfDisplay($_item, 1, 'sales')): ?> @@ -66,7 +66,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    @@ -89,13 +89,13 @@ helper('checkout')->getPriceInclTax($_item); ?> helper('checkout')->getBasePriceInclTax($_item); ?> - + typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?> displayPrices($_baseIncl-$_item->getBaseWeeeTaxDisposition(), $_incl-$_item->getWeeeTaxDisposition()) ?> - + getApplied($_item)): ?>
    typeOfDisplay($_item, 1, 'sales')): ?> @@ -115,7 +115,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?>
    @@ -132,7 +132,7 @@ helper('tax')->displayCartBothPrices()): ?> __('Excl. Tax'); ?>: - + typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?> displayPrices( @@ -143,8 +143,8 @@ displayPrices($_item->getBaseRowTotal(), $_item->getRowTotal()) ?> - - + + getApplied($_item)): ?> typeOfDisplay($_item, 1, 'sales')): ?> @@ -163,7 +163,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    @@ -191,10 +191,10 @@ displayPrices($_baseIncl-$_item->getBaseWeeeTaxRowDisposition(), $_incl-$_item->getWeeeTaxRowDisposition()) ?> - - + + getApplied($_item)): ?> - +
    typeOfDisplay($_item, 1, 'sales')): ?> @@ -213,7 +213,7 @@ - + typeOfDisplay($_item, 2, 'sales')): ?>
    __('Total'); ?>:
    displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmount(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
    diff --git a/app/design/adminhtml/default/default/template/sales/order/shipment/create/tracking.phtml b/app/design/adminhtml/default/default/template/sales/order/shipment/create/tracking.phtml index cc8771e3cd..ed3a902611 100644 --- a/app/design/adminhtml/default/default/template/sales/order/shipment/create/tracking.phtml +++ b/app/design/adminhtml/default/default/template/sales/order/shipment/create/tracking.phtml @@ -24,6 +24,11 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> +
    - __('Clear All') ?> - + __('Clear All') ?> +
    -

    __('You have no items to compare.') ?>

    +

    __('You have no items to compare.') ?>

    -
    \ No newline at end of file +
    diff --git a/app/design/frontend/default/default/template/catalog/product/list.phtml b/app/design/frontend/default/default/template/catalog/product/list.phtml index 91cfb7951d..6ba76af8fc 100644 --- a/app/design/frontend/default/default/template/catalog/product/list.phtml +++ b/app/design/frontend/default/default/template/catalog/product/list.phtml @@ -88,8 +88,9 @@
    count() ?> + getColumnCount(); ?> - +
    1. @@ -117,7 +118,7 @@

    2. - +
    diff --git a/app/design/frontend/default/default/template/catalog/product/new.phtml b/app/design/frontend/default/default/template/catalog/product/new.phtml index 73c98fb43a..18ea198723 100644 --- a/app/design/frontend/default/default/template/catalog/product/new.phtml +++ b/app/design/frontend/default/default/template/catalog/product/new.phtml @@ -30,7 +30,7 @@ getItems() as $_product): ?> - 5): continue; endif; ?> + =4): continue; endif; ?> diff --git a/app/design/frontend/default/default/template/email/productalert/stock.phtml b/app/design/frontend/default/default/template/email/productalert/stock.phtml index 7feb4d737d..05f42bce34 100644 --- a/app/design/frontend/default/default/template/email/productalert/stock.phtml +++ b/app/design/frontend/default/default/template/email/productalert/stock.phtml @@ -35,9 +35,11 @@ getShortDescription()): ?>

    -

    __('Price:') ?> currency($_product->getPrice()) ?> - getPrice() != $_product->getFinalPrice()): ?> -
    __('Special price:') ?> currency($_product->getFinalPrice()) ?> +

    getPrice() != $_product->getFinalPrice()): ?> + __('Regular Price:') ?> formatPrice($_product->getPrice()) ?>
    + __('Special price:') ?> formatPrice($_product->getFinalPrice()) ?> + + __('Price:') ?> formatPrice($_product->getPrice()) ?>

    __('Click here not to receive alerts for this product') ?>

    diff --git a/app/design/frontend/default/default/template/page/1column.phtml b/app/design/frontend/default/default/template/page/1column.phtml index 2c6047871d..fb71520356 100644 --- a/app/design/frontend/default/default/template/page/1column.phtml +++ b/app/design/frontend/default/default/template/page/1column.phtml @@ -36,6 +36,7 @@ getBodyClass()?'class="'.$this->getBodyClass().'"':'' ?>>
    + getChildHtml('global_notices') ?>
    getChildHtml('header') ?> diff --git a/app/design/frontend/default/default/template/page/2columns-left.phtml b/app/design/frontend/default/default/template/page/2columns-left.phtml index c069d6c23e..e227cf572e 100644 --- a/app/design/frontend/default/default/template/page/2columns-left.phtml +++ b/app/design/frontend/default/default/template/page/2columns-left.phtml @@ -36,7 +36,7 @@ getBodyClass()?'class="'.$this->getBodyClass().'"':'' ?>>
    -__('This is a demo store. Any orders placed through this store will not be honored or fulfilled.') ?>

    */ ?> + getChildHtml('global_notices') ?>
    getChildHtml('header') ?> diff --git a/app/design/frontend/default/default/template/page/2columns-right.phtml b/app/design/frontend/default/default/template/page/2columns-right.phtml index f58ae0d666..c093d6076e 100644 --- a/app/design/frontend/default/default/template/page/2columns-right.phtml +++ b/app/design/frontend/default/default/template/page/2columns-right.phtml @@ -35,7 +35,7 @@ getBodyClass()?'class="'.$this->getBodyClass().'"':'' ?>>
    -__('This is a demo store. Any orders placed through this store will not be honored or fulfilled.') ?>

    */ ?> + getChildHtml('global_notices') ?>
    getChildHtml('header') ?> diff --git a/app/design/frontend/default/default/template/page/3columns.phtml b/app/design/frontend/default/default/template/page/3columns.phtml index 9dbb183de0..28929d2442 100644 --- a/app/design/frontend/default/default/template/page/3columns.phtml +++ b/app/design/frontend/default/default/template/page/3columns.phtml @@ -36,7 +36,7 @@ getBodyClass()?'class="'.$this->getBodyClass().'"':'' ?>>
    -__('This is a demo store. Any orders placed through this store will not be honored or fulfilled.') ?>

    */ ?> + getChildHtml('global_notices') ?>
    getChildHtml('header') ?> diff --git a/app/design/frontend/default/default/template/page/dashboard.phtml b/app/design/frontend/default/default/template/page/dashboard.phtml index cdcdd58039..4d1f3c822c 100644 --- a/app/design/frontend/default/default/template/page/dashboard.phtml +++ b/app/design/frontend/default/default/template/page/dashboard.phtml @@ -36,7 +36,7 @@ getBodyClass()?'class="'.$this->getBodyClass().'"':'' ?>>
    -__('This is a demo store. Any orders placed through this store will not be honored or fulfilled.') ?>

    */ ?> + getChildHtml('global_notices') ?>
    getChildHtml('header') ?> diff --git a/app/design/frontend/default/default/template/page/html/breadcrumbs.phtml b/app/design/frontend/default/default/template/page/html/breadcrumbs.phtml index ecd7681867..a19c0ab946 100644 --- a/app/design/frontend/default/default/template/page/html/breadcrumbs.phtml +++ b/app/design/frontend/default/default/template/page/html/breadcrumbs.phtml @@ -30,11 +30,11 @@ $_crumbInfo): ?>
  • - + htmlEscape($_crumbInfo['label']) ?> - + htmlEscape($_crumbInfo['label']) ?> - + htmlEscape($_crumbInfo['label']) ?>
  • diff --git a/app/design/frontend/default/default/template/page/html/notices.phtml b/app/design/frontend/default/default/template/page/html/notices.phtml new file mode 100644 index 0000000000..1f5c008294 --- /dev/null +++ b/app/design/frontend/default/default/template/page/html/notices.phtml @@ -0,0 +1,44 @@ + + +displayNoscriptNotice()): ?> + + +displayDemoNotice()): ?> +

    __('This is a demo store. Any orders placed through this store will not be honored or fulfilled.') ?>

    + diff --git a/app/design/frontend/default/default/template/payment/form/ccsave.phtml b/app/design/frontend/default/default/template/payment/form/ccsave.phtml index d2874a707c..d96068108b 100644 --- a/app/design/frontend/default/default/template/payment/form/ccsave.phtml +++ b/app/design/frontend/default/default/template/payment/form/ccsave.phtml @@ -37,7 +37,7 @@

    <?php echo $this->htmlEscape($_product->getName()) ?> diff --git a/app/design/frontend/default/default/template/checkout/onepage/login.phtml b/app/design/frontend/default/default/template/checkout/onepage/login.phtml index b8a8648850..a9da21b662 100644 --- a/app/design/frontend/default/default/template/checkout/onepage/login.phtml +++ b/app/design/frontend/default/default/template/checkout/onepage/login.phtml @@ -64,7 +64,7 @@

    __('Login') ?>

    getMessagesBlock()->getGroupedHtml() ?> -
    +

    __('Already registered?') ?>
    __('Please log in below:') ?>

    @@ -110,5 +110,12 @@ loginForm.submit(); } } + function onepageLogin(button) + { + if(loginForm.validator && loginForm.validator.validate()){ + button.disabled = true; + loginForm.submit(); + } + } //]]> \ No newline at end of file diff --git a/app/design/frontend/default/default/template/email/productalert/price.phtml b/app/design/frontend/default/default/template/email/productalert/price.phtml index 5125b55d73..03a6c6f03f 100644 --- a/app/design/frontend/default/default/template/email/productalert/price.phtml +++ b/app/design/frontend/default/default/template/email/productalert/price.phtml @@ -35,9 +35,11 @@ getShortDescription()): ?>

    -

    __('Price:') ?> currency($_product->getPrice()) ?> - getPrice() != $_product->getFinalPrice()): ?> -
    __('Special price:') ?> currency($_product->getFinalPrice()) ?> +

    getPrice() != $_product->getFinalPrice()): ?> + __('Regular Price:') ?> formatPrice($_product->getPrice()) ?>
    + __('Special price:') ?> formatPrice($_product->getFinalPrice()) ?> + + __('Price:') ?> formatPrice($_product->getPrice()) ?>

    __('Click here not to receive alerts for this product') ?>

    - - - -
    - - - - - -
    - Magento
    - - - - - - -
    -

    Dear {{var customer.name}},
    - Welcome to Demo Store. To log in when visiting our site just click Login or My Account at the top of every page, and then enter your e-mail address and password.

    - -

    - Use the following values when prompted to log in:
    - E-mail: {{var customer.email}}
    - Password: {{var customer.password}}

    - -

    When you log in to your account, you will be able to do the following:

    - -
      -
    • Proceed through checkout faster when making a purchase
    • -
    • Check the status of orders
    • -
    • View past orders
    • -
    • Make changes to your account information
    • -
    • Change your password
    • -
    • Store alternative addresses (for shipping to multiple family members and friends!)
    • -
    - -

    If you have any questions about your account or any other matter, please feel free to contact us at dummyemail@magentocommerce.com or by phone at (555) 555-0123.

    -

    Thanks again!

    - - -
    - -
    -
    + + + + +
    + + + + +
    + + + + + +
    + Magento
    + + + + + + +
    +

    Dear {{htmlescape var=$customer.name}},
    + Welcome to Demo Store. To log in when visiting our site just click Login or My Account at the top of every page, and then enter your e-mail address and password.

    + +

    + Use the following values when prompted to log in:
    + E-mail: {{var customer.email}}
    + Password: {{htmlescape var=$customer.password}}

    + +

    When you log in to your account, you will be able to do the following:

    + +
      +
    • Proceed through checkout faster when making a purchase
    • +
    • Check the status of orders
    • +
    • View past orders
    • +
    • Make changes to your account information
    • +
    • Change your password
    • +
    • Store alternative addresses (for shipping to multiple family members and friends!)
    • +
    + +

    If you have any questions about your account or any other matter, please feel free to contact us at dummyemail@magentocommerce.com or by phone at (555) 555-0123.

    +

    Thanks again!

    + + +
    + +
    +
    diff --git a/app/locale/en_US/template/email/account_new_confirmation.html b/app/locale/en_US/template/email/account_new_confirmation.html index 7fa89c898b..77ddfbf9f5 100644 --- a/app/locale/en_US/template/email/account_new_confirmation.html +++ b/app/locale/en_US/template/email/account_new_confirmation.html @@ -20,7 +20,7 @@ diff --git a/app/locale/en_US/template/email/account_new_confirmed.html b/app/locale/en_US/template/email/account_new_confirmed.html index 314794b14a..ae7c7f8334 100644 --- a/app/locale/en_US/template/email/account_new_confirmed.html +++ b/app/locale/en_US/template/email/account_new_confirmed.html @@ -1,48 +1,48 @@ - - - - -
    -
    -

    Dear {{var customer.name}},
    Welcome to Demo Store.

    +

    Dear {{htmlescape var=$customer.name}},
    Welcome to Demo Store.

    Your e-mail {{var customer.email}} must be confirmed before using it to log in to our store.

    @@ -29,7 +29,7 @@

    Use the following values when prompted to log in:
    E-mail: {{var customer.email}}
    - Password: {{var customer.password}}

    + Password: {{htmlescape var=$customer.password}}

    If you have any questions about your account or any other matter, please feel free to contact us at dummyemail@magentocommerce.com or by phone at (555) 555-0123.

    - - - -
    - - - - - -
    - Magento
    - - - - - - -
    -

    Dear {{var customer.name}},
    - Welcome to Demo Store. To log in when visiting our site just click Login or My Account at the top of every page, and then enter your e-mail address and password.

    - -

    When you log in to your account, you will be able to do the following:

    - -
      -
    • Proceed through checkout faster when making a purchase
    • -
    • Check the status of orders
    • -
    • View past orders
    • -
    • Make changes to your account information
    • -
    • Change your password
    • -
    • Store alternative addresses (for shipping to multiple family members and friends!)
    • -
    - -

    If you have any questions about your account or any other matter, please feel free to contact us at dummyemail@magentocommerce.com or by phone at (555) 555-0123.

    -

    Thanks again!

    - - -
    - -
    -
    + + + + +
    + + + + +
    + + + + + +
    + Magento
    + + + + + + +
    +

    Dear {{htmlescape var=$customer.name}},
    + Welcome to Demo Store. To log in when visiting our site just click Login or My Account at the top of every page, and then enter your e-mail address and password.

    + +

    When you log in to your account, you will be able to do the following:

    + +
      +
    • Proceed through checkout faster when making a purchase
    • +
    • Check the status of orders
    • +
    • View past orders
    • +
    • Make changes to your account information
    • +
    • Change your password
    • +
    • Store alternative addresses (for shipping to multiple family members and friends!)
    • +
    + +

    If you have any questions about your account or any other matter, please feel free to contact us at dummyemail@magentocommerce.com or by phone at (555) 555-0123.

    +

    Thanks again!

    + + +
    + +
    +
    diff --git a/app/locale/en_US/template/email/admin_password_new.html b/app/locale/en_US/template/email/admin_password_new.html index 01f6300656..5670dbda81 100644 --- a/app/locale/en_US/template/email/admin_password_new.html +++ b/app/locale/en_US/template/email/admin_password_new.html @@ -20,8 +20,8 @@ -->
    -

    Dear, {{var user.name}},
    - Your new password is: {{var password}}

    +

    Dear, {{htmlescape var=$user.name}},
    + Your new password is: {{htmlescape var=$password}}

    You can change your password at any time by logging into your account.

    Thank you again,
    Demo Store

    diff --git a/app/locale/en_US/template/email/newsletter_subscr_confirm.html b/app/locale/en_US/template/email/newsletter_subscr_confirm.html index bd3f52f999..8d1d837d74 100644 --- a/app/locale/en_US/template/email/newsletter_subscr_confirm.html +++ b/app/locale/en_US/template/email/newsletter_subscr_confirm.html @@ -20,7 +20,7 @@ diff --git a/cron.sh b/cron.sh new file mode 100644 index 0000000000..c800123cce --- /dev/null +++ b/cron.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# location of the php binary +if [ ! "$1" = "" ] ; then +CRONSCRIPT=$1 +else +CRONSCRIPT=cron.php +fi + +PHP_BIN=`which php` + +# absolute path to magento installation +if [ "$1" != "" ]; then + INSTALLDIR=`ps axwww -o command= |grep -v grep| grep croncheck.sh \ + | awk '{ field = $(NF-1) }; END{ print field }' | sed 's/croncheck\.sh//g'` +else + INSTALLDIR=`ps axwww -o command= |grep -v grep| grep croncheck.sh \ + | awk '{ field = $NF }; END{ print field }' | sed 's/croncheck\.sh//g'` +fi + +# prepend the intallation path if not given an absolite path +if [ "$INSTALLDIR" != "" -a "`expr index $CRONSCRIPT /`" != "1" ];then + if ! ps auxwww | grep "$INSTALLDIR""$CRONSCRIPT" | grep -v grep 1>/dev/null 2>/dev/null ; then + $PHP_BIN "$INSTALLDIR""$CRONSCRIPT" & + fi +else + if ! ps auxwww | grep " $CRONSCRIPT" | grep -v grep | grep -v croncheck.sh 1>/dev/null 2>/dev/null ; then + $PHP_BIN $CRONSCRIPT & + fi +fi diff --git a/downloader/Maged/Controller.php b/downloader/Maged/Controller.php index 4f5c36914c..2351291a0c 100755 --- a/downloader/Maged/Controller.php +++ b/downloader/Maged/Controller.php @@ -74,6 +74,12 @@ public function indexAction() echo $this->view()->template('install/writable.phtml'); } else { $this->view()->set('mage_url', dirname(dirname($_SERVER['SCRIPT_NAME']))); + + $this->view()->set('use_custom_permissions_mode', $this->config()->get('use_custom_permissions_mode')); + $this->view()->set('mkdir_mode', $this->config()->get('mkdir_mode')); + $this->view()->set('chmod_file_mode', $this->config()->get('chmod_file_mode')); + $this->view()->set('chmod_file_mode_executable', $this->config()->get('chmod_file_mode_executable')); + echo $this->view()->template('install/download.phtml'); } } else { @@ -97,6 +103,7 @@ public function pearGlobalAction() public function pearInstallAllAction() { + $this->config()->saveConfigPost($_POST); $this->model('pear', true)->installAll(!empty($_GET['force'])); } @@ -150,6 +157,12 @@ public function settingsAction() $pearConfig = $this->model('pear', true)->pear()->getConfig(); $this->view()->set('state', $pearConfig->get('preferred_state')); $this->view()->set('mage_dir', $pearConfig->get('mage_dir')); + + $this->view()->set('use_custom_permissions_mode', $this->config()->get('use_custom_permissions_mode')); + $this->view()->set('mkdir_mode', $this->config()->get('mkdir_mode')); + $this->view()->set('chmod_file_mode', $this->config()->get('chmod_file_mode')); + $this->view()->set('chmod_file_mode_executable', $this->config()->get('chmod_file_mode_executable')); + echo $this->view()->template('settings.phtml'); } diff --git a/downloader/Maged/Model/Config.php b/downloader/Maged/Model/Config.php index 3d74a98871..6f080d7792 100644 --- a/downloader/Maged/Model/Config.php +++ b/downloader/Maged/Model/Config.php @@ -28,7 +28,20 @@ class Maged_Model_Config extends Maged_Model { public function saveConfigPost($p) { - $this->set('preferred_state', $p['preferred_state']); + $configParams = array( + 'preferred_state', + 'use_custom_permissions_mode', + 'mkdir_mode', + 'chmod_file_mode', + 'chmod_file_mode_executable' + ); + + foreach ($configParams as $paramName){ + if (isset($p[$paramName])) { + $this->set($paramName, $p[$paramName]); + } + } + //$this->set('mage_dir', $p['mage_dir']); $this->save(); return $this; @@ -54,7 +67,7 @@ public function load() continue; } $key = trim($arr[0]); - $value = trim($arr[1], " \t\"'"); + $value = trim($arr[1], " \t\"'\n"); if (!$key || $key[0]=='#' || $key[0]==';') { continue; } diff --git a/downloader/config.ini b/downloader/config.ini index c42f3e5251..68d0f07564 100755 --- a/downloader/config.ini +++ b/downloader/config.ini @@ -1,2 +1,6 @@ preferred_state=beta - +use_custom_permissions_mode=0 +mkdir_mode=0777 +chmod_file_mode=0777 +chmod_file_mode_executable=0777 +tmp_dir=../var/tmp \ No newline at end of file diff --git a/downloader/pearlib/php/PEAR/Common.php b/downloader/pearlib/php/PEAR/Common.php index b06b50a776..5f5a02365e 100644 --- a/downloader/pearlib/php/PEAR/Common.php +++ b/downloader/pearlib/php/PEAR/Common.php @@ -259,6 +259,21 @@ function mkDirHier($dir) if (!class_exists('System')) { require_once 'System.php'; } + + /* + * Magento fix for custom set permissions in config.ini + */ + if (class_exists('Maged_Controller',false)) { + $magedConfig = Maged_Controller::model('Config',true)->load(); + if ($magedConfig->get('use_custom_permissions_mode') == '1' && + $mode = $magedConfig->get('mkdir_mode')) { + return System::mkDir(array('-m' . $mode, $dir)); + } + } + /* + * End fix + */ + return System::mkDir(array('-p', $dir)); } diff --git a/downloader/pearlib/php/PEAR/Installer.php b/downloader/pearlib/php/PEAR/Installer.php index 5f73ed4429..0e4fdb87a0 100644 --- a/downloader/pearlib/php/PEAR/Installer.php +++ b/downloader/pearlib/php/PEAR/Installer.php @@ -612,6 +612,25 @@ function _installFile2(&$pkg, $file, $atts, $tmp_path, $options) } else { $mode = 0666 & ~(int)octdec($this->config->get('umask')); } + + /* + * Magento fix for custom set permissions in config.ini + */ + if (class_exists('Maged_Controller',false)) { + $magedConfig = Maged_Controller::model('Config',true)->load(); + if ($magedConfig->get('use_custom_permissions_mode') == '1'){ + if ($role->isExecutable() && $configMode = $magedConfig->get('chmod_file_mode_executable')) { + $mode = $magedConfig; + } + if (!$role->isExecutable() && $configMode = $magedConfig->get('chmod_file_mode')) { + $mode = $magedConfig; + } + } + } + /* + * End fix + */ + if ($attribs['role'] != 'src') { $this->addFileOperation("chmod", array($mode, $dest_file)); if (!@chmod($dest_file, $mode)) { @@ -1702,4 +1721,4 @@ function md5_file($filename) { } // }}} -?> \ No newline at end of file +?> diff --git a/downloader/pearlib/php/System.php b/downloader/pearlib/php/System.php index 7695007f40..9edffe1b73 100644 --- a/downloader/pearlib/php/System.php +++ b/downloader/pearlib/php/System.php @@ -392,9 +392,32 @@ function mktemp($args = null) if (!isset($tmpdir)) { $tmpdir = System::tmpdir(); } - if (!System::mkDir(array('-p', $tmpdir))) { - return false; + + /* + * Magento fix for set tmp dir in config.ini + */ + if (class_exists('Maged_Controller',false)) { + $magedConfig = Maged_Controller::model('Config',true)->load(); + if ($magedConfig->get('use_custom_permissions_mode') == '1' && + $mode = $magedConfig->get('mkdir_mode')) { + $result = System::mkDir(array('-m' . $mode, $tmpdir)); + } else { + $result = System::mkDir(array('-p', $tmpdir)); + } + + if (!$result) { + return false; + } } + // Old realisation + //if (!System::mkDir(array('-p', $tmpdir))) { + // return false; + //} + + /* + * End fix + */ + $tmp = tempnam($tmpdir, $prefix); if (isset($tmp_is_dir)) { unlink($tmp); // be careful possible race condition here @@ -438,7 +461,22 @@ function _removeTmpFiles() */ function tmpdir() { - if (OS_WINDOWS) { + + /* + * Magento fix for set tmp dir in config.ini + */ + if (class_exists('Maged_Controller',false)) { + $magedConfig = Maged_Controller::model('Config',true)->load(); + if (!is_null($tmpDir = $magedConfig->get('tmp_dir'))) + { + return $tmpDir; + } + } + /* + * End fix + */ + + if (OS_WINDOWS) { if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP')) { return $var; } @@ -603,4 +641,4 @@ function find($args) } return $files; } -} \ No newline at end of file +} diff --git a/downloader/template/install/download.phtml b/downloader/template/install/download.phtml index 42b4b9f7ad..deff77486e 100644 --- a/downloader/template/install/download.phtml +++ b/downloader/template/install/download.phtml @@ -35,9 +35,6 @@

    You are now ready to continue the installation process by downloading the most up-to-date copy of the Magento software.

    - - -

    There's an indication that Magento files already have been downloaded.

    If you feel that you have arrived to this page by mistake, please continue installation:

    @@ -46,6 +43,45 @@

    Alternatively, you could proceed with Re-Downloading all packages

    + + +
    -

    Dear {{var customer.name}},,
    +

    Dear {{htmlescape var=$customer.name}},,
    Thank you for subscribing to our newsletter.

    To begin receiving the newsletter, you must first confirm your subscription by clicking on the following link:
    {{var subscriber.getConfirmationLink()}}

    diff --git a/app/locale/en_US/template/email/password_new.html b/app/locale/en_US/template/email/password_new.html index c7c5ad24d8..86fe170cce 100644 --- a/app/locale/en_US/template/email/password_new.html +++ b/app/locale/en_US/template/email/password_new.html @@ -18,8 +18,8 @@ diff --git a/app/locale/en_US/template/email/product_share.html b/app/locale/en_US/template/email/product_share.html index 4f55e7968f..1fcfd5bc2d 100644 --- a/app/locale/en_US/template/email/product_share.html +++ b/app/locale/en_US/template/email/product_share.html @@ -13,4 +13,4 @@ Use vars: {{var var_name}} *} -Welcome, {{var name}}

    Please look at {{var product_name}}

    Here is message:
    {{var message}}

    \ No newline at end of file +Welcome, {{htmlescape var=$name}}

    Please look at {{var product_name}}

    Here is message:
    {{var message}}

    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/creditmemo_new.html b/app/locale/en_US/template/email/sales/creditmemo_new.html index 979ddd8e22..9bc642d3df 100644 --- a/app/locale/en_US/template/email/sales/creditmemo_new.html +++ b/app/locale/en_US/template/email/sales/creditmemo_new.html @@ -1,89 +1,89 @@ - - - - -
    -
    -

    Dear, {{var customer.name}},
    -Your new password is: {{var customer.password}}

    +

    Dear, {{htmlescape var=$customer.name}},
    +Your new password is: {{htmlescape var=$customer.password}}

    You can change your password at any time by logging into your account.

    Thank you again,
    Demo Store

    - - - -
    - - - - - -
    Magento
    - - - - - -
    -

    - Hello {{var order.getCustomerName()}},
    - Thank you for your order from {{var order.getStoreGroupName()}}. - You can check the status of your order by logging into your account. - If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. -

    -

    - Your Credit Memo #{{var creditmemo.increment_id}} for Order #{{var order.increment_id}} -

    - - - - - - - - - - - - - - - -
    Billing Information:Payment Method:
    - {{var order.billing_address.format('html')}} -   - {{var payment_html}} -
    -
    - {{depend order.getIsNotVirtual()}} - - - - - - - - - - - - - - - -
    Shipping Information:Shipping Method:
    - {{var order.shipping_address.format('html')}} -   -   - {{var order.shipping_description}} -   -
    -
    - {{/depend}} - - {{layout handle="sales_email_order_creditmemo_items" creditmemo=$creditmemo order=$order}} - -

    {{var comment}}

    -

    - Thank you again,
    {{var order.getStoreGroupName()}} -

    -
    -
    + + + + +

    + + + + +
    + + + + + +
    Magento
    + + + + + +
    +

    + Hello {{htmlescape var=$order.getCustomerName()}},
    + Thank you for your order from {{var order.getStoreGroupName()}}. + You can check the status of your order by logging into your account. + If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. +

    +

    + Your Credit Memo #{{var creditmemo.increment_id}} for Order #{{var order.increment_id}} +

    + + + + + + + + + + + + + + + +
    Billing Information:Payment Method:
    + {{var order.billing_address.format('html')}} +   + {{var payment_html}} +
    +
    + {{depend order.getIsNotVirtual()}} + + + + + + + + + + + + + + + +
    Shipping Information:Shipping Method:
    + {{var order.shipping_address.format('html')}} +   +   + {{var order.shipping_description}} +   +
    +
    + {{/depend}} + + {{layout handle="sales_email_order_creditmemo_items" creditmemo=$creditmemo order=$order}} + +

    {{var comment}}

    +

    + Thank you again,
    {{var order.getStoreGroupName()}} +

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/creditmemo_new_guest.html b/app/locale/en_US/template/email/sales/creditmemo_new_guest.html index 64ebfc42e3..f23ecf53a6 100644 --- a/app/locale/en_US/template/email/sales/creditmemo_new_guest.html +++ b/app/locale/en_US/template/email/sales/creditmemo_new_guest.html @@ -1,88 +1,88 @@ - - - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - -
    -

    - Hello {{var billing.getName()}},
    - Thank you for your order from {{var order.getStoreGroupName()}}. - If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. -

    -

    - Your Credit Memo #{{var creditmemo.increment_id}} for Order #{{var order.increment_id}} -

    - - - - - - - - - - - - - - - -
    Billing Information:Payment Method:
    - {{var order.billing_address.format('html')}} -   - {{var payment_html}} -
    -
    - {{depend order.getIsNotVirtual()}} - - - - - - - - - - - - - - - -
    Shipping Information:Shipping Method:
    - {{var order.shipping_address.format('html')}} -   -   - {{var order.shipping_description}} -   -
    -
    - {{/depend}} - - {{layout handle="sales_email_order_creditmemo_items" creditmemo=$creditmemo order=$order}} - -

    {{var comment}}

    -

    - Thank you again,
    {{var order.getStoreGroupName()}} -

    -
    -
    + + + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + +
    +

    + Hello {{htmlescape var=$billing.getName()}},
    + Thank you for your order from {{var order.getStoreGroupName()}}. + If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. +

    +

    + Your Credit Memo #{{var creditmemo.increment_id}} for Order #{{var order.increment_id}} +

    + + + + + + + + + + + + + + + +
    Billing Information:Payment Method:
    + {{var order.billing_address.format('html')}} +   + {{var payment_html}} +
    +
    + {{depend order.getIsNotVirtual()}} + + + + + + + + + + + + + + + +
    Shipping Information:Shipping Method:
    + {{var order.shipping_address.format('html')}} +   +   + {{var order.shipping_description}} +   +
    +
    + {{/depend}} + + {{layout handle="sales_email_order_creditmemo_items" creditmemo=$creditmemo order=$order}} + +

    {{var comment}}

    +

    + Thank you again,
    {{var order.getStoreGroupName()}} +

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/creditmemo_update.html b/app/locale/en_US/template/email/sales/creditmemo_update.html index 9b38a9ba7e..5b8276b278 100644 --- a/app/locale/en_US/template/email/sales/creditmemo_update.html +++ b/app/locale/en_US/template/email/sales/creditmemo_update.html @@ -1,37 +1,37 @@ - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - - -
    -

    - Dear {{var order.getCustomerName()}},
    - Your order # {{var order.increment_id}} has been
    - {{var order.getStatusLabel()}}. -

    -

    You can check the status of your order by logging into your account.

    -

    {{var comment}}

    -

    - If you have any questions, please feel free to contact us at - dummyemail@magentocommerce.com - or by phone at (555) 555-0123. -

    -

    Thank you again,
    {{var order.getStoreGroupName()}}

    -
    -
    + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + + +
    +

    + Dear {{htmlescape var=$order.getCustomerName()}},
    + Your order # {{var order.increment_id}} has been
    + {{var order.getStatusLabel()}}. +

    +

    You can check the status of your order by logging into your account.

    +

    {{var comment}}

    +

    + If you have any questions, please feel free to contact us at + dummyemail@magentocommerce.com + or by phone at (555) 555-0123. +

    +

    Thank you again,
    {{var order.getStoreGroupName()}}

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/creditmemo_update_guest.html b/app/locale/en_US/template/email/sales/creditmemo_update_guest.html index 9f0f1a6737..1f38f19b27 100644 --- a/app/locale/en_US/template/email/sales/creditmemo_update_guest.html +++ b/app/locale/en_US/template/email/sales/creditmemo_update_guest.html @@ -1,36 +1,36 @@ - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - - -
    -

    - Dear {{var billing.getName()}},
    - Your order # {{var order.increment_id}} has been
    - {{var order.getStatusLabel()}}. -

    -

    {{var comment}}

    -

    - If you have any questions, please feel free to contact us at - dummyemail@magentocommerce.com - or by phone at (555) 555-0123. -

    -

    Thank you again,
    {{var order.getStoreGroupName()}}

    -
    -
    + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + + +
    +

    + Dear {{htmlescape var=$billing.getName()}},
    + Your order # {{var order.increment_id}} has been
    + {{var order.getStatusLabel()}}. +

    +

    {{var comment}}

    +

    + If you have any questions, please feel free to contact us at + dummyemail@magentocommerce.com + or by phone at (555) 555-0123. +

    +

    Thank you again,
    {{var order.getStoreGroupName()}}

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/invoice_new.html b/app/locale/en_US/template/email/sales/invoice_new.html index 14c9b6a2fa..ec87b6f3e6 100644 --- a/app/locale/en_US/template/email/sales/invoice_new.html +++ b/app/locale/en_US/template/email/sales/invoice_new.html @@ -1,87 +1,87 @@ - - - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - -
    -

    - Hello {{var order.getCustomerName()}},
    - Thank you for your order from {{var order.getStoreGroupName()}}. - You can check the status of your order by logging into your account. - If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. -

    -

    - Your Invoice #{{var invoice.increment_id}} for Order #{{var order.increment_id}} -

    - - - - - - - - - - - - - - - -
    Billing Information:Payment Method:
    - {{var order.billing_address.format('html')}} -   - {{var payment_html}} -
    -
    - {{depend order.getIsNotVirtual()}} - - - - - - - - - - - - - - - -
    Shipping Information:Shipping Method:
    - {{var order.shipping_address.format('html')}} -   -   - {{var order.shipping_description}}  -
    -
    - {{/depend}} - - {{layout area="frontend" handle="sales_email_order_invoice_items" invoice=$invoice order=$order}} -

    {{var comment}}

    -

    - Thank you again,
    {{var order.getStoreGroupName()}} -

    -
    -
    + + + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + +
    +

    + Hello {{htmlescape var=$order.getCustomerName()}},
    + Thank you for your order from {{var order.getStoreGroupName()}}. + You can check the status of your order by logging into your account. + If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. +

    +

    + Your Invoice #{{var invoice.increment_id}} for Order #{{var order.increment_id}} +

    + + + + + + + + + + + + + + + +
    Billing Information:Payment Method:
    + {{var order.billing_address.format('html')}} +   + {{var payment_html}} +
    +
    + {{depend order.getIsNotVirtual()}} + + + + + + + + + + + + + + + +
    Shipping Information:Shipping Method:
    + {{var order.shipping_address.format('html')}} +   +   + {{var order.shipping_description}}  +
    +
    + {{/depend}} + + {{layout area="frontend" handle="sales_email_order_invoice_items" invoice=$invoice order=$order}} +

    {{var comment}}

    +

    + Thank you again,
    {{var order.getStoreGroupName()}} +

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/invoice_new_guest.html b/app/locale/en_US/template/email/sales/invoice_new_guest.html index 069dc8f033..1e70c9888b 100644 --- a/app/locale/en_US/template/email/sales/invoice_new_guest.html +++ b/app/locale/en_US/template/email/sales/invoice_new_guest.html @@ -1,88 +1,88 @@ - - - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - -
    -

    - Hello {{var billing.getName()}},
    - Thank you for your order from {{var order.getStoreGroupName()}}. - If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. -

    -

    - Your Invoice #{{var invoice.increment_id}} for Order #{{var order.increment_id}} -

    - - - - - - - - - - - - - - - -
    Billing Information:Payment Method:
    - {{var order.billing_address.format('html')}} -   - {{var payment_html}} -
    -
    - {{depend order.getIsNotVirtual()}} - - - - - - - - - - - - - - - -
    Shipping Information:Shipping Method:
    - {{var order.shipping_address.format('html')}} -   -   - {{var order.shipping_description}} -   -
    -
    - {{/depend}} - - {{layout handle="sales_email_order_invoice_items" invoice=$invoice order=$order}} - -

    {{var comment}}

    -

    - Thank you again,
    {{var order.getStoreGroupName()}} -

    -
    -
    + + + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + +
    +

    + Hello {{htmlescape var=$billing.getName()}},
    + Thank you for your order from {{var order.getStoreGroupName()}}. + If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. +

    +

    + Your Invoice #{{var invoice.increment_id}} for Order #{{var order.increment_id}} +

    + + + + + + + + + + + + + + + +
    Billing Information:Payment Method:
    + {{var order.billing_address.format('html')}} +   + {{var payment_html}} +
    +
    + {{depend order.getIsNotVirtual()}} + + + + + + + + + + + + + + + +
    Shipping Information:Shipping Method:
    + {{var order.shipping_address.format('html')}} +   +   + {{var order.shipping_description}} +   +
    +
    + {{/depend}} + + {{layout handle="sales_email_order_invoice_items" invoice=$invoice order=$order}} + +

    {{var comment}}

    +

    + Thank you again,
    {{var order.getStoreGroupName()}} +

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/invoice_update.html b/app/locale/en_US/template/email/sales/invoice_update.html index d2d9fe8088..90817930da 100644 --- a/app/locale/en_US/template/email/sales/invoice_update.html +++ b/app/locale/en_US/template/email/sales/invoice_update.html @@ -1,37 +1,37 @@ - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - - -
    -

    - Dear {{var order.getCustomerName()}},
    - Your order # {{var order.increment_id}} has been
    - {{var order.getStatusLabel()}}. -

    -

    You can check the status of your order by logging into your account.

    -

    {{var comment}}

    -

    - If you have any questions, please feel free to contact us at - dummyemail@magentocommerce.com - or by phone at (555) 555-0123. -

    -

    Thank you again,
    {{var order.getStoreGroupName()}}

    -
    -
    + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + + +
    +

    + Dear {{htmlescape var=$order.getCustomerName()}},
    + Your order # {{var order.increment_id}} has been
    + {{var order.getStatusLabel()}}. +

    +

    You can check the status of your order by logging into your account.

    +

    {{var comment}}

    +

    + If you have any questions, please feel free to contact us at + dummyemail@magentocommerce.com + or by phone at (555) 555-0123. +

    +

    Thank you again,
    {{var order.getStoreGroupName()}}

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/invoice_update_guest.html b/app/locale/en_US/template/email/sales/invoice_update_guest.html index 71f4567809..735ec295b7 100644 --- a/app/locale/en_US/template/email/sales/invoice_update_guest.html +++ b/app/locale/en_US/template/email/sales/invoice_update_guest.html @@ -1,36 +1,36 @@ - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - - -
    -

    - Dear {{var billing.getName()}},
    - Your order # {{var order.increment_id}} has been
    - {{var order.getStatusLabel()}}. -

    -

    {{var comment}}

    -

    - If you have any questions, please feel free to contact us at - dummyemail@magentocommerce.com - or by phone at (555) 555-0123. -

    -

    Thank you again,
    {{var order.getStoreGroupName()}}

    -
    -
    + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + + +
    +

    + Dear {{htmlescape var=$billing.getName()}},
    + Your order # {{var order.increment_id}} has been
    + {{var order.getStatusLabel()}}. +

    +

    {{var comment}}

    +

    + If you have any questions, please feel free to contact us at + dummyemail@magentocommerce.com + or by phone at (555) 555-0123. +

    +

    Thank you again,
    {{var order.getStoreGroupName()}}

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/order_new.html b/app/locale/en_US/template/email/sales/order_new.html index 6c96433355..aeb4fc5b49 100644 --- a/app/locale/en_US/template/email/sales/order_new.html +++ b/app/locale/en_US/template/email/sales/order_new.html @@ -1,89 +1,87 @@ - - - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - -
    -

    - Hello {{var order.getCustomerName()}},
    - Thank you for your order from {{var order.getStoreGroupName()}}. - Once your package ships we will send an email with a link to track your order. - You can check the status of your order by logging into your account. - If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. -

    -

    Your order confirmation is below. Thank you again for your business.

    - -

    Your Order #{{var order.increment_id}} (placed on {{var order.getCreatedAtFormated('long')}})

    - - - - - - - - - - - - - - - -
    Billing Information:Payment Method:
    - {{var order.getBillingAddress().format('html')}} -   - {{var payment_html}} -
    -
    - {{depend order.getIsNotVirtual()}} - - - - - - - - - - - - - - - -
    Shipping Information:Shipping Method:
    - {{var order.getShippingAddress().format('html')}} -   -   - {{var order.getShippingDescription()}} -   -
    -
    - {{/depend}} - {{layout handle="sales_email_order_items" order=$order}} - - {{var items_html}} -
    - {{var order.getEmailCustomerNote()}} -

    Thank you again,
    {{var order.getStoreGroupName()}}

    -
    -
    + + + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + +
    +

    + Hello {{htmlescape var=$order.getCustomerName()}},
    + Thank you for your order from {{var order.getStoreGroupName()}}. + Once your package ships we will send an email with a link to track your order. + You can check the status of your order by logging into your account. + If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. +

    +

    Your order confirmation is below. Thank you again for your business.

    + +

    Your Order #{{var order.increment_id}} (placed on {{var order.getCreatedAtFormated('long')}})

    + + + + + + + + + + + + + + + +
    Billing Information:Payment Method:
    + {{var order.getBillingAddress().format('html')}} +   + {{var payment_html}} +
    +
    + {{depend order.getIsNotVirtual()}} + + + + + + + + + + + + + + + +
    Shipping Information:Shipping Method:
    + {{var order.getShippingAddress().format('html')}} +   +   + {{var order.getShippingDescription()}} +   +
    +
    + {{/depend}} + {{layout handle="sales_email_order_items" order=$order}} +
    + {{var order.getEmailCustomerNote()}} +

    Thank you again,
    {{var order.getStoreGroupName()}}

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/order_new_guest.html b/app/locale/en_US/template/email/sales/order_new_guest.html index 681292120b..3447b85b64 100644 --- a/app/locale/en_US/template/email/sales/order_new_guest.html +++ b/app/locale/en_US/template/email/sales/order_new_guest.html @@ -1,86 +1,86 @@ - - - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - -
    -

    - Hello {{var order.getBillingAddress().getName()}},
    - Thank you for your order from {{var order.getStoreGroupName()}}. - Once your package ships we will send an email with a link to track your order. - If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. -

    -

    Your order confirmation is below. Thank you again for your business.

    - -

    Your Order #{{var order.increment_id}} (placed on {{var order.getCreatedAtFormated('long')}})

    - - - - - - - - - - - - - - - -
    Billing Information:Payment Method:
    - {{var order.getBillingAddress().format('html')}} -   - {{var payment_html}} -
    -
    - {{depend order.getIsNotVirtual()}} - - - - - - - - - - - - - - - -
    Shipping Information:Shipping Method:
    - {{var order.getShippingAddress().format('html')}} -   -   - {{var order.getShippingDescription()}} -   -
    -
    - {{/depend}} - {{layout handle="sales_email_order_items" order=$order}} -
    - {{var order.getEmailCustomerNote()}} -

    Thank you again,
    {{var order.getStoreGroupName()}}

    -
    -
    + + + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + +
    +

    + Hello {{htmlescape var=$order.getBillingAddress().getName()}},
    + Thank you for your order from {{var order.getStoreGroupName()}}. + Once your package ships we will send an email with a link to track your order. + If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. +

    +

    Your order confirmation is below. Thank you again for your business.

    + +

    Your Order #{{var order.increment_id}} (placed on {{var order.getCreatedAtFormated('long')}})

    + + + + + + + + + + + + + + + +
    Billing Information:Payment Method:
    + {{var order.getBillingAddress().format('html')}} +   + {{var payment_html}} +
    +
    + {{depend order.getIsNotVirtual()}} + + + + + + + + + + + + + + + +
    Shipping Information:Shipping Method:
    + {{var order.getShippingAddress().format('html')}} +   +   + {{var order.getShippingDescription()}} +   +
    +
    + {{/depend}} + {{layout handle="sales_email_order_items" order=$order}} +
    + {{var order.getEmailCustomerNote()}} +

    Thank you again,
    {{var order.getStoreGroupName()}}

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/order_update.html b/app/locale/en_US/template/email/sales/order_update.html index 7dc130fd05..50592eed79 100644 --- a/app/locale/en_US/template/email/sales/order_update.html +++ b/app/locale/en_US/template/email/sales/order_update.html @@ -1,37 +1,37 @@ - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - - -
    -

    - Dear {{var order.getCustomerName()}},
    - Your order # {{var order.increment_id}} has been
    - {{var order.getStatusLabel()}}. -

    -

    You can check the status of your order by logging into your account.

    -

    {{var comment}}

    -

    - If you have any questions, please feel free to contact us at - dummyemail@magentocommerce.com - or by phone at (555) 555-0123. -

    -

    Thank you again,
    {{var order.getStoreGroupName()}}

    -
    -
    + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + + +
    +

    + Dear {{htmlescape var=$order.getCustomerName()}},
    + Your order # {{var order.increment_id}} has been
    + {{var order.getStatusLabel()}}. +

    +

    You can check the status of your order by logging into your account.

    +

    {{var comment}}

    +

    + If you have any questions, please feel free to contact us at + dummyemail@magentocommerce.com + or by phone at (555) 555-0123. +

    +

    Thank you again,
    {{var order.getStoreGroupName()}}

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/order_update_guest.html b/app/locale/en_US/template/email/sales/order_update_guest.html index d6b373d34c..f9cb2ad772 100644 --- a/app/locale/en_US/template/email/sales/order_update_guest.html +++ b/app/locale/en_US/template/email/sales/order_update_guest.html @@ -1,36 +1,36 @@ - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - - -
    -

    - Dear {{var billing.getName()}},
    - Your order # {{var order.increment_id}} has been
    - {{var order.getStatusLabel()}}. -

    -

    {{var comment}}

    -

    - If you have any questions, please feel free to contact us at - dummyemail@magentocommerce.com - or by phone at (555) 555-0123. -

    -

    Thank you again,
    {{var order.getStoreGroupName()}}

    -
    -
    + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + + +
    +

    + Dear {{htmlescape var=$billing.getName()}},
    + Your order # {{var order.increment_id}} has been
    + {{var order.getStatusLabel()}}. +

    +

    {{var comment}}

    +

    + If you have any questions, please feel free to contact us at + dummyemail@magentocommerce.com + or by phone at (555) 555-0123. +

    +

    Thank you again,
    {{var order.getStoreGroupName()}}

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/shipment_new.html b/app/locale/en_US/template/email/sales/shipment_new.html index 6cfbece5d9..380c3450a4 100644 --- a/app/locale/en_US/template/email/sales/shipment_new.html +++ b/app/locale/en_US/template/email/sales/shipment_new.html @@ -1,93 +1,93 @@ - - - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - -
    -

    - Hello {{var order.getCustomerName()}},
    - Thank you for your order from {{var order.getStoreGroupName()}}. - You can check the status of your order by logging into your account. - If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. -

    -

    - Your shipping confirmation is below. Thank you again for your business. -

    - -

    - Your Shipment #{{var shipment.increment_id}} for Order #{{var order.increment_id}} -

    - - - - - - - - - - - - - - - -
    Billing Information:Payment Method:
    - {{var order.billing_address.format('html')}} -   - {{var payment_html}} -
    -
    - - - - - - - - - - - - - - - -
    Shipping Information:Shipping Method:
    - {{var order.shipping_address.format('html')}} -   -   - {{var order.shipping_description}} -   -
    -
    - - {{layout handle="sales_email_order_shipment_items" shipment=$shipment order=$order}} - -
    - {{block type='core/template' area='frontend' template='email/order/shipment/track.phtml' shipment=$shipment order=$order}} -

    {{var comment}}

    -

    - Thank you again,
    {{var order.getStoreGroupName()}} -

    -
    -
    + + + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + +
    +

    + Hello {{htmlescape var=$order.getCustomerName()}},
    + Thank you for your order from {{var order.getStoreGroupName()}}. + You can check the status of your order by logging into your account. + If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. +

    +

    + Your shipping confirmation is below. Thank you again for your business. +

    + +

    + Your Shipment #{{var shipment.increment_id}} for Order #{{var order.increment_id}} +

    + + + + + + + + + + + + + + + +
    Billing Information:Payment Method:
    + {{var order.billing_address.format('html')}} +   + {{var payment_html}} +
    +
    + + + + + + + + + + + + + + + +
    Shipping Information:Shipping Method:
    + {{var order.shipping_address.format('html')}} +   +   + {{var order.shipping_description}} +   +
    +
    + + {{layout handle="sales_email_order_shipment_items" shipment=$shipment order=$order}} + +
    + {{block type='core/template' area='frontend' template='email/order/shipment/track.phtml' shipment=$shipment order=$order}} +

    {{var comment}}

    +

    + Thank you again,
    {{var order.getStoreGroupName()}} +

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/shipment_new_guest.html b/app/locale/en_US/template/email/sales/shipment_new_guest.html index 6482b7a1ae..c545f3b169 100644 --- a/app/locale/en_US/template/email/sales/shipment_new_guest.html +++ b/app/locale/en_US/template/email/sales/shipment_new_guest.html @@ -1,92 +1,92 @@ - - - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - -
    -

    - Hello {{var billing.getName()}},
    - Thank you for your order from {{var order.getStoreGroupName()}}. - If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. -

    -

    - Your shipping confirmation is below. Thank you again for your business. -

    - -

    - Your Shipment #{{var shipment.increment_id}} for Order #{{var order.increment_id}} -

    - - - - - - - - - - - - - - - -
    Billing Information:Payment Method:
    - {{var order.billing_address.format('html')}} -   - {{var payment_html}} -
    -
    - - - - - - - - - - - - - - - -
    Shipping Information:Shipping Method:
    - {{var order.shipping_address.format('html')}} -   -   - {{var order.shipping_description}} -   -
    -
    - - {{layout handle="sales_email_order_shipment_items" shipment=$shipment order=$order}} - -
    - {{block type='core/template' area='frontend' template='email/order/shipment/track.phtml' shipment=$shipment order=$order}} -

    {{var comment}}

    -

    - Thank you again,
    {{var order.getStoreGroupName()}} -

    -
    -
    + + + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + +
    +

    + Hello {{htmlescape var=$billing.getName()}},
    + Thank you for your order from {{var order.getStoreGroupName()}}. + If you have any questions about your order please contact us at dummyemail@magentocommerce.com or call us at (555) 555-0123 Monday - Friday, 8am - 5pm PST. +

    +

    + Your shipping confirmation is below. Thank you again for your business. +

    + +

    + Your Shipment #{{var shipment.increment_id}} for Order #{{var order.increment_id}} +

    + + + + + + + + + + + + + + + +
    Billing Information:Payment Method:
    + {{var order.billing_address.format('html')}} +   + {{var payment_html}} +
    +
    + + + + + + + + + + + + + + + +
    Shipping Information:Shipping Method:
    + {{var order.shipping_address.format('html')}} +   +   + {{var order.shipping_description}} +   +
    +
    + + {{layout handle="sales_email_order_shipment_items" shipment=$shipment order=$order}} + +
    + {{block type='core/template' area='frontend' template='email/order/shipment/track.phtml' shipment=$shipment order=$order}} +

    {{var comment}}

    +

    + Thank you again,
    {{var order.getStoreGroupName()}} +

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/shipment_update.html b/app/locale/en_US/template/email/sales/shipment_update.html index 769c10d51b..c656ed8a1d 100644 --- a/app/locale/en_US/template/email/sales/shipment_update.html +++ b/app/locale/en_US/template/email/sales/shipment_update.html @@ -1,37 +1,37 @@ - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - - -
    -

    - Dear {{var order.getCustomerName()}},
    - Your order # {{var order.increment_id}} has been
    - {{var order.getStatusLabel()}}. -

    -

    You can check the status of your order by logging into your account.

    -

    {{var comment}}

    -

    - If you have any questions, please feel free to contact us at - dummyemail@magentocommerce.com - or by phone at (555) 555-0123. -

    -

    Thank you again,
    {{var order.getStoreGroupName()}}

    -
    -
    + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + + +
    +

    + Dear {{htmlescape var=$order.getCustomerName()}},
    + Your order # {{var order.increment_id}} has been
    + {{var order.getStatusLabel()}}. +

    +

    You can check the status of your order by logging into your account.

    +

    {{var comment}}

    +

    + If you have any questions, please feel free to contact us at + dummyemail@magentocommerce.com + or by phone at (555) 555-0123. +

    +

    Thank you again,
    {{var order.getStoreGroupName()}}

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/sales/shipment_update_guest.html b/app/locale/en_US/template/email/sales/shipment_update_guest.html index d04b29de4d..754dcf459a 100644 --- a/app/locale/en_US/template/email/sales/shipment_update_guest.html +++ b/app/locale/en_US/template/email/sales/shipment_update_guest.html @@ -1,36 +1,36 @@ - - -
    - - - - -
    - - - - - -
    Magento
    - - - - - - -
    -

    - Dear {{var billing.getName()}},
    - Your order # {{var order.increment_id}} has been
    - {{var order.getStatusLabel()}}. -

    -

    {{var comment}}

    -

    - If you have any questions, please feel free to contact us at - dummyemail@magentocommerce.com - or by phone at (555) 555-0123. -

    -

    Thank you again,
    {{var order.getStoreGroupName()}}

    -
    -
    + + +
    + + + + +
    + + + + + +
    Magento
    + + + + + + +
    +

    + Dear {{htmlescape var=$billing.getName()}},
    + Your order # {{var order.increment_id}} has been
    + {{var order.getStatusLabel()}}. +

    +

    {{var comment}}

    +

    + If you have any questions, please feel free to contact us at + dummyemail@magentocommerce.com + or by phone at (555) 555-0123. +

    +

    Thank you again,
    {{var order.getStoreGroupName()}}

    +
    +
    \ No newline at end of file diff --git a/app/locale/en_US/template/email/wishlist_share.html b/app/locale/en_US/template/email/wishlist_share.html index 8badfc5768..6716f8b920 100644 --- a/app/locale/en_US/template/email/wishlist_share.html +++ b/app/locale/en_US/template/email/wishlist_share.html @@ -30,7 +30,7 @@ {{depend salable}}

    Add all items to shopping cart |{{/depend}} View all wishlist items

    -

    Thank you,
    {{var customer.name}}

    +

    Thank you,
    {{htmlescape var=$customer.name}}

    + + + + +
    Use custom permissions: + +
    + get('use_custom_permissions_mode')=='0'):?>style="display:none;"> + + + + + + + + + + + + +
    Folders: + +
    Files: + +
    Executable files: + +
    + +controller()->isDownloaded()): ?> + + + + @@ -71,6 +107,18 @@ + + +

    Settings

    @@ -54,6 +66,39 @@
    +

    Permission to create new files and folders.

    + + + + + +
    Use custom permissions: + +
    + get('use_custom_permissions_mode')=='0'):?>style="display:none;"> + + + + + + + + + + + + +
    Folders: + +
    Files: + +
    Executable files: + +
    +

    diff --git a/includes/.htaccess b/includes/.htaccess new file mode 100644 index 0000000000..93169e4eb4 --- /dev/null +++ b/includes/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/includes/config.php b/includes/config.php new file mode 100644 index 0000000000..4ae464cd75 --- /dev/null +++ b/includes/config.php @@ -0,0 +1,29 @@ + 1) { + dateObj = eval("new this.parent.constructor("+Array.prototype.slice.call(arguments).join(",")+");"); + } else if (arguments.length > 0) { + dateObj = new this.parent.constructor(arguments[0]); + } else { + dateObj = new this.parent.constructor(); + if (typeof(CalendarDateObject._LOCAL_TIMZEONE_OFFSET_SECONDS) != "undefined") { + dateObj.setTime(dateObj.getTime()+(CalendarDateObject._LOCAL_TIMZEONE_OFFSET_SECONDS - dateObj.getTimezoneOffset())*1000); + } + } + return dateObj; +} + // END: DATE OBJECT PATCHES diff --git a/js/extjs/ext-tree-checkbox.js b/js/extjs/ext-tree-checkbox.js index 7ae0f68c3e..7ef284993f 100644 --- a/js/extjs/ext-tree-checkbox.js +++ b/js/extjs/ext-tree-checkbox.js @@ -81,7 +81,7 @@ Ext.extend(Ext.tree.CheckboxNodeUI, Ext.tree.TreeNodeUI, { '',this.indentMarkup,"", '', '', - '" : '>'), + '" : '>'), '', '',n.text,"", @@ -152,6 +152,9 @@ Ext.extend(Ext.tree.CheckboxNodeUI, Ext.tree.TreeNodeUI, { * @param {Boolean} descend true to walk through the nodes children and set their checkbox values. (defaults to false) */ check : function(state, descend, bulk) { + if (this.node.disabled) { + return; + } var n = this.node; var tree = n.getOwnerTree(); var parentNode = n.parentNode;n @@ -223,6 +226,9 @@ Ext.extend(Ext.tree.CheckNodeMultiSelectionModel, Ext.tree.MultiSelectionModel, * (see {@link Ext.tree.CheckNodeMultiSelectionModel#extendSelection} for the limitations) */ onNodeClick : function(node, e){ + if (node.disabled) { + return; + } if( e.shiftKey && this.extendSelection(node) ) { return true; } @@ -303,4 +309,4 @@ Ext.extend(Ext.tree.CheckNodeMultiSelectionModel, Ext.tree.MultiSelectionModel, return true; }) -}); \ No newline at end of file +}); diff --git a/js/mage/adminhtml/product.js b/js/mage/adminhtml/product.js index e4694e2dbc..dcb935e418 100644 --- a/js/mage/adminhtml/product.js +++ b/js/mage/adminhtml/product.js @@ -37,7 +37,9 @@ Product.Gallery.prototype = { this.container = $(this.containerId); this.uploader = uploader; this.imageTypes = imageTypes; - this.uploader.onFilesComplete = this.handleUploadComplete.bind(this); + if (this.uploader) { + this.uploader.onFilesComplete = this.handleUploadComplete.bind(this); + } //this.uploader.onFileProgress = this.handleUploadProgress.bind(this); //this.uploader.onFileError = this.handleUploadError.bind(this); this.images = this.getElement('save').value.evalJSON(); @@ -292,13 +294,14 @@ Product.Attributes.prototype = { Product.Configurable = Class.create(); Product.Configurable.prototype = { - initialize: function (attributes, links, idPrefix, grid) { + initialize: function (attributes, links, idPrefix, grid, readonly) { this.templatesSyntax = new RegExp('(^|.|\\r|\\n)(\'{{\\s*(\\w+)\\s*}}\')', ""); this.attributes = attributes; // Attributes this.idPrefix = idPrefix; // Container id prefix this.links = $H(links); // Associated products this.newProducts = []; // For product that's created througth Create Empty and Copy from Configurable - + this.readonly = readonly; + /* Generation templates */ this.addAttributeTemplate = new Template($(idPrefix + 'attribute_template').innerHTML.replace(/__id__/g,"'{{html_id}}'").replace(/ template no-display/g,''), this.templatesSyntax); this.addValueTemplate = new Template($(idPrefix + 'value_template').innerHTML.replace(/__id__/g,"'{{html_id}}'").replace(/ template no-display/g,''), this.templatesSyntax); @@ -351,8 +354,10 @@ Product.Configurable.prototype = { Event.observe(li.down('.attribute-label'),'change', this.onLabelUpdate); Event.observe(li.down('.attribute-label'),'keyup', this.onLabelUpdate); }.bind(this)); - // Creation of sortable for attributes sorting - Sortable.create(this.container, {handle:'attribute-name-container',onUpdate:this.updatePositions.bind(this)}); + if (!this.readonly) { + // Creation of sortable for attributes sorting + Sortable.create(this.container, {handle:'attribute-name-container',onUpdate:this.updatePositions.bind(this)}); + } this.updateSaveInput(); }, @@ -877,4 +882,4 @@ function onCompleteDisableInited() }); } -Event.observe(window, 'load', onCompleteDisableInited); \ No newline at end of file +Event.observe(window, 'load', onCompleteDisableInited); diff --git a/js/mage/adminhtml/sales.js b/js/mage/adminhtml/sales.js index 9bfe030781..17abf82ee3 100644 --- a/js/mage/adminhtml/sales.js +++ b/js/mage/adminhtml/sales.js @@ -240,7 +240,7 @@ AdminOrder.prototype = { } if(!this.paymentMethod || method){ - $('order-billing_method').select('input', 'select').each(function(elem){ + $('order-billing_method_form').select('input', 'select').each(function(elem){ if(elem.type != 'radio') elem.disabled = true; }) } @@ -473,7 +473,8 @@ AdminOrder.prototype = { } }, - itemChange : function(){ + itemChange : function(event){ + this.giftmessageOnItemChange(event); this.orderItemChanged = true; }, @@ -523,6 +524,22 @@ AdminOrder.prototype = { this.saveData(this.serializeData('order-giftmessage')); }, + giftmessageOnItemChange : function(event) { + var element = Event.element(event); + if(element.name.indexOf("giftmessage") != -1 && element.type == "checkbox" && !element.checked) { + var messages = $("order-giftmessage").select('textarea'); + var name; + for(var i=0; i0 && pass.length < 6); @@ -490,12 +503,17 @@ Validation.addAllThese([ }); }], ['validate-one-required-by-name', 'Please select one of the options.', function (v,elm) { - var inputs = $$('input'); + var inputs = $$('input[name="' + elm.name.replace(/([\\"])/g, '\\$1') + '"]'); + var error = 1; - for( i in inputs ) { - if( inputs[i].checked == true && inputs[i].name == elm.name ) { + for(var i=0;i span.required') || + elem.up(2).down('label > span.required') || + elem.up(1).down('label.required > em') || + elem.up(2).down('label.required > em'); + if(labelElement) { + display ? labelElement.show() : labelElement.hide(); } } } \ No newline at end of file diff --git a/lib/Varien/Autoload.php b/lib/Varien/Autoload.php new file mode 100644 index 0000000000..53a33284aa --- /dev/null +++ b/lib/Varien/Autoload.php @@ -0,0 +1,168 @@ +_isIncludePathDefined = defined('COMPILER_INCLUDE_PATH'); + if (defined('COMPILER_COLLECT_PATH')) { + $this->_collectClasses = true; + $this->_collectPath = COMPILER_COLLECT_PATH; + } + self::registerScope(self::$_scope); + } + + /** + * Singleton pattern implementation + * + * @return Varien_Autoload + */ + static public function instance() + { + if (!self::$_instance) { + self::$_instance = new Varien_Autoload(); + } + return self::$_instance; + } + + /** + * Register SPL autoload function + */ + static public function register() + { + spl_autoload_register(array(self::instance(), 'autoload')); + } + + /** + * Load class source code + * + * @param string $class + */ + public function autoload($class) + { + if ($this->_collectClasses) { + $this->_arrLoadedClasses[self::$_scope][] = $class; + } + if ($this->_isIncludePathDefined) { + $classFile = $class; + } else { + $classFile = str_replace(' ', DIRECTORY_SEPARATOR, ucwords(str_replace('_', ' ', $class))); + } + $classFile.= '.php'; + //echo $classFile;die(); + return include $classFile; + } + + /** + * Register autoload scope + * This process allow include scope file which can contain classes + * definition which are used for this scope + * + * @param string $code scope code + */ + static public function registerScope($code) + { + self::$_scope = $code; + @include self::SCOPE_FILE_PREFIX.$code.'.php'; + } + + /** + * Get current autoload scope + * + * @return string + */ + static public function getScope() + { + return self::$_scope; + } + + /** + * Class destructor + */ + public function __destruct() + { + if ($this->_collectClasses) { + $this->_saveCollectedStat(); + } + } + + /** + * Save information about used classes per scope with class popularity + * Class_Name:popularity + * + * @return Varien_Autoload + */ + protected function _saveCollectedStat() + { + if (!is_dir($this->_collectPath)) { + @mkdir($this->_collectPath); + @chmod($this->_collectPath, 0777); + } + + if (!is_writeable($this->_collectPath)) { + return $this; + } + + foreach ($this->_arrLoadedClasses as $scope => $classes) { + $file = $this->_collectPath.DIRECTORY_SEPARATOR.$scope.'.csv'; + $data = array(); + if (file_exists($file)) { + $data = explode("\n", file_get_contents($file)); + foreach ($data as $index => $class) { + $class = explode(':', $class); + $searchIndex = array_search($class[0], $classes); + if ($searchIndex !== false) { + $class[1]+=1; + unset($classes[$searchIndex]); + } + $data[$index] = $class[0].':'.$class[1]; + } + } + foreach ($classes as $class) { + $data[] = $class . ':1'; + } + file_put_contents($file, implode("\n", $data)); + } + return $this; + } +} diff --git a/lib/Varien/Data/Collection/Db.php b/lib/Varien/Data/Collection/Db.php index 042ac6afe6..c7ee9e3ad5 100644 --- a/lib/Varien/Data/Collection/Db.php +++ b/lib/Varien/Data/Collection/Db.php @@ -69,6 +69,13 @@ class Varien_Data_Collection_Db extends Varien_Data_Collection */ protected $_data = null; + /** + * Fields map for corellation names & real selected fields + * + * @var array + */ + protected $_map = null; + public function __construct($conn=null) { parent::__construct(); diff --git a/lib/Varien/Data/Form/Element/Abstract.php b/lib/Varien/Data/Form/Element/Abstract.php index 4ed0c1a9f2..2e2bf99e3c 100644 --- a/lib/Varien/Data/Form/Element/Abstract.php +++ b/lib/Varien/Data/Form/Element/Abstract.php @@ -142,11 +142,7 @@ public function getEscapedValue($index=null) if ($filter = $this->getValueFilter()) { $value = $filter->filter($value); } - try { - return $this->_escape($value); - } catch (Exception $e) { - return $value; - } + return $this->_escape($value); } public function setRenderer(Varien_Data_Form_Element_Renderer_Interface $renderer) @@ -218,9 +214,37 @@ public function serialize($attributes = array(), $valueSeparator='=', $fieldSepa if (in_array('disabled', $attributes) && !empty($this->_data['disabled'])) { $this->_data['disabled'] = 'disabled'; } + else { + unset($this->_data['disabled']); + } if (in_array('checked', $attributes) && !empty($this->_data['checked'])) { $this->_data['checked'] = 'checked'; } + else { + unset($this->_data['checked']); + } return parent::serialize($attributes, $valueSeparator, $fieldSeparator, $quote); } + + public function setReadonly($readonly, $useDisabled = false) + { + if ($useDisabled) { + $this->setDisabled($readonly); + $this->setData('readonly_disabled', $readonly); + } else { + $this->setData('readonly', $readonly); + } + + return $this; + } + + public function getReadonly() + { + if ($this->hasData('readonly_disabled')) { + return $this->_getData('readonly_disabled'); + } + + return $this->_getData('readonly'); + } + } diff --git a/lib/Varien/Data/Form/Element/Date.php b/lib/Varien/Data/Form/Element/Date.php index e8d9ebd962..c5cabfdcd8 100644 --- a/lib/Varien/Data/Form/Element/Date.php +++ b/lib/Varien/Data/Form/Element/Date.php @@ -138,7 +138,7 @@ public function getElementHtml() $this->addClass('input-text'); $html = sprintf( - '' + '' .' ', $this->getName(), $this->getHtmlId(), $this->_escape($this->getValue()), $this->serialize($this->getHtmlAttributes()), $this->getImage(), $this->getHtmlId(), __('Select Date'), ($this->getDisabled() ? 'display:none;' : '') diff --git a/lib/Varien/Db/Adapter/Pdo/Mysql.php b/lib/Varien/Db/Adapter/Pdo/Mysql.php index 076e1a56a6..ea72c388bb 100644 --- a/lib/Varien/Db/Adapter/Pdo/Mysql.php +++ b/lib/Varien/Db/Adapter/Pdo/Mysql.php @@ -36,9 +36,31 @@ class Varien_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql const ISO_DATE_FORMAT = 'yyyy-MM-dd'; const ISO_DATETIME_FORMAT = 'yyyy-MM-dd HH-mm-ss'; + const DDL_DESCRIBE = 1; + const DDL_CREATE = 2; + const DDL_INDEX = 3; + const DDL_FOREIGN_KEY = 4; + + /** + * Current Transaction Level + * + * @var int + */ protected $_transactionLevel = 0; + + /** + * Set attribute to connection flag + * + * @var bool + */ protected $_connectionFlagsSet = false; - protected $_describesCache = array(); + + /** + * Tables DDL cache + * + * @var array + */ + protected $_ddlCache = array(); /** * SQL bind params @@ -299,6 +321,12 @@ protected function _unQuote($string) return strtr($string, $translate); } + /** + * Run Multi Query + * + * @param string $sql + * @return array + */ public function multi_query($sql) { ##$result = $this->raw_query($sql); @@ -315,6 +343,9 @@ public function multi_query($sql) #$this->rollback(); throw $e; } + + $this->resetDdlCache(); + return $result; } @@ -377,35 +408,90 @@ protected function _splitMultiQuery($sql) /** * Delete foreign key if it exist * - * @param string $table - * @param string $fk - * @return bool + * @param string $tableName + * @param string $foreignKey + * @param string $shemaName + * @return mixed */ - public function dropForeignKey($table, $fk) + public function dropForeignKey($tableName, $foreignKey, $schemaName = null) { - $create = $this->raw_fetchRow("show create table `$table`", 'Create Table'); - if (strpos($create, "CONSTRAINT `$fk` FOREIGN KEY (")!==false) { - $this->resetDescribesCache($table); - return $this->raw_query("ALTER TABLE `$table` DROP FOREIGN KEY `$fk`"); + $foreignKeys = $this->getForeignKeys($tableName, $schemaName); + if (isset($foreignKeys[strtoupper($foreignKey)])) { + $sql = sprintf('ALTER TABLE %s DROP FOREIGN KEY %s', + $this->quoteIdentifier($this->_getTableName($tableName, $schemaName)), + $this->quoteIdentifier($foreignKeys[strtoupper($foreignKey)]['FK_NAME'])); +// echo '
    ';
    +//            var_dump($tableName, $schemaName, $foreignKey, $foreignKeys, $sql);
    +//            echo '
    '; + + $this->resetDdlCache($tableName, $schemaName); + + return $this->raw_query($sql); } + return true; } /** - * Delte index if it exist + * Delete index from a table if it exist * - * @param string $table - * @param string $key - * @return bool + * @param string $tableName + * @param string $keyName + * @param string $shemaName + * @return bool */ - public function dropKey($table, $key) + public function dropKey($tableName, $keyName, $shemaName = null) { - $create = $this->raw_fetchRow("show create table `$table`", 'Create Table'); - if (strpos($create, "KEY `$key` (")!==false) { - $this->resetDescribesCache($table); - return $this->raw_query("ALTER TABLE `$table` DROP KEY `$key`"); + $indexList = $this->getIndexList($tableName, $shemaName); + $keyName = strtoupper($keyName); + if (!isset($indexList[$keyName])) { + return true; } - return true; + + if ($keyName == 'PRIMARY') { + $cond = 'DROP PRIMARY KEY'; + } + else { + $cond = sprintf('DROP KEY %s', $this->quoteIdentifier($indexList[$keyName]['KEY_NAME'])); + } + $sql = sprintf('ALTER TABLE %s %s', + $this->quoteIdentifier($this->_getTableName($tableName, $shemaName)), + $cond); + + $this->resetDdlCache($tableName, $shemaName); + return $this->raw_query($sql); + } + + /** + * Prepare table before add constraint foreign key + * + * @param string $tableName + * @param string $columnName + * @param string $refTableName + * @param string $refColumnName + * @param string $onDelete + * @return Varien_Db_Adapter_Pdo_Mysql + */ + public function purgeOrphanRecords($tableName, $columnName, $refTableName, $refColumnName, $onDelete = 'cascade') + { + if (strtoupper($onDelete) == 'CASCADE' + || strtoupper($onDelete) == 'RESTRICT') { + $sql = "DELETE `p`.* FROM `{$tableName}` AS `p`" + . " LEFT JOIN `{$refTableName}` AS `r`" + . " ON `p`.`{$columnName}` = `r`.`{$refColumnName}`" + . " WHERE `r`.`{$refColumnName}` IS NULL"; + $this->raw_query($sql); + } + elseif (strtoupper($onDelete) == 'SET NULL') { + $sql = "UPDATE `{$tableName}` AS `p`" + . " LEFT JOIN `{$refTableName}` AS `r`" + . " ON `p`.`{$columnName}` = `r`.`{$refColumnName}`" + . " SET `p`.`{$columnName}`=NULL" + . " WHERE `r`.`{$refColumnName}` IS NULL"; + $this->raw_query($sql); + } + + return $this; } /** @@ -418,8 +504,11 @@ public function dropKey($table, $key) * @param string $refKeyName refered table field name * @param string $onUpdate on update statement * @param string $onDelete on delete statement + * @param bool $purge + * @return mixed */ - public function addConstraint($fkName, $tableName, $keyName, $refTableName, $refKeyName, $onDelete = 'cascade', $onUpdate = 'cascade') + public function addConstraint($fkName, $tableName, $columnName, + $refTableName, $refColumnName, $onDelete = 'cascade', $onUpdate = 'cascade', $purge = false) { if (substr($fkName, 0, 3) != 'FK_') { $fkName = 'FK_' . $fkName; @@ -427,29 +516,36 @@ public function addConstraint($fkName, $tableName, $keyName, $refTableName, $ref $this->dropForeignKey($tableName, $fkName); + if ($purge) { + $this->purgeOrphanRecords($tableName, $columnName, $refTableName, $refColumnName, $onDelete); + } + $sql = 'ALTER TABLE `'.$tableName.'` ADD CONSTRAINT `'.$fkName.'`' - . 'FOREIGN KEY (`'.$keyName.'`) REFERENCES `'.$refTableName.'` (`'.$refKeyName.'`)'; + . ' FOREIGN KEY (`'.$columnName.'`) REFERENCES `'.$refTableName.'` (`'.$refColumnName.'`)'; if (!is_null($onDelete)) { $sql .= ' ON DELETE ' . strtoupper($onDelete); } if (!is_null($onUpdate)) { $sql .= ' ON UPDATE ' . strtoupper($onUpdate); } - $this->resetDescribesCache($tableName); + + $this->resetDdlCache($tableName); return $this->raw_query($sql); } /** * Check table column exist * - * @param string $tableName - * @param string $columnName - * @return bool + * @param string $tableName + * @param string $columnName + * @param string $schemaName + * @return bool */ - public function tableColumnExists($tableName, $columnName) + public function tableColumnExists($tableName, $columnName, $schemaName = null) { - foreach ($this->fetchAll('DESCRIBE `'.$tableName.'`') as $row) { - if ($row['Field'] == $columnName) { + $describe = $this->describeTable($tableName, $schemaName); + foreach ($describe as $column) { + if ($column['COLUMN_NAME'] == $columnName) { return true; } } @@ -469,42 +565,47 @@ public function addColumn($tableName, $columnName, $definition) if ($this->tableColumnExists($tableName, $columnName)) { return true; } - $this->resetDescribesCache($tableName); - $result = $this->raw_query("alter table `$tableName` add column `$columnName` ".$definition); + + $sql = sprintf('ALTER TABLE %s ADD COLUMN %s %s', + $this->quoteIdentifier($tableName), + $this->quoteIdentifier($columnName), + $definition + ); + $result = $this->raw_query($sql); + $this->resetDdlCache($tableName); return $result; } /** * Delete table column * - * @param string $tableName - * @param string $columnName - * @return bool + * @param string $tableName + * @param string $columnName + * @param string $shemaName + * @return bool */ - public function dropColumn($tableName, $columnName) + public function dropColumn($tableName, $columnName, $shemaName = null) { - if (!$this->tableColumnExists($tableName, $columnName)) { + if (!$this->tableColumnExists($tableName, $columnName, $shemaName)) { return true; } - $create = $this->raw_fetchRow('SHOW CREATE TABLE `'.$tableName.'`', 'Create Table'); - $alterDrop = array(); - /** - * find foreign keys for column - */ - $matches = array(); - preg_match_all('/CONSTRAINT `([^`]*)` FOREIGN KEY \(`([^`]*)`\)/', $create, $matches, PREG_SET_ORDER); - foreach ($matches as $match) { - if ($match[2] == $columnName) { - $alterDrop[] = 'DROP FOREIGN KEY `'.$match[1].'`'; + $foreignKeys = $this->getForeignKeys($tableName, $shemaName); + foreach ($foreignKeys as $fkProp) { + if ($fkProp['COLUMN_NAME'] == $columnName) { + $alterDrop[] = sprintf('DROP FOREIGN KEY %s', $this->quoteIdentifier($fkProp['FK_NAME'])); } } - $alterDrop[] = 'DROP COLUMN `'.$columnName.'`'; - $this->resetDescribesCache($tableName); - return $this->raw_query('ALTER TABLE `'.$tableName.'` ' . join(', ', $alterDrop)); + $alterDrop[] = sprintf('DROP COLUMN %s', $this->quoteIdentifier($columnName)); + $sql = sprintf('ALTER TABLE %s %s', + $this->quoteIdentifier($this->_getTableName($tableName, $shemaName)), + join(', ', $alterDrop)); + + $this->resetDdlCache($tableName, $shemaName); + return $this->raw_query($sql); } /** @@ -521,17 +622,21 @@ public function dropColumn($tableName, $columnName) public function changeColumn($tableName, $oldColumnName, $newColumnName, $definition, $showStatus = false) { if (!$this->tableColumnExists($tableName, $oldColumnName)) { - Mage::throwException('Column "' . $oldColumnName . '" does not exists on table "' . $tableName . '"'); + throw new Exception(sprintf('Column "%s" does not exists on table "%s"', $oldColumnName, $tableName)); } - $sql = 'ALTER TABLE ' . $this->quoteIdentifier($tableName) - . ' CHANGE COLUMN ' . $this->quoteIdentifier($oldColumnName) - . ' ' . $this->quoteIdentifier($newColumnName) . ' ' . $definition; - $this->resetDescribesCache($tableName); + $sql = sprintf('ALTER TABLE %s CHANGE COLUMN %s %s %s', + $this->quoteIdentifier($tableName), + $this->quoteIdentifier($oldColumnName), + $this->quoteIdentifier($newColumnName), + $definition); + $result = $this->raw_query($sql); if ($showStatus) { $this->showTableStatus($tableName); } + + $this->resetDdlCache($tableName); return $result; } @@ -548,17 +653,19 @@ public function changeColumn($tableName, $oldColumnName, $newColumnName, $defini public function modifyColumn($tableName, $columnName, $definition, $showStatus = false) { if (!$this->tableColumnExists($tableName, $columnName)) { - Mage::throwException('Column "' . $columnName . '" does not exists on table "' . $tableName . '"'); + throw new Exception(sprintf('Column "%s" does not exists on table "%s"', $columnName, $tableName)); } - $sql = 'ALTER TABLE ' . $this->quoteIdentifier($tableName) - . ' MODIFY COLUMN ' . $this->quoteIdentifier($columnName) - . ' ' . $definition; - $this->resetDescribesCache($tableName); + $sql = sprintf('ALTER TABLE %s MODIFY COLUMN %s %s', + $this->quoteIdentifier($tableName), + $this->quoteIdentifier($columnName), + $definition); $result = $this->raw_query($sql); if ($showStatus) { $this->showTableStatus($tableName); } + + $this->resetDdlCache($tableName); return $result; } @@ -574,62 +681,171 @@ public function showTableStatus($tableName) return $this->raw_fetchRow($sql); } - public function getKeyList($tableName) + /** + * Retrieve table index key list + * + * @deprecated use getIndexList( + * @param string $tableName + * @param string $schemaName + * @return array + */ + public function getKeyList($tableName, $schemaName = null) { - $keyList = array(); - $create = $this->raw_fetchRow('SHOW CREATE TABLE ' . $this->quoteIdentifier($tableName), 'Create Table'); - $matches = array(); - preg_match_all('#KEY `([^`]+)` (USING (BTREE|HASH) )?\(([^)]+)\)#s', $create, $matches, PREG_SET_ORDER); + $keyList = array(); + $indexList = $this->getIndexList($tableName, $schemaName); - foreach ($matches as $v) { - $keyList[$v[1]] = split(',', str_replace($this->getQuoteIdentifierSymbol(), '', $v[2])); + foreach ($indexList as $indexProp) { + $keyList[$indexProp['KEY_NAME']] = $indexProp['COLUMNS_LIST']; } return $keyList; } /** - * Retrieve INDEX list for table + * Retrieve Create Table SQL + * + * @param string $tableName + * @param string $schemaName + * @return string + */ + public function getCreateTable($tableName, $schemaName = null) + { + $tableName = $this->_getTableName($tableName, $schemaName); + if (!isset($this->_ddlCache[self::DDL_CREATE][$tableName])) { + $sql = sprintf('SHOW CREATE TABLE %s', $this->quoteIdentifier($tableName)); + $this->_ddlCache[self::DDL_CREATE][$tableName] = $this->raw_fetchRow($sql, 'Create Table'); + } + return $this->_ddlCache[self::DDL_CREATE][$tableName]; + } + + /** + * Retrieve the foreign keys descriptions for a table. + * + * The return value is an associative array keyed by the UPPERCASE foreign key, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * FK_NAME => string; original foreign key name + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * REF_SCHEMA_NAME => string; name of reference database or schema + * REF_TABLE_NAME => string; reference table name + * REF_COLUMN_NAME => string; reference column name + * ON_DELETE => string; action type on delete row + * ON_UPDATE => string; action type on update row * * @param string $tableName + * @param string $schemaName * @return array */ - public function getIndexList($tableName) + public function getForeignKeys($tableName, $schemaName = null) { - $indexList = array(); + $cacheKey = $this->_getTableName($tableName, $schemaName); + if (!isset($this->_ddlCache[self::DDL_FOREIGN_KEY][$cacheKey])) { + $foreignKeys = array(); + $createSql = $this->getCreateTable($tableName, $schemaName); + + // collect CONSTRAINT + $regExp = '#,\s+CONSTRAINT `([^`]*)` FOREIGN KEY \(`([^`]*)`\) ' + . 'REFERENCES (`[^`]*\.)?`([^`]*)` \(`([^`]*)`\)' + . '( ON DELETE (RESTRICT|CASCADE|SET NULL|NO ACTION))?' + . '( ON UPDATE (RESTRICT|CASCADE|SET NULL|NO ACTION))?#'; + $matches = array(); + preg_match_all($regExp, $createSql, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + $foreignKeys[strtoupper($match[1])] = array( + 'FK_NAME' => $match[1], + 'SCHEMA_NAME' => $schemaName, + 'TABLE_NAME' => $tableName, + 'COLUMN_NAME' => $match[2], + 'REF_SHEMA_NAME' => isset($match[3]) ? $match[3] : $schemaName, + 'REF_TABLE_NAME' => $match[4], + 'REF_COLUMN_NAME' => $match[5], + 'ON_DELETE' => isset($match[6]) ? $match[7] : '', + 'ON_UPDATE' => isset($match[8]) ? $match[9] : '' + ); + } + + $this->_ddlCache[self::DDL_FOREIGN_KEY][$cacheKey] = $foreignKeys; + } - $sql = "SHOW INDEX FROM " . $this->quoteIdentifier($tableName); - foreach ($this->fetchAll($sql) as $row) { - $fieldKeyName = 'Key_name'; - $fieldNonUnique = 'Non_unique'; - $fieldColumn = 'Column_name'; - $fieldIndexType = 'Index_type'; + return $this->_ddlCache[self::DDL_FOREIGN_KEY][$cacheKey]; + } - if ($row[$fieldKeyName] == 'PRIMARY') { - $indexType = 'primary'; - } - elseif ($row[$fieldNonUnique] == 1) { - $indexType = 'unique'; - } - elseif ($row[$fieldIndexType] == 'FULLTEXT') { - $indexType = 'fulltext'; - } - else { - $indexType = 'index'; - } + /** + * Retrieve table index information + * + * The return value is an associative array keyed by the UPPERCASE index key, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; name of the table + * KEY_NAME => string; the original index name + * COLUMNS_LIST => array; array of index column names + * INDEX_TYPE => string; create index type + * INDEX_METHOD => string; index method using + * type => string; see INDEX_TYPE + * fields => array; see COLUMNS_LIST + * + * @param string $tableName + * @param string $schemaName + * @return array + */ + public function getIndexList($tableName, $schemaName = null) + { + $cacheKey = $this->_getTableName($tableName, $schemaName); + if (!isset($this->_ddlCache[self::DDL_INDEX][$cacheKey])) { + $indexList = array(); + + $sql = sprintf('SHOW INDEX FROM %s', + $this->quoteIdentifier($this->_getTableName($tableName, $schemaName))); + foreach ($this->fetchAll($sql) as $row) { + $fieldKeyName = 'Key_name'; + $fieldNonUnique = 'Non_unique'; + $fieldColumn = 'Column_name'; + $fieldIndexType = 'Index_type'; + + if ($row[$fieldKeyName] == 'PRIMARY') { + $indexType = 'primary'; + } + elseif ($row[$fieldNonUnique] == 0) { + $indexType = 'unique'; + } + elseif ($row[$fieldIndexType] == 'FULLTEXT') { + $indexType = 'fulltext'; + } + else { + $indexType = 'index'; + } - if (isset($indexList[$row[$fieldKeyName]])) { - $indexList[$row[$fieldKeyName]]['fields'][] = $row[$fieldColumn]; - } - else { - $indexList[$row[$fieldKeyName]] = array( - 'type' => $indexType, - 'fields' => array($row[$fieldColumn]) - ); + if (isset($indexList[$row[$fieldKeyName]])) { + $indexList[$row[$fieldKeyName]]['fields'][] = $row[$fieldColumn]; // for compatible + $indexList[$row[$fieldKeyName]]['COLUMNS_LIST'][] = $row[$fieldColumn]; + } + else { + $indexList[strtoupper($row[$fieldKeyName])] = array( + 'SCHEMA_NAME' => $schemaName, + 'TABLE_NAME' => $tableName, + 'KEY_NAME' => $row[$fieldKeyName], + 'COLUMNS_LIST' => array($row[$fieldColumn]), + 'INDEX_TYPE' => strtoupper($indexType), + 'INDEX_METHOD' => $row[$fieldIndexType], + 'type' => $indexType, // for compatible + 'fields' => array($row[$fieldColumn]) // for compatible + ); + } } + + $this->_ddlCache[self::DDL_INDEX][$cacheKey] = $indexList; } - return $indexList; + return $this->_ddlCache[self::DDL_INDEX][$cacheKey]; } /** @@ -643,6 +859,7 @@ public function getIndexList($tableName) */ public function addKey($tableName, $indexName, $fields, $indexType = 'index') { + $columns = $this->describeTable($tableName); $keyList = $this->getKeyList($tableName); $sql = 'ALTER TABLE '.$this->quoteIdentifier($tableName); @@ -650,16 +867,20 @@ public function addKey($tableName, $indexName, $fields, $indexType = 'index') $sql .= ' DROP INDEX ' . $this->quoteIdentifier($indexName) . ','; } - if (is_array($fields)) { - $fieldSql = array(); - foreach ($fields as $field) { - $fieldSql[] = $this->quoteIdentifier($field); - } - $fieldSql = join(',', $fieldSql); + if (!is_array($fields)) { + $fields = array($fields); } - else { - $fieldSql = $this->quoteIdentifier($fields); + + $fieldSql = array(); + foreach ($fields as $field) { + if (!isset($columns[$field])) { + $msg = sprintf('There is no field "%s" that you are trying to create an index on "%s"', + $field, $tableName); + throw new Exception($msg); + } + $fieldSql[] = $this->quoteIdentifier($field); } + $fieldSql = join(',', $fieldSql); switch (strtolower($indexType)) { case 'primary': @@ -677,8 +898,67 @@ public function addKey($tableName, $indexName, $fields, $indexType = 'index') } $sql .= ' ADD ' . $condition . ' (' . $fieldSql . ')'; - $this->resetDescribesCache($tableName); - return $this->raw_query($sql); + + $cycle = true; + while ($cycle === true) { + try { + $result = $this->raw_query($sql); + $cycle = false; + } + catch (PDOException $e) { + if (in_array(strtolower($indexType), array('primary', 'unique'))) { + $match = array(); + if (preg_match('#SQLSTATE\[23000\]: [^:]+: 1062[^\']+\'([\d-]+)\'#', $e->getMessage(), $match)) { + $ids = explode('-', $match[1]); + $this->_removeDuplicateEntry($tableName, $fields, $ids); + continue; + } + } + throw $e; + } + catch (Exception $e) { + throw $e; + } + } + + $this->resetDdlCache($tableName); + + return $result; + } + + /** + * Remove duplicate entry for create key + * + * @param string $table + * @param array $fields + * @param array $ids + * @return Varien_Db_Adapter_Pdo_Mysql + */ + protected function _removeDuplicateEntry($table, $fields, $ids) + { + $where = array(); + $i = 0; + foreach ($fields as $field) { + $where[] = $this->quoteInto($field . '=?', $ids[$i]); + $i ++; + } + + if (!$where) { + return $this; + } + $whereCond = join(' AND ', $where); + $sql = sprintf('SELECT COUNT(*) as `cnt` FROM `%s` WHERE %s', $table, $whereCond); + + if ($cnt = $this->raw_fetchRow($sql, 'cnt')) { + $sql = sprintf('DELETE FROM `%s` WHERE %s LIMIT %d', + $table, + $whereCond, + $cnt - 1 + ); + $this->raw_query($sql); + } + + return $this; } /** @@ -767,6 +1047,11 @@ protected function _debugException(Exception $e) throw $e; } + /** + * Debug write to file process + * + * @param string $str + */ protected function _debugWriteToFile($str) { if (!$this->_debugIoAdapter) { @@ -804,23 +1089,37 @@ public function quoteInto($text, $value, $type = null, $count = null) } /** - * Reset table describe cache data + * Retrieve ddl cache name * - * @param string $tableName - * @param string $schemaName OPTIONAL - * @return Varien_Db_Adapter_Pdo_Mysql + * @param string $tableName + * @param string $schemaName */ - public function resetDescribesCache($tableName = null, $schemaName = null) + protected function _getTableName($tableName, $schemaName = null) { - if ($tableName) { - $key = $tableName; - if ($schemaName) { - $key = $schemaName . '.' . $key; - } - unset($this->_describesCache[$key]); - } else { - $this->_describesCache = array(); + return ($schemaName ? $schemaName . '.' : '') . $tableName; + } + + /** + * Reset table DDL + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return Varien_Db_Adapter_Pdo_Mysql + */ + public function resetDdlCache($tableName = null, $schemaName = null) + { + if (is_null($tableName)) { + $this->_ddlCache = array(); } + else { + $cacheKey = $this->_getTableName($tableName, $schemaName); + + unset($this->_ddlCache[self::DDL_DESCRIBE][$cacheKey]); + unset($this->_ddlCache[self::DDL_CREATE][$cacheKey]); + unset($this->_ddlCache[self::DDL_INDEX][$cacheKey]); + unset($this->_ddlCache[self::DDL_FOREIGN_KEY][$cacheKey]); + } + return $this; } @@ -854,57 +1153,44 @@ public function resetDescribesCache($tableName = null, $schemaName = null) */ public function describeTable($tableName, $schemaName = null) { - $key = $tableName; - if ($schemaName) { - $key = $schemaName . '.' . $key; - } + $cacheKey = $this->_getTableName($tableName, $schemaName); - if (!isset($this->_describesCache[$key])) { - $this->_describesCache[$key] = parent::describeTable($tableName, $schemaName); + if (!isset($this->_ddlCache[self::DDL_DESCRIBE][$cacheKey])) { + $this->_ddlCache[self::DDL_DESCRIBE][$cacheKey] = parent::describeTable($tableName, $schemaName); } - return $this->_describesCache[$key]; + return $this->_ddlCache[self::DDL_DESCRIBE][$cacheKey]; } /** - * Retrieve Database limitation + * Truncate table * - * @return mixed + * @param string $tableName + * @param string $schemaName + * @return Varien_Db_Adapter_Pdo_Mysql */ - public function getLimitation($code) + public function truncate($tableName, $schemaName = null) { - switch ($code) { - case 'index': - $value = 64; - break; - case 'join': - $value = 61; - break; - case 'column': - $value = 1000; - break; - case 'columns_per_index': - $value = 16; - break; - default: - $value = null; - break; - } + $tableName = $this->_getTableName($tableName, $schemaName); + $sql = sprintf('TRUNCATE %s', $this->quoteIdentifier($tableName)); + $this->raw_query($sql); - return $value; + return $this; } /** - * Truncate table + * Change table storage engine * * @param string $tableName - * @return Varien_Db_Adapter_Pdo_Mysql + * @param string $engine + * @param string $type + * @return mixed */ - public function truncate($tableName) + public function changeTableEngine($tableName, $engine, $schemaName = null) { - $sql = 'TRUNCATE ' . $this->quoteIdentifier($tableName); - $this->raw_query($sql); - - return $this; + $sql = sprintf('ALTER TABLE %s ENGINE=%s', + $this->quoteIdentifier($this->_getTableName($tableName, $schemaName)), + $engine); + return $this->raw_query($sql); } } diff --git a/lib/Varien/Db/Select.php b/lib/Varien/Db/Select.php index d34ed56fed..321c3d0958 100644 --- a/lib/Varien/Db/Select.php +++ b/lib/Varien/Db/Select.php @@ -300,4 +300,20 @@ public function deleteFromSelect($table) { return $sql; } + /** + * Modify (hack) part of the structured information for the currect query + * + * @param string $part + * @param mixed $value + * @return Varien_Db_Select + */ + public function setPart($part, $value) + { + $part = strtolower($part); + if (!array_key_exists($part, $this->_parts)) { + throw new Zend_Db_Select_Exception("Invalid Select part '$part'"); + } + $this->_parts[$part] = $value; + return $this; + } } \ No newline at end of file diff --git a/lib/Varien/File/Uploader.php b/lib/Varien/File/Uploader.php index 9bbb1743de..d2e89d5fef 100644 --- a/lib/Varien/File/Uploader.php +++ b/lib/Varien/File/Uploader.php @@ -101,6 +101,16 @@ class Varien_File_Uploader */ protected $_enableFilesDispersion = false; + /** + * This variable is used both with $_enableFilesDispersion == true + * It helps to avoid problems after migrating from case-insensitive file system to case-insensitive + * (e.g. NTFS->ext or ext->NTFS) + * + * @var bool + * @access protected + */ + protected $_caseInsensitiveFilenames = true; + /** * @var string * @access protected @@ -159,6 +169,7 @@ public function save($destinationFolder, $newFileName=null) } if( $this->_enableFilesDispersion ) { + $fileName = $this->correctFileNameCase($fileName); $this->setAllowCreateFolders(true); $this->_dispretionPath = self::getDispretionPath($fileName); $destFile.= $this->_dispretionPath; @@ -198,6 +209,20 @@ static public function getCorrectFileName($fileName) return $fileName; } + /** + * Convert filename to lowercase in case of case-insensitive file names + * + * @param string + * @return string + */ + public function correctFileNameCase($fileName) + { + if ($this->_caseInsensitiveFilenames) { + return strtolower($fileName); + } + return $fileName; + } + static protected function _addDirSeparator($dir) { if (substr($dir,-1) != DIRECTORY_SEPARATOR) { @@ -239,7 +264,7 @@ public function getUploadedFileName() * * @param mixed $flag * @access public - * @return void + * @return Varien_File_Uploader */ public function setAllowCreateFolders($flag) { @@ -252,7 +277,7 @@ public function setAllowCreateFolders($flag) * * @param mixed $flag * @access public - * @return void + * @return Varien_File_Uploader */ public function setAllowRenameFiles($flag) { @@ -265,11 +290,24 @@ public function setAllowRenameFiles($flag) * * @param mixed $flag * @access public - * @return void + * @return Varien_File_Uploader */ public function setFilesDispersion($flag) { $this->_enableFilesDispersion = $flag; + return $this; + } + + /** + * Filenames Case-sensitivity setter + * + * @param mixed $flag + * @return Varien_File_Uploader + */ + public function setFilenamesCaseSensitivity($flag) + { + $this->_caseInsensitiveFilenames = $flag; + return $this; } public function setAllowedExtensions($extensions=array()) diff --git a/lib/Varien/Filter/Template.php b/lib/Varien/Filter/Template.php index a12915c2c9..925d3c124c 100644 --- a/lib/Varien/Filter/Template.php +++ b/lib/Varien/Filter/Template.php @@ -43,6 +43,7 @@ class Varien_Filter_Template implements Zend_Filter_Interface * Cunstruction logic regular expression */ const CONSTRUCTION_DEPEND_PATTERN = '/{{depend\s*(.*?)}}(.*?){{\\/depend\s*}}/si'; + const CONSTRUCTION_IF_PATTERN = '/{{if\s*(.*?)}}(.*?)({{else}}(.*?))?{{\\/if\s*}}/si'; /** * Assigned template variables @@ -100,20 +101,25 @@ public function getIncludeProcessor() */ public function filter($value) { - // Depend operand should be first - if(preg_match_all(self::CONSTRUCTION_DEPEND_PATTERN, $value, $constructions, PREG_SET_ORDER)) { - foreach($constructions as $index=>$construction) { - $replacedValue = ''; - $callback = array($this, 'dependDirective'); - if(!is_callable($callback)) { - continue; - } - try { - $replacedValue = call_user_func($callback, $construction); - } catch (Exception $e) { - throw $e; + // "depend" and "if" operands should be first + foreach (array( + self::CONSTRUCTION_DEPEND_PATTERN => 'dependDirective', + self::CONSTRUCTION_IF_PATTERN => 'ifDirective', + ) as $pattern => $directive) { + if (preg_match_all($pattern, $value, $constructions, PREG_SET_ORDER)) { + foreach($constructions as $index => $construction) { + $replacedValue = ''; + $callback = array($this, $directive); + if(!is_callable($callback)) { + continue; + } + try { + $replacedValue = call_user_func($callback, $construction); + } catch (Exception $e) { + throw $e; + } + $value = str_replace($construction[0], $replacedValue, $value); } - $value = str_replace($construction[0], $replacedValue, $value); } } @@ -178,6 +184,22 @@ public function dependDirective($construction) } } + public function ifDirective($construction) + { + if (count($this->_templateVars) == 0) { + return $construction[0]; + } + + if($this->_getVariable($construction[1], '') == '') { + if (isset($construction[3]) && isset($construction[4])) { + return $construction[4]; + } + return ''; + } else { + return $construction[2]; + } + } + /** * Return associative array of include construction. * @@ -247,4 +269,4 @@ protected function _getVariable($value, $default='{no_value_defined}') Varien_Profiler::stop("email_template_proccessing_variables"); return $result; } -} \ No newline at end of file +} diff --git a/lib/Varien/Http/Adapter/Curl.php b/lib/Varien/Http/Adapter/Curl.php index 928408cb0d..a03b8ab527 100644 --- a/lib/Varien/Http/Adapter/Curl.php +++ b/lib/Varien/Http/Adapter/Curl.php @@ -62,6 +62,7 @@ public function setConfig($config = array()) */ public function connect($host, $port = 80, $secure = false) { + //curl_setopt(); if (isset($this->_config['timeout'])) { curl_setopt($this->_getResource(), CURLOPT_TIMEOUT, $this->_config['timeout']); } @@ -160,4 +161,15 @@ public function getError() { return curl_error($this->_getResource()); } + + /** + * Get information regarding a specific transfer + * + * @param int $opt CURLINFO option + * @return mixed + */ + public function getInfo($opt = 0) + { + return curl_getinfo($this->_getResource(), $opt); + } } diff --git a/lib/Varien/Image.php b/lib/Varien/Image.php index b03ca1ec11..dce6fb26cd 100644 --- a/lib/Varien/Image.php +++ b/lib/Varien/Image.php @@ -242,6 +242,12 @@ public function setWatermarkHeigth($heigth) return $this; } + /** + * Retrieve image adapter object + * + * @param string $adapter + * @return Varien_Image_Adapter_Abstract + */ protected function _getAdapter($adapter=null) { if( !isset($this->_adapter) ) { @@ -250,4 +256,23 @@ protected function _getAdapter($adapter=null) return $this->_adapter; } + /** + * Retrieve original image width + * + * @return int|null + */ + public function getOriginalWidth() + { + return $this->_getAdapter()->getOriginalWidth(); + } + + /** + * Retrieve original image height + * + * @return int|null + */ + public function getOriginalHeight() + { + return $this->_getAdapter()->getOriginalHeight(); + } } diff --git a/lib/Varien/Image/Adapter/Abstract.php b/lib/Varien/Image/Adapter/Abstract.php index 58ad831f0d..8340a014ce 100644 --- a/lib/Varien/Image/Adapter/Abstract.php +++ b/lib/Varien/Image/Adapter/Abstract.php @@ -87,6 +87,28 @@ public function getMimeType() } } + /** + * Retrieve Original Image Width + * + * @return int|null + */ + public function getOriginalWidth() + { + $this->getMimeType(); + return $this->_imageSrcWidth; + } + + /** + * Retrieve Original Image Height + * + * @return int|null + */ + public function getOriginalHeight() + { + $this->getMimeType(); + return $this->_imageSrcHeight; + } + public function setWatermarkPosition($position) { $this->_watermarkPosition = $position; diff --git a/lib/Varien/Image/Adapter/Gd2.php b/lib/Varien/Image/Adapter/Gd2.php index addb5081af..217e421c50 100644 --- a/lib/Varien/Image/Adapter/Gd2.php +++ b/lib/Varien/Image/Adapter/Gd2.php @@ -290,10 +290,13 @@ public function watermark($watermarkImage, $positionX=0, $positionY=0, $watermar $this->_getFileAttributes(); $watermark = call_user_func($this->_getCallback('create', $watermarkFileType, 'Unsupported watermark image format.'), $watermarkImage); + $merged = false; + if( $this->getWatermarkWidth() && $this->getWatermarkHeigth() && ($this->getWatermarkPosition() != self::POSITION_STRETCH) ) { $newWatermark = imagecreatetruecolor($this->getWatermarkWidth(), $this->getWatermarkHeigth()); imagealphablending($newWatermark, false); $col = imagecolorallocate($newWatermark, 255, 255, 255); + imagecolortransparent($newWatermark, $col); imagefilledrectangle($newWatermark, 0, 0, $this->getWatermarkWidth(), $this->getWatermarkHeigth(), $col); imagealphablending($newWatermark, true); @@ -307,31 +310,37 @@ public function watermark($watermarkImage, $positionX=0, $positionY=0, $watermar $newWatermark = imagecreatetruecolor($this->_imageSrcWidth, $this->_imageSrcHeight); imagealphablending($newWatermark, false); $col = imagecolorallocate($newWatermark, 255, 255, 255); + imagecolortransparent($newWatermark, $col); imagefilledrectangle($newWatermark, 0, 0, $this->_imageSrcWidth, $this->_imageSrcHeight, $col); imagealphablending($newWatermark, true); - imagecopyresampled($newWatermark, $watermark, 0, 0, 0, 0, $this->_imageSrcWidth, $this->_imageSrcHeight, imagesx($watermark), imagesy($watermark)); $watermark = $newWatermark; } elseif( $this->getWatermarkPosition() == self::POSITION_TOP_RIGHT ) { $positionX = ($this->_imageSrcWidth - imagesx($watermark)); - imagecopymerge($this->_imageHandler, $watermark, $positionX, $positionY, 0, 0, imagesx($watermark), imagesy($watermark), $watermarkImageOpacity); + imagecopy($this->_imageHandler, $watermark, $positionX, $positionY, 0, 0, imagesx($watermark), imagesy($watermark)); + $merged = true; + } elseif( $this->getWatermarkPosition() == self::POSITION_TOP_LEFT ) { + imagecopy($this->_imageHandler, $watermark, $positionX, $positionY, 0, 0, imagesx($watermark), imagesy($watermark)); + $merged = true; } elseif( $this->getWatermarkPosition() == self::POSITION_BOTTOM_RIGHT ) { $positionX = ($this->_imageSrcWidth - imagesx($watermark)); $positionY = ($this->_imageSrcHeight - imagesy($watermark)); - imagecopymerge($this->_imageHandler, $watermark, $positionX, $positionY, 0, 0, imagesx($watermark), imagesy($watermark), $watermarkImageOpacity); + imagecopy($this->_imageHandler, $watermark, $positionX, $positionY, 0, 0, imagesx($watermark), imagesy($watermark)); + $merged = true; } elseif( $this->getWatermarkPosition() == self::POSITION_BOTTOM_LEFT ) { $positionY = ($this->_imageSrcHeight - imagesy($watermark)); - imagecopymerge($this->_imageHandler, $watermark, $positionX, $positionY, 0, 0, imagesx($watermark), imagesy($watermark), $watermarkImageOpacity); + imagecopy($this->_imageHandler, $watermark, $positionX, $positionY, 0, 0, imagesx($watermark), imagesy($watermark)); + $merged = true; } - if( $repeat === false ) { + if( $repeat === false && $merged === false ) { imagecopymerge($this->_imageHandler, $watermark, $positionX, $positionY, 0, 0, imagesx($watermark), imagesy($watermark), $watermarkImageOpacity); } else { $offsetX = $positionX; $offsetY = $positionY; while( $offsetY <= ($this->_imageSrcHeight+imagesy($watermark)) ) { while( $offsetX <= ($this->_imageSrcWidth+imagesx($watermark)) ) { - imagecopymerge($this->_imageHandler, $watermark, $offsetX, $offsetY, 0, 0, imagesx($watermark), imagesy($watermark), $watermarkImageOpacity); + imagecopy($this->_imageHandler, $watermark, $offsetX, $offsetY, 0, 0, imagesx($watermark), imagesy($watermark)); $offsetX += imagesx($watermark); } $offsetX = $positionX; diff --git a/lib/Zend/Amf/Server.php b/lib/Zend/Amf/Server.php index 1f47455cd1..a6bfdb55f6 100644 --- a/lib/Zend/Amf/Server.php +++ b/lib/Zend/Amf/Server.php @@ -129,7 +129,7 @@ protected function _dispatch($method, $params = null, $source = null) #require_once('Zend/Loader.php'); try { - Zend_Loader::loadClass($className, $classPath); + #Zend_Loader::loadClass($className, $classPath); } catch (Exception $e) { #require_once 'Zend/Amf/Server/Exception.php'; throw new Zend_Amf_Server_Exception('Class "' . $className . '" does not exist'); diff --git a/lib/Zend/Controller/Front.php b/lib/Zend/Controller/Front.php index d8770627b8..2e472e3a36 100644 --- a/lib/Zend/Controller/Front.php +++ b/lib/Zend/Controller/Front.php @@ -442,7 +442,7 @@ public function getDefaultModule() public function setRequest($request) { if (is_string($request)) { - Zend_Loader::loadClass($request); + #Zend_Loader::loadClass($request); $request = new $request(); } if (!$request instanceof Zend_Controller_Request_Abstract) { @@ -481,7 +481,7 @@ public function getRequest() public function setRouter($router) { if (is_string($router)) { - Zend_Loader::loadClass($router); + #Zend_Loader::loadClass($router); $router = new $router(); } @@ -610,7 +610,7 @@ public function getDispatcher() public function setResponse($response) { if (is_string($response)) { - Zend_Loader::loadClass($response); + #Zend_Loader::loadClass($response); $response = new $response(); } if (!$response instanceof Zend_Controller_Response_Abstract) { diff --git a/lib/Zend/Controller/Router/Rewrite.php b/lib/Zend/Controller/Router/Rewrite.php index 561b6fdc94..e11bf7b1e4 100644 --- a/lib/Zend/Controller/Router/Rewrite.php +++ b/lib/Zend/Controller/Router/Rewrite.php @@ -168,7 +168,7 @@ public function addConfig(Zend_Config $config, $section = null) protected function _getRouteFromConfig(Zend_Config $info) { $class = (isset($info->type)) ? $info->type : 'Zend_Controller_Router_Route'; - Zend_Loader::loadClass($class); + #Zend_Loader::loadClass($class); $route = call_user_func(array($class, 'getInstance'), $info); diff --git a/lib/Zend/Db.php b/lib/Zend/Db.php index 95aac9fdd4..c9d2d3f5d2 100644 --- a/lib/Zend/Db.php +++ b/lib/Zend/Db.php @@ -254,7 +254,7 @@ public static function factory($adapter, $config = array()) * Load the adapter class. This throws an exception * if the specified class cannot be loaded. */ - Zend_Loader::loadClass($adapterName); + #Zend_Loader::loadClass($adapterName); /* * Create an instance of the adapter class. diff --git a/lib/Zend/Db/Adapter/Abstract.php b/lib/Zend/Db/Adapter/Abstract.php index 0452e07277..4e3df1a3cc 100644 --- a/lib/Zend/Db/Adapter/Abstract.php +++ b/lib/Zend/Db/Adapter/Abstract.php @@ -375,7 +375,7 @@ public function setProfiler($profiler) } if ($profilerInstance === null) { - Zend_Loader::loadClass($profilerClass); + #Zend_Loader::loadClass($profilerClass); $profilerInstance = new $profilerClass(); } diff --git a/lib/Zend/Db/Adapter/Db2.php b/lib/Zend/Db/Adapter/Db2.php index e83494faac..be7f54712b 100644 --- a/lib/Zend/Db/Adapter/Db2.php +++ b/lib/Zend/Db/Adapter/Db2.php @@ -226,7 +226,7 @@ public function prepare($sql) { $this->_connect(); $stmtClass = $this->_defaultStmtClass; - Zend_Loader::loadClass($stmtClass); + #Zend_Loader::loadClass($stmtClass); $stmt = new $stmtClass($this, $sql); $stmt->setFetchMode($this->_fetchMode); return $stmt; diff --git a/lib/Zend/Db/Adapter/Mysqli.php b/lib/Zend/Db/Adapter/Mysqli.php index 1629ed42d0..cf8013544e 100644 --- a/lib/Zend/Db/Adapter/Mysqli.php +++ b/lib/Zend/Db/Adapter/Mysqli.php @@ -373,7 +373,7 @@ public function prepare($sql) $this->_stmt->close(); } $stmtClass = $this->_defaultStmtClass; - Zend_Loader::loadClass($stmtClass); + #Zend_Loader::loadClass($stmtClass); $stmt = new $stmtClass($this, $sql); if ($stmt === false) { return false; diff --git a/lib/Zend/Db/Adapter/Oracle.php b/lib/Zend/Db/Adapter/Oracle.php index 26fdb90b7d..e1b179b4c4 100644 --- a/lib/Zend/Db/Adapter/Oracle.php +++ b/lib/Zend/Db/Adapter/Oracle.php @@ -208,7 +208,7 @@ public function prepare($sql) { $this->_connect(); $stmtClass = $this->_defaultStmtClass; - Zend_Loader::loadClass($stmtClass); + #Zend_Loader::loadClass($stmtClass); $stmt = new $stmtClass($this, $sql); if ($stmt instanceof Zend_Db_Statement_Oracle) { $stmt->setLobAsString($this->getLobAsString()); diff --git a/lib/Zend/Db/Adapter/Pdo/Abstract.php b/lib/Zend/Db/Adapter/Pdo/Abstract.php index 303b68f73c..0e1efaf358 100644 --- a/lib/Zend/Db/Adapter/Pdo/Abstract.php +++ b/lib/Zend/Db/Adapter/Pdo/Abstract.php @@ -176,7 +176,7 @@ public function prepare($sql) { $this->_connect(); $stmtClass = $this->_defaultStmtClass; - Zend_Loader::loadClass($stmtClass); + #Zend_Loader::loadClass($stmtClass); $stmt = new $stmtClass($this, $sql); $stmt->setFetchMode($this->_fetchMode); return $stmt; diff --git a/lib/Zend/Db/Table/Abstract.php b/lib/Zend/Db/Table/Abstract.php index df08b161af..9b0622175b 100644 --- a/lib/Zend/Db/Table/Abstract.php +++ b/lib/Zend/Db/Table/Abstract.php @@ -1165,7 +1165,7 @@ public function fetchAll($where = null, $order = null, $count = null, $offset = 'stored' => true ); - Zend_Loader::loadClass($this->_rowsetClass); + #Zend_Loader::loadClass($this->_rowsetClass); return new $this->_rowsetClass($data); } @@ -1210,7 +1210,7 @@ public function fetchRow($where = null, $order = null) 'stored' => true ); - Zend_Loader::loadClass($this->_rowClass); + #Zend_Loader::loadClass($this->_rowClass); return new $this->_rowClass($data); } @@ -1269,7 +1269,7 @@ public function createRow(array $data = array(), $defaultSource = null) 'stored' => false ); - Zend_Loader::loadClass($this->_rowClass); + #Zend_Loader::loadClass($this->_rowClass); $row = new $this->_rowClass($config); $row->setFromArray($data); return $row; diff --git a/lib/Zend/Db/Table/Row/Abstract.php b/lib/Zend/Db/Table/Row/Abstract.php index c9fd5a8242..44dad6f731 100644 --- a/lib/Zend/Db/Table/Row/Abstract.php +++ b/lib/Zend/Db/Table/Row/Abstract.php @@ -525,7 +525,7 @@ protected function _doUpdate() $pkOld = $this->_getPrimaryKey(false); foreach ($depTables as $tableClass) { try { - Zend_Loader::loadClass($tableClass); + #Zend_Loader::loadClass($tableClass); } catch (Zend_Exception $e) { #require_once 'Zend/Db/Table/Row/Exception.php'; throw new Zend_Db_Table_Row_Exception($e->getMessage()); @@ -603,7 +603,7 @@ public function delete() $pk = $this->_getPrimaryKey(); foreach ($depTables as $tableClass) { try { - Zend_Loader::loadClass($tableClass); + #Zend_Loader::loadClass($tableClass); } catch (Zend_Exception $e) { #require_once 'Zend/Db/Table/Row/Exception.php'; throw new Zend_Db_Table_Row_Exception($e->getMessage()); @@ -856,7 +856,7 @@ public function findDependentRowset($dependentTable, $ruleKey = null, Zend_Db_Ta if (is_string($dependentTable)) { try {; - Zend_Loader::loadClass($dependentTable); + #Zend_Loader::loadClass($dependentTable); } catch (Zend_Exception $e) { #require_once 'Zend/Db/Table/Row/Exception.php'; throw new Zend_Db_Table_Row_Exception($e->getMessage()); @@ -909,7 +909,7 @@ public function findParentRow($parentTable, $ruleKey = null, Zend_Db_Table_Selec if (is_string($parentTable)) { try { - Zend_Loader::loadClass($parentTable); + #Zend_Loader::loadClass($parentTable); } catch (Zend_Exception $e) { #require_once 'Zend/Db/Table/Row/Exception.php'; throw new Zend_Db_Table_Row_Exception($e->getMessage()); @@ -963,7 +963,7 @@ public function findManyToManyRowset($matchTable, $intersectionTable, $callerRef if (is_string($intersectionTable)) { try { - Zend_Loader::loadClass($intersectionTable); + #Zend_Loader::loadClass($intersectionTable); } catch (Zend_Exception $e) { #require_once 'Zend/Db/Table/Row/Exception.php'; throw new Zend_Db_Table_Row_Exception($e->getMessage()); @@ -981,7 +981,7 @@ public function findManyToManyRowset($matchTable, $intersectionTable, $callerRef if (is_string($matchTable)) { try { - Zend_Loader::loadClass($matchTable); + #Zend_Loader::loadClass($matchTable); } catch (Zend_Exception $e) { #require_once 'Zend/Db/Table/Row/Exception.php'; throw new Zend_Db_Table_Row_Exception($e->getMessage()); @@ -1047,7 +1047,7 @@ public function findManyToManyRowset($matchTable, $intersectionTable, $callerRef $rowsetClass = $matchTable->getRowsetClass(); try { - Zend_Loader::loadClass($rowsetClass); + #Zend_Loader::loadClass($rowsetClass); } catch (Zend_Exception $e) { #require_once 'Zend/Db/Table/Row/Exception.php'; throw new Zend_Db_Table_Row_Exception($e->getMessage()); diff --git a/lib/Zend/Db/Table/Rowset/Abstract.php b/lib/Zend/Db/Table/Rowset/Abstract.php index ec5af22e84..dcd5f715b6 100644 --- a/lib/Zend/Db/Table/Rowset/Abstract.php +++ b/lib/Zend/Db/Table/Rowset/Abstract.php @@ -116,7 +116,7 @@ public function __construct(array $config) if (isset($config['rowClass'])) { $this->_rowClass = $config['rowClass']; } - Zend_Loader::loadClass($this->_rowClass); + #Zend_Loader::loadClass($this->_rowClass); if (isset($config['data'])) { $this->_data = $config['data']; } diff --git a/lib/Zend/Feed.php b/lib/Zend/Feed.php index f380a5d59a..cc0e5606f0 100644 --- a/lib/Zend/Feed.php +++ b/lib/Zend/Feed.php @@ -377,8 +377,8 @@ public static function importArray(array $data, $format = 'atom') * @see Zend_Loader */ #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($obj); - Zend_Loader::loadClass('Zend_Feed_Builder'); + #Zend_Loader::loadClass($obj); + #Zend_Loader::loadClass('Zend_Feed_Builder'); return new $obj(null, null, new Zend_Feed_Builder($data)); } @@ -397,7 +397,7 @@ public static function importBuilder(Zend_Feed_Builder_Interface $builder, $form * @see Zend_Loader */ #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($obj); + #Zend_Loader::loadClass($obj); return new $obj(null, null, $builder); } diff --git a/lib/Zend/Feed/Builder/Header.php b/lib/Zend/Feed/Builder/Header.php index a447b932e8..d9f9c0165d 100644 --- a/lib/Zend/Feed/Builder/Header.php +++ b/lib/Zend/Feed/Builder/Header.php @@ -175,7 +175,7 @@ public function setAuthor($author) */ public function setEmail($email) { - Zend_Loader::loadClass('Zend_Validate_EmailAddress'); + #Zend_Loader::loadClass('Zend_Validate_EmailAddress'); $validate = new Zend_Validate_EmailAddress(); if (!$validate->isValid($email)) { /** @@ -246,7 +246,7 @@ public function setLanguage($language) */ public function setWebmaster($webmaster) { - Zend_Loader::loadClass('Zend_Validate_EmailAddress'); + #Zend_Loader::loadClass('Zend_Validate_EmailAddress'); $validate = new Zend_Validate_EmailAddress(); if (!$validate->isValid($webmaster)) { /** @@ -269,7 +269,7 @@ public function setWebmaster($webmaster) */ public function setTtl($ttl) { - Zend_Loader::loadClass('Zend_Validate_Int'); + #Zend_Loader::loadClass('Zend_Validate_Int'); $validate = new Zend_Validate_Int(); if (!$validate->isValid($ttl)) { /** diff --git a/lib/Zend/Feed/Builder/Header/Itunes.php b/lib/Zend/Feed/Builder/Header/Itunes.php index a218c9e2a7..1c2c927bd2 100644 --- a/lib/Zend/Feed/Builder/Header/Itunes.php +++ b/lib/Zend/Feed/Builder/Header/Itunes.php @@ -112,7 +112,7 @@ public function setAuthor($author) public function setOwner($name = '', $email = '') { if (!empty($email)) { - Zend_Loader::loadClass('Zend_Validate_EmailAddress'); + #Zend_Loader::loadClass('Zend_Validate_EmailAddress'); $validate = new Zend_Validate_EmailAddress(); if (!$validate->isValid($email)) { /** diff --git a/lib/Zend/File/Transfer.php b/lib/Zend/File/Transfer.php index b0503daef4..61430497f6 100644 --- a/lib/Zend/File/Transfer.php +++ b/lib/Zend/File/Transfer.php @@ -45,7 +45,7 @@ public function __construct($protocol = null) break; } - Zend_Loader::loadClass($adapter); + #Zend_Loader::loadClass($adapter); $this->_adapter = new $adapter(); if (!$this->_adapter instanceof Zend_File_Transfer_Adapter) { #require_once 'Zend/File/Transfer/Exception.php'; diff --git a/lib/Zend/Filter.php b/lib/Zend/Filter.php index 009ff9c09f..dd27331739 100644 --- a/lib/Zend/Filter.php +++ b/lib/Zend/Filter.php @@ -95,7 +95,7 @@ public static function get($value, $classBaseName, array $args = array(), $names foreach ($namespaces as $namespace) { $className = $namespace . '_' . ucfirst($classBaseName); try { - Zend_Loader::loadClass($className); + #Zend_Loader::loadClass($className); } catch (Zend_Exception $ze) { continue; } diff --git a/lib/Zend/Form.php b/lib/Zend/Form.php index b3ea29ae6d..c8575436a3 100644 --- a/lib/Zend/Form.php +++ b/lib/Zend/Form.php @@ -1663,7 +1663,7 @@ public function addDisplayGroup(array $elements, $name, $options = null) if (!class_exists($class)) { #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($class); + #Zend_Loader::loadClass($class); } $this->_displayGroups[$name] = new $class( $name, diff --git a/lib/Zend/Gdata/App.php b/lib/Zend/Gdata/App.php index 4934f910d7..7baa372e8f 100644 --- a/lib/Zend/Gdata/App.php +++ b/lib/Zend/Gdata/App.php @@ -935,7 +935,7 @@ public function __call($method, $args) $foundClassName = null; foreach ($this->_registeredPackages as $name) { try { - @Zend_Loader::loadClass("${name}_${class}"); + @#Zend_Loader::loadClass("${name}_${class}"); $foundClassName = "${name}_${class}"; break; } catch (Zend_Exception $e) { diff --git a/lib/Zend/Gdata/Gapps.php b/lib/Zend/Gdata/Gapps.php index b0b4223b73..1b35ce9692 100644 --- a/lib/Zend/Gdata/Gapps.php +++ b/lib/Zend/Gdata/Gapps.php @@ -616,7 +616,7 @@ public function __call($method, $args) { foreach ($this->_registeredPackages as $name) { try { #require_once 'Zend/Loader.php'; - @Zend_Loader::loadClass("${name}_${class}"); + @#Zend_Loader::loadClass("${name}_${class}"); $foundClassName = "${name}_${class}"; break; } catch (Zend_Exception $e) { diff --git a/lib/Zend/Http/Client.php b/lib/Zend/Http/Client.php index 1867e740f0..6df121861c 100644 --- a/lib/Zend/Http/Client.php +++ b/lib/Zend/Http/Client.php @@ -776,7 +776,7 @@ public function setAdapter($adapter) { if (is_string($adapter)) { try { - Zend_Loader::loadClass($adapter); + #Zend_Loader::loadClass($adapter); } catch (Zend_Exception $e) { /** @see Zend_Http_Client_Exception */ #require_once 'Zend/Http/Client/Exception.php'; diff --git a/lib/Zend/InfoCard/Xml/Element.php b/lib/Zend/InfoCard/Xml/Element.php index 9d237aa268..17a094b490 100644 --- a/lib/Zend/InfoCard/Xml/Element.php +++ b/lib/Zend/InfoCard/Xml/Element.php @@ -86,7 +86,7 @@ static public function convertToDOM(Zend_InfoCard_Xml_Element $e) static public function convertToObject(DOMElement $e, $classname) { - Zend_Loader::loadClass($classname); + #Zend_Loader::loadClass($classname); $reflection = new ReflectionClass($classname); diff --git a/lib/Zend/InfoCard/Xml/Security/Transform.php b/lib/Zend/InfoCard/Xml/Security/Transform.php index 194eef9ee7..a0d7173526 100644 --- a/lib/Zend/InfoCard/Xml/Security/Transform.php +++ b/lib/Zend/InfoCard/Xml/Security/Transform.php @@ -98,7 +98,7 @@ public function getTransformList() public function applyTransforms($strXmlDocument) { foreach($this->_transformList as $transform) { - Zend_Loader::loadClass($transform['class']); + #Zend_Loader::loadClass($transform['class']); $transformer = new $transform['class']; diff --git a/lib/Zend/Layout.php b/lib/Zend/Layout.php index a5c2e0bccb..ce45d692b0 100644 --- a/lib/Zend/Layout.php +++ b/lib/Zend/Layout.php @@ -265,7 +265,7 @@ protected function _initPlugin() $front = Zend_Controller_Front::getInstance(); if (!$front->hasPlugin($pluginClass)) { #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($pluginClass); + #Zend_Loader::loadClass($pluginClass); $front->registerPlugin( // register to run last | BUT before the ErrorHandler (if its available) new $pluginClass($this), @@ -285,7 +285,7 @@ protected function _initHelper() #require_once 'Zend/Controller/Action/HelperBroker.php'; if (!Zend_Controller_Action_HelperBroker::hasHelper('layout')) { #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($helperClass); + #Zend_Loader::loadClass($helperClass); Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-90, new $helperClass($this)); } } diff --git a/lib/Zend/Loader.php b/lib/Zend/Loader.php index e9889b1b42..b45d70d1bd 100644 --- a/lib/Zend/Loader.php +++ b/lib/Zend/Loader.php @@ -61,7 +61,11 @@ public static function loadClass($class, $dirs = null) } // autodiscover the path from the class name - $file = str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php'; + if (defined('COMPILER_INCLUDE_PATH')) { + $file = $class . '.php'; + } else { + $file = str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php'; + } if (!empty($dirs)) { // use the autodiscovered path $dirPath = dirname($file); diff --git a/lib/Zend/Locale/Math.php b/lib/Zend/Locale/Math.php index 5403bf0652..463643e3be 100644 --- a/lib/Zend/Locale/Math.php +++ b/lib/Zend/Locale/Math.php @@ -150,5 +150,9 @@ public static function localize($value) if ((defined('TESTS_ZEND_LOCALE_BCMATH_ENABLED') && !TESTS_ZEND_LOCALE_BCMATH_ENABLED) || !extension_loaded('bcmath')) { - require_once 'Zend/Locale/Math/PhpMath.php'; + if (defined('COMPILER_INCLUDE_PATH')) { + require_once 'Zend_Locale_Math_PhpMath.php'; + } else { + require_once 'Zend/Locale/Math/PhpMath.php'; + } } diff --git a/lib/Zend/Mail/Transport/Smtp.php b/lib/Zend/Mail/Transport/Smtp.php index 559976c348..4935fef1c5 100644 --- a/lib/Zend/Mail/Transport/Smtp.php +++ b/lib/Zend/Mail/Transport/Smtp.php @@ -192,7 +192,7 @@ public function _sendMail() if ($this->_auth) { $connectionClass .= '_Auth_' . ucwords($this->_auth); } - Zend_Loader::loadClass($connectionClass); + #Zend_Loader::loadClass($connectionClass); $this->setConnection(new $connectionClass($this->_host, $this->_port, $this->_config)); $this->_connection->connect(); $this->_connection->helo($this->_name); diff --git a/lib/Zend/Memory.php b/lib/Zend/Memory.php index 049abef154..ddbcec11cf 100644 --- a/lib/Zend/Memory.php +++ b/lib/Zend/Memory.php @@ -61,7 +61,7 @@ public static function factory($backend, $backendOptions = array()) $backendClass = 'Zend_Cache_Backend_' . $backend; - // For perfs reasons, we do not use the Zend_Loader::loadClass() method + // For perfs reasons, we do not use the #Zend_Loader::loadClass() method // (security controls are explicit) #require_once str_replace('_', DIRECTORY_SEPARATOR, $backendClass) . '.php'; diff --git a/lib/Zend/Registry.php b/lib/Zend/Registry.php index 296e7fd493..73f7325ed5 100644 --- a/lib/Zend/Registry.php +++ b/lib/Zend/Registry.php @@ -110,7 +110,7 @@ public static function setClassName($registryClassName = 'Zend_Registry') * @see Zend_Loader */ #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($registryClassName); + #Zend_Loader::loadClass($registryClassName); self::$_registryClassName = $registryClassName; } diff --git a/lib/Zend/Service/Nirvanix.php b/lib/Zend/Service/Nirvanix.php index ba781faf87..f3e19529b8 100644 --- a/lib/Zend/Service/Nirvanix.php +++ b/lib/Zend/Service/Nirvanix.php @@ -91,7 +91,7 @@ public function getService($namespace, $options = array()) $options['namespace'] = ucfirst($namespace); $options = array_merge($this->_options, $options); - Zend_Loader::loadClass($class); + #Zend_Loader::loadClass($class); return new $class($options); } diff --git a/lib/Zend/Service/StrikeIron.php b/lib/Zend/Service/StrikeIron.php index 32af44757d..fda8eb0617 100644 --- a/lib/Zend/Service/StrikeIron.php +++ b/lib/Zend/Service/StrikeIron.php @@ -74,7 +74,7 @@ public function getService($options = array()) } try { - @Zend_Loader::loadClass($class); + @#Zend_Loader::loadClass($class); if (!class_exists($class, false)) { throw new Exception('Class file not found'); } diff --git a/lib/Zend/Session.php b/lib/Zend/Session.php index f42041b0f7..336e4155b3 100644 --- a/lib/Zend/Session.php +++ b/lib/Zend/Session.php @@ -729,7 +729,7 @@ private static function _processValidators() } foreach ($_SESSION['__ZF']['VALID'] as $validator_name => $valid_data) { - Zend_Loader::loadClass($validator_name); + #Zend_Loader::loadClass($validator_name); $validator = new $validator_name; if ($validator->validate() === false) { /** @see Zend_Session_Exception */ diff --git a/lib/Zend/TimeSync.php b/lib/Zend/TimeSync.php index 3ce7c9da80..f44f1985c6 100644 --- a/lib/Zend/TimeSync.php +++ b/lib/Zend/TimeSync.php @@ -299,7 +299,7 @@ protected function _addServer($target, $alias) $className = 'Zend_TimeSync_' . $protocol; - Zend_Loader::loadClass($className); + #Zend_Loader::loadClass($className); $timeServerObj = new $className($adress, $port); $this->_timeservers[$alias] = $timeServerObj; diff --git a/lib/Zend/Translate.php b/lib/Zend/Translate.php index d2f326749b..55f8768f38 100644 --- a/lib/Zend/Translate.php +++ b/lib/Zend/Translate.php @@ -86,7 +86,7 @@ public function setAdapter($adapter, $data, $locale = null, array $options = arr $adapter = 'Zend_Translate_Adapter_' . ucfirst($adapter); } - Zend_Loader::loadClass($adapter); + #Zend_Loader::loadClass($adapter); if (self::$_cache !== null) { call_user_func(array($adapter, 'setCache'), self::$_cache); } diff --git a/lib/Zend/Uri.php b/lib/Zend/Uri.php index c4c8333f7c..61c5591bd4 100644 --- a/lib/Zend/Uri.php +++ b/lib/Zend/Uri.php @@ -128,7 +128,7 @@ public static function factory($uri = 'http') break; } - Zend_Loader::loadClass($className); + #Zend_Loader::loadClass($className); $schemeHandler = new $className($scheme, $schemeSpecific); return $schemeHandler; diff --git a/lib/Zend/Validate/Hostname.php b/lib/Zend/Validate/Hostname.php index 630c0213f7..9d584e7472 100644 --- a/lib/Zend/Validate/Hostname.php +++ b/lib/Zend/Validate/Hostname.php @@ -325,7 +325,7 @@ public function isValid($value) // Load additional characters $className = 'Zend_Validate_Hostname_' . ucfirst($this->_tld); - Zend_Loader::loadClass($className); + #Zend_Loader::loadClass($className); $labelChars .= call_user_func(array($className, 'getCharacters')); $utf8 = true; } diff --git a/lib/Zend/View/Helper/Placeholder/Registry.php b/lib/Zend/View/Helper/Placeholder/Registry.php index 8eb3a9ccd8..497d5fe463 100644 --- a/lib/Zend/View/Helper/Placeholder/Registry.php +++ b/lib/Zend/View/Helper/Placeholder/Registry.php @@ -159,7 +159,7 @@ public function deleteContainer($key) public function setContainerClass($name) { #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($name); + #Zend_Loader::loadClass($name); $reflection = new ReflectionClass($name); if (!$reflection->isSubclassOf(new ReflectionClass('Zend_View_Helper_Placeholder_Container_Abstract'))) { diff --git a/lib/Zend/Wildfire/Channel/HttpHeaders.php b/lib/Zend/Wildfire/Channel/HttpHeaders.php index 2f1c8ccf95..7c4b01316f 100644 --- a/lib/Zend/Wildfire/Channel/HttpHeaders.php +++ b/lib/Zend/Wildfire/Channel/HttpHeaders.php @@ -90,7 +90,7 @@ public static function init($class = null) #require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Third argument is not a class string'); } - Zend_Loader::loadClass($class); + #Zend_Loader::loadClass($class); self::$_instance = new $class(); if (!self::$_instance instanceof Zend_Wildfire_Channel_HttpHeaders) { self::$_instance = null; diff --git a/lib/Zend/Wildfire/Plugin/FirePhp.php b/lib/Zend/Wildfire/Plugin/FirePhp.php index a418715c6e..086de24dd2 100644 --- a/lib/Zend/Wildfire/Plugin/FirePhp.php +++ b/lib/Zend/Wildfire/Plugin/FirePhp.php @@ -179,7 +179,7 @@ public static function init($class = null) #require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Third argument is not a class string'); } - Zend_Loader::loadClass($class); + #Zend_Loader::loadClass($class); self::$_instance = new $class(); if (!self::$_instance instanceof Zend_Wildfire_Plugin_FirePhp) { self::$_instance = null; diff --git a/report/index.php b/report/index.php index b4077eedca..0427652219 100644 --- a/report/index.php +++ b/report/index.php @@ -135,6 +135,11 @@ $reportData = unserialize(file_get_contents($reportFile)); } +$design = false; +if (file_exists('design.xml')) { + $design = simplexml_load_file('design.xml'); +} + $store = 'default'; if (isset($_GET['s'])) { $skinPath = realpath('skin/'); @@ -145,8 +150,8 @@ } } -include_once ('skin/' . $store . '/index.phtml'); +include_once ('skin/' . $store . '/' . ($design ? $design->template : 'index.phtml')); function checkEmail($email) { return eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email); -} \ No newline at end of file +} diff --git a/skin/adminhtml/default/default/boxes.css b/skin/adminhtml/default/default/boxes.css index 42a4ba80ae..50114d3e18 100644 --- a/skin/adminhtml/default/default/boxes.css +++ b/skin/adminhtml/default/default/boxes.css @@ -82,6 +82,7 @@ font-weight:bold; text-align:center; opacity:0.80; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; /* IE8 */ z-index:500; } #loading-mask .loader { @@ -110,6 +111,7 @@ z-index:9999; background-color:#efefef; opacity:.2; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)"; /* IE8 */ } #message-popup-window-mask .flash-window { @@ -179,7 +181,7 @@ table.actions td { vertical-align:top; } /* Grid - Mass Action */ .massaction { width:100%; height:26px; border:1px solid #d1cfcf; border-bottom:none; background:url(images/massaction_bg.gif) repeat-x 0 100% #ebebeb; font-size:.9em; } .massaction td { width:50%; border-top:1px solid #fff; padding:1px 8px; vertical-align:middle; } -.massaction .entry-edit fieldset .select { width:120px; display:inline; } +.massaction .entry-edit fieldset .select { width:auto; /*width:120px;*/ display:inline; } .massaction .entry-edit fieldset { margin:0; padding:0; background:none; border:none; } .massaction .entry-edit fieldset .field-row { display:inline; } .massaction .entry-edit .field-row label { float:none; width:auto; margin-left:13px; } @@ -299,10 +301,19 @@ a.error span, .validation-advice { clear:both; min-height:15px; margin:3px 0 0 9px; background:url(images/validation_advice_bg.gif) no-repeat 2px 1px; padding-left:16px; font-size:.95em; font-weight:bold; line-height:1.25em; } input.validation-failed, textarea.validation-failed { background:#fef0ed; border:1px dashed #d6340e; } +/* Noscript Notice */ +.noscript { border:1px solid #000; border-width:0 0 1px; background:#ffff90; font-size:12px; line-height:1.25; text-align:center; color:#2f2f2f; } +.noscript .noscript-inner { width:900px; margin:0 auto; padding:12px 0 12px; background:url(images/i_notice.gif) 20px 50% no-repeat; } +.noscript p { margin:0; } + +/* For Demo store only */ +.demo-notice { margin:0; background:#d75f07; padding:5px 10px 6px 10px; color:#fff; line-height:1em; text-align:center; } + /* FORMS *******************************************************************************/ select.countries option { background-repeat:no-repeat; } +.entry-edit .fieldset .tree li, .entry-edit .tree li { margin:0; } @@ -413,8 +424,8 @@ button.save span { background-image:url(images/save_btn_icon.gif); } button.disabled, button.disabled:hover, -button.disabled:active { border-color:#777 #505050 #505050 #777; background:#919191 url(images/btn_bg-disabled.gif) 0 0 repeat-x; color:#fff; cursor:default; opacity:.8; } -button.add.disabled span { background-image:url(images/add_btn_icon-disabled.gif);} +button.disabled:active { border-color:#777 #505050 #505050 #777; background:#919191 url(images/btn_bg-disabled.gif) 0 0 repeat-x; color:#fff; cursor:default; opacity:.8; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)"; } +button.add.disabled span { background-image:url(images/add_btn_icon-disabled.gif); } button.icon-btn { width:32px!important; } button.icon-btn span { text-indent:-999em; display:block; width:16px; padding:0; overflow:hidden; } @@ -581,7 +592,7 @@ div.autocomplete ul li { padding:.5em .7em; min-height:32px; cursor:pointer; tex .left-col-block { width:200px; } /* Floating Content Header */ /* Used to make action buttons always within reach */ -.content-header-floating { display:none; position:fixed; left:0; top:0; width:100%; border-bottom:solid 1px #988753; z-index:100; background:#fdfaa4; opacity:.85; } +.content-header-floating { display:none; position:fixed; left:0; top:0; width:100%; border-bottom:solid 1px #988753; z-index:100; background:#fdfaa4; opacity:.85; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)" } .content-header-floating .content-header { padding:6px 8px 4px 8px; margin-bottom:0; border:0; } .content-header-floating td { padding-right:20px; } .content-header-floating button { margin-top:3px; } @@ -633,7 +644,7 @@ div.autocomplete ul li { padding:.5em .7em; min-height:32px; cursor:pointer; tex .head-order-date { background-image:url(images/fam_calendar.gif); } .head-customer-sales-statistics { background-image:url(images/fam_money.gif); } .head-notification { background-image:url(images/fam_folder_table.gif); } - +.head-compilation {background-image:url(images/fam_package_go.gif); } @@ -926,7 +937,7 @@ ul.item-options li { padding-left:.7em; } /* Downloadable Product */ .files { width:195px; } .files input.input-text { float:left; width:134px !important; } -.files-wide { width:355px;} +.files-wide { width:355px; } .files-wide input.input-text { float:left; width:294px !important; } .files label, .files-wide label { float:left; width:55px; } @@ -1022,7 +1033,8 @@ ul.config-tabs a.last span { background-image:none; } .attribute-change-checkbox label{ margin-left:5px; float:none !important; } - +/* PopUp Calendar */ +.calendar { z-index:105; } /** Order view **/ .order-history { width:70%; margin-right:27px; } @@ -1172,7 +1184,7 @@ ul.tabs-horiz:after, dl.accordion dt:after, .field-100:after, .entry-edit fieldset li:after, -.entry-edit fieldset span:after, +.entry-edit fieldset span.field-row:after, .content:after, #topnav:after, .main:after, diff --git a/skin/adminhtml/default/default/images/i_notice.gif b/skin/adminhtml/default/default/images/i_notice.gif new file mode 100644 index 0000000000000000000000000000000000000000..17733eff3fa73171ffbce8254fa0b368d940b74d GIT binary patch literal 802 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 literal 3584 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 literal 3584 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

    gv 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 RCT5{SG*q;dOBJ8J{y$f-QPuze literal 0 HcmV?d00001 diff --git a/skin/frontend/default/default/images/cookies/ie6-1.gif b/skin/frontend/default/default/images/cookies/ie6-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..3d674caa215b0470d61a6785ff2f7ebbe9e88789 GIT binary patch literal 19710 zcmWh!c|6qL_kPc6FvE;}H`d155VAMcY%vPSQezh?Nm5iZhOsl2BwIsB8X9Z%#!|`F zh=iyqOA0lWPpLHDU%&gu`SZSB_c`}@-RGS1+{4a}re;CbpcxeN|gX^g#t zUBy&|n~Uq}STa;3p825Z`Nv-#p%uE#d+O?{?Jdp8DOaFwoY3%)nW?9`!NsR4XP1^< z6;}>yeSEL0g=_Dc6W5Q|woi(ub*P(MhC+`LoZ|gY_|-7V`Ud)Te(ao0x*KykRNg3N zb@^p!&%Cf&bl1c@F@c#zrA|z}iHV9a^2l}bD^yVRnqJyO8ZM12a&c9>_LdQagI9F5 zMG%S;t_0^XXFK&I>HZ?VcN)kewSBvYHuIF@gO>So8-dbH>nSC*;<3QW{xmh!` zh}4cLE-a9V87*rVIT%%8UeAu?9^?5~Cc0O!VFi3z(1SL1GrWbYD29!u>hNoUj?wQ@r z$)YJL$n$t#jGQw^o-Br3sabu$cE4**!zxwRJm&F}VVFWV6rqcwbBP{D;;77H5yb|0 z{W~?aJN(_}vn$Ehl8mBijokNqSxZh8oZ_iHVU2jG-)!pHrHS!AWWp+`kWKF6;;*m+ z8fWnhTgi79&i1am4Q(+emYj;`;}eY36Z<5N?n!9I2l%GOL>0$YO_)|Jor)+JnO#b* znZ5Vo>p|+XhK3E3{3Wlf)zG-D)RI*r!+7S%l6q7-5{XpOjR-hXrEqd0J}xvSYsvCR zri6J#ZO_ixb1_NTOm)kck@Y=wzrB&MzS@T29M(im!-#~-L~Ye*^0hvDYfC87-^e~5 zr%x|!=P^cj?L#}v_6f^t?FyO|rZv2;Usk)j`d7aE3<}DzY+W6hTJ0k9A z6_H|#1Hvoz_DAF^{WaAvpI}e2@#Z?i{sM!rRVSW zEUhiF3d>@Kw&LfuLJODTTbJy^iTwh5 z+UmDzdM({!R^KnWU28Y;DTJC&C|F-*Hs0-dvZM?ATmR1m0R$f~p6Al3?s+L@QL+<* zK_o$Wq)J>Q?)-b341ohvEz|o~2F;WXrRIwCK3#yR$tdm-r9_S;3n z&<4G}uJi9g@^qf#>$@+=PgLf&*!1`Ow>jT(Zpr#Z?P!5nAOEI;$G~2q+Uj&~%!#=E z$)CKHr*D5@qWXDnfFOSCy*0fnlzcyY*sL>p=BdgUiQh4pqP$(Qflcv9VJw8 z$DGnsdH)P=9^)58*~EcOUnMiF{OhAHFu z-R8MDMycfxHT~q3z?$^?!ec#yLegqEXvem1-Pj?_kHLN0*W9)rZqJ2Y-t3@kruH(Z zI0dw;)t-XbGkmM>j3Xk@vSlnQfgW_Je{KYV?PB>UwXXj8o6DEU0#Gtk)$J?7U7anb ziUmuASEFWFHK%6)T0fIxR9K9SiieJ7cbAd?69UED}UT<(~t_sg^-xyR3z=NghgHo+z zhEQs;PemgRBIwh^^K3@O#Gq#im8NXaJBj7!nbgXB zi+(LgE|vv%dIt!fHMD`c#X>}x)oGi*F|#E(5YsS0ADSx1o2F@__$ z)CI1I|6FFk`XEukp_!PzQ;NxW$?yhjS@WQT*HdEt!av(E-6KkQGIqsX3%%~=0g#;VL3^Bm6ADKI6Ih- zhl}Lv=rS>o-oX^XmolIgbJCm@Yo#hQk^7m+f|(>RGLGS^r1)$wib3|W0d(}F8U@S} zRWes%Apt*0&-IcA<;>Ew`@e$i{x%V0EOkWbR}+7*IY^5Ho{}XCq`3b zr?{DiHdK_Zmp+Lerl*?Hs!^7#bI3yS6R3ZPf*+A=m5YI5NZ)%En@aQr?n|Chk}Ay( zW9EM>h8#zbr5|D+W8AP=LA3;^6cG-yj84Y@5{VMA6k}fiIp${b&}IYR^Xh}1=XX$K ze`HZ&h#ZOtmU+I(`>WN(=$vT&py1rDfGnr4YpjBTG;1BSYGjQ_5K#szFi|J}-&faUI!PFR{JJapQ1DM!+Gpq$YhSELe2CfBs20P2|Sthz!&dcC6SI?pkUuZ_>N={P(;F zn`dY1nzWd-k40ckL zT@57OOc=U!Ff!e&1q-1OWUjn?-Gz_g_TD`+oV*#G>+K)&NI%*j@uO?Bzd#3@)}^U4 z%2JU}ekE95d#2@4CEkz$7niJb6!R;DxLNOqi2ctF-Ssu+!04cyZh}FM)`1nd{dt0l zzXX=lN}$rvqNBFq2lp>;H}w$7;PV;OzM{U+iCJ5PgJcjMX_GHt6bwH++6wDjVm}Xi zS7uq-WE?k`lDf`r?vJDzn6d=Wr^NfDW>S>i-1FC2twF_c$^TXG%#eMRUDAiX$Q|ZV zOyXzI`^P+|PB6YrGUtOLINKlY0`It8Sm9H20VgUS1Jx|OA!sI}W6_EQ`!EcIaj`=O z=!!I?!n5F?uy%wY>1_n*hQJfqVhf#NgP*Xy zm3(9cH$+0}VAbJp_AvOtTJ()~&~Ocb>pWNz%fb(B6~KdC#|oUl3e3bpe@bYkygHkD z92-G|nj|J>J%#*NA}f-D9O8knWav@yWhr86`O~maj$k`MSdEAZ!Go_5gg zwE_xkl_a{;72Zi2*@;PqsIg$at4?Mlfgn6M!qm|Q4-PU-I$kSqQYAeUkGf%`J$+tV z77%9QwI{1lNoXgEseou0JRI%B4|GzzDHdqM1>*n#+J*?n(~`D(QlAB45-r@(fiq-` zXQ`7T3v`7JIg5q{&_U&i1ERr!Q*a#*G2xC37rZ0v^ zkg`nBa2qc4+`fO?iZLRg;Y84}*ew6j1Nwx+eZC;kABRI!eGMXg4`fJPY!SIg6v#w_ z9LQ928Mj+4aX2jU%2C-{cadXsQBFJLTM9Vg!ol6r{CbS(FDHG}NPd2>ne_XE^#vgM z3&OQwRg|Qu{wrSx^vamTQ-W@4k(j*2d0b8t^_&jwTPF@ zihckcqDWJJe9t}KDiX{>ssONyq`ZuqdAWz(bZSt6bkX#~AWdRPx&Q)Yv|rkAzp|LB zL7aT6jjGx=`ECQ%;TA2M+MDJtZjJ|OSE$(^QdOk>QnNKwZwXd^3DVIo!Wcu8P zt7zB^i*aYfbX9cqJ;hJFSMvX+blOSF1f=OVRBRihyg8RkJ$&Q$9l(n#ion8EST{b% z2%Nkus}muh!4+!bln;C?Z^j;^8dm5W#XY`Na4u7@@vF+fJNbtN@&h1+c924oxV_wW z)vMiRru-o@8{5+KTZU?~I{L$8ie zRKEt=m4=M6hH(}$y{94X_rC0`f3e}X*}W1u@Hkh<0zgEQVOPmOTPEXJ6bcJ~fh&y- zWsQwJjm*Wy=HHDhx%;i=_uKvMcV4;QRd&Cp=YH>RC>k$p!MW#!g%i=Bqm6lIi$c%T zQFrQ@Q@@!Uxu)ml=RV?^=B_l&mo?4#HQ^nb7Uh~gjzUfmp!ST!)ho>#e$DGwnlm3Z ze=JK}l@pjBYg+oou zzD3NU1>*`@Ahk%8x5)LjD7Oq zit}$XNoq4qN?gMOmjRFk3+&6Qy@+ibjY2ID+8l^^4rtJNB-LcJohaYo_NV=rPREhW zcCY9TpWgQMhK^(79bV-fp5q-S{X0W?+ey)#QN5jhuARqT!^Y`|IE#nz{tpw99wz#y zhHrMpyncAizccyI!@y{&6;TAdDMYYf+PQ)R{o19YQ4$QOuSIw9>vn2VM{#*~S#Nj6 z>+Y&Q-8ZtkPYL%hvb&2cx*Ql#Vr+Zu>mHBSaC>Zzdvs6RpZ2!boewQ~nm4=Kd%KUn zhFB2+WxTLkW0(Ew#PkT%IJUdrwRgP~rOE9%D&Og~$?E5qclTs>)c@&N_|v^)(ewIs zM@dp=r+iOmHfr{M57WPwa=-gz_CSDeugmKm5&wb8*ZsXZ1HXhj=E!Q#RR{(e10E(lI#P}zvf!sG;8=E# zCI_MefX4wa5g1~Wqp)c30vZ(0gko4v`2*QK1Ldf37W{PVXfSVNYO`;F3=1Z}h~)kh zw{FY6fg|OjrEVo1_j@zRu$%q^nAnk`*UyZQFicLzFCu`Zi*^bR9Nio1b$vYK+IQTI z{WMzEf1+E04M^hwS}(E<04EdLO5H#u{v)ScL0ABQ@Pr?+ATmrOg!dT122doBPG7fX zEGUo!&Sb;A@WQSYgHI+#q~t-U^2x>C_Fs76ciizuWLS9SGZUHq^++&=jCvfy6e$;N zW8-|Q+e_SDY znE>X5f|yz8Kl|CP8O`r0hnFy>>!N_KfUDj5%)vl8aBUM90&p*dg=&J(TNsn>imZmKZ~ukrpuwLj1+pu< zUC>}g1!{}|U1K0!kHElh0L|QY9`tr(ECW0MiMcv`vmEty4>aHhSOG9JZ^nZIcvlKY z)0fqW)7_P;!~L(l-NyH$mJUpIk5~a7JdipWNM~Z-yF#TIP$U|h84JQPgwR|ez7<i!v z9Uj!k6}8|BSr5PiV?qBUb{k=1j)}D5z}5(`Gjzl|9;lhI>WoDoVKHp32Y1{BEz-uD9q55vW`Uh2;aJ{~i}iNV zr5I;1rZ)-;9;@ghT{*y|FUscjS} zPVe0s8TO05awrc*Wbq;M%dnqH3k4Gcn!Hb%mCH`c5Hbhi%YjP(+g7Xz3&y9~t0Tv= z7aNzCV@RKg_*F7{ERjF5>%RS9>4p2*@e|B#PwS-63T%CUWkP*a6V8Eb*qRh{I~V(7jX?~IT`b1 zGV#s2%-Q*YlZ#LH7OuE~e2F4D=(mSSjdo|(e*xQfCU<5(?+jcWN361rJ?i#9GmK)r zH25s^h|g{_=l%Y@*&cxcc)@=hzKjE;Sr-5d!2>#?J-^5hJ_)44hL3aq-QmA345T`5 zO^PS1e&z{=_#4LiYO30iee($slD$@-BV9@@*r&5Yo3kmDH_|8k5}R z?)NW1IG8%J>qBoHE>zNDehgAo9x{;{tNU1Of5HTg)hC$Qu0rI+6|5X1WmP<(H46+b z`DiM*L^v}XGts7-e}5kmz8B}69{RK}u>TrN-bZ)7X8y_!ju$#7q~SFZSx2ZnB9EEd z3co|rd;f%mExh8kDh*Au*YVjMe|nKQt$!LxWpUWC(l{^1>Sn9z^jwS5-*CQb>f<{> zy1!bDIR$#fn_luE)>gXquw_{ zol|gi7CU#!CAz8e%~2Qqo~>5+{{CW_Z18RKR(cAe)gZ{?ws~)}ow(5|%dXG#6N|8z z+{(%jG1dj|N8Xp;>=1ug!?4@HCr>`c9Gu02g#uhX?Kp z?){d9kO!~jxU)f-syjmuklT$DhSJ`JOwsHAv@{FqHv2-f+DkQc!?F-FYn-MV=On&w zZPd!)P;NWulT28<`w0sRbd%-6V%uQ%UVFGxv@HYg^MLtUV#F~s%zNJTcwKS-D>Tet zCOpYra?zvC!Mg{&TWI9wcIe8^T?3T2)RD7lmB!0vUuTO3yAsmqU?F?7o#4LSGg7B6 zPO4vWkJ5OYu;~0h2Pq%&_cIdZ`X%SZJkt-Ql%8@?q&3~Ke-b8jf|7mFCoo?iRQmX( zKdGEl^FE2DClR-rFh^U)tV&lxnzAL=g9cyDuSLo0fwRqNeDzHK7_aQF0WVu+uiUxw z>%G*9>!V4Z_58b^Ke4mV2GTtew?AoN9@qr_j1MF%RkJEqz*$W{ppVWKLj3+J9%U0S~M;qQ;dB!O!Qudgas z{dgbpKdZ#0qWu01X@}y2S3X`)@O-n)yng=oryEt*ocdP(p6u9obWkw)%cGko?|q&A zGH~^0zq0ZkZ!MQAh(7rNqSs+RS9THen{5lgObK8q4q3pS1m;V25#S~qifAeqTpepB zawmS)Xc8&-Q zk@+iWa4k$bAoGe38=(%~?-%VGmZRDsSK?^altc8mGC%Sg)&g90%M^o1NMLd0UE;=9Gp7rvV+*fMz-|4QTwfD$w7ibbzNxgVO#g1r?uo8@H_Qq>ebI*@SH2Au zoYAvgU^!wsq2?9Sp7EiVB|h3dJrG#p8Jv2WfPc*AkX6wjf})PC>IfNtLfb%mM0n1I zuWRTT0T&-5Rb}am+S1z_whN<&Aq2Lb#`>nw%4)8$8mFkz>Zq<^jnrK@W6a{?gTTKl zH&RuHoG$%1<^zrsi|WBcHAvOM7V|cU`CnQ%X7#O!7~sGS0ys^s0goDeYPeUBp@xQs z%MaPgom{&;Nlyjy*+aV5K$W3QV^9mOU9e9PZBD{QJ>_@gA$eliksmQt_uF4u9e;Ws zbK=fP==$ z$vhdR*fPsBEX2Shjw+t|Q5f9r2^Jx+U*N+a!Z1dJO4^tM;$xBRp6+Q#yJ|yW)c1Qg z8X;hlJ2H#c8av?-H^`MwHL_tg5=PR3`H<SCfv@2pcx)=S!A;0tfMBDka5Vb)+^)|APkU(BVnmyv+x_&?at^iPX2LM zWRjd*iamf+X?T9VE<`wV%x7?Pw|0Z65|)#*Z;0htibhjh_$U5Jqh1J5{G{Sl8eIlU zpuiho0xtN?NfRi{U`It1K_Q5i6y)!;HtPJ^039Q+0c~E8Y-ViQ^#k9tjkwZYE~Srk zomfZ{2>|R7>u{-xkfMYH%zupz3tel0gz1{1)aOC9Hf*>sj`B~Y*nrT$Mo!}Ss8_%6 zK=YP~wh5X3!_px7e?}@T$Vp|djTGa~3+;^V4w3FKnWjNU&;zBQkR*lDw?mE~b_(O% zxz(>DrnWF`7GoSkAnP=I%9q??D9kj;Neo1xR7pXPngJL2;KH?-wBu=~Zj9<$bI4u% z#R;g@?u+D`gTN>3s;&zTz-}o}lDmFFF0DZ%ia{_F-!jBuUpq4~YUFV&Y5DZ$@8UxL z^dhf%3=M3FSCOeYk8`uGAM**G z`>PG>;Vy|XvEcIzf@lwV-v!%h(1*@!L=RR3k;+(B{@=6SR}7?rQznQH#LHRZ$@;6+ zQ=Dot_r79qb~ytiJOBiOJoBEcQ=oHQY&kd?W^Dg=f4w8@bjamjwp?HxQJ-n|ly?=Om~?B%)R2zc3&(5BQEX>F=02j zWERXUQjA9-FI|jFF6e1}N|_+Gs&Dp3eNR`LM=LV;je;E1FsUL%1M?89yJrqS{eshJgZfX zFjTcIN^cL469t&id-j5;phzYdOG#z{)&QW$6WGbfOy+>#T!-Tu6tz(i=B}{F0jbZt zbf?;qncr!rh-t+KYJCc;HITyhUW0Ih8GAf=Wn!R0$K)5DRDPSE7YGJ18a0CU*}}; zVspzzQs6T31~Qqd=zVLk`nqU`>*!)Mz60LyOsD#mht9vAp89!`igtsQgn!3XAz_Xw zPPz?H<${2UY!rwRCS$D;`$&~6u8{%JCBpL~f$C_LYOT6mVQDrltw*}2NJ6)h)cANb!L+ly)_Gqg#h>p4^B7%{aE1s+Y=nCiMBNQZj%=8*BINWd@ zYWiyIyO_;cq;qIU<5 z)Tv76e!RCbWRY1d%ia0McnvrgB5m8D7i@Mp$T;l8A&p4LRIAh)V!WcEF_}O(zW@@m=aw9wY`lE zj4M9mqKU!ZuduCGC4&hvEGhJ?iXvd*3mI6TuY(D!&`txDl*1#f)?mqJzHs?$Ck5<% zIJd#wOIGiKYJ_Zauu5r$;EX;>JtKp8;4i0-oFbVdD-d4{+$*(sZ?peztz%6~Q7~B; zm)?dmvhF&{u#wtaq(CL}j)!PM(Ntl!;pTl5eBL`U>>p+3Aj>mqN2Lf^5(3MmN7EV& z{@%M{=q`G(P9+m^otR?0R;S*Bw)muWug|ri$FpzdR9jecNQ@8P3>Dc=z7F#x zhXIPD=lQ%cs>6J>%&=bFD@W%eVKc3sYih#A8nJpU=dILNw@~}f_uM@#%N_F85;D1Y z{)uI<{5hMN6B=2Q3l)j)Urcdo{r(DWUY;-36+HgTs^F@@xjOO3_@-EI@8e}1E~;zJKlYz<;kF!Is#POM@CqL&i(P4ogGJ zUUlZEh4I@4z0$(d1z6C&8(hdO(%mW+eN3YunJD-Y3mPS6PUwm8yKbn?XakkvRK|a| zmqSdhlLN!=famK17wVShE0>S=E-$YwzYgmRO~Y~18Zx3Z-=j3&IlNi*ezO+#X8q!u z4}oto%-=jtyJe3D!HFqqETHXZin;HhN4`{}d5|`53BGHM!=>97u@C?S;S0&zuo^{E zqh5nnIQauh6#aR6l$|T0ZvMpA6WX7i!AXH9&A?AH6+~UQP?4H3PufOH%FlwEh!U<) zCs+6h7dc1zSWObvYKyA|{L_BEl{ReOEX9ZTUXwVs9E#tTocf40F~t#7V2#I@GwvIWLY#jrfpPu)MXRAhApS1-=MixgK{3&m6AhN$o6t~k zi#7c*;hzo*g4;6O_U6J=G$sQS$IqZ7<$)4+A*^p7uERITQX3S_jTDm&Dvh4pFbtk% zo(hL3vf+)qLsO7_7mM~|OhY?z0inK3$8hT5yimufbWlT^W-?faNJ}75lQZfR8Dyzr zxn&B4l30)HLR=6Q+>7JRjnULNV;*{SS6~H~^Nf3U1=P8;+Np@M^ME>G<1Xz}L&>MR znyT&^*)jB0g9O-SE;*K=lACJdUj(<8d&JPW4k+@qf01w*kQJG%qk0T8%TzGZ`` z0URnkPZ4HJ8+4MBNq}M>r+i8{dj6v~L@NH-O;ZE$tW@n98d_yHr7Ihx!U7*CO}8!m zG`YStWxdfD9>BN!(=DUPXVBEjn3t1Sm={tqN2I9%bc{! zyQvOD>IE+N6p^CK+uHFt_q8XcH z0ZbRziv;qN0db%kMjNJ6RcWeZv}zbOYNWifR1z8u43~N1VEXcCoNp&bq*NKI@Gbo|+ zsn32uR2VcmbOS^Lr(l3a%rolswEfmx$Y(HRA2DSgi)_S=*Bz&c?jFZwkd?Z~+Ta_ahbZD1 zAbcrVh76aJNed*w58-I;4d2Q2AE@g+*FS@L+k}O<)Rg8C!vD6E4oNfw@hY~xj*5MX z6Hz;SDQ+z<{`L6ShfW}sMFYjcgd4)o%gvukw2uD6vdjRSX@TbdBb&ubCh~xI}MK z5}NZ7&87Yq-=@S8)`+C&m!@5rJKYsUCEvNWxVa-m1S444g{goE5dTylax~%_gEABH zeKfBDBDg#^aZqmlMHXQ8*>Qj7;a5MZ1P}%nvxwLi^|^>>p*Bxer<-$u>aQv!POJuT zTk^6G;p-+~K zkw=HN*5EuNk337Kda(Z0Jai9)^?9Zzm*19?Z>y^}M~Kbh_~qNr*$0r1>f7g21F<-* z=xqq154~r$z4>!Lmrc=XuSTobj*MhU+c|rw+pef)%I&vHHdTGEswu=YXxTMb=iIV6 zY^@NyvzDP*W%;#2wsqwdo;FcVMce?>Cux7UWM^va(D-B(YY28rPB?>R+!|-0qwUhRPU^PL~AoV)VA(8=bR< z5juv0V6z43G8in+MiHj4J|=#Zjs}U&Avx*B$s~*o;_~d^VMR&FmSOS0WClIq@~)b# zl9#%=Opbwwk8f1xy&tZLe1`yTzTl~k^z?9C7*)njYKKk}M0%nN+!v6~l!7&h3~?JP zTtTSn8E3P#5Tw@k5rJR0d&e&SvbP7_G->=Ld$#B69Q7Pq@bD4=rnpn1>~0RlnB4nk z6LWn4yCPFSHvi$PS_11SO>$8OGSN8-ZLqq4Q5z96L9}?O7?G|+jWJZBL0)bcG z4~7xwqWnkDKssE~?CNWFVYIoWe9~EM=!bKIsN)rtql%REDvyC5F_G5Cs1P`3=Cz)XLTVHgY^u=S5-_d9~fcz_S< zh$vZ=m5|2X&Vc#uU`===?HRI|FAJmtmP#cL3wgCnv$&m@v!;*ZP6m8<@2>X@jBsHr zS^w{0*i7~Pib4c>r<#0~F$DSpG`}=pQABFVh>HL4;sJnt6ci~^v(Qoz5sieGd| zV1>W7g1<(^w&U4=@2wGK$VR5jC*%GY1`nJ$nl3ihLW?UUSbC6cmBywa-lM5PzsO(_ z?oRfJtq0e$F26miDYY+q`kCpaxGX_2jP-R>&se(<56C~m1s5c$5^gz)u_rkiwzlM+ ziM#`QgLrD%Q;-{1v7+!LcQe)r%Rf}$;uhDLYr8|?J7j}|q~)){u(bHA$Xbw~T< z9Zg%h$hezH0tb+r0t;hZRQg04eprbHK;oZUS_0CVGE@z-$9Vob=TNFQ&9>xyKx-~hUEmHI5 zzt)HSpRevuUeS5`>&3%?AN~8UZI8PQTe_L>OHX(}f5(@PUDfo2UaJWfdt7C|dW799 zA3EA&+8xocgV_Jy5w{O_7o>w|MEI0KhMn$vOi|Z}rnN!VG3I;8?A>9qEz+XDRA$yb z@xpd3kCOf|Fk@lV@NFgPEF%LL=Dj=j?Y`<2$rR0)fVOAu*9?pA=&orU>mKvT(@ZK` ztyLXKjI~avIU9jA{2#xx&WPsw4o;tsA^8kDcRqQ@!hSHD>7Gg$I8gPS`N8UY_w#G~ z0}M!D1bSXpD1gEm6X(#50IdBwP|NfsfpK{DXqA1NG|Pn?@+9 zyGpoy1ikKxlj!WsxsbCSe0DANu;!2Ks#s{8cpn#j$Q1g#zkV`6P~M6sVAK|rlBDU( zKH)P_(xyT?rI3Y_Vq&=T+|olu8h7LBt;e;J#;lXV-VcWiIh5 zzxRD$ikA)Jc)|oC)^%Ob#$x00;H8&?&iH$7_ED|KAF@N~1;`?FIM6@U7^T>D?|Uos!RfXWA7 z+!%z-emDALNwHFAObJDr0-tzJNMy$3OS6-=YTk}r`S8&e6i+TnCX)b{Q9J7dLgiF4 zSyXc3N!Wh6RM&kimwyfbKx#Zh!+!eh*j57jqR8$$@l#7p7M)T0fg%|ZR3Y<34W`11 z#SQyfg}zgZhKsE^sMC68 z`}~(IMK$;}lear>1W$cMVL|+fum2r4i5xB5r7qyfw2D-}s{~>CQR^5FGt!`7<*Ao? zj;f`ELslS>t~an4v?Sjx^N_D71Wj?=B7iIpTT1})8Kf6p#1yB}3v0@PMmhPvPQ3v! z9tx5`@M^Ts6Oc6$=EcFh10<54^O$1l1#AHv)iCBc4`aEIWca|$9{=>2{D+ZrK(3)z^&qC};5SN^aHdAMJr)NbB=U&W6jzKCNE$AWv zGSLk!#ygKyI~O4YlboFETD)riJN4!KYy6^%!M8ikKNNy2o%K)pH^EkG^=QvnwWH`P ztKV-fzYB1#s&$tN*d)Wh{a5A&54-iU)@k4b_OtrY&jB8t>ZO8p$F6whqSyYnrsk|! z=Peh2S(MK{QL0F0pLp_5 zlmy;7`B~$X$%$ucj!y1t%03!_QsJM_j#5DsFtWjA z2qF;hX<1ZGGxB$i-%$c`gsqHIkE*YaY79p*>!X{)PY=|`Xotp3)t`B@9;N9R@ted; zt3Rjj>JsIcfZF%3Ai^l@!}t;s9)r$k!-U?1;rE?)jIj3oa9%1R-h5xY=Dza| z9}?vDB?RA%x4wH>>~36^H|hNfsch}sz=u-`Z!^1Pe9L@4%znszcQ?yfBdH|JedzAF zu@8OT^2bcpnl5V`D?HIY{l-Pe-2_;%61wBb-$zcV_mhg;&Rp>B_orX1-5)o_;qNZC zH?6t3```=LQhge-v}G;QPBi~gui2KO#<_nWmV3PL%NWCDipX4d!MQg#Wc|KVQ+*=6 z=Q+Iw{w&Zvy(83pRxv6W`3~36v^H|~Xk8NcG}+Jlx>l_q_Q=zZb44}lcY@yK_Por9 z6S>t`9&B`c_Q>)jo9WCaYZ1X($tN3%^=SdmWD%(VgyTwesg2yFR(vG%{wm!~Q;wt~ zAKLpyDQJi4eF}-K2`*)e?14j3VK+MWrM>v*Ep(b9Ns*BNnvDPmHw9rJXlruMf0}Od zg7{kE)}cM0!cu}#>g_IdXT?a@uTD$FUdK7fglO~#5`?j`64%MA@IPP6AFwGu+k7{F zOye%U{_Zt6tchY0hLPW5%PqO~G1)>JWS9{!ylaP~01~Xj1G5wu5d?{JR7}(Xx7#%N z0f3r&ta8Kr{ z1a7f~0@;S8WD(y?@x~EdO0~!t(dJgr%lBj%ZIH;S4G4SmkP6^031BiqAPu&lJ-8Gw z1fY*AA#?msXN>#hqu$X!whRgsi+UyhgJvryp?U6Gy)~^l=-Rfp)p6^b{Np**HyBNb zt|0&mL}STfmLMoc*kn~WDb-89)`RJO!1EDru@oeLXdlFo0U%?E!Z(bzC&px@oD0f2_Y(y6UmMho&6SxImrn&Gt`R&G z20w$vAgPDlv7U%fjEsvOtI?_H6M*~x0*DmHJ&taLw-S>g!{!Naa&IXFiLzM}DFpZ$ zb-wTD!9B#-*n``_Q*Fl4Km9(|XWwO==wS6B zA@vl3t&JSX)xiuemE##mV2jM!xZpi81VAwLuyqDVkPhrK&J?2q(D)l-^Y-p!(OpY1 zN#eJ?AMZWl&ZS<{Z!a|PEBhKm|3a_uziEB6u%Wz-buU^W)Lr7ZD&nSq;&D1lApYXB z3n*vp2x&W$oDs|jKWMcz!C6iwzqKN+N$YlGR9yv)*6BxXq;?riN8#CT!O}3g+pr%93rIrsY@T3?>bpb+?Wm1W3yl<0Sl5yfApO$f})%J&(skBY^Vc!x!fa zzZ3YUK3*2CvHGB~Q~&wXdy!;mf?+g`h9w{P1`?5=hZugMRBp5L}2s29jF*)@@|EG`>{YcS4+J|=9xh`~#VFKorP#E1XV=(DDI`h82 zHIAxQ^?w1l3`g_dFI}D(a1;qxfY2&L?=UV(AyhtCz;R3N{|-P8#h(Zq!43ex1vP*& z)WPwjuZ5AzN_q2z;trtIERaANKtMP^ z4+!8uVA&NQI1i#~25T((3h;z0Jk$!@4RHyKKlnJNJJci7&PMG3q|?=m>a$cgd7&FR zA>KCr3yMPlKtYmx0I_S8E9_#D^VZWAK(im(T zHNErLAi*|?9vC+C^~ZyJKhntdYN);0e2r#~Ll^aZE~qwh^gVx9$A_~{%RB*IXlyf^ z$E1SMt{Eau;1=3{;$V+Ow9D}mu3{$wV;;$vnP zI5x~X^WG0%vlIal#KGkwr{*JP9ALiY=Y!`X=ND`~>2Llxc)sV4e&`dy=x4s`ALr_q zzU5}}zw#G9$?Sg7_kQ0AsD4gA z^;f@rM!m07HS_~s!u6&1e?R#1rSm`e_9I+jB(-fNwNj@)`?vpTtv~#`zx=aSf{ef1 zmw#PSKn|b)3K)X_|35$&5;%}xL4yYoB1DmpVMB)xA=TUh)LD~)h-^0Opb$EgDAAxrhaN?`lqm|O zO`%4WI&~_UJ`^ot)X32zNRcE>u2i{`Y+18s(Wc!=;YhX|K@CBTYljS(rBA5}jqB7- z+`U5S+GPsYPT#zTqyCkM^t>({Yo zcj+1QR6Fjh{m}rdE*U#ctkg9WxNqUYangQ1FJG?#_CYcIqAIUL#gD8XAd&I$RZalxNxHl zE%cxxOEW6)LW?(;@F1Re{@h>;Jt{zSnrXhsg^Qrb$U+Zb=CVRc406eZl`YyZl@?>X zxTn-9PGJF3LML_AKcpT+EW+p3tZ=$FGgu&_11{Q# z(TXX|SQeOPwy;msHl}a~gBbS6!an(op@j^;{@CIVZ8`|%k7?cjrh_0VnBtxeI(UPN zEV{MBiY=^hhhO24OE}lT(3B85HZ7zM&J2mI*y6H`mCLDQ|A2*z9NPVZM^@r6V~Pzp z$mLTzo*_}2KhVopMpm*Aj7Lv_5sHi$URXB2c&3Smt|0Egx2`N`CNYB;+!&#PT-^Cj zpu%*XZDEEPQ_7maO00^1_TCQefjk_3zz<5U>2Br+91P;4GLq08uRqn!fG<3 z+Ewf5+Ptv3uvu??JD<8s>^ndHm?H*{jTnc6w#`^28VpGF!Wc8m`y&i8RM4Ko7WT+poWc;&=lCW2PBH+!5R{=9GJY@BNQGGl&BgEihn00WwC2fec`Bk)y6Z z+!5^RyBg+o>(nI{EY}SXY&|JL>~

    (r~~DV?aR?rXiFO?5Rm3a04)45saX0;Vp(Z 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 ZWnc>CU=n5wVTxo03_x2xr3wTA06WD@GN%9l literal 0 HcmV?d00001 diff --git a/skin/frontend/default/default/images/cookies/ie7-3.gif b/skin/frontend/default/default/images/cookies/ie7-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..719382b091767b91dfe121f7c240dc3b58bfd603 GIT binary patch literal 19023 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 G0029?A|a&! literal 0 HcmV?d00001 diff --git a/skin/frontend/default/default/images/cookies/ie7-4.gif b/skin/frontend/default/default/images/cookies/ie7-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..660b58c2b5e88668a6cc4b0a5000c23341f30d12 GIT binary patch literal 9137 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 literal 0 HcmV?d00001 diff --git a/skin/frontend/default/default/images/cookies/ie7-6.gif b/skin/frontend/default/default/images/cookies/ie7-6.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d8a2f0ddb40473c853e75f3089ebab404280a7d GIT binary patch literal 6485 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 literal 0 HcmV?d00001 diff --git a/skin/frontend/default/default/images/cookies/opera.png b/skin/frontend/default/default/images/cookies/opera.png new file mode 100644 index 0000000000000000000000000000000000000000..04ff63915ab140ac094942dd0678826ecfbc954b GIT binary patch literal 17813 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 R8J_?E002ovPDHLkV1fy2e}Mo1 literal 0 HcmV?d00001 diff --git a/skin/frontend/default/default/images/i_notice.gif b/skin/frontend/default/default/images/i_notice.gif new file mode 100644 index 0000000000000000000000000000000000000000..17733eff3fa73171ffbce8254fa0b368d940b74d GIT binary patch literal 802 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 literal 3584 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 literal 3584 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 Nuo{z?i4qYI06Y4!a=rin literal 0 HcmV?d00001 diff --git a/skin/frontend/default/german/images/logo_email.gif b/skin/frontend/default/german/images/logo_email.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6d6d5a74a064a3129cca7b790ae0f330d3cd0cf GIT binary patch literal 3306 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 literal 0 HcmV?d00001 diff --git a/skin/install/default/default/css/boxes.css b/skin/install/default/default/css/boxes.css index d0279e009b..cb03ca485d 100644 --- a/skin/install/default/default/css/boxes.css +++ b/skin/install/default/default/css/boxes.css @@ -380,6 +380,10 @@ h1#logo { float:left; width:202px; margin:3px 0 0 12px; } .link-remove { color:#646464 !important;} .link-print { background:url(../images/icon_printer.gif) no-repeat 0 2px; padding-left:23px; } +/* Noscript Notice */ +.noscript { border:1px solid #000; border-width:0 0 1px; background:#ffff90; font-size:12px; line-height:1.25; text-align:center; color:#2f2f2f; } +.noscript .noscript-inner { width:950px; margin:0 auto; padding:12px 0 12px; background:url(../images/i_notice.gif) 20px 50% no-repeat; } +.noscript p { margin:0; } /* For Demo store only */ -.demo-notice { margin:0; background:#d75f07; padding:5px 10px 6px 10px; color:#fff; line-height:1em; text-align:center; } +.demo-notice { margin:0; background:#d75f07; padding:5px 10px 6px 10px; color:#fff; line-height:1em; text-align:center; } \ No newline at end of file diff --git a/skin/install/default/default/images/i_notice.gif b/skin/install/default/default/images/i_notice.gif new file mode 100644 index 0000000000000000000000000000000000000000..17733eff3fa73171ffbce8254fa0b368d940b74d GIT binary patch literal 802 zcmcJM|1Z>W9LHbp<2c`rJ9KE|IG-Fg*CdBp(*uKkgc;TvRP8X(&pli==sC*r|09B$1~|vB0pNp0e@Hmuv+i$ zSP=ktd(*!zqKF94>#rLOH%IkoVxpw96h52LI|HIpZRm86NPteKi9}#BNhOjfv$-lc z8AviOKOag<<0>l?x3=ovOdua0;Br|@OLBtn)D0tofL1N4tc3RVOo4zH(xIfJV38%;d?+j19k_XV!q`~R#wKcMMXjwF#l`S_6-7lIsIO09 zFd!=nl(k4I70k||?(R#gtIG8BL$!5?!Eh7`L-~Av8V%k~p@oGi7RzPV%zq90kL{j) z2-~Z@Pr%+<4RS@z9XKAJ7N=}bso~^h3MF%2W3$SShp`J&)1mOjXJfHfXNSF(plKbR zG`nL4LasQdUu~zoNQTGY=#hpa*pVc;I5B;^hJ)!&Q;5&TAx61}8$N0x6WSgbML5DT z6^h-BPcdzU+^@A84<00i)E#PSAy+e)JL8h#T$r}NS&;Wp>B_F@HSshp*C{%Buq%h@ z?ArNIXfaX(U#VsW9429Ep5tSB%*zoQY!s*l}kJdfVwbYau!%(Q3^{