{"id":18564895,"url":"https://github.com/bdcrops/module-ordernotes","last_synced_at":"2025-07-29T05:34:38.633Z","repository":{"id":62492558,"uuid":"210131469","full_name":"bdcrops/module-ordernotes","owner":"bdcrops","description":"OrderNotes for Magento 2 extensions","archived":false,"fork":false,"pushed_at":"2019-09-22T15:03:08.000Z","size":164,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-15T18:47:32.927Z","etag":null,"topics":["magento-2-extensions","ordernotes-for-magento-2-extensions","ordernotes-magento-2"],"latest_commit_sha":null,"homepage":"https://www.bdcrops.com","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bdcrops.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-09-22T10:51:20.000Z","updated_at":"2019-09-23T08:41:21.000Z","dependencies_parsed_at":"2022-11-02T11:30:35.647Z","dependency_job_id":null,"html_url":"https://github.com/bdcrops/module-ordernotes","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bdcrops/module-ordernotes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bdcrops%2Fmodule-ordernotes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bdcrops%2Fmodule-ordernotes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bdcrops%2Fmodule-ordernotes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bdcrops%2Fmodule-ordernotes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bdcrops","download_url":"https://codeload.github.com/bdcrops/module-ordernotes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bdcrops%2Fmodule-ordernotes/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267633676,"owners_count":24118778,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-29T02:00:12.549Z","response_time":2574,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["magento-2-extensions","ordernotes-for-magento-2-extensions","ordernotes-magento-2"],"created_at":"2024-11-06T22:16:42.098Z","updated_at":"2025-07-29T05:34:38.611Z","avatar_url":"https://github.com/bdcrops.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Magento2x OrderNotes\n\nThis module is used as a OrderNotes for Magento 2 extensions.\nwe have built a small, but functional, order notes module. This allowed us to\nfamiliarize ourselves with an important aspect of customizing the checkout experience. The gist\nof this lies in understanding the checkout_index_index layout handle, the JavaScript\nwindow.checkoutConfig object, and the uiComponent.\n\n\n## Goal\n\n- Customizing \u0026 Passing data Checkout Experiences\n- Adding order notes to the checkout\n- Learn Magento 2 Certified Professional Developer exam topics \"Customizing the Checkout Process 13%\"\n\n## 1. Install \u0026 upgrade  OrderNotes\n\n\n#### 1.1 Copy and paste\n\nIf you don't want to install via composer, you can use this way.\n\n- Download [the latest version here](https://github.com/bdcrops/module-ordernotes/archive/master.zip)\n- Extract `master.zip` file to `app/code/BDC/OrderNotes` ; You should create a folder path `app/code/BDC/OrderNotes` if not exist.\n- Go to Magento root folder and run upgrade command line to install `BDC_OrderNotes`:\n\n```\nphp bin/magento setup:upgrade\nphp bin/magento setup:static-content:deploy\n```\n\n\n#### 1.2 Install via composer\n\nWe recommend you to install BDC_OrderNotes module via composer. It is easy to install, update and maintaince.Run the following command in Magento 2 root folder.\n\n```\ncomposer config repositories.module-ordernotes git\nhttps://github.com/bdcrops/module-ordernotes.git\n\ncomposer require bdcrops/module-ordernotes:~1.0.0\nphp bin/magento setup:upgrade\nphp bin/magento setup:static-content:deploy\n```\n\n#### 1.3 Upgrade    \n\n```\ncomposer update bdcrops/module-ordernotes\nphp bin/magento setup:upgrade\nphp bin/magento setup:static-content:deploy\n```\n\nRun compile if your store in Product mode:\n\n```\nphp bin/magento setup:di:compile\n```\n\n## 2. Magento 2 Module \"OrderNotes\" Step By Step Tutorial\n\n- Create app/code/BDC/OrderNotes/registration.php\n```\n\u003c?php\n\\Magento\\Framework\\Component\\ComponentRegistrar::register(\n    \\Magento\\Framework\\Component\\ComponentRegistrar::MODULE,\n    'BDC_OrderNotes',\n    __DIR__\n);\n```\n- Create app/code/BDC/OrderNotes/etc/module.xml\n```\n\u003c?xml version=\"1.0\"?\u003e\n\u003cconfig xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"urn:magento:framework:Module/etc/module.xsd\"\u003e\n    \u003cmodule name=\"BDC_OrderNotes\" setup_version=\"1.0.0\"/\u003e\n\u003c/config\u003e\n```\n- Create app/code/BDC/OrderNotes/Setup/InstallSchema.php\n```\n\u003c?php\n\nnamespace BDC\\OrderNotes\\Setup;\nuse \\Magento\\Framework\\Setup\\InstallSchemaInterface;\n\nclass InstallSchema implements InstallSchemaInterface{\n    public function install(\n        \\Magento\\Framework\\Setup\\SchemaSetupInterface $setup,\n        \\Magento\\Framework\\Setup\\ModuleContextInterface $context\n    ) {\n        $connection = $setup-\u003egetConnection();\n        $connection-\u003eaddColumn(\n            $setup-\u003egetTable('quote'),\n            'order_notes', [\n                'type' =\u003e \\Magento\\Framework\\DB\\Ddl\\Table::TYPE_TEXT,\n                'nullable' =\u003e true,\n                'comment' =\u003e 'Order Notes'\n            ]\n        );\n\n        $connection-\u003eaddColumn(\n            $setup-\u003egetTable('sales_order'),\n            'order_notes', [\n                'type' =\u003e \\Magento\\Framework\\DB\\Ddl\\Table::TYPE_TEXT,\n                'nullable' =\u003e true,\n                'comment' =\u003e 'Order Notes'\n            ]\n        );\n    }\n}\n\n```\n- Create app/code/BDC/OrderNotes/etc/frontend/routes.xml\n```\n\u003c?xml version=\"1.0\"?\u003e\n\n\u003cconfig xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xsi:noNamespaceSchemaLocation=\"urn:magento:framework:App/etc/routes.xsd\"\u003e\n    \u003crouter id=\"standard\"\u003e\n        \u003croute id=\"ordernotes\" frontName=\"ordernotes\"\u003e\n            \u003cmodule name=\"BDC_OrderNotes\"/\u003e\n        \u003c/route\u003e\n    \u003c/router\u003e\n\u003c/config\u003e\n\n```\n- Create app/code/BDC/OrderNotes/Controller/Index.php\n```\n\u003c?php\nnamespace BDC\\OrderNotes\\Controller;\nabstract class Index extends \\Magento\\Framework\\App\\Action\\Action { }\n\n```\n- Create app/code/BDC/OrderNotes/Controller/Index/Process.php\n```\n\u003c?php\nnamespace BDC\\OrderNotes\\Controller\\Index;\n\nclass Process extends \\BDC\\OrderNotes\\Controller\\Index {\n    protected $checkoutSession;\n    protected $logger;\n\n    public function __construct(\n        \\Magento\\Framework\\App\\Action\\Context $context,\n        \\Magento\\Checkout\\Model\\Session $checkoutSession,\n        \\Psr\\Log\\LoggerInterface $logger ) {\n        $this-\u003echeckoutSession = $checkoutSession;\n        $this-\u003elogger = $logger;\n        parent::__construct($context);\n    }\n    public function execute() {\n        try {\n            if ($notes = $this-\u003egetRequest()-\u003egetParam('order_notes', null)) {\n                $quote = $this-\u003echeckoutSession-\u003egetQuote();\n                $quote-\u003esetOrderNotes($notes);\n                $quote-\u003esave();\n            }\n            $result = ['time' =\u003e (new \\DateTime('now'))-\u003eformat('Y-m-d H:i:s'), ];\n        } catch (\\Exception $e) {\n            $this-\u003elogger-\u003ecritical($e);\n            $result = [\n                'error' =\u003e __('Something went wrong.'),\n                'errorcode' =\u003e $e-\u003egetCode(),\n            ];\n        }\n        $resultJson = $this-\u003eresultFactory-\u003ecreate(\\Magento\\Framework\\Controller\\ResultFactory::TYPE_JSON);\n        $resultJson-\u003esetData($result);\n        return $resultJson;\n    }\n}\n\n```\n\n- Create app/code/BDC/OrderNotes/etc/frontend/di.xml\n```\n\u003c?xml version=\"1.0\"?\u003e\n\u003cconfig xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"urn:magento:framework:ObjectManager/etc/config.xsd\"\u003e\n    \u003ctype name=\"Magento\\Checkout\\Model\\CompositeConfigProvider\"\u003e\n        \u003carguments\u003e\n            \u003cargument name=\"configProviders\" xsi:type=\"array\"\u003e\n                \u003citem name=\"order_notes_config_provider\" xsi:type=\"object\"\u003eBDC\\OrderNotes\\Model\\ConfigProvider\u003c/item\u003e\n            \u003c/argument\u003e\n        \u003c/arguments\u003e\n    \u003c/type\u003e\n\u003c/config\u003e\n```\n- Create app/code/BDC/OrderNotes/Model/ConfigProvider.php\n```\n\u003c?php\nnamespace BDC\\OrderNotes\\Model;\n\nuse \\Magento\\Checkout\\Model\\ConfigProviderInterface;\n\nclass ConfigProvider implements ConfigProviderInterface {\n    public function getConfig() {\n        return [\n            'orderNotes' =\u003e [\n                'title' =\u003e __('Order Notes'),\n                'header' =\u003e __('Header content.'),\n                'footer' =\u003e __('Footer content.'),\n                'options' =\u003e [\n                    [ 'code' =\u003e 'ring', 'value' =\u003e __('Ring longer') ],\n                    [ 'code' =\u003e 'backyard', 'value' =\u003e __('Try backyard') ],\n                    [ 'code' =\u003e 'neighbour', 'value' =\u003e __('Ping neighbour') ],\n                    [ 'code' =\u003e 'other', 'value' =\u003e __('Other') ],\n                ],\n                'time' =\u003e (new \\DateTime('now'))-\u003eformat('Y-m-d H:i:s')\n            ]\n        ];\n    }\n}\n\n```\n- Create app/code/BDC/OrderNotes/etc/webapi_rest/events.xml\n```\n\u003c?xml version=\"1.0\"?\u003e\n\n\u003cconfig xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"urn:magento:framework:Event/etc/events.xsd\"\u003e\n    \u003cevent name=\"sales_model_service_quote_submit_before\"\u003e\n        \u003cobserver name=\"orderNotesToOrder\" instance=\"BDC\\OrderNotes\\Observer\\SaveOrderNotesToOrder\" shared=\"false\"/\u003e\n    \u003c/event\u003e\n\u003c/config\u003e\n\n```\n- Create app/code/BDC/OrderNotes/Observer/SaveOrderNotesToOrder.php\n```\n\u003c?php\nnamespace BDC\\OrderNotes\\Observer;\nuse \\Magento\\Framework\\Event\\ObserverInterface;\nuse \\Magento\\Framework\\Event\\Observer;\n\nclass SaveOrderNotesToOrder implements ObserverInterface {\n    public function execute(Observer $observer) {\n        $event = $observer-\u003egetEvent();\n        if ($notes = $event-\u003egetQuote()-\u003egetOrderNotes()) {\n            $event-\u003egetOrder()-\u003esetOrderNotes($notes)\n                -\u003eaddStatusHistoryComment('Customer note: ' . $notes);\n        }\n        return $this;\n    }\n}\n\n```\n- Create app/code/BDC/OrderNotes/view/frontend/layout/checkout_index_index.xml\n```\n\u003cpage xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" layout=\"1column\" xsi:noNamespaceSchemaLocation=\"urn:magento:framework:View/Layout/etc/page_configuration.xsd\"\u003e\n    \u003cbody\u003e\n        \u003creferenceBlock name=\"checkout.root\"\u003e\n            \u003carguments\u003e\n                \u003cargument name=\"jsLayout\" xsi:type=\"array\"\u003e\n                    \u003citem name=\"components\" xsi:type=\"array\"\u003e\n                        \u003citem name=\"checkout\" xsi:type=\"array\"\u003e\n                            \u003citem name=\"children\" xsi:type=\"array\"\u003e\n                                \u003citem name=\"steps\" xsi:type=\"array\"\u003e\n                                    \u003citem name=\"children\" xsi:type=\"array\"\u003e\n                                        \u003citem name=\"order-notes\" xsi:type=\"array\"\u003e\n                                            \u003citem name=\"component\" xsi:type=\"string\"\u003eBDC_OrderNotes/js/view/order-notes\u003c/item\u003e\n                                            \u003citem name=\"sortOrder\" xsi:type=\"string\"\u003e2\u003c/item\u003e\n                                        \u003c/item\u003e\n                                    \u003c/item\u003e\n                                \u003c/item\u003e\n                            \u003c/item\u003e\n                        \u003c/item\u003e\n                    \u003c/item\u003e\n                \u003c/argument\u003e\n            \u003c/arguments\u003e\n        \u003c/referenceBlock\u003e\n    \u003c/body\u003e\n\u003c/page\u003e\n\n```\n- Create app/code/BDC/OrderNotes/view/frontend/web/js/view/order-notes.js\n```\ndefine( ['ko',\n        'uiComponent',\n        'underscore',\n        'Magento_Checkout/js/model/step-navigator',\n        'jquery',\n        'mage/translate',\n        'mage/url'],\n    function (\n        ko,\n        Component,\n        _,\n        stepNavigator,\n        $,\n        $t,\n        url ) {\n        'use strict';\n        let checkoutConfigOrderNotes = window.checkoutConfig.orderNotes;\n        return Component.extend({\n            defaults: { template: 'BDC_OrderNotes/order/notes' },\n            isVisible: ko.observable(true),\n            initialize: function () {\n                this._super();\n                stepNavigator.registerStep('order_notes', null, $t('Order Notes'), this.isVisible, _.bind(this.navigate, this), 15);\n                return this;\n            },\n\n            getTitle: function () { return checkoutConfigOrderNotes.title; },\n            getHeader: function () { return checkoutConfigOrderNotes.header; },\n            getFooter: function () { return checkoutConfigOrderNotes.footer; },\n            getNotesOptions: function () { return checkoutConfigOrderNotes.options; },\n            getCheckoutConfigOrderNotesTime: function ()\n              { return checkoutConfigOrderNotes.time;},\n            setOrderNotes: function (valObj, event) {\n                if (valObj.code == 'other') {\n                    $('[name=\"order_notes\"]').val('');\n                } else {\n                    $('[name=\"order_notes\"]').val(valObj.value);\n                }\n                return true;\n            },\n\n            navigate: function () {\n                // Code to trigger when landing on our step\n            },\n\n            navigateToNextStep: function () {\n                if ($(arguments[0]).is('form')) {\n                    $.ajax({\n                        type: 'POST',\n                        url: url.build('ordernotes/index/process'),\n                        data: $(arguments[0]).serialize(),\n                        showLoader: true,\n                        complete: function (response) {\n                            stepNavigator.next();\n                        }\n                    });\n                }\n            }\n        });\n    }\n);\n\n```\n- Create app/code/BDC/OrderNotes/view/frontend/web/template/order/notes.html\n```\n\u003cli id=\"order_notes\" data-bind=\"fadeVisible: isVisible\"\u003e\n    \u003cdiv class=\"step-title\" data-bind=\"text: getTitle()\" data-role=\"title\"\u003e\u003c/div\u003e\n    \u003cdiv id=\"step-content\" class=\"step-content\" data-role=\"content\"\u003e\n        \u003cdiv class=\"step-header\" data-bind=\"text: getHeader()\" data-role=\"header\"\u003e\u003c/div\u003e\n        \u003cform data-bind=\"submit: navigateToNextStep\" novalidate=\"novalidate\"\u003e\n            \u003cdiv data-bind=\"foreach: getNotesOptions()\" class=\"field choice\"\u003e\n                \u003cinput type=\"radio\" name=\"order[notes]\" class=\"radio\"\n                       data-bind=\"value: code, click: $parent.setOrderNotes\"/\u003e\n                \u003clabel data-bind=\"attr: {'for': code}\" class=\"label\"\u003e\n                    \u003cspan data-bind=\"text: value\"\u003e\u003c/span\u003e\n                \u003c/label\u003e\n            \u003c/div\u003e\n            \u003ctextarea name=\"order_notes\"\u003e\u003c/textarea\u003e\n            \u003cdiv class=\"actions-toolbar\"\u003e\n                \u003cdiv class=\"primary\"\u003e\n                    \u003cbutton data-role=\"opc-continue\" type=\"submit\" class=\"button action continue primary\"\u003e\n                        \u003cspan\u003e\u003c!-- ko i18n: 'Next'--\u003e\u003c!-- /ko --\u003e\u003c/span\u003e\n                    \u003c/button\u003e\n                \u003c/div\u003e\n            \u003c/div\u003e\n        \u003c/form\u003e\n        \u003cdiv class=\"step-footer\" data-bind=\"text: getFooter()\" data-role=\"footer\"\u003e\u003c/div\u003e\n    \u003c/div\u003e\n\u003c/li\u003e\n\n\n```\n- OrderNotes Checkout\n\n![](docs/OrderNotesCheckout.png)\n\n-  Order Notes Order Details\n![](docs/OrderNotesOrderDetails.png)\n\n- Order Notes Order Comment\n![](docs/OrderNotesOrderComent.png)\n\n\n## 3. FAQ\n\n## Ref\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbdcrops%2Fmodule-ordernotes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbdcrops%2Fmodule-ordernotes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbdcrops%2Fmodule-ordernotes/lists"}