PDA

Zobacz pełną wersję : Drobne modyfikacje



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.

nexus246
18-09-2007, 13:02
Jeśli o klucze obce i kaskadowe usuwanie to sądzę że chodzi o tyb tabel - MyISAM z tego co pamiętam nie obsługuje kluczy obcych.

Pomysł na modyfikację jest bardzo ciekawy, przetestowałeś już?

tnsem
18-09-2007, 13:12
Typ tabel innodb i testowalem to już. Zrobilem sobie menu z zapisem id i parent_id i title prosta tabela i oczywiście po usunięciu jakiegokolwiek elementu wszystkie powiązania zostają również usunięte.

tnsem
18-09-2007, 13:14
Chodzi tu o sam fakt wstawienia referencji (parent_id) na ta samą tabele ale na klucz główny (id).