čtvrtek 11. září 2025

NopCommerce Vlastní plugin

 Vytvoření pluginu

Založení nového projektu s pluginem




Projekty pluginů jsou uloženy ve složce Plugins.
Zbuildovaný plugin se ale PostBuild stepem přenáší do pložky Plugins v projektu Nop.Web

Nastavení projektu

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <Copyright>Copyright © Tyrion SW, s.r.o.</Copyright>
    <Company>Tyrion SW, s.r.o.</Company>
    <Authors>Tyrion SW, s.r.o.</Authors>
    <PackageLicenseUrl></PackageLicenseUrl>
    <OutputPath>..\..\Presentation\Nop.Web\Plugins\Payments.ComGate</OutputPath>
    <OutDir>$(OutputPath)</OutDir>
    <CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>
  </PropertyGroup>
...

...
<ItemGroup>
    <ProjectReference Include="..\..\Presentation\Nop.Web.Framework\Nop.Web.Framework.csproj" />
    <ClearPluginAssemblies Include="$(MSBuildProjectDirectory)\..\..\Build\ClearPluginAssemblies.proj" />
  </ItemGroup>


  <!-- This target execute after "Build" target -->
  <Target Name="NopTarget" AfterTargets="Build">
    <!-- Delete unnecessary libraries from plugins path -->
    <MSBuild Projects="@(ClearPluginAssemblies)" Properties="PluginPath=$(MSBuildProjectDirectory)\$(OutDir)" Targets="NopClear" />
  </Target>

Reference na Framework

Aby byla v projektu dostupná funkcionaliza NopCommerce je potřeba přidat rteferenci na projekt Nop.Web.Framework. V něm se například nachází třída BasePlugin ze které budeme náš nový plugin dědit.

plugin.json


logo.png

Logo se potom zobrazuje v seznamu pluginů v administraci NopCommerce a u platebních metod jako logo platební metody

Nastavení vlastností souborů

Jak plugin.json tak i logo.png musí mít nastaveny vlastnosti 



Třída pluginu



Administrace / Configuration / Local plugins


Controller


public ActionResult Index2()
        {
            return new ContentResult() { Content="Ahoj" };
        }

public ActionResult Index()
        {
            return View("~/Plugins/Payments.Test/Views/Index.cshtml");
        }

Konfigurace


return $"{_webHelper.GetStoreLocation()}Admin/PaymentComGate/Configure";

Routing

https://docs.nopcommerce.com/en/developer/tutorials/guide-to-creating-a-page-containing-a-reporting-table-of-datatables.html
public partial class RouteProvider : IRouteProvider
    {
        /// <summary>
        /// Register routes
        /// </summary>
        /// <param name="endpointRouteBuilder">Route builder</param>
        public void RegisterRoutes(IEndpointRouteBuilder endpointRouteBuilder)
        {
            
            endpointRouteBuilder.MapControllerRoute("Plugin.Payments.Test.Index", "Plugins/Test/Index",
                 new { controller = "Test", action = "Index" });

            endpointRouteBuilder.MapControllerRoute("Plugin.Payments.Test.Generator", "Admin/Test/Generator",
                 new { controller = "Test", action = "Generator" });


        }

        /// <summary>
        /// Gets a priority of route provider
        /// </summary>
        public int Priority => -1;
    }

Menu položka

Views





Zdroj:

Make.com - zpracování vícestránkové odpovědi

 Make.com - zpracování vícestránkové odpovědi

Pokud HTTP response vrací vícestránkovou odpověď, je potřeba ji zpracovat v cyklu a projít všechny stránky.
To není úplně jednoduché realizovat na platformě Make, pokud odpověď neobsahuje počet stránek, ale pouze odkaz na další stránku. např. takto: 

Mně se zatím jako jediný osvědčil tento scénář:

  • Vytvořit proměnné done a ContinuationToken.

  • Ty následně načíst a použít ve volání HTTP requestu.

  • Po HTTP requestu znovu nastavit proměnné v závislosti na odpovědi.

  • Poté zpracovat data z odpovědi iterátorem.

  • Před HTTP requestem je nastavený filtr na done != true a na true se proměnná done nastaví, pokud se v odpovědi vrátí ContinuationToken = null.





pondělí 21. července 2025

Make.com konverze času na desetinné číslo

Hodnotu ve formátu 12:30:30 převede na desetinné číslo 12.508333333333333 v hodinách

V proměnné 2.YourTimeVariable mám uložený čas 12:30:30

Funkce v prostředí Make.com

{{(parseNumber(get(split(2.YourTimeVariable; ":"); 1); )) + (parseNumber(get(split(2.YourTimeVariable; ":"); 2); ) / 60) + (parseDate(get(split(2.YourTimeVariable; ":"); 3); ) / 3600)}}


Vyzkoušej Make.com



Poznámka:

pro vkládání funkcí v editoru výrazu je potřeba je vyhledávat v nabídce, která se zobrazí po vložení znaku lomítka '/' 

Zápis je poněkud krkolomný a je potřeba si na něj zvyknout.

Matematické operace je potřeba zadávat také přes znak lomeno


Druhá varianta



{{parseNumber(substring(1.cas; 0; 2); ) + (parseNumber(substring(1.cas; 3; 5); ) /60 ) + (parseNumber(substring(1.cas; 6; 8); ) /3600) }}



 

středa 23. listopadu 2022

pondělí 1. srpna 2022

NopCommerce Payment Plugin


Components

One or more errors occurred. (A view component named 'PaymentComGate' could not be found. A view component must be a public non-abstract class, not contain any generic parameters, and either be decorated with 'ViewComponentAttribute' or have a class name ending with the 'ViewComponent' suffix. A view component must not be decorated with 'NonViewComponentAttribute'.)

Nebo

One or more errors occurred. (A view component named 'PaymentBesteron' could not be found. A view component must be a public non-abstract class, not contain any generic parameters, and either be decorated with 'ViewComponentAttribute' or have a class name ending with the 'ViewComponent' suffix. A view component must not be decorated with 'NonViewComponentAttribute'.)


Řešení

 namespace Nop.Plugin.Payments.{NázevSlužby}.Components
{

          [ViewComponent(Name = "Payment{NázevSlužby}")]

 public class Payment{NázevSlužby}ViewComponent : NopViewComponent
    {
        public IViewComponentResult Invoke()
        {
            return View("~/Plugins/Payments.{NázevSlužby}/Views/PaymentInfo.cshtml");
        }
    }

            } 

Souvisí s metodou GetPublicViewComponentName ve třídě {NázevSlužby}PaymentProceser

/// <summary>
/// Gets a name of a view component for displaying plugin in public store ("payment info" checkout step)
/// </summary>
/// <returns>View component name</returns>
public string GetPublicViewComponentName()
{
return "Payment{NázevSlužby}";
}

 

Services

Služby které jsou využívány v konstruktorech je potřeba nejprve zaregistrovat tak aby je IOC mohl nalézt. Registrují se ve třídě NopStartup ve složce Infrastructure
Pokud je použijete bez registrace tak Vám pravděpodobně nepůjde plugin ani nainstalovat a instalace skončí chybou ve smyslu že se nepodařilo nalézt vyhovující konstruktor.

Views

Configure.cshtml

Zobrazuje formulář v administraci kterým se nastavují údaje pro komunikaci s platební bránou. Například ID obchodníka

PaymentInfo.cshtml

Zobrazuje informace o tom že po dokončení objednávky budete přesměrování na platební bránu, nebo může obsahuvat formulář pro zadání doplňujících informací pro dokončení platby.

Zdroj:

čtvrtek 13. ledna 2022

Visual Studio nerozpozná nově přidanou třídu

 Po přidání nové třídy do projektu se VS chovalo jako kdyby nová třída vůbec přidaná nebyla.

Řešení:

Aktualizovat verzi knihovny "Microsoft.Net.Compilers" z verze 1.0.0 na alespoň 3.0.0

Zdroj:

https://developercommunity.visualstudio.com/t/cannot-navigate-to-the-symbol-under-the-caret-3/505489

čtvrtek 18. února 2021

Test ukazující funkci Distinct a SequenceEqual

[TestMethod]

public void Distinct_SequenceEqual()
{
// ARRANGE
var list1 = new List<string>() { "Karel", "Jan", "Jindra", "Jan"};
var list2 = new List<string>() { "Karel", "Jan", "Jindra" };

// ACT
var result = !list1.Distinct()
.SequenceEqual(list2);

// ASSERT
Assert.IsFalse(result);
}