Groepenbeheer, hoe subgroepen van subgroepen maken ?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Major Apollo

Major Apollo

03/04/2007 14:42:00
Quote Anchor link
ik ben bezig een groep-met subgroepen script aan het maken, alles werkt perfect als ik maar 1 subgroep onder de hoofdgroep maak maar als ik bvb subgroepen van subgroepen wens te maken dan zie ik het niet meer hoe ik verder moet...

zit hier nu al sinds deze morgen op te zoeken en wordt bijna gek ...

de functie :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function Lijst_Beroepen(){

    $dbconnect        = mysql_connect (DBhost,DBgebruiker,DBwachtwoord) or die ("Kan niet verbinden: " . mysql_error());
    $dbselect         = mysql_select_db (DBnaam,$dbconnect);
    
    $sql_result = mysql_query ("SELECT * FROM webcms_groepen WHERE subgroepVan = '0'");

    $tmpHtml    = '<select name="F_GBberoepen">';    

    while ($row=mysql_fetch_array ($sql_result)) {
        
        $HoofdGroep     = $row['groepnaamNL'];
        $HoofdGroepId = $row['groepId'];

        $sql_result2 = mysql_query ("SELECT * FROM webcms_groepen WHERE subgroepVan='".$HoofdGroepId."'");
        
        while ($subrow=mysql_fetch_array ($sql_result2)) {
        $tmpHtml .= '<option value="'.$subrow['id'].'">'.$HoofdGroep.' - '.$subrow['groepnaamNL'].'</option>';            
        }
    
    }

    $tmpHtml .= '</select>';
    return $tmpHtml;
}

De tabel :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE `webcms_groepen` (
  `groepId` int(10) NOT NULL auto_increment,
  `subgroepVan` int(10) NOT NULL default '0',
  `groepnaamNL` text,
  `groepnaamFR` text,
  PRIMARY KEY  (`groepId`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `webcms_groepen` VALUES ('1', '0', 'Hoofdgroep 1 NL', 'Hoofdgroep 1 FR');
INSERT INTO `webcms_groepen` VALUES ('2', '0', 'Hoofdgroep 2 NL', 'Hoofdgroep 2 FR');
INSERT INTO `webcms_groepen` VALUES ('3', '1', 'Subgroep 1 NL', 'Subgroep 1 FR');
INSERT INTO `webcms_groepen` VALUES ('4', '2', 'Subgroep 2  NL', 'Subgroep 2 FR');
INSERT INTO `webcms_groepen` VALUES ('5', '4', 'Subgroep 2  subgroep NL', null);
Gewijzigd op 01/01/1970 01:00:00 door Major Apollo
 
PHP hulp

PHP hulp

23/12/2024 02:54:05
 
- SanThe -

- SanThe -

03/04/2007 14:49:00
Quote Anchor link
Zet code tags om het script en lees de regels om te posten eens door. Verzin daarna de bijbehorende vraag.
 
Frank -

Frank -

03/04/2007 14:58:00
Quote Anchor link
Tip: Ga normaliseren

CREATE TABLE `webcms_groepen` (
`groepId` int(10) NOT NULL auto_increment,
`subgroepVan` int(10) NOT NULL default '0',
`groepnaamNL` text,
`groepnaamFR` text,

groepnaamNL en groepnaamFR zet je in een aparte tabel. Dan kun je de overige talen er ook bijzetten zonder dat je extra kolommen aan hoeft te maken. Het datamodel mag nooit afhankelijk zijn van de data en dit is hier wel het geval. Voor de taal NL heb jij een andere kolom nodig dan de taal FR. NL en FR zijn gewoon records in de tabel 'talen'.

talen:
id
iso_code

webcms_groepen:
groepnaam
+ de rest

groepnaam
id_webcms_groepen (foreignkey)
id_talen (foreignkey)
naam

Weer een probleem opgelost!
 
Rudie dirkx

rudie dirkx

03/04/2007 15:00:00
Quote Anchor link
Zoals ik het begrijp wil je een recursieve functie, die steeds alle subgroepen ophaalt van een groep. Het enige wat je dan nodig hebt is een begin, en childs.

Er zijn maar twee belangrijke velden in je tabel (excl. de naam): groepId, parentGroepId (alleen je noemt ze iets anders).

Zou zoiets niet werken?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

[code]<?php

function getGroups( $f_iParent = 0, $f_szLevels = '' )
{

    $qThisLevelGroups = _query("SELECT groupId, groupName FROM groups WHERE parentGroupId = '".$f_iParent."';");
    $szHTML = "";
    while ( $arrGroup = _fetch_assoc($qThisLevelGroups) )
    {

        $szHTML .= $f_szLevels.'<option value="'.$arrGroup['groupId'].'">'.$f_szLevels.$arrGroup['groupName'].'</option>' . PHP_EOL;
        $szHTML .= getGroups($arrGroup['groupId'], $f_szLevels."\t");
    }


    return $szHTML;
}


?>


?>


Edit:
Normaliseren heeft in dit geval absoluut geen zin en is misschien wel onmogelijk. Je wil namelijk een recursieve tabel...
Gewijzigd op 01/01/1970 01:00:00 door rudie dirkx
 
Major Apollo

Major Apollo

03/04/2007 15:02:00
Quote Anchor link
bedankt voor de reakties, trouwens weet er niemand een voorbeeldscript van iets soortgelijks ?
 
Rudie dirkx

rudie dirkx

03/04/2007 15:08:00
Quote Anchor link
Werkt perfect:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

mysql_connect();
mysql_select_db("phphulp");


echo '<select name="groups">'.PHP_EOL . getGroups() . '</select>';


function
getGroups( $f_iParent = 0, $f_szLevels = '' )
{

    $qThisLevelGroups = mysql_query("SELECT groupId, groupName FROM groups WHERE parentGroupId = '".$f_iParent."';");
    $szHTML = "";
    while ( $arrGroup = mysql_fetch_assoc($qThisLevelGroups) )
    {

        $szHTML .= "\t".$f_szLevels.'<option value="'.$arrGroup['groupId'].'">' . str_replace("\t", '&nbsp;&nbsp;&nbsp;', $f_szLevels.$arrGroup['groupName']) . '</option>' . PHP_EOL;
        $szHTML .= getGroups($arrGroup['groupId'], $f_szLevels."\t");
    }


    return $szHTML;
}


?>


Edit:
Als je je tabel innoDB maakt (is een aanrader), kan je zorgen dat je nooit overhead data in je tabel hebt en altijd correcte keys. Moet je parentGroupId linken naar groupId en wel ff parentGroupId standaard op NULL zetten (in sql) en niet op '0' controleren in de functie, maar op NULL.
0 is namelijk geen valid groupId, dus dan gaat je constriction zeiken. NULL is wel valid.
Gewijzigd op 01/01/1970 01:00:00 door rudie dirkx
 
Major Apollo

Major Apollo

03/04/2007 15:17:00
Quote Anchor link
Bedankt t vercetti,

werkt prima en je hebt me wel ff heel hard gehlpen want zit met een deadline voor morgen... dus nogmaals van harte bedankt !
 
Frank -

Frank -

03/04/2007 15:23:00
Quote Anchor link
Quote:
Normaliseren heeft in dit geval absoluut geen zin en is misschien wel onmogelijk. Je wil namelijk een recursieve tabel...
Daar denk ik dus anders over, ik zou dit wel willen normaliseren. Ik wil niet voor het toevoegen van een nieuwe taal mijn hele database-model overhoop halen en alle API's gaan aanpassen, moet er niet aan denken.

Maar beide oplossingen zijn mogelijk, daar heb je gelijk in.
 
Rudie dirkx

rudie dirkx

03/04/2007 15:59:00
Quote Anchor link
Voor de taal heb je trouwens helemaal gelijk hoor :) De taal zou perfect normaliseerbaar zijn. Dat is een feit. Ik bedoelde echter het recursief zijn van de tabel (daar ging het probleem over toch!?).
 
Frank -

Frank -

03/04/2007 16:07:00
Quote Anchor link
@vercetti: We zijn het dus helemaal met elkaar eens, ik was wellicht niet helemaal duidelijk in mijn reactie over het normaliseren. Het ging mij uitsluitend om de talen, met de rest is namelijk niets mis. Soms is een half woord niet genoeg, communicatie via een forum verdient toch wat meer aandacht... Zal er op letten!
 
Rudie dirkx

rudie dirkx

03/04/2007 16:40:00
Quote Anchor link
major apollo graag gedaan
frank, lol, let er vooral op ;)
 
Major Apollo

Major Apollo

03/04/2007 17:46:00
Quote Anchor link
kzit nog met 1 vraag, hoe moet ik mijn SQL query opbouwens als ik een groep/subgroep (en de subgroepen daaronder) wens te wissen ?
 
Major Apollo

Major Apollo

04/04/2007 15:21:00
Quote Anchor link
heb deze funktie wat uitgebreid om een groepID mee te geven, deze groepID moet er dan voor zorgen dat de juiste groep geselecteerd is ...

Maar helaas krijg ik een fout:
Warning: Missing argument 3 for toongroepen()

de html waar ik de funtkie in oproep:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<select name="F_GBberoepen">'.toonGroepen($row['bedrijfSector']).'</select>


en dan de funktie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function toonGroepen( $f_iParent = 0, $f_szLevels = '',$groepID ) {

        echo $groepID;
        exit;
        $dbconnect        = mysql_connect (DBhost,DBgebruiker,DBwachtwoord) or die ("Kan niet verbinden: " . mysql_error());
        $dbselect         = mysql_select_db (DBnaam,$dbconnect);

    $qThisLevelGroups = mysql_query("SELECT groepId, groepnaamNL FROM webcms_groepen WHERE subgroepVan = '".$f_iParent."';");
    $szHTML = "";
    while ( $arrGroup = mysql_fetch_assoc($qThisLevelGroups) )
    {
        if ($groepID == $arrGroup['groepId']){ $selectcode='selected="selected"'; } else { $selectcode=''; }
                $szHTML .= $f_szLevels.'<option value="'.$arrGroup['groepId'].'" '.$selectcode.'>' . str_replace("\t", '&nbsp;&nbsp;&nbsp;', $f_szLevels.$arrGroup['groepnaamNL']) . '</option>' . PHP_EOL;
        $szHTML .= toonGroepen($arrGroup['groepId'], $f_szLevels."\t",$groepID);
    }

    return $szHTML;
}


Wat ik dus heb bijgevoed is :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if ($groepID == $arrGroup['groepId']){ $selectcode='selected="selected"'; } else { $selectcode=''; }
 
Major Apollo

Major Apollo

04/04/2007 15:29:00
Quote Anchor link
oops voel me zo noob, heb hem intussen gevonden ...

moest gewoon in de html extra args meegeven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<select name="F_GBberoepen">'.toonGroepen(0,'',$row['bedrijfSector']).'</select>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.