diff --git a/README.md b/README.md index b9ddf71..6e75022 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -Progetto per un sito di introduzione a mastodon ([vedi il pad su cisti](https://pad.cisti.org/p/uhXFbSxe5EaMPE4syEKI)) che dia inoltre la possibilità di scegliere un'istanza in base a vari criteri, da una base di istanze sufficientemente occhei. +Progetto per un sito di introduzione a mastodon ([al momento pubblicato qui](https://rame.altervista.org/mastostart/)) che dia inoltre la possibilità di scegliere un’istanza in base a vari criteri, da una base di istanze sufficientemente occhei. diff --git a/web/admin/.htaccess b/web/admin/.htaccess new file mode 100644 index 0000000..226358b --- /dev/null +++ b/web/admin/.htaccess @@ -0,0 +1,2 @@ +RewriteEngine Off +RewriteEngine On diff --git a/web/admin/crawler/crawler.php b/web/admin/crawler/crawler.php index db4279e..543edda 100755 --- a/web/admin/crawler/crawler.php +++ b/web/admin/crawler/crawler.php @@ -600,7 +600,7 @@ while ($i<$cinsts) { $res=mysqli_query($link,'SELECT * FROM Instances WHERE URI=\''.myesc($link,mb_substr($dom,0,$tables['Instances']['URI'],'UTF-8')).'\'') or mexit(mysqli_error($link).N,3); if (mysqli_num_rows($res)>0) { - lecho('«'.$dom.'» non risponde, ma è presente nel database; aggiorno InstChecks.'); + lecho('«'.$dom.'» non risponde, ma è presente nel database; aggiorno InstChecks.'.N); $row=mysqli_fetch_assoc($res); mysqli_query($link,'INSERT INTO InstChecks (InstID, Time, Status) VALUES ('.$row['ID'].', '.time().', 0)') or mexit(mysqli_error($link).N,3); @@ -613,7 +613,7 @@ while ($i<$cinsts) { } if ($ok && !is_null($info) && akeavinn('uri',$info) && !is_null(nempty($info['uri'])) && !willtrunc($info['uri'],'Instances','URI') && akeavinn('version',$info) && preg_match('/pleroma|pixelfed/i',$info['version'])===0) { $qok++; - $instrow=array('ID'=>null, 'New'=>0, 'Good'=>0, 'Chosen'=>0, 'Visible'=>0, 'Blacklisted'=>0, 'URI'=>null, 'Title'=>null, 'ShortDesc'=>null, 'LongDesc'=>null, 'OurDesc'=>null, 'PlaceID'=>null, 'Email'=>null, 'Software'=>null, 'Version'=>null, 'UserCount'=>null, 'StatusCount'=>null, 'DomainCount'=>null, 'ActiveUsersMonth'=>null, 'ActiveUsersHalfYear'=>null, 'Thumb'=>null, 'RegOpen'=>null, 'RegReqApproval'=>null, 'MaxTootChars'=>null, 'AdmAccount'=>null, 'AdmDisplayName'=>null, 'AdmCreatedAt'=>null, 'AdmNote'=>null, 'AdmURL'=>null, 'AdmAvatar'=>null, 'AdmHeader'=>null); + $instrow=array('ID'=>null, 'New'=>0, 'Good'=>0, 'Chosen'=>0, 'Visible'=>0, 'Blacklisted'=>0, 'URI'=>null, 'Title'=>null, 'ShortDesc'=>null, 'LongDesc'=>null, 'OurDesc'=>null, 'LocalityID'=>null, 'Email'=>null, 'Software'=>null, 'Version'=>null, 'UserCount'=>null, 'StatusCount'=>null, 'DomainCount'=>null, 'ActiveUsersMonth'=>null, 'ActiveUsersHalfYear'=>null, 'Thumb'=>null, 'RegOpen'=>null, 'RegReqApproval'=>null, 'MaxTootChars'=>null, 'AdmAccount'=>null, 'AdmDisplayName'=>null, 'AdmCreatedAt'=>null, 'AdmNote'=>null, 'AdmURL'=>null, 'AdmAvatar'=>null, 'AdmHeader'=>null); if (array_key_exists($info['uri'],$blacklist)) $instrow['Blacklisted']=1; $instrow['URI']=$info['uri']; @@ -724,7 +724,7 @@ while ($i<$cinsts) { if ($instrow['LongDesc']!=$oldinstrow['LongDesc']) notify('
La «Descrizione lunga» dell’istanza «'.$instrow['URI'].'» è cambiata. La vecchia era...
La nuove è...
Ciao sono una istanza | ||||||||||
+ + Orpo + |
Ciao,
+qui puoi usare un accrocchio che ho fatto per la sezione di admin della Mastodon Startpage; chiamiamolo “browser di istanze lato admin”; è uno strumento che permette di “sfogliare” e cercare-ordinare secondo tanti criteri un database di metadati relativi a tante istanze mastodon (poi spiego meglio). Non è il browser di istanze che dovrebbe poi essere mostrato “lato utente” sulla Mastodon Startpage, quello ancora non c’è; è invece quello destinato “a uso interno”, “lato admin”, quindi è un po’ più complicato all’uso, ma anche più duttile, rispetto a come pensavo di fare quello “lato utente”.
+Ho deciso di renderlo pubblicamente utilizzabile soprattutto perché così magari può essere testato più a fondo.
+Rispetto alla versione su cui sto lavorando ha solo tre limitazioni: la possibilità di salvare-modificare-cancellare dei preset di ricerca e ordinamento è disabilitata, i criteri di ricerca impostabili sono al massimo otto, i criteri di ordinamento impostabili sono al massimo sei.
+Qualche parola in più sul progetto nel suo insieme, per come l‘avevamo pensato io che son pongrebio e Ca_Gi. In pratica si dovrebbe comporre di vari accrocchi, alcuni dei quali ci sono già, altri invece no: un crawler (c’è) che periodicamente recupera e salva-aggiorna in un database tutti i metadati disponibili relativi alle istanze note a cinque istanze italiane amiche, che al momento sono bida, cisti, nebbia (da un po’ di tempo è rotta), snapj e stereodon, tenendo conto delle rispettive “blacklist” (liste di istanze bloccate), ovvero marcando come tali le istanze blacklistate da una qualsiasi delle cinque istanze amiche, e marcando inoltre come “papabili” le istanze che corrispondono a certi criteri (l’istanza non è blacklistata, la registrazione di nuovi account è aperta, il numero di utenti è compreso tra 10 e 30.000, il numero di istanze note all’istanza è maggiore di 500, il numero di utenti attivi negli ultimi 30 giorni è maggiore di 10); una sezione di admin con un accrocchio (c’è, è quello linkato all’inizio ma poi anche qui) per “sfogliare” questi dati e un altro accrocchio (non c’è) che dia la possibilità di editarli, ovvero per ogni istanza nota poter per esempio scegliere se renderla visibile tramite il “browser di istanze lato utente” e poterne editare alcuni metadati aggiuntivi/alternativi rispetto a quelli “standard” recuperati dal crawler: una descrizione alternativa (perché quella impostata dagli admin e disponibile tra i metadati “standard” recuperabili dal crawler è spesso troppo vaga o troppo scarna o troppo lunga), una localizzazione geografica (relativa al collettivo o al singolo che gestisce l’istanza, non alla collocazione del server; metadato non presente tra quelli “standard”), le lingue più impiegate sull’istanza (quella dichiarata nei metadati “standard” recuperabili dal crawler spesso non corrisponde a quella maggiormente impiegata realmente sull’istanza, e ci sono istanze spiccatamente multilingue), modalità di finanziamento (metadato non presente tra quelli “standard”), restrizioni (policy) sui contenuti postabili (metadato non presente tra quelli “standard”), tag descrittive riassuntive del tipo di istanza (metadato non presente tra quelli “standard”). Questi metadati aggiuntivi/alternativi rispetto a quelli “standard” hanno già le proprie strutture nel database e sono visibili dal “browser di istanze lato admin”, quello che manca è appunto la possibilità di editarli; manca inoltre una pagina di gestione degli account admin e, come già detto, il browser di istanze “lato utente”.
+Se qualcuno volesse dare una mano il codice si trova qui, nella cartella web/admin.
'.print_r($_POST,1).''; +$page=0; +if (array_key_exists('p',$_POST) && preg_match('/^[0-9]*$/',$_POST['p'])==1) + $page=$_POST['p']+0; + /*SELECT *, Instances.ID AS IID, GROUP_CONCAT(OrdOurLanguages.NameIt ORDER BY OrdInstOurLangs.Pos ASC SEPARATOR '; ') AS OrdOurLangs FROM Instances LEFT JOIN InstOurLangs ON InstOurLangs.InstID=Instances.ID LEFT JOIN Languages AS OurLanguages ON OurLanguages.ID=InstOurLangs.OurLangID LEFT JOIN InstOurLangs AS OrdInstOurLangs ON OrdInstOurLangs.InstID=Instances.ID LEFT JOIN Languages AS OrdOurLanguages ON OrdOurLanguages.ID=OrdInstOurLangs.OurLangID WHERE OurLanguages.NameIT LIKE '%italiano%' GROUP BY IID LIMIT 50*/ $cols=array( - 'Instances.New'=>array('field'=>'Instances.New','name'=>'Nuova','type'=>'bool'), - 'Instances.Good'=>array('field'=>'Instances.Good','name'=>'Papabile','type'=>'bool'), - 'Instances.Chosen'=>array('field'=>'Instances.Chosen','name'=>'Scelta','type'=>'bool'), - 'Instances.Visible'=>array('field'=>'Instances.Visible','name'=>'Visibile','type'=>'bool'), - 'Instances.Blacklisted'=>array('field'=>'Instances.Blacklisted','name'=>'Blacklistata','type'=>'bool'), + 'Instances.New'=>array('field'=>'Instances.New','name'=>'[Nuova]','type'=>'bool'), + 'Instances.Good'=>array('field'=>'Instances.Good','name'=>'[Papabile]','type'=>'bool'), + 'Instances.Chosen'=>array('field'=>'Instances.Chosen','name'=>'[Scelta]','type'=>'bool'), + 'Instances.Visible'=>array('field'=>'Instances.Visible','name'=>'[Visibile]','type'=>'bool'), + 'Instances.Blacklisted'=>array('field'=>'Instances.Blacklisted','name'=>'[Blacklistata]','type'=>'bool'), 'Instances.URI'=>array('field'=>'Instances.URI','name'=>'URI','type'=>'text'), 'Instances.Title'=>array('field'=>'Instances.Title','name'=>'Titolo','type'=>'text'), 'Instances.ShortDesc'=>array('field'=>'Instances.ShortDesc','name'=>'Descrizione breve','type'=>'text'), 'Instances.LongDesc'=>array('field'=>'Instances.LongDesc','name'=>'Descrizione lunga','type'=>'text'), - 'Instances.OurDesc'=>array('field'=>'Instances.OurDesc','name'=>'Descrizione nostra','type'=>'text'), + 'Instances.OurDesc'=>array('field'=>'Instances.OurDesc','name'=>'[Descrizione nostra]','type'=>'text'), //-------------------------------- - 'Instances.LocalityID'=>array('field'=>'Instances.LocalityID','name'=>'Località ⮞','type'=>'join','join'=>array(),'ord'=>false), - 'Localities.Locality'=>array('field'=>'Localities.Locality','name'=>'Località','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID'),'subtype'=>'text'), + 'Instances.LocalityID'=>array('field'=>'Instances.LocalityID','name'=>'[Località] ⮞','type'=>'join','join'=>array(),'ord'=>false), + 'Localities.Locality'=>array('field'=>'Localities.Locality','name'=>'[Località]','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID'),'subtype'=>'text'), - 'Provinces.ID'=>array('field'=>'Provinces.ID','name'=>'Provincia ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID'),'ord'=>false), - 'Provinces.Province'=>array('field'=>'Provinces.Province','name'=>'Provincia','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID'),'subtype'=>'text'), + 'Provinces.ID'=>array('field'=>'Provinces.ID','name'=>'[Provincia] ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID'),'ord'=>false), + 'Provinces.Province'=>array('field'=>'Provinces.Province','name'=>'[Provincia]','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID'),'subtype'=>'text'), - 'Regions.ID'=>array('field'=>'Regions.ID','name'=>'Regione ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID'),'ord'=>false), - 'Regions.Region'=>array('field'=>'Regions.Region','name'=>'Regione','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID'),'subtype'=>'text'), + 'Regions.ID'=>array('field'=>'Regions.ID','name'=>'[Regione] ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID'),'ord'=>false), + 'Regions.Region'=>array('field'=>'Regions.Region','name'=>'[Regione]','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID'),'subtype'=>'text'), - 'States.ID'=>array('field'=>'States.ID','name'=>'Stato ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID','States ON States.ID=Regions.StateID'),'ord'=>false), - 'States.State'=>array('field'=>'States.State','name'=>'Stato','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID','States ON States.ID=Regions.StateID'),'subtype'=>'text'), + 'States.ID'=>array('field'=>'States.ID','name'=>'[Stato] ⮞','type'=>'join','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID','States ON States.ID=Regions.StateID'),'ord'=>false), + 'States.State'=>array('field'=>'States.State','name'=>'[Stato]','type'=>'joini','join'=>array('Localities ON Localities.ID=Instances.LocalityID','Provinces ON Provinces.ID=Localities.ProvinceID','Regions ON Regions.ID=Provinces.RegionID','States ON States.ID=Regions.StateID'),'subtype'=>'text'), //-------------------------------- 'Instances.Email'=>array('field'=>'Instances.Email','name'=>'Email di contatto','type'=>'text'), 'Instances.Software'=>array('field'=>'Instances.Software','name'=>'Software','type'=>'text'), 'Instances.Version'=>array('field'=>'Instances.Version','name'=>'Versione','type'=>'text'), - 'Instances.UserCount'=>array('field'=>'Instances.UserCount','name'=>'Utenti','type'=>'int'), - 'Instances.StatusCount'=>array('field'=>'Instances.StatusCount','name'=>'Stati','type'=>'int'), - 'Instances.DomainCount'=>array('field'=>'Instances.DomainCount','name'=>'Istanze note','type'=>'int'), - 'Instances.ActiveUsersMonth'=>array('field'=>'Instances.ActiveUsersMonth','name'=>'Utenti attivi (mese)','type'=>'int'), - 'Instances.ActiveUsersHalfYear'=>array('field'=>'Instances.ActiveUsersHalfYear','name'=>'Utenti attivi (6 mesi)','type'=>'int'), + 'Instances.UserCount'=>array('field'=>'Instances.UserCount','name'=>'Numero utenti','type'=>'int'), + 'Instances.StatusCount'=>array('field'=>'Instances.StatusCount','name'=>'Numero stati','type'=>'int'), + 'Instances.DomainCount'=>array('field'=>'Instances.DomainCount','name'=>'Numero istanze note','type'=>'int'), + 'Instances.ActiveUsersMonth'=>array('field'=>'Instances.ActiveUsersMonth','name'=>'Numero utenti attivi (mese)','type'=>'int'), + 'Instances.ActiveUsersHalfYear'=>array('field'=>'Instances.ActiveUsersHalfYear','name'=>'Numero utenti attivi (6 mesi)','type'=>'int'), 'Instances.Thumb'=>array('field'=>'Instances.Thumb','name'=>'Logo','type'=>'text','search'=>false,'ord'=>false), 'Instances.RegOpen'=>array('field'=>'Instances.RegOpen','name'=>'Registrazioni aperte','type'=>'bool'), 'Instances.RegReqApproval'=>array('field'=>'Instances.RegReqApproval','name'=>'Approvazione registrazioni','type'=>'bool'), @@ -152,51 +162,51 @@ $cols=array( //-------------------------------- - 'InstOurLangs'=>array('name'=>'Lingue impostate da noi','search'=>false,'ord'=>false), + 'InstOurLangs'=>array('name'=>'[Lingue impostate da noi]','search'=>false,'ord'=>false), - 'InstOurLangs.OurLangID'=>array('field'=>'InstOurLangs%.OurLangID','name'=>'Una lingua impostata da noi ⮞','type'=>'join','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID'),'ord'=>false), + 'InstOurLangs.OurLangID'=>array('field'=>'InstOurLangs%.OurLangID','name'=>'[Una lingua impostata da noi] ⮞','type'=>'join','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID'),'ord'=>false), - 'OurLanguages.NameIT'=>array('field'=>'OurLanguages%.NameIT','name'=>'Una lingua impostata da noi','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID','Languages AS OurLanguages% ON OurLanguages%.ID=InstOurLangs%.OurLangID'),'subtype'=>'text','ord'=>true,'ordname'=>'Lingue impostate da noi','ordjoin'=>array('InstOurLangs AS OrdInstOurLangs ON OrdInstOurLangs.InstID=Instances.ID','Languages AS OrdOurLanguages ON OrdOurLanguages.ID=OrdInstOurLangs.OurLangID'),'ordselmore'=>'GROUP_CONCAT(OrdOurLanguages.NameIT ORDER BY OrdInstOurLangs.Pos ASC SEPARATOR \'\') AS xOrdOurLangs','ordby'=>'xOrdOurLangs'), + 'OurLanguages.NameIT'=>array('field'=>'OurLanguages%.NameIT','name'=>'[Una lingua impostata da noi]','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs% ON InstOurLangs%.InstID=Instances.ID','Languages AS OurLanguages% ON OurLanguages%.ID=InstOurLangs%.OurLangID'),'subtype'=>'text','ord'=>true,'ordname'=>'Lingue impostate da noi','ordjoin'=>array('InstOurLangs AS OrdInstOurLangs ON OrdInstOurLangs.InstID=Instances.ID','Languages AS OrdOurLanguages ON OrdOurLanguages.ID=OrdInstOurLangs.OurLangID'),'ordselmore'=>'GROUP_CONCAT(OrdOurLanguages.NameIT ORDER BY OrdInstOurLangs.Pos ASC SEPARATOR \'\') AS xOrdOurLangs','ordby'=>'xOrdOurLangs'), - 'InstOurLangs.OurLangID.First'=>array('field'=>'InstOurLangs.OurLangID','name'=>'Lingua primaria impostata da noi ⮞','type'=>'join','join'=>array('InstOurLangs AS InstOurLangs ON InstOurLangs.InstID=Instances.ID AND InstOurLangs.Pos=1'),'ord'=>false), + 'InstOurLangs.OurLangID.First'=>array('field'=>'InstOurLangs.OurLangID','name'=>'[Lingua primaria impostata da noi] ⮞','type'=>'join','join'=>array('InstOurLangs AS InstOurLangs ON InstOurLangs.InstID=Instances.ID AND InstOurLangs.Pos=1'),'ord'=>false), - 'OurLanguages.NameIT.First'=>array('field'=>'OurLanguages.NameIT','name'=>'Lingua primaria impostata da noi','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs ON InstOurLangs.InstID=Instances.ID AND InstOurLangs.Pos=1','Languages AS OurLanguages ON OurLanguages.ID=InstOurLangs.OurLangID'),'subtype'=>'text','ord'=>false), + 'OurLanguages.NameIT.First'=>array('field'=>'OurLanguages.NameIT','name'=>'[Lingua primaria impostata da noi]','type'=>'joini','join'=>array('InstOurLangs AS InstOurLangs ON InstOurLangs.InstID=Instances.ID AND InstOurLangs.Pos=1','Languages AS OurLanguages ON OurLanguages.ID=InstOurLangs.OurLangID'),'subtype'=>'text','ord'=>false), //-------------------------------- - 'InstFinancing'=>array('name'=>'Modalità di finanziamento','search'=>false,'ord'=>false), + 'InstFinancing'=>array('name'=>'[Modalità di finanziamento]','search'=>false,'ord'=>false), - 'InstFinancing.FinID'=>array('field'=>'InstFinancing%.FinID','name'=>'Una modalità di finanziamento ⮞','type'=>'join','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID'),'ord'=>false), + 'InstFinancing.FinID'=>array('field'=>'InstFinancing%.FinID','name'=>'[Una modalità di finanziamento] ⮞','type'=>'join','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID'),'ord'=>false), - 'Financing.Type'=>array('field'=>'Financing%.Type','name'=>'Una modalità di finanziamento','type'=>'joini','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID','Financing AS Financing% ON Financing%.ID=InstFinancing%.FinID'),'subtype'=>'text','ord'=>true,'ordname'=>'Modalità di finanziamento','ordjoin'=>array('InstFinancing AS OrdInstFinancing ON OrdInstFinancing.InstID=Instances.ID','Financing AS OrdFinancing ON OrdFinancing.ID=OrdInstFinancing.FinID'),'ordselmore'=>'GROUP_CONCAT(OrdFinancing.Type ORDER BY OrdInstFinancing.Pos ASC SEPARATOR \'\') AS xOrdFinancing','ordby'=>'xOrdFinancing'), + 'Financing.Type'=>array('field'=>'Financing%.Type','name'=>'[Una modalità di finanziamento]','type'=>'joini','join'=>array('InstFinancing AS InstFinancing% ON InstFinancing%.InstID=Instances.ID','Financing AS Financing% ON Financing%.ID=InstFinancing%.FinID'),'subtype'=>'text','ord'=>true,'ordname'=>'Modalità di finanziamento','ordjoin'=>array('InstFinancing AS OrdInstFinancing ON OrdInstFinancing.InstID=Instances.ID','Financing AS OrdFinancing ON OrdFinancing.ID=OrdInstFinancing.FinID'),'ordselmore'=>'GROUP_CONCAT(OrdFinancing.Type ORDER BY OrdInstFinancing.Pos ASC SEPARATOR \'\') AS xOrdFinancing','ordby'=>'xOrdFinancing'), - 'InstFinancing.FinID.First'=>array('field'=>'InstFinancing.FinID','name'=>'Modalità di finanziamento primaria ⮞','type'=>'join','join'=>array('InstFinancing AS InstFinancing ON InstFinancing.InstID=Instances.ID AND InstFinancing.Pos=1'),'ord'=>false), + 'InstFinancing.FinID.First'=>array('field'=>'InstFinancing.FinID','name'=>'[Modalità di finanziamento primaria] ⮞','type'=>'join','join'=>array('InstFinancing AS InstFinancing ON InstFinancing.InstID=Instances.ID AND InstFinancing.Pos=1'),'ord'=>false), - 'Financing.Type.First'=>array('field'=>'Financing.Type','name'=>'Modalità di finanziamento primaria','type'=>'joini','join'=>array('InstFinancing AS InstFinancing ON InstFinancing.InstID=Instances.ID AND InstFinancing.Pos=1','Financing AS Financing ON Financing.ID=InstFinancing.FinID'),'subtype'=>'text','ord'=>false), + 'Financing.Type.First'=>array('field'=>'Financing.Type','name'=>'[Modalità di finanziamento primaria]','type'=>'joini','join'=>array('InstFinancing AS InstFinancing ON InstFinancing.InstID=Instances.ID AND InstFinancing.Pos=1','Financing AS Financing ON Financing.ID=InstFinancing.FinID'),'subtype'=>'text','ord'=>false), //-------------------------------- - 'InstPolicies'=>array('name'=>'Restrizioni sui contenuti','search'=>false,'ord'=>false), + 'InstPolicies'=>array('name'=>'[Restrizioni sui contenuti]','search'=>false,'ord'=>false), - 'InstPolicies.PolID'=>array('field'=>'InstPolicies%.PolID','name'=>'Una restrizione sui contenuti ⮞','type'=>'join','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID'),'ord'=>false), + 'InstPolicies.PolID'=>array('field'=>'InstPolicies%.PolID','name'=>'[Una restrizione sui contenuti] ⮞','type'=>'join','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID'),'ord'=>false), - 'Policies.Name'=>array('field'=>'Policies%.Name','name'=>'Una restrizione sui contenuti','type'=>'joini','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID','Policies AS Policies% ON Policies%.ID=InstPolicies%.PolID'),'subtype'=>'text','ord'=>true,'ordname'=>'Restrizioni sui contenuti','ordjoin'=>array('InstPolicies AS OrdInstPolicies ON OrdInstPolicies.InstID=Instances.ID','Policies AS OrdPolicies ON OrdPolicies.ID=OrdInstPolicies.PolID'),'ordselmore'=>'GROUP_CONCAT(OrdPolicies.Name ORDER BY OrdInstPolicies.Pos ASC SEPARATOR \'\') AS xOrdPolicies','ordby'=>'xOrdPolicies'), + 'Policies.Name'=>array('field'=>'Policies%.Name','name'=>'[Una restrizione sui contenuti]','type'=>'joini','join'=>array('InstPolicies AS InstPolicies% ON InstPolicies%.InstID=Instances.ID','Policies AS Policies% ON Policies%.ID=InstPolicies%.PolID'),'subtype'=>'text','ord'=>true,'ordname'=>'Restrizioni sui contenuti','ordjoin'=>array('InstPolicies AS OrdInstPolicies ON OrdInstPolicies.InstID=Instances.ID','Policies AS OrdPolicies ON OrdPolicies.ID=OrdInstPolicies.PolID'),'ordselmore'=>'GROUP_CONCAT(OrdPolicies.Name ORDER BY OrdInstPolicies.Pos ASC SEPARATOR \'\') AS xOrdPolicies','ordby'=>'xOrdPolicies'), - 'InstPolicies.PolID.First'=>array('field'=>'InstPolicies.PolID','name'=>'Restrizione sui contenuti primaria ⮞','type'=>'join','join'=>array('InstPolicies AS InstPolicies ON InstPolicies.InstID=Instances.ID AND InstPolicies.Pos=1'),'ord'=>false), + 'InstPolicies.PolID.First'=>array('field'=>'InstPolicies.PolID','name'=>'[Restrizione sui contenuti primaria] ⮞','type'=>'join','join'=>array('InstPolicies AS InstPolicies ON InstPolicies.InstID=Instances.ID AND InstPolicies.Pos=1'),'ord'=>false), - 'Policies.Name.First'=>array('field'=>'Policies.Name','name'=>'Restrizione sui contenuti primaria','type'=>'joini','join'=>array('InstPolicies AS InstPolicies ON InstPolicies.InstID=Instances.ID AND InstPolicies.Pos=1','Policies AS Policies ON Policies.ID=InstPolicies.PolID'),'subtype'=>'text','ord'=>false), + 'Policies.Name.First'=>array('field'=>'Policies.Name','name'=>'[Restrizione sui contenuti primaria]','type'=>'joini','join'=>array('InstPolicies AS InstPolicies ON InstPolicies.InstID=Instances.ID AND InstPolicies.Pos=1','Policies AS Policies ON Policies.ID=InstPolicies.PolID'),'subtype'=>'text','ord'=>false), //-------------------------------- - 'InstTags'=>array('name'=>'Tags','search'=>false,'ord'=>false), + 'InstTags'=>array('name'=>'[Tags]','search'=>false,'ord'=>false), - 'InstTags.TagID'=>array('field'=>'InstTags%.TagID','name'=>'Una tag ⮞','type'=>'join','join'=>array('InstTags% ON InstTags%.InstID=Instances.ID'),'ord'=>false), + 'InstTags.TagID'=>array('field'=>'InstTags%.TagID','name'=>'[Una tag] ⮞','type'=>'join','join'=>array('InstTags AS InstTags% ON InstTags%.InstID=Instances.ID'),'ord'=>false), - 'Tags.Name'=>array('field'=>'Tags%.Name','name'=>'Una tag','type'=>'joini','join'=>array('InstTags AS InstTags% ON InstTags%.InstID=Instances.ID','Tags AS Tags% ON Tags%.ID=InstTags%.TagID'),'subtype'=>'text','ord'=>true,'ordname'=>'Tags','ordjoin'=>array('InstTags AS OrdInstTags ON OrdInstTags.InstID=Instances.ID','Tags AS OrdTags ON OrdTags.ID=OrdInstTags.TagID'),'ordselmore'=>'GROUP_CONCAT(OrdTags.Name ORDER BY OrdInstTags.Pos ASC SEPARATOR \'\') AS xOrdTags','ordby'=>'xOrdTags'), + 'Tags.Name'=>array('field'=>'Tags%.Name','name'=>'[Una tag]','type'=>'joini','join'=>array('InstTags AS InstTags% ON InstTags%.InstID=Instances.ID','Tags AS Tags% ON Tags%.ID=InstTags%.TagID'),'subtype'=>'text','ord'=>true,'ordname'=>'Tags','ordjoin'=>array('InstTags AS OrdInstTags ON OrdInstTags.InstID=Instances.ID','Tags AS OrdTags ON OrdTags.ID=OrdInstTags.TagID'),'ordselmore'=>'GROUP_CONCAT(OrdTags.Name ORDER BY OrdInstTags.Pos ASC SEPARATOR \'\') AS xOrdTags','ordby'=>'xOrdTags'), - 'InstTags.TagID.First'=>array('field'=>'InstTags.TagID','name'=>'Tag primaria ⮞','type'=>'join','join'=>array('InstTags AS InstTags ON InstTags.InstID=Instances.ID AND InstTags.Pos=1'),'ord'=>false), + 'InstTags.TagID.First'=>array('field'=>'InstTags.TagID','name'=>'[Tag primaria] ⮞','type'=>'join','join'=>array('InstTags AS InstTags ON InstTags.InstID=Instances.ID AND InstTags.Pos=1'),'ord'=>false), - 'Tags.Name.First'=>array('field'=>'Tags.Name','name'=>'Tag primaria','type'=>'joini','join'=>array('InstTags AS InstTags ON InstTags.InstID=Instances.ID AND InstTags.Pos=1','Tags AS Tags ON Tags.ID=InstTags.TagID'),'subtype'=>'text','ord'=>false), + 'Tags.Name.First'=>array('field'=>'Tags.Name','name'=>'[Tag primaria]','type'=>'joini','join'=>array('InstTags AS InstTags ON InstTags.InstID=Instances.ID AND InstTags.Pos=1','Tags AS Tags ON Tags.ID=InstTags.TagID'),'subtype'=>'text','ord'=>false), //-------------------------------- @@ -268,6 +278,7 @@ foreach ($_POST as $key=>$val) { $type=$buf[2]; $subtype=$buf[3]; if (array_key_exists($tagk,$cols) && in_array($type,$types)) { + ($tagk=='Instances.AdmCreatedAt') ? $inpisdate=true : $inpisdate=false; if (strpos($cols[$tagk]['field'],'%')!==false) $ji++; $where.=str_replace('%',$ji,$cols[$tagk]['field']); @@ -301,10 +312,13 @@ foreach ($_POST as $key=>$val) { $jssetrows.=',""'; } if (preg_match('/^valueinp-\d+$/',$key)===1) { - if (preg_match('/^LIKE|NOT LIKE$/',$cond)===1) + if ($inpisdate && preg_match('/^([0-9]{1,2}) ([0-9]{1,2}) ([0-9]{4,5})$/',$val,$buf)===1) { + $where.=mktime(0,0,0,$buf[2]+0,$buf[1]+0,$buf[3]+0); + } elseif (preg_match('/^LIKE|NOT LIKE$/',$cond)===1) { $where.='\'%'.myesc($link,$val).'%\''; - else + } else { $where.='\''.myesc($link,$val).'\''; + } $jssetrows.=',"NOMMITROVI!"'; $jssetrows.=','.json_encode($val); } @@ -386,29 +400,53 @@ if (count($havings)>0) else $havings=''; -$query='SELECT *, Instances.ID AS IID'.$sels.' FROM Instances '.$joins.' '.$where.' GROUP BY IID '.$havings.' '.$order.' LIMIT 50'; +$query='SELECT Instances.ID AS IID '.$sels.' FROM Instances '.$joins.' '.$where.' GROUP BY IID '.$havings; +$res=mysqli_query($link,$query) + or muoribene($dbg.'
Nessuna istanza da mostrare.
'.N; } else { +// $pgout='Pag. '.($page+1).'/'.(ceil($cinsts/$iperp)-1); + $pgout=''; +// --- + $ci=0; $out=''; while ($row=mysqli_fetch_assoc($res)) { + $ci++; $out.='Attributi | Info | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'.$row['URI'].' {'.$row['IID'].'} | ||||||||||||||
'.$row['URI'].' ('.($finst+$ci).'/'.$cinsts.') - Modifica | ||||||||||||||
'.$attr.' | '.N;
+ if ($row['Blacklisted']>0) {
+ $sres=mysqli_query($link,'SELECT * FROM Blacklist WHERE Domain=\''.myesc($link,$row['URI']).'\'')
+ or muoribene(mysqli_error($link),true);
+ if (mysqli_num_rows($sres)>0) {
+ $srow=mysqli_fetch_assoc($sres);
+ if (!is_null($srow['PublicComment']) && preg_match('/^\s*$/',$srow['PublicComment'])!==1) {
+ $out.=' Questa istanza è blacklistata per questo motivo: '.hspech($srow['PublicComment']).' '.N;
+ } else {
+ $out.='Questa istanza è blacklistata, ma nella blacklist non è specificato il motivo. '.N;
+ }
+ } else {
+ $out.='Questa istanza risulta blacklistata nella tabella delle istanze, ma nella tabella “Blacklist” non è presente: probabilmente è stata rimossa dalla tabella “Blacklist” e il crawler non l’ha ancora aggiornata. '.N;
+ }
+ }
$out.=''.$cols['Instances.URI']['name'].': '.$row['URI'].' '.N;
$out.=''.$cols['Instances.Title']['name'].': '.nully($row['Title'],false,'strip').' '.N;
$out.=''.$cols['Instances.Thumb']['name'].': '.nully($row['Thumb'],true,'image').' '.N;
$out.=''.$cols['Instances.ShortDesc']['name'].': '.nully($row['ShortDesc'],true,'strip').' '.N;
$out.=''.$cols['Instances.LongDesc']['name'].': '.nully($row['LongDesc'],true,'strip').' '.N;
// 'strip' o 'htmlent' per la descrizione nostra?
- $out.=''.$cols['Instances.OurDesc']['name'].': '.nully($row['OurDesc'],true,'strip').' '.N;
- $out.=''.$cols['Localities.Locality']['name'].': ';
+ $out.='
-
--->
'.trimname($cols['Instances.OurDesc']['name']).': '.nully($row['OurDesc'],true,'strip').' '.N;
+ $out.=''.trimname($cols['Localities.Locality']['name']).': ';
if (!is_null($row['LocalityID'])) {
$sres=mysqli_query($link,'SELECT * FROM Localities LEFT JOIN Provinces ON Provinces.ID=Localities.ProvinceID LEFT JOIN Regions ON Regions.ID=Provinces.RegionID LEFT JOIN States ON States.ID=Regions.StateID WHERE Localities.ID='.$row['LocalityID'])
or muoribene(mysqli_error($link),true);
@@ -499,9 +551,9 @@ if (mysqli_num_rows($res)<1) {
$i++;
$buf[]=$i.': '.hspech($srow['Code'].' ['.$srow['NameIT'].']');
}
- $out.='
@@ -1161,13 +1240,12 @@ function pupoff() {
'.$cols['InstOurLangs']['name'].': '.implode('; ',$buf).' '.N;
+ $out.=''.trimname($cols['InstOurLangs']['name']).': '.implode('; ',$buf).' '.N;
} else {
- $out.=''.$cols['InstOurLangs']['name'].': Non definite '.N;
+ $out.=''.trimname($cols['InstOurLangs']['name']).': Non definite '.N;
}
$sres=mysqli_query($link,'SELECT * FROM InstFinancing LEFT JOIN Financing ON Financing.ID=FinID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
or muoribene(mysqli_error($link),true);
@@ -512,9 +564,9 @@ if (mysqli_num_rows($res)<1) {
$i++;
$buf[]=$i.': '.hspech($srow['Type']);
}
- $out.=''.$cols['InstFinancing']['name'].': '.implode('; ',$buf).' '.N;
+ $out.=''.trimname($cols['InstFinancing']['name']).': '.implode('; ',$buf).' '.N;
} else {
- $out.=''.$cols['InstFinancing']['name'].': Non definite '.N;
+ $out.=''.trimname($cols['InstFinancing']['name']).': Non definite '.N;
}
$sres=mysqli_query($link,'SELECT * FROM InstPolicies LEFT JOIN Policies ON Policies.ID=PolID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
or muoribene(mysqli_error($link),true);
@@ -525,9 +577,9 @@ if (mysqli_num_rows($res)<1) {
$i++;
$buf[]=$i.': '.hspech($srow['Name']);
}
- $out.=''.$cols['InstPolicies']['name'].': '.implode('; ',$buf).' '.N;
+ $out.=''.trimname($cols['InstPolicies']['name']).': '.implode('; ',$buf).' '.N;
} else {
- $out.=''.$cols['InstPolicies']['name'].': Non definite '.N;
+ $out.=''.trimname($cols['InstPolicies']['name']).': Non definite '.N;
}
$sres=mysqli_query($link,'SELECT * FROM InstTags LEFT JOIN Tags ON Tags.ID=TagID WHERE InstID='.$row['IID'].' ORDER BY Pos ASC')
or muoribene(mysqli_error($link),true);
@@ -538,9 +590,9 @@ if (mysqli_num_rows($res)<1) {
$i++;
$buf[]=$i.': '.hspech($srow['Name']);
}
- $out.=''.$cols['InstTags']['name'].': '.implode('; ',$buf).' '.N;
+ $out.=''.trimname($cols['InstTags']['name']).': '.implode('; ',$buf).' '.N;
} else {
- $out.=''.$cols['InstTags']['name'].': Non definite '.N;
+ $out.=''.trimname($cols['InstTags']['name']).': Non definite '.N;
}
$out.=''.$cols['Instances.Email']['name'].': '.nully($row['Email'],true,'email').' '.N;
$out.=''.$cols['Instances.Software']['name'].': '.nully($row['Software'],false,'strip').' '.N;
@@ -566,7 +618,6 @@ if (mysqli_num_rows($res)<1) {
$out.='';
}
-
$presid=0;
if (array_key_exists('presets',$_POST) && preg_match('/^[0-9]+$/',$_POST['presets'])===1)
$presid=$_POST['presets'];
@@ -586,7 +637,7 @@ mysqli_close($link);
-Non hai selezionato alcun preset ;) '); } } +function rempres() { + pupwait(true); + let pres=document.getElementById('presets'); + let formdata=new FormData(document.forms.f); + formdata.append('act','remove'); + formdata.append('pid',pres.value); + let xhr=new XMLHttpRequest(); + xhr.open('POST','loadsaverempres.php'); + xhr.responseType='json'; + xhr.send(formdata); + xhr.onload=function() { + console.log(xhr.response); + pres.remove(pres.selectedIndex); + pres.selectedIndex=0; + pupwait(false); + }; + xhr.onerror=function() { + pupwait(false); + alert('La richiesta è fallita.'); + }; +} function savepres(txt,asnew) { pupwait(true); let pres=document.getElementById('presets'); @@ -1066,7 +1132,7 @@ function savepres(txt,asnew) { if (!asnew) formdata.append('pid',pres.value); let xhr=new XMLHttpRequest(); - xhr.open('POST','loadsavepres.php'); + xhr.open('POST','loadsaverempres.php'); xhr.responseType='json'; xhr.send(formdata); xhr.onload=function() { @@ -1092,12 +1158,21 @@ function pupsavepres(asnew) { var prestext=pres.options[pres.selectedIndex].text; var pre='Se vuoi puoi modificare il nome del preset che stai per sovrascrivere '; if (asnew) pre='Dai un nuovo nome al nuovo preset che stai per salvare '; - inpup.innerHTML=''+pre+' ';
+ inpup.innerHTML=''+pre+' ';
pup.style.display='table';
} else {
alerta('Non hai selezionato alcun preset ;) '); } } +function puprempres() { + var pres=document.getElementById('presets'); + if (pres.value!='null') { + var prestext=pres.options[pres.selectedIndex].text; + confirma('Confermi l’eliminazione del preset «'+hent(prestext)+'»?','rempres()'); + } else { + alerta('Non hai selezionato alcun preset ;) '); + } +} function ckpresname(asnew) { var pres=document.getElementById('presets'); var presname=document.getElementById('presname').value; @@ -1136,7 +1211,10 @@ function pupoff() { inpup.innerHTML='... ';
pup.style.display='none';
}
-
+function gotopage(pi) {
+ document.getElementById('p').value=pi;
+ ckf();
+}
//-->
@@ -1149,7 +1227,8 @@ function pupoff() {
@@ -1184,7 +1262,8 @@ function pupoff() {
diff --git a/web/admin/loadsavepres.php b/web/admin/loadsaverempres.php
similarity index 90%
rename from web/admin/loadsavepres.php
rename to web/admin/loadsaverempres.php
index 76a5dbc..b7fe071 100644
--- a/web/admin/loadsavepres.php
+++ b/web/admin/loadsaverempres.php
@@ -106,7 +106,16 @@ if (array_key_exists('act',$_POST)) {
or muoribene(mysqli_error($link),true);
}
} elseif ($_POST['act']=='remove' && array_key_exists('pid',$_POST) && preg_match('/^[0-9]+$/',$_POST['pid'])===1) {
- echo(json_encode($_POST));
+ $pid=$_POST['pid'];
+ $query='DELETE FROM PresFiltConds WHERE PresID='.$pid;
+ mysqli_query($link,$query)
+ or muoribene(mysqli_error($link),true);
+ $query='DELETE FROM PresOrdConds WHERE PresID='.$pid;
+ mysqli_query($link,$query)
+ or muoribene(mysqli_error($link),true);
+ $query='DELETE FROM Presets WHERE ID='.$pid;
+ mysqli_query($link,$query)
+ or muoribene(mysqli_error($link),true);
}
}
diff --git a/web/admin/theme.css b/web/admin/theme.css
index 54ceb50..33c6afc 100644
--- a/web/admin/theme.css
+++ b/web/admin/theme.css
@@ -60,7 +60,7 @@ p {
padding: 3px;
color: white;
height: 30px;
- background-color: #916f6f;
+ background-color: #6f8a91;
border-radius: 5px;
text-align: center;
vertical-align: middle;
@@ -68,6 +68,10 @@ p {
font-size: 12pt;
font-weight: bold;
}
+.bigtab .insthead a {
+ color: #1c2224;
+ /*text-decoration: underline;*/
+}
.bigtab img {
max-width: 100%;
display: block;
@@ -459,6 +463,78 @@ input {
min-width: 320px;
}
+.edtab {
+ background-color: white;
+ font-size: 10pt;
+ margin-left: auto;
+ margin-right: auto;
+ width: 400px;
+ margin-top: 32px;
+}
+.edtab .insthead {
+ padding: 3px;
+ color: white;
+ height: 30px;
+ background-color: #916f6f;
+ border-radius: 5px;
+ text-align: center;
+ vertical-align: middle;
+ color: white;
+ font-size: 12pt;
+ font-weight: bold;
+}
+.edtab input {
+ width: auto;
+ font-size: 10pt;
+ padding: 0;
+}
+.edtab img {
+ max-width: 100%;
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+/*720x1280*/
+.edtab td {
+ padding: 3px;
+ text-align: left;
+ vertical-align: top;
+/* word-break: break-word;*/
+ background-color: lightgrey;
+ border-radius: 5px;
+}
+.edtab .left {
+ width: 1%;
+ text-align: right;
+}
+.edtab .right {
+ width: 99%;
+}
+.edtab .tarea {
+ width: 100%;
+ resize: none;
+ padding: 3px;
+ border-radius: 3px;
+ border: 1px;
+}
+
+.cbtab {
+ background-color: red;
+ border-spacing: 0;
+}
+.cbtab td {
+ border-radius: 0;
+ padding: 0;
+ border: none;
+}
+
+#pageselect {
+ position: absolute;
+ left: 50%;
+ transform: translateX(-50%);
+ margin-top: 5px;
+}
+
#debug {
position: fixed;
left: 0;
@@ -467,6 +543,20 @@ input {
height: 240px;
font-size: 8pt;
overflow: auto;
+ display: none;
+}
+
+#intro {
+ width:800px;
+ margin-left:auto;
+ margin-right:auto;
+ padding:10px;
+ font-size:14pt;
+ line-height: 18pt;
+ background-color:lightgrey;
+}
+#intro p {
+ margin-bottom: 0;
}
@media only screen and (max-width:720px) {
diff --git a/web/admin/zzz-materiali/mastostart_struttura_e_dati.sql.gz b/web/admin/zzz-materiali/mastostart_struttura_e_dati.sql.gz
index 1201c41..894dd92 100644
Binary files a/web/admin/zzz-materiali/mastostart_struttura_e_dati.sql.gz and b/web/admin/zzz-materiali/mastostart_struttura_e_dati.sql.gz differ
|