2121namespace Modules \Aggiornamenti \Controlli ;
2222
2323use Models \Module ;
24- use Models \Plugin ;
2524
2625class PluginDuplicati extends Controllo
2726{
@@ -37,25 +36,181 @@ public function getType($record)
3736
3837 public function check ()
3938 {
40- $ duplicati = database ()->fetchArray ('SELECT `idmodule_to`, `title`, `zz_plugins`.`id` FROM `zz_plugins` LEFT JOIN `zz_plugins_lang` ON (`zz_plugins`.`id` = `zz_plugins_lang`.`id_record` AND `zz_plugins_lang`.`id_lang` = ' .prepare (\Models \Locale::getDefault ()->id ).') GROUP BY `idmodule_to`, `title` HAVING COUNT(`title`) > 1 ' );
39+ // 1. Controllo duplicati nel campo 'name' della tabella zz_plugins
40+ $ duplicati_name = database ()->fetchArray ('
41+ SELECT `idmodule_to`, `name`, COUNT(*) as `count`
42+ FROM `zz_plugins`
43+ WHERE `name` IS NOT NULL AND `name` != ""
44+ GROUP BY `idmodule_to`, `name`
45+ HAVING COUNT(*) > 1
46+ ' );
4147
42- foreach ($ duplicati as $ plugin ) {
48+ foreach ($ duplicati_name as $ plugin ) {
4349 $ modulo = Module::find ($ plugin ['idmodule_to ' ]);
44- $ plugin = Plugin::find ($ plugin ['id ' ]);
4550
4651 $ this ->addResult ([
47- 'id ' => $ plugin-> id ,
48- 'nome ' => $ modulo ->getTranslation ('title ' ). ': ' . $ plugin-> getTranslation ( ' title ' ) ,
49- 'descrizione ' => tr ('Il plugin _NAME_ del modulo _MODULE_ esiste più volte ' , [
50- '_NAME_ ' => $ plugin-> getTranslation ( ' title ' ) ,
52+ 'id ' => ' name_ ' . $ plugin[ ' idmodule_to ' ] . ' _ ' . $ plugin [ ' name ' ] ,
53+ 'nome ' => $ modulo ->getTranslation ('title ' ) . ': ' . $ plugin[ ' name ' ] . ' (name) ' ,
54+ 'descrizione ' => tr ('Il plugin _NAME_ del modulo _MODULE_ esiste _COUNT_ volte nella tabella zz_plugins (campo name) ' , [
55+ '_NAME_ ' => $ plugin[ ' name ' ] ,
5156 '_MODULE_ ' => $ modulo ->getTranslation ('title ' ),
57+ '_COUNT_ ' => $ plugin ['count ' ],
5258 ]),
5359 ]);
5460 }
61+
62+ // 2. Controllo plugin diversi con stesso title nello stesso modulo e lingua
63+ $ duplicati_title_diversi = database ()->fetchArray ('
64+ SELECT `zz_plugins`.`idmodule_to`, `zz_plugins_lang`.`title`, `zz_plugins_lang`.`id_lang`,
65+ COUNT(DISTINCT `zz_plugins_lang`.`id_record`) as `count_plugin`,
66+ GROUP_CONCAT(DISTINCT `zz_plugins`.`name`) as `nomi_plugin`
67+ FROM `zz_plugins_lang`
68+ INNER JOIN `zz_plugins` ON `zz_plugins`.`id` = `zz_plugins_lang`.`id_record`
69+ WHERE `zz_plugins_lang`.`title` IS NOT NULL AND `zz_plugins_lang`.`title` != ""
70+ GROUP BY `zz_plugins`.`idmodule_to`, `zz_plugins_lang`.`title`, `zz_plugins_lang`.`id_lang`
71+ HAVING COUNT(DISTINCT `zz_plugins_lang`.`id_record`) > 1
72+ ' );
73+
74+ foreach ($ duplicati_title_diversi as $ plugin ) {
75+ $ modulo = Module::find ($ plugin ['idmodule_to ' ]);
76+ $ lingua = database ()->fetchOne ('SELECT `name` FROM `zz_langs` WHERE `id` = ' .prepare ($ plugin ['id_lang ' ]));
77+
78+ // Estrai solo la parte principale del nome della lingua (es. "English" da "English (English)")
79+ $ nome_lingua = explode (' ( ' , $ lingua ['name ' ])[0 ];
80+
81+ $ this ->addResult ([
82+ 'id ' => 'title_diversi_ ' . $ plugin ['idmodule_to ' ] . '_ ' . $ plugin ['id_lang ' ] . '_ ' . md5 ($ plugin ['title ' ]),
83+ 'nome ' => $ modulo ->getTranslation ('title ' ) . ': ' . $ plugin ['title ' ] . ' ( ' . $ nome_lingua . ') ' ,
84+ 'descrizione ' => tr ('Il titolo "_TITLE_" del modulo _MODULE_ è usato da _COUNT_ plugin diversi (_PLUGINS_) nella lingua _LANG_ ' , [
85+ '_TITLE_ ' => $ plugin ['title ' ],
86+ '_MODULE_ ' => $ modulo ->getTranslation ('title ' ),
87+ '_COUNT_ ' => $ plugin ['count_plugin ' ],
88+ '_PLUGINS_ ' => $ plugin ['nomi_plugin ' ],
89+ '_LANG_ ' => $ nome_lingua ,
90+ ]),
91+ ]);
92+ }
93+
94+ // 3. Controllo record duplicati in zz_plugins_lang con stesso id_record e id_lang
95+ $ duplicati_record_lang = database ()->fetchArray ('
96+ SELECT `zz_plugins`.`idmodule_to`, `zz_plugins_lang`.`id_record`, `zz_plugins_lang`.`id_lang`, COUNT(*) as `count`
97+ FROM `zz_plugins_lang`
98+ INNER JOIN `zz_plugins` ON `zz_plugins`.`id` = `zz_plugins_lang`.`id_record`
99+ GROUP BY `zz_plugins_lang`.`id_record`, `zz_plugins_lang`.`id_lang`
100+ HAVING COUNT(*) > 1
101+ ' );
102+
103+ foreach ($ duplicati_record_lang as $ plugin ) {
104+ $ modulo = Module::find ($ plugin ['idmodule_to ' ]);
105+ $ lingua = database ()->fetchOne ('SELECT `name` FROM `zz_langs` WHERE `id` = ' .prepare ($ plugin ['id_lang ' ]));
106+ $ plugin_record = database ()->fetchOne ('SELECT `name` FROM `zz_plugins` WHERE `id` = ' .prepare ($ plugin ['id_record ' ]));
107+
108+ // Estrai solo la parte principale del nome della lingua (es. "English" da "English (English)")
109+ $ nome_lingua = explode (' ( ' , $ lingua ['name ' ])[0 ];
110+
111+ $ this ->addResult ([
112+ 'id ' => 'record_lang_ ' . $ plugin ['id_record ' ] . '_ ' . $ plugin ['id_lang ' ],
113+ 'nome ' => $ modulo ->getTranslation ('title ' ) . ': ' . $ plugin_record ['name ' ] . ' ( ' . $ nome_lingua . ') ' ,
114+ 'descrizione ' => tr ('Il plugin _NAME_ del modulo _MODULE_ ha _COUNT_ traduzioni duplicate per la lingua _LANG_ ' , [
115+ '_NAME_ ' => $ plugin_record ['name ' ],
116+ '_MODULE_ ' => $ modulo ->getTranslation ('title ' ),
117+ '_COUNT_ ' => $ plugin ['count ' ],
118+ '_LANG_ ' => $ nome_lingua ,
119+ ]),
120+ ]);
121+ }
122+ }
123+
124+ /**
125+ * Indica se questo controllo supporta azioni globali
126+ */
127+ public function hasGlobalActions ()
128+ {
129+ return true ;
55130 }
56131
57132 public function execute ($ record , $ params = [])
58133 {
59- return false ;
134+ // La risoluzione singola non è supportata per questo controllo
135+ // Utilizzare solo la risoluzione globale tramite il pulsante "Risolvi tutti i conflitti"
136+ throw new \Exception (tr ('La risoluzione singola non è supportata. Utilizzare la risoluzione globale. ' ));
137+ }
138+
139+ /**
140+ * Risolve tutti i conflitti eliminando i record più vecchi e mantenendo quello più recente
141+ */
142+ public function solveGlobal ($ params = [])
143+ {
144+ $ results = [];
145+ $ database = database ();
146+
147+ try {
148+ // 1. Risolvi duplicati nel campo 'name' della tabella zz_plugins
149+ $ duplicati_name = $ database ->fetchArray ('
150+ SELECT `id`, `idmodule_to`, `name`
151+ FROM `zz_plugins`
152+ WHERE `name` IS NOT NULL AND `name` != ""
153+ AND (`idmodule_to`, `name`) IN (
154+ SELECT `idmodule_to`, `name`
155+ FROM `zz_plugins`
156+ WHERE `name` IS NOT NULL AND `name` != ""
157+ GROUP BY `idmodule_to`, `name`
158+ HAVING COUNT(*) > 1
159+ )
160+ ORDER BY `idmodule_to`, `name`, `id` DESC
161+ ' );
162+
163+ $ grouped_name = [];
164+ foreach ($ duplicati_name as $ record ) {
165+ $ key = $ record ['idmodule_to ' ] . '_ ' . $ record ['name ' ];
166+ $ grouped_name [$ key ][] = $ record ;
167+ }
168+
169+ foreach ($ grouped_name as $ group ) {
170+ if (count ($ group ) > 1 ) {
171+ // Mantieni il primo record (più recente per ID) ed elimina gli altri
172+ for ($ i = 1 ; $ i < count ($ group ); $ i ++) {
173+ $ database ->query ('DELETE FROM `zz_plugins` WHERE `id` = ' . prepare ($ group [$ i ]['id ' ]));
174+ $ results ['name_ ' . $ group [$ i ]['id ' ]] = true ;
175+ }
176+ }
177+ }
178+
179+ // 2. Risolvi record duplicati in zz_plugins_lang con stesso id_record e id_lang
180+ $ duplicati_record_lang = $ database ->fetchArray ('
181+ SELECT `id`, `id_record`, `id_lang`
182+ FROM `zz_plugins_lang`
183+ WHERE (`id_record`, `id_lang`) IN (
184+ SELECT `id_record`, `id_lang`
185+ FROM `zz_plugins_lang`
186+ GROUP BY `id_record`, `id_lang`
187+ HAVING COUNT(*) > 1
188+ )
189+ ORDER BY `id_record`, `id_lang`, `id` DESC
190+ ' );
191+
192+ $ grouped_record_lang = [];
193+ foreach ($ duplicati_record_lang as $ record ) {
194+ $ key = $ record ['id_record ' ] . '_ ' . $ record ['id_lang ' ];
195+ $ grouped_record_lang [$ key ][] = $ record ;
196+ }
197+
198+ foreach ($ grouped_record_lang as $ group ) {
199+ if (count ($ group ) > 1 ) {
200+ // Mantieni il primo record (più recente per ID) ed elimina gli altri
201+ for ($ i = 1 ; $ i < count ($ group ); $ i ++) {
202+ $ database ->query ('DELETE FROM `zz_plugins_lang` WHERE `id` = ' . prepare ($ group [$ i ]['id ' ]));
203+ $ results ['record_lang_ ' . $ group [$ i ]['id ' ]] = true ;
204+ }
205+ }
206+ }
207+
208+ return $ results ;
209+
210+ } catch (\Exception $ e ) {
211+ throw new \Exception (tr ('Errore durante la risoluzione dei conflitti: _ERROR_ ' , [
212+ '_ERROR_ ' => $ e ->getMessage (),
213+ ]));
214+ }
60215 }
61216}
0 commit comments