CMS en relaties in verschillende tabellen

Pagina: 1
Acties:

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 21:54
Ik ben benieuwd hoe mensen omgaan met een (modulair) CMS waarbij data opgeslagen moet worden in meerdere tabellen met behulp van een koppeltabel.

Bijvoorbeeld een module personen en een module groepen. Als een persoon in een onbeperkt aantal groepen kan zitten, zal er een koppeltabel gebruikt moeten worden om die relaties aan te geven.

Het beheren van een module zonder relaties is uiteraard makkelijk; in een module geef je aan wat voor formuliervelden er moeten worden weergegeven en het CMS zorgt ervoor dat er nieuwe items kunnen worden toegevoegd en dat bestaande records bewerkt kunnen worden.

Bij één op veel relaties krijg je te maken met afhankelijkheden. Vanwege de database (mysql) wil ik dit niet op databaseniveau regelen, maar in de code. Ik heb een module 'modules' die gegevens van een module opslaat in een databasetabel (titel van module, aantal items per pagina, datumformaat, weergeven in menu, etc). In die tabel zou je ook aan kunnen geven waarvan deze module een parent of child is (met gewoon een dropdown menuutje).

Toch kan ik nog niet helemaal bedenken hoe je op een mooie manier (met weinig code een nieuwe module opzetten) een module kunt aanmaken die gebruik maakt van een koppeltabel, met bijkomende problemen: betekent het verwijderen van een parent verwijdering van child(s) of moet een parent eerst 'leeg' zijn?

Misschien iemand een interessante kijk hierop?

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Bijvoorbeeld een module personen en een module groepen. Als een persoon in een onbeperkt aantal groepen kan zitten, zal er een koppeltabel gebruikt moeten worden om die relaties aan te geven.
Waarom zou dat moeten? Je hebt toch maar 1 gebruiker dan, die bijvoorbeeld in meerdere groepen kan zitten, je hoeft dus alleen maar in een tabel de groepen aan te geven, waar de gene lid van is. Vraag is echter waarom je iemand in meerdere groepen zou willen hebben... :)

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Misschien kan je eens kijken naar de implementatie daarvan in Ruby on Rails of Cake, die gebruik maken van patterns als ActiveRecord :) .

DM!


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 21:54
Waarom is niet de vraag. Dat kan in heel veel gevallen voorkomen; er zijn genoeg situaties te bedenken wanneer 1 persoon in meerdere groepen zit. Dat moet je op gaan slaan in een koppeltabel. (of ranzig in een varchar, bijvoorbeeld komma gescheiden, maar dát wil ik juist niet).

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 20-02 15:44
In Typo3 heb je een globale array, de TCA array, waarin alle databasevelden beschreven worden. Zo kan je aangeven in die array hoeveel tekens er in een veld mogen, of het veld gecontroleerd moet worden op email/websites en nog veel meer. In het document "inside typo3" bij google vind je wel een voorbeeld denk ik.

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 21:54
patterns als ActiveRecord
Dat is toch gewoon het werken met data-objecten? Dat zou betekenen dat voor elke module een class geschreven zou moeten worden met de juiste kolommen en relaties die zorgt voor de opslag van een record.

Een module is nu weinig code:


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$oForm = new cForm($oDatabase);

$oForm->fDBSelectField($title = 'Parent', $name =  'parent', $module =  'cats', $titleColumn =  'titel', '', null, 1, array(0 => 'Geen parent'), true, true);
$oForm->fDBSelectField('Product', 'product', 'producten', 'titel', '', null, 1, array(0 => 'Geen product'));
$oForm->fLinkFields('parent', 'product');

$oForm->fTextField('Titel', 'titel', FH_NOT_EMPTY);
$oForm->fEditor('Omschrijving', 'omschrijving');

$oForm->fOverview(array('parent', 'product', 'titel'));

$oForm->fOutPut();

?>


Dit is nu álle code voor een module. Deze module geeft een overview met records, een formulier voor wijziging van bestaande records en een formulier voor toevoegen van een nieuw record. De database tabel wordt automatisch aangemaakt op basis van de validatie van de velden en de veldtypes. Het formulier bevat twee selects die data ophaalt uit een andere module, deze twee selects zijn afhankelijk van elkaar (parent - child). De selects worden met ajax live gelinkt aan elkaar.

Dat dus voor een module met 1 op veel relaties, nu nog door naar veel op veel relaties. :)


@djluc: kun je iets vertellen over hoe er relaties gelegd worden in de TCA array? ik vind het document wel, maar vind daarin niet direct iets over relaties

[ Voor 12% gewijzigd door orf op 05-04-2006 21:56 ]


  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

orf schreef op woensdag 05 april 2006 @ 21:54:
[...] Dat is toch gewoon het werken met data-objecten? Dat zou betekenen dat voor elke module een class geschreven zou moeten worden met de juiste kolommen en relaties die zorgt voor de opslag van een record.
Nee :) . Met behulp van conventies wordt er uit de classname al direct de juiste tabel gehaald, de kolommen worden uit de database bepaald. Relations leg je met iets als $this->relations[] = array("has_and_belongs_to_many", "users");, waaruit ook weer "by convention" de naam van de koppeltabel wordt afgeleid :) .

DM!


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 21:54
Ok, dat klinkt al interessanter :)
Nu gebruik ik al conventies voor modules (naam van module is naam van map waarin scriptje staat en is de naam van de bijbehorende tabel) en elementen (naam van element is in meeste gevallen naam van kolom).

Misschien kan er iets in een initialisatie van het module object vastgelegd worden mbt de relaties. Ik ga daar eens wat mee proberen. Bedankt.
:)
Pagina: 1