Inhalte aufrufen

Profilbild
- - - - -

Produktfilter Plugin


  • Bitte melden Sie sich an, um eine Antwort zu verfassen.
9 Antworten zu diesem Thema

#1 daniel@streetec

daniel@streetec

    Member

  • Members
  • PunktPunkt
  • 12 Beiträge

Geschrieben: 18 January 2022 - 12:57

Hallo,

erstmal ein Hallo an die Community und die Kollegen der Smartstore AG.

 

Ich evaluiere gerade die Möglichkeit, Smartstore für unseren Online-Shop zu verwenden. Dafür würde ich gerne vorab ein kleines Plugin schreiben, welches die Produkte verschiedener Kategorien filtern kann. Im speziellen geht es hier um eine Fahrzeugauswahl für unsere Produkte, wie hier aktuell in unserem Shop:

https://null-bar.de/...uspensions.html

 

Ich habe schon grob herausgefunden, wie ich ein Plugin erstelle und im Shop einbinde. Auch das erzeugen von Einstellungen für dieses Plugin habe ich gefunden. 

 

Wenn ich es richtig verstanden habe benötige ich folgendes:

Plugin Type: General

Plugin group: Misc

Plugin has own data context (Da Hersteller, Typ und Modell dynamisch von einer API abgerufen werden)

Add admin menu (für API Key)

Add filter (zum Filtern von Produkten)

 

Info: Aus Hersteller, Typ und Modell ergibt sich am Ende eine ID. Produkte haben eine Liste an kompatiblen IDs (z.B. als Attribut) und werden anhand dessen gefiltert angezeigt.

 

ist das so weit korrekt?

 

Kann mir jemand bitte grob erklären (oder ein Beispiel zeigen) wo und wie ich nun die Views und Actions erstellen kann, um eine solche Cascading Combobox Abfrage für bestimmte Produktkategorien zu erstellen? 

 

Vielen Dank schonmal und entschuldigt wenn ich ein entsprechendes Thema oder eine Hilfeseite nicht gefunden habe.


  • stefanmueller gefällt das

#2 stefanmueller

stefanmueller

    SmartStore AG

  • Administrators
  • 462 Beiträge

Geschrieben: 18 January 2022 - 14:21

Hallo Daniel, dazu werden sicher noch Entwickler antworten.

 

Hast du schon unser Tool für Visual Studio gesehen? Vielleicht hilft dir das.

 

https://smartstore.c...tudio-extension

 

Ausserdem gibt es auf unserem Github eine Entwicklungsumgebung für Plugins.

 

https://github.com/s...olutionTemplate

 

"Dieses Repository ermöglicht es Entwicklern, in einer perfekten Entwicklungsumgebung für die Entwicklung von Plugins, Tests oder Themen zu arbeiten, einschließlich jedes erdenklichen Bereitstellungsszenarios."

 

Gruß, Stefan


  • daniel@streetec gefällt das

Stefan


#3 Marcus Gesing

Marcus Gesing

    SmartStore AG

  • Administrators
  • 3801 Beiträge

Geschrieben: 18 January 2022 - 18:50

Ein Hinweis vorne weg: eine solche Filterfunktion gibt es bereits in Form des MegaSeach\MegaSeachPlus Plugins. Hersteller, Modell, Motor ließen sich als Spezifikationsattribute indexieren und sind dann als solche facettierbar. Dafür müssen diese Daten aber in der Datenbank stehen, sonst kann MegaSearch sie nicht indexieren.
 
Einen eigenen Datenkontext benötigt ein Plugin, wenn es eigene Daten in der Datenbank speichern möchte. Es sei denn es begnügt sich mit der Entität SyncMapping, die ebf. für das speichern von Fremddaten gedacht ist.
 
Admin-Menu ist nur eine Implementierung, um eine Plugin eigene Konfiguration direkt im Backend-Menü zu verlinken. Die eigentliche UI-Implementierung, um Konfigurationsdaten wie API-Key zu speichern ist IConfigurable. Dazu gibt es zahlreiche Beispiele bei GitHub.
 
Im Prinzip müsste man im Plugin eine eigene View mit den Auswahlboxen aufbauen und diese z.B. per IActionFilter oder IResultFilter an die gewünschte Stelle per Widget-Zone ausgeben (z.B. über die Widget-Zone categorydetails_top). Einfache Beispiele für solche Filter finden sich im Dev-Tools-Plugin. Alternativ wird hier z.B. ein Zahlungs-Button im Mini-Warenkorb durch ein Plugin gerendert.

  • stefanmueller und daniel@streetec gefällt das

Marcus Gesing

Smartstore AG


#4 daniel@streetec

daniel@streetec

    Member

  • Members
  • PunktPunkt
  • 12 Beiträge

Geschrieben: 19 January 2022 - 19:40

Hi Marcus,

Hi Stefan,

vielen Dank für die Antworten.

 

Die Abfrage muss im Hintergrund auf die API der TecAlliance (TecDoc) zugreifen. Ein speichern der Daten ist nicht gestattet, daher können die entsprechenden Felder auch nicht in die DB.

 

Ich habe aber mit Euren Hinweisen das ganze schon so weit programmieren können, dass ich die Felder an der richtigen Stelle im Katalog angezeigt bekomme und auch die Daten auswählen kann.

 

Der nächste Schritt ist jetzt herauszufinden, wie ich aus meinem Plugin heraus die Produkte der entsprechenden Kategorie nach einem (am besten für den Kunden nicht sichtbares) Attribut filtern kann...



#5 daniel@streetec

daniel@streetec

    Member

  • Members
  • PunktPunkt
  • 12 Beiträge

Geschrieben: 17 February 2022 - 11:05

Hallo,
ich arbeite weiter - wann immer es die restlichen Aufgaben zulassen - an diesem Plugin.

Ich bin jetzt soweit, dass ich gerne meine eigene Entität in der DB speichern würde, um später darüber Produkte zu Filtern.
Ich bin allerdings an dem Problem angekommen, dass keine Tabellen für meine Entität erzeugt wird und wenn ich einen Eintrag einfügen möchte, kommt es zu einer dementsprechenden Fehlermeldung.
 
Ich habe mich dabei an diesem Thema, sowie dem GoogleMerchantCenter und dem ShippingByWeight Plugin orientiert.

 

kurz dazu:

  1. POCO-(Domain)-Klasse, z.B. TecDocApplicationRecord : BaseEntity (Namespace SmartStore.Tec_Doc.Domain)
  2. Datenbank Mapping-Definition: z.B. TecDocApplicationRecordMap : EntityTypeConfiguration<TecDocApplicationRecord> (Namespace SmartStore.Tec_Doc.Data)
  3. Datenbank-Migrationscode, z.B. public partial class Initial : DbMigration (Namespace SmartStore.Tec_Doc.Data.Migrations)
  4. Configuration: internal sealed class Configuration : DbMigrationsConfiguration<TecDocApplicationObjectContext> (namespace SmartStore.Tec_Doc.Data.Migrations)
  5. Service-(BOM)-Interface, z.B. public partial interface ITecDocApplicationListService (Namespace SmartStore.Tec_Doc.Services)
  6. Service-(BOM)-Implementierung, z.B. public class TecDocApplicationListService : ITecDocApplicationListService (Namespace SmartStore.Tec_Doc.Services)
  7. Registrierung von MyEntityService als Dependency in der DependencyRegistrar-Klasse
builder.RegisterType<TecDocApplicationListService>().As<ITecDocApplicationListService>().InstancePerRequest();

            //data layer
            //register named context
            builder.Register<IDbContext>(c => new TecDocApplicationObjectContext(DataSettings.Current.DataConnectionString))
                .Named<IDbContext>(TecDocApplicationObjectContext.ALIASKEY)
                .InstancePerRequest();

            builder.Register<TecDocApplicationObjectContext>(c => new TecDocApplicationObjectContext(DataSettings.Current.DataConnectionString))
                .InstancePerRequest();

            //override required repository with custom context
            builder.RegisterType<EfRepository<TecDocApplicationRecord>>()
                .As<IRepository<TecDocApplicationRecord>>()
                .WithParameter(ResolvedParameter.ForNamed<IDbContext>(TecDocApplicationObjectContext.ALIASKEY))
                .InstancePerRequest();

Anschließend habe ich das ganze probiert, indem ich mit der VS Extension ein neues Plugin erzeugt habe, wo ich den Datenkontext direkt angehakt habe, mit dem gleichen Fehler...

Kann mir hier jemand weiterhelfen?



#6 Marcus Gesing

Marcus Gesing

    SmartStore AG

  • Administrators
  • 3801 Beiträge

Geschrieben: 17 February 2022 - 12:20

Ich kann keinen Fehler entdecken. Wie lautet die Fehlermeldung? Die Tabellen für Plugin-Entitäten werden erst in der Datenbank angelegt, wenn zum ersten Mal auf sie zugegriffen wird.


Marcus Gesing

Smartstore AG


#7 daniel@streetec

daniel@streetec

    Member

  • Members
  • PunktPunkt
  • 12 Beiträge

Geschrieben: 17 February 2022 - 12:36

Hi Marcus,
genau da tritt mein Fehler ja auch auf. Ich habe eine ControllerAction, die zu Testzwecken einen Dummy-Datensatz anlegt.

 

Der Fehler tritt dann im _context.SaveChanges() auf, es handelt sich um eine SQL-Exception die besagt, dass der Tabellenname "dbo.Tec_Doc" ungültig ist. Unter App_Data/EfCache wird die entsprechende "SmartStore.Tec_Doc.Data.TecDocApplicationObjectContext.edmx" auch angelegt. In der DB die Tabelle dbo.Tec_Doc allerdings nicht.

 

Muss ich über den Package Manager die Migration erstellen? Ich kann allerdings schon nicht "Enable-Migrations" ausführen, dort bekomme ich die Fehlermeldung "no context type was found in the assembly". Build ist auf EF-Migrations festgelegt.

 

 

//Edit:

Hier noch mal der vollständigkeithalber die Exception:

Smartstore.Data.Caching.CachingCommands => CachingCommands.cs Zeile 105

var result = _command.ExecuteReader(behavior);

Message: Ungültiger Objektname "dbo.Tec_Doc".

Server: srv001\sqlexpress,1433

Source: .Net SqlClient Data Provider

StackTrace:   

bei System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

   bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   bei System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   bei System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   bei System.Data.SqlClient.SqlDataReader.get_MetaData()
   bei System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
   bei System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   bei System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   bei System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   bei System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   bei SmartStore.Data.Caching.CachingCommand.ExecuteDbDataReader(CommandBehavior behavior) in C:\Users\seeda1\source\repos\SmartStoreNET\src\Libraries\SmartStore.Data\Caching\CachingCommand.cs:Zeile 105.
   bei System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
   bei System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)
   bei System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.Execute(Dictionary`2 identifierValues, List`1 generatedValues)
   bei System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()


#8 Marcus Gesing

Marcus Gesing

    SmartStore AG

  • Administrators
  • 3801 Beiträge

Geschrieben: 17 February 2022 - 15:27

"Muss ich über den Package Manager die Migration erstellen? Ich kann allerdings schon nicht "Enable-Migrations" ausführen, dort bekomme ich die Fehlermeldung "no context type was found in the assembly"."
Ja. Siehe hier. Ohne Migrationsdatei keine strukturellen Änderungen an der Datenbank. Ist TecDocApplicationObjectContext korrekt?

  • daniel@streetec gefällt das

Marcus Gesing

Smartstore AG


#9 daniel@streetec

daniel@streetec

    Member

  • Members
  • PunktPunkt
  • 12 Beiträge

Geschrieben: 18 February 2022 - 13:40

Perfekt, jetzt hat es geklappt!

Mein Problem war, dass ich jeweils nur mein Plugin Project auf "EF Migration" gestellt habe und nicht die gesamte Projektmappe. Kaum hatte ich das erledigt lief das aktivieren und erstellen der Migration. Jetzt erstellt er mir auch meine Datentabelle :)

 

Es scheint aber noch ein kleines Problem mit der Migrations Tabelle zu geben. Beim ausführen der Migration fehlt ihm wohl die "CreatedOn" Spalte in der DB.... Anscheinend ein bekanntes Problem mit EF.



#10 Marcus Gesing

Marcus Gesing

    SmartStore AG

  • Administrators
  • 3801 Beiträge

Geschrieben: 18 February 2022 - 16:59

Die Meldung kannst du ignorieren. Details siehe hier.


Marcus Gesing

Smartstore AG