Default Contry on registration form

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.
8 years ago
Hi,

I added the following row in 3.6\Presentation\Nop.Web\Controllers\CustomerController.cs

            model.DisplayCaptcha = _captchaSettings.Enabled && _captchaSettings.ShowOnRegistrationPage;
            model.CountryId = 73; // This row was added. Substitute 73 with your preferred countryid

Regards
Patrik
7 years ago
Hi guys,

I stumbled across the same topic and came up with a solution which does not need to change any core code (working for nop 3.8) with the help of ActionFilters.

First, define your ActionFilterProvider in your PlugIn:
class preSelectCountryActionFilterProvider : IFilterProvider
    {
        public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
        {
            if ((controllerContext.Controller is Nop.Web.Controllers.CheckoutController
               && actionDescriptor.ActionName.ToLowerInvariant() == "opcbillingform")
               //|| -->any other desired hooks go here <-- )
            {
                var fi = EngineContext.Current.ContainerManager.Container.Resolve<preSelectCountryActionFilter>();
                return new List<Filter> { new Filter(fi, FilterScope.Action, 0) };
            }

            return new List<Filter>();
        }
    }


Secondth, define your ActionFilter, which is performing the actual stuff:
class preSelectCountryActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            using (var scope = EngineContext.Current.ContainerManager.Container.BeginLifetimeScope())
            {
                var settingsService = EngineContext.Current.ContainerManager.Resolve<ISettingService>(string.Empty, scope);
                var storeContext = EngineContext.Current.ContainerManager.Resolve<IStoreContext>(string.Empty, scope);


                if (settingsService.GetSetting("addresssettings.countryenabled", storeContext.CurrentStore.Id, true).Value == "False")
                {
                    return;
                }
                
                string preselectedCountryCode = settingsService.GetSetting("addresssettings.countrydefaultcode", storeContext.CurrentStore.Id, true).Value;


                Nop.Web.Models.Checkout.CheckoutBillingAddressModel model = ((System.Web.Mvc.PartialViewResult)filterContext.Result).Model as Nop.Web.Models.Checkout.CheckoutBillingAddressModel;
                IList<System.Web.Mvc.SelectListItem> countries = model.NewAddress.AvailableCountries;

                bool hasPreSelectedCountry = Convert.ToBoolean(countries.Where(e => e.Selected == true).Count());

                if (!hasPreSelectedCountry)
                {
                        foreach (System.Web.Mvc.SelectListItem country in countries)
                        {
                            if (country.Value == preselectedCountryCode)
                            {
                                country.Selected = true;
                                break;
                            }
                        }
                    }
                }            
        }
    }


Then you of course have to announce your ActionFilter to nopCommerce via DependencyRegistrar:
 public class DependencyRegistrar : IDependencyRegistrar
    {
        /// <summary>
        /// Register services and interfaces
        /// </summary>
        /// <param name="builder">Container builder</param>
        /// <param name="typeFinder">Type finder</param>
        /// <param name="config">Config</param>
        public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder, NopConfig config)
        {
            builder.RegisterType<preSelectCountryActionFilterProvider>().As<IFilterProvider>();
            builder.RegisterType<preSelectCountryActionFilter>().As<preSelectCountryActionFilter>();
        }

        /// <summary>
        /// Order of this dependency registrar implementation
        /// </summary>
        public int Order
        {
            get { return 1; }
        }
    }


And last not least you create your desired settings in nopCommerce with the help of the database level settings page in the admin area (Admin Area -> Configuration -> Settings ->  All settings (advanced)):

Create an entry with the name "addresssettings.countrydefaultcode" and your desired country code plus according store.

This way the core code stays untouched and you can easily defined default countries for your different stores. :)
This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.