[Frage] Formular Werte automatisch verändern in Extension in Abhängigkeit zuvor gewählter Einträge

  • Halion Halion
    Sternenflotten-Admiral
    0 x
    165 Beiträge
    1 Hilfreiche Beiträge
    20. 02. 2014, 11:44

    Hallo Typo3 Gemeinde,

    ich würde gerne eine Rechner Extension bauen.
    ich habe dafür ein Formular mit einem Select Feld für die Kategorie(z.B. Milchprodukte), einem Select Feld für Werte aus dieser gewählten Kategorie (z.B. Sahne) und einem Select Feld mit den Einheiten dieser Werte(z.B. ml). Dass ganze soll ein Kalorienrechner werden.

    Jetzt würde ich gerne das wenn im ersten Select Feld z.B. Milchprodukte gewählt wird im zweiten Select Feld nur die Werte aus der Kategorie Milchprodukte erscheinen und wenn im zweiten Select Feld dann z.B. Sahne gewählt wurde im dritten Select Feld automatisch die möglichen Einheiten von Sahne erscheinen (z.B. ml, oder L) und keine anderen.

    Ich dachte daran im Extension Builder ein Modell für Kategorie, eines für Produkt und eines für Einheiten anzulegen. Dann werden im Backend Produkte angelegt, welche eine Kategorie und eine Messgröße haben. Das zentrale Domänenobjekt wären dann die Produkte?

    Wie würdet Ihr das angehen?

    Wäre Super wenn jemand einen Tip hat??

    Grüße
    Halion


  • 1
  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    20. 02. 2014, 13:37

    Hallo,

    ich hab mal sowas ähnliches gemacht - es ging um Angebot, Rechnung, Mahnung erstellen.
    In der Rechnung tauchen Einheiten auf wie Arbeitsstunden, Laufmeter, Kilogramm, uvm.
    Die Datenmodellierung ist gar kein Problem - Einheit, Kategorie, sind selbstverständlich ValueObjects.

    Das Problem wird sein, daß du eine Kategorie auswählst und wenn du aufgrund dieser Auswahl die zweiten Select-options einschränken willst, musst du entweder die Seite neu laden oder asynchron mit Ajax an die Sache rangehen.

  • Halion Halion
    Sternenflotten-Admiral
    0 x
    165 Beiträge
    1 Hilfreiche Beiträge
    20. 02. 2014, 16:28

    Ja, ich denke Ajax wird die Wahl sein.
    benötige ich dann für die Ajax request einzelne Views wo die Logik durchgeführt wird und von welcher ich mir per Ajax die Daten hole?

    Also in der Form: In der Listview werden die Kategorien in Select-Feld angezeigt, die wird an einen Action Controller übergeben und zurück hole ich mir dann die entsprechende Ausgabe sprich aller Produkte per Ajax?

    Grüße

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    20. 02. 2014, 20:37

    Ich hab nichts asynchrones machen müssen - kann dir zu Ajax auch fast nichts sagen.

    Aber ich denke, du kannst eine Funktion anwerfen, die dir ein Array liefert, welches durch die erste Auswahl gefiltert wird... z.B. findAllProductsByCategory()
    Und die musst du eben asynchron anwerfen (ohne die Seite neu laden zu müssen). Mit Ajax kann ich dir aber nicht weiterhelfen.

    Deine View bleibt dann die selbe.

  • volk0r volk0r
    Padawan
    0 x
    59 Beiträge
    3 Hilfreiche Beiträge
    21. 02. 2014, 08:44

    redest du vom backend oder vom frontend? solltest du vom backend reden, so musst du das tca entsprechend anpassen.

    beispielsweise habe ich eine extension, die kategorien abhängigkeiten hat. ich habe das wie folgt gelost.

    1. in der ext_tables.php deiner extension musst du ein requestUpdate für dein gewünschtes formularfeld aktivieren.

    1. $TCA['tx_[extkey]_domain_model_[model]']['ctrl']['requestUpdate'] = "sys_language_uid,categories,listtype"; // die felder, bei denen ein request update angefordert werden soll. in dem fall wird beim ändern der sprache, der kategorien und dem listtype ein reload der seite angeforder. achtung, es wird bereits ein datensatz angelegt, da gleich gespeichert wird.

    2. im tca deines formulars musst du für deine abhängigen formulare entsprechend eine where bedingung mit anhängen.

    1. $TCA['tx_[extkey]_domain_model_[model]']['columns']['categories']['config']['foreign_table_where'] = ' AND sys_language_uid = ###REC_FIELD_sys_language_uid###'; // dies lädt nur die einträge in der jeweiligen sprache
    2.  
    3.  
    4. $TCA['tx_[extkey]_domain_model_[model]']['columns']['subcategories']['config'] = array(
    5. 'type' => 'select',
    6. 'foreign_table' => 'tx_[extkey]_domain_model_subcategories',
    7. 'foreign_table_where' => ' AND sys_language_uid = ###REC_FIELD_sys_language_uid### ORDER BY name',
    8. 'MM' => 'tx_[extkey]_ethdb_subcategories_mm',
    9. 'size' => 10,
    10. 'autoSizeMax' => 30,
    11. 'maxitems' => 9999,
    12. 'multiple' => 0,
    13. 'itemsProcFunc' => 'SubcategoriesSelect->Items', // das ist dafür zuständig, um eine eigene funktion aufzurufen, die dann die felder lädt die abhängig von der hauptkategorie ist. das ist eine einfache klasse.
    14. );

    ich hoffe du kommst damit zurecht.

  • 1