Adding fields to products

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.
9 years ago
We added new fields(boolean) in sql, as well as the backend admin area, it is showing up in the admin section of the product page. It is currently under the shipping section of the admin product page.

We are stuck on how to get it to show up on the product page of the website.

What files need to be modified?
Ex:  This is what we would like to show up.
---if the field is TRUE then show text or image, if FALSE NULL.

Thank you
9 years ago
Here is the article may help you

Usually we create custom product attribute ( admin -> catalog -> attributes -> product attributes) if we need to add new field on product, in that case we do not need change any existing source code. After else if we want to add new field with any existing entity here is the right article
https://www.nopcommerce.com/docs/73/updating-an-existing-entity-how-to-add-a-new-property.aspx
7 years ago
Hi everyone,
I am trying to add a custom field on product and show it on product detail page.
So far I did;

1.  Went to my database and added a new column named "POL" in Product table.

2.  Went to Libraries > Nop.Core > Domain > Catalog > Product.cs and added
        
]/// <summary>
        /// POL
        /// </summary>
        public virtual string POL { get; set; }
[/code

3.  Went to Libraries > Nop.Data > Mapping > Catalog > ProductMap.cs and added  
           [code]]//POL
            this.Property(p => p.POL).HasMaxLength(500).IsOptional();

[/code

4.  Went to Presentation > Nop.Admin > Models > Catalog > ProductModel.cs and added  
       [code]]//POL
        [NopResourceDisplayName("Admin.Catalog.Products.Fields.POL")]
        [AllowHtml]
        public string POL { get; set; }
[/code

5.  Went to Presentation > Nop.Admin > Validators > Catalog > ProductValidator.cs and added
           [code]//POL
            RuleFor(x => x.POL).Length(0, 500);


6.  Went to Presentation > Nop.Admin > Models > Settings > ProductEditorSettingsModel.cs and added
//POL
        [NopResourceDisplayName("Admin.Configuration.Settings.ProductEditor.POL")]
        public bool POL { get; set; }



7.  Went to Presentation > Nop.Admin > Views > Product >  _CreateOrUpdate.Info.cshtml and added
@*POL*@
                    <div class="form-group @(Model.ProductEditorSettingsModel.POL ? null : "advanced-setting")">
                        <div class="col-md-3">
                            @Html.NopLabelFor(model => model.POL)
                        </div>
                        <div class="col-md-9">
                            @Html.EditorFor(model => model.POL)
                            @Html.ValidationMessageFor(model => model.POL)
                        </div>
                    </div>


8.  Went to Presentation > Nop.Admin > Controllers > ProductController.cs and added
to Method: void PrepareProductModel(ProductModel Model,product..)
          
//POL
            model.POL = product.POL;

to Method: Create(ProductModel model, bool continueEditing)
              
//POL
                product.POL = model.POL;

to Method: Edit(ProductModel model, bool continueEditing)
              
//POL
                product.POL = model.POL;


9.  Went to Presentation > Nop.Web > Models > Catalog > ProductDetails.Model.cs and added
        
//POL
        public string POL { get; set; }


10.  And finally on Presentation > Nop.Web > Views > Product > ProductTemplate.Simple.cshtml added
                      
<!--POL-->
                        @if (!String.IsNullOrEmpty(Model.POL))
                        {
                            @Html.Raw(Model.POL)
                        }


When I go to Administration > Catalog > Products and click on "Add New";

First I get an error on VS saying  for Presentation > Nop.Admin > Controllers > ProductController.cs  Module: Process: "The source file is different from when the module was built. Would you like the debugger to use it anyway"

Then when I click on Yes;

I get a Null Reference Exception on ProductController.cs on
throw new ArgumentNullException("model");


When I click continue it gives me following server error;
Server Error in '/' Application.

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:


Line 606:        {          
Line 607:            if (model == null)
Line 608:                throw new ArgumentNullException("model");
Line 609:
Line 610:            if (product != null)

Source File: C:\Users\Bulut\Source\Workspaces\Unfreighted\nopCommerce_3.80_Source\Presentation\Nop.Web\Administration\Controllers\ProductController.cs    Line: 608

Stack Trace:


[NullReferenceException: Object reference not set to an instance of an object.]
   Nop.Admin.Controllers.ProductController.PrepareProductModel(ProductModel model, Product product, Boolean setPredefinedValues, Boolean excludeProperties) in C:\Users\Bulut\Source\Workspaces\Unfreighted\nopCommerce_3.80_Source\Presentation\Nop.Web\Administration\Controllers\ProductController.cs:608
   Nop.Admin.Controllers.ProductController.Create() in C:\Users\Bulut\Source\Workspaces\Unfreighted\nopCommerce_3.80_Source\Presentation\Nop.Web\Administration\Controllers\ProductController.cs:1087
   lambda_method(Closure , ControllerBase , Object[] ) +61
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +157
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22
   System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225
   System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9765121
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.6.1586.0


Any idea how to fix it? I know it is coming from the following change but have no idea how to fix it.

8.  Went to Presentation > Nop.Admin > Controllers > ProductController.cs and added
to Method: void PrepareProductModel(ProductModel Model,product..)
          
//POL
            model.POL = product.POL;
7 years ago
Anyone to help? :)
7 years ago
Solved. Removed from product create. and removed length from validator. Works fine now.
7 years ago
I managed the add the field admin area but now facing with another issue. It shows on admin side but I cannot show it on product page. My changes are as follow so far;

1- Created a new column in Product table called POL.

2- Went to Libraries > Nop.Core > Domain > Catalog > Product.cs and added
  /// <summary>
        /// Bulut POL
        /// </summary>
        public virtual string POL { get; set; }


3- Went to Libraries > Nop.Data > Mapping > Catalog > ProductMap.cs and added  
//Bulut POL
      this.Property(p => p.POL).HasMaxLength(500).IsOptional();
          

4- Went to Presentation > Nop.Admin > Models > Catalog > ProductModel.cs and added  
      
//Bulut POL
        [NopResourceDisplayName("Admin.Catalog.Products.Fields.POL")]
        [AllowHtml]
        public string POL { get; set; }


5- Went to Presentation > Nop.Admin > Models > Settings > ProductEditorSettingsModel.cs and added
        
//Bulut POL
        [NopResourceDisplayName("Admin.Configuration.Settings.ProductEditor.POL")]
        public bool POL { get; set; }


6- Went to Presentation > Nop.Admin > Views > Product >  _CreateOrUpdate.Info.cshtml and added
                  
@*Bulut POL*@
                    <div class="form-group @(Model.ProductEditorSettingsModel.POL ? null : "advanced-setting")">
                        <div class="col-md-3">
                            @Html.NopLabelFor(model => model.POL)
                        </div>
                        <div class="col-md-9">
                            @Html.EditorFor(model => model.POL)
                            @Html.ValidationMessageFor(model => model.POL)
                        </div>
                    </div>


7- Went to Presentation > Nop.Admin > Controllers > ProductController.cs and added

Method name: Create(ProductModel model, bool continueEditing)
              
//Bulut POL
                product.POL = model.POL
;
Method name: Edit(ProductModel model, bool continueEditing)
              
//Bulut POL
                product.POL = model.POL;


8- Went to Presentation > Nop.Web > Models > Catalog > ProductDetails.Model.cs and added
        
//Bulut POL
        public string POL { get; set; }


9- Went to Presentation > Nop.Web > Views > Product > ProductTemplate.Simple.cshtml and added
                        
<!--Bulut POL-->
                        @if (!String.IsNullOrEmpty(Model.POL))
                        {
                            <div class="pol">
                                @Html.Raw(Model.POL)
                            </div>
                        }
7 years ago
Found the issue, forgot to add to the Presentation\Nop.Web\Controllers\ProductController.cs. Now works fine.
6 years ago
Hello..

I'm a new in nopCommerce so, can you guide me how to add new table in database with proper steps.
This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.