tnsem
18-09-2007, 10:59
Nie wiem czy w tym miejscu można umieścić swoje sugestie ale spróbuje.
Moim zdaniem w pliku libraries//joomla/factory.php
kod źródłowy ok lini 445
$options = array(
'db' => &$db,
'db_table_prefix' => $db->getPrefix() . 'core_acl_',
'debug' => 0
);
powinien wyglądać
$options = array(
'db' => &$db,
'db_table_prefix' => '#__' . 'core_acl_',
'debug' => 0
);
ponieważ jest funkcja odpowiedzialna za zmianę prefiksu '#__' na odpowiedni dla danej instalacji a mianowicie /libraries/joomla/database/database.php
function replacePrefix( $sql, $prefix='#__' )
wówczas budując most pomiędzy dwoma joomlami można wpisać następujący kod w tej funkcji zamiast istniejącego kodu a co w efekcie daje możliwość korzystania z tych samych użytkowników w obu joomlach pod warunkiem że jest to na jednej bazie danych i w tym przypadku źródłowymi tabelami są tabele z prefiksem 'jos_'.
function replacePrefix( $sql, $prefix='#__' )
{
$sql = trim( $sql );
$tab_sql = explode('#__',$sql);
$literal = $tab_sql[0];
for ($i=1;$i<count($tab_sql);$i++)
{
if (ereg("contact_details",$tab_sql[$i]) ||
ereg("users",$tab_sql[$i]) ||
ereg("usertypes",$tab_sql[$i]) ||
ereg("core_acl_aro",$tab_sql[$i]) ||
ereg("core_acl_groups_aro_map",$tab_sql[$i]) ||
ereg("core_acl_aro_groups",$tab_sql[$i]) ||
ereg("core_acl_aro_sections",$tab_sql[$i]) ||
ereg("session",$tab_sql[$i]))
{
$literal .= "jos_".$tab_sql[$i];
}
else $literal .= $this->_table_prefix.$tab_sql[$i];
}
return $literal;
}
Dodatkowa sugestia tyczy się budowy tabel z strukturą drzewiastą
np.
CREATE TABLE `jos_core_acl_aro_groups` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11) NOT NULL default '0',
`name` varchar(255) NOT NULL default '',
`lft` int(11) NOT NULL default '0',
`rgt` int(11) NOT NULL default '0',
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id_aro_groups` (`parent_id`),
KEY `jos_gacl_parent_id_aro_groups` (`parent_id`),
KEY `jos_gacl_lft_rgt_aro_groups` (`lft`,`rgt`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=31 ;
jak zauważyłem usuwanie elementów z tej tabeli jest zrobione programowo
gdzie łatwo można zastąpić to wykorzystując mechanizm mysql
chodzi o stworzenie pierwszego elementu o indeksie 0
INSERT INTO `jos_core_acl_aro_groups` VALUES (0, null, 'Korzen', 1, 22, 'Korzen');
i kolejne elementy
INSERT INTO `jos_core_acl_aro_groups` VALUES (17, 0, 'ROOT', 1, 22, 'ROOT');
INSERT INTO `jos_core_acl_aro_groups` VALUES (28, 17, 'USERS', 2, 21, 'USERS');
...
i nadanie relacji
alter table jos_core_acl_aro_groups add CONSTRAINT `par_own_fk` FOREIGN KEY (`parent_id`) REFERENCES `jos_core_acl_aro_groups` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
Pierwszy element pozwala na dodanie referencji ( oczywiście klucz 'parent_id ' musi przybierać wartości null i nie może być innego użycia parent_id jako indeksu i tabela jak wiadomo innodb).
W efekcie usuwając dowolny element usuwamy wszystkich potomków.
Moim zdaniem w pliku libraries//joomla/factory.php
kod źródłowy ok lini 445
$options = array(
'db' => &$db,
'db_table_prefix' => $db->getPrefix() . 'core_acl_',
'debug' => 0
);
powinien wyglądać
$options = array(
'db' => &$db,
'db_table_prefix' => '#__' . 'core_acl_',
'debug' => 0
);
ponieważ jest funkcja odpowiedzialna za zmianę prefiksu '#__' na odpowiedni dla danej instalacji a mianowicie /libraries/joomla/database/database.php
function replacePrefix( $sql, $prefix='#__' )
wówczas budując most pomiędzy dwoma joomlami można wpisać następujący kod w tej funkcji zamiast istniejącego kodu a co w efekcie daje możliwość korzystania z tych samych użytkowników w obu joomlach pod warunkiem że jest to na jednej bazie danych i w tym przypadku źródłowymi tabelami są tabele z prefiksem 'jos_'.
function replacePrefix( $sql, $prefix='#__' )
{
$sql = trim( $sql );
$tab_sql = explode('#__',$sql);
$literal = $tab_sql[0];
for ($i=1;$i<count($tab_sql);$i++)
{
if (ereg("contact_details",$tab_sql[$i]) ||
ereg("users",$tab_sql[$i]) ||
ereg("usertypes",$tab_sql[$i]) ||
ereg("core_acl_aro",$tab_sql[$i]) ||
ereg("core_acl_groups_aro_map",$tab_sql[$i]) ||
ereg("core_acl_aro_groups",$tab_sql[$i]) ||
ereg("core_acl_aro_sections",$tab_sql[$i]) ||
ereg("session",$tab_sql[$i]))
{
$literal .= "jos_".$tab_sql[$i];
}
else $literal .= $this->_table_prefix.$tab_sql[$i];
}
return $literal;
}
Dodatkowa sugestia tyczy się budowy tabel z strukturą drzewiastą
np.
CREATE TABLE `jos_core_acl_aro_groups` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11) NOT NULL default '0',
`name` varchar(255) NOT NULL default '',
`lft` int(11) NOT NULL default '0',
`rgt` int(11) NOT NULL default '0',
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id_aro_groups` (`parent_id`),
KEY `jos_gacl_parent_id_aro_groups` (`parent_id`),
KEY `jos_gacl_lft_rgt_aro_groups` (`lft`,`rgt`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=31 ;
jak zauważyłem usuwanie elementów z tej tabeli jest zrobione programowo
gdzie łatwo można zastąpić to wykorzystując mechanizm mysql
chodzi o stworzenie pierwszego elementu o indeksie 0
INSERT INTO `jos_core_acl_aro_groups` VALUES (0, null, 'Korzen', 1, 22, 'Korzen');
i kolejne elementy
INSERT INTO `jos_core_acl_aro_groups` VALUES (17, 0, 'ROOT', 1, 22, 'ROOT');
INSERT INTO `jos_core_acl_aro_groups` VALUES (28, 17, 'USERS', 2, 21, 'USERS');
...
i nadanie relacji
alter table jos_core_acl_aro_groups add CONSTRAINT `par_own_fk` FOREIGN KEY (`parent_id`) REFERENCES `jos_core_acl_aro_groups` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
Pierwszy element pozwala na dodanie referencji ( oczywiście klucz 'parent_id ' musi przybierać wartości null i nie może być innego użycia parent_id jako indeksu i tabela jak wiadomo innodb).
W efekcie usuwając dowolny element usuwamy wszystkich potomków.