Back to top

Autore Topic: [RISOLTO] Come fare un import massivo di articoli da file  (Letto 606 volte)

Offline stefbort

  • Nuovo arrivato
  • *
  • Post: 46
  • Sesso: Maschio
    • Mostra profilo
Buongiorno a tutti.
Ho circa 12000 articoli da importare in un sito Joomla 4: come posso fare fare un'import massivo?
Gli articoli sono in formato word, ma li ho convertiti in html e pulito il codice.Un volta feci questa operazione (in un vecchio Joomla 1.5 mi sembra) e lo faci con una query operando direttamente sul DB.Ho fatto ora una prova con 1 articolo, ma vedo che non funziona.Ho cercato in internet, ma non ho trovato una soluzione .
Qualche aiuto? Qualche suggerimento?Grazie anticipate a tutti.
« Ultima modifica: 17 Apr 2024, 17:31:07 da stefbort »

Offline giusebos

  • Fuori controllo
  • *
  • Post: 21748
  • Sesso: Maschio
  • Giuseppe Serbelloni Mazzanti Viendalmare
    • Mostra profilo
Re:Come fare un import massivo di articoli da file
« Risposta #1 il: 14 Apr 2024, 10:54:24 »
importi 12K di articoli da un altro db, ma da word o in formato html o almeno ciò che è dentro il tag body la vedo davvero dura ed impegnativa.

Comunque il metodo più semplice è quello di lavorare dentro phpmyadmin, possedendo un file csv con campi separati da ";" e delimitati da virgolette, con l'attenzione che il testo formattato non contenga ";" e ' " '     perchè succederebbe un immenso casino.

Poi con la funzione importa indichi in quali campi vuoi che il contenuto vada a finire, quindi ti servirano campi per:

categoria
titolo
alias
pubblicato
articolo
autore

Se dimentichi anche solo uno di questi, anche se l'importazione è andata a buon fine, non vedresti gli articoli.

C'è anche un altra strada simile con xml

Rimane comunque come opzione migliore quella di partire dai dati originali e non da quelli fatti diventare word o fatti diventare html

su www.icagenda.it guide e tutorial con esempi di chronoforms e chronoconnectivity

Offline stefbort

  • Nuovo arrivato
  • *
  • Post: 46
  • Sesso: Maschio
    • Mostra profilo
Re:Come fare un import massivo di articoli da file
« Risposta #2 il: 14 Apr 2024, 15:43:42 »
Ok, grazie.Il primo problema è che i dati originali sono file Word :(
Avevo già provato la via di import direttamente dento il DB con tutte le accortezze indicate.Dop il caricamento nel DB risultano i record, ma non compaiono in Joomla, né in frontent, ne in backend, ma il finder interno di Joomla li vede e li indicizza.
Cre che la causa sia la tabella "##_assets". Ho provato a creare un riga con la logica che ho cercato di capire (l'ID dell'articolo, i nomeri progressivi, ecc...), ma l'articolo non comapre...Forse ho sbagliato qualcosa in questa seconda tabella?
Saluti

Offline giusebos

  • Fuori controllo
  • *
  • Post: 21748
  • Sesso: Maschio
  • Giuseppe Serbelloni Mazzanti Viendalmare
    • Mostra profilo
Re:Come fare un import massivo di articoli da file
« Risposta #3 il: 14 Apr 2024, 18:20:51 »
hai inserito questi dati?

categoria
titolo
alias
pubblicato
articolo
autore
su www.icagenda.it guide e tutorial con esempi di chronoforms e chronoconnectivity

Offline stefbort

  • Nuovo arrivato
  • *
  • Post: 46
  • Sesso: Maschio
    • Mostra profilo
Re:Come fare un import massivo di articoli da file
« Risposta #4 il: 14 Apr 2024, 18:22:53 »
Si, certo.
Faccio un altro test e posto se va o meno :)

Offline giusebos

  • Fuori controllo
  • *
  • Post: 21748
  • Sesso: Maschio
  • Giuseppe Serbelloni Mazzanti Viendalmare
    • Mostra profilo
Re:Come fare un import massivo di articoli da file
« Risposta #5 il: 14 Apr 2024, 18:26:23 »
ho visto che esiste questo plg-in che ti fa importare massivamente file html

https://extensions.joomla.org/extension/migration-a-conversion/data-import-a-export/html-2-articles/
su www.icagenda.it guide e tutorial con esempi di chronoforms e chronoconnectivity

Offline stefbort

  • Nuovo arrivato
  • *
  • Post: 46
  • Sesso: Maschio
    • Mostra profilo
Re:Come fare un import massivo di articoli da file
« Risposta #6 il: 14 Apr 2024, 19:16:33 »
Confermo: inserendo direttamente i dati nella tabella "##_content" l'articolo non compare né backend, né frontend, ma il motore di ricerca backend lo vede e indicizza ;(

Più tardi vado a vedere il plugin indicato.
Qui di seguito la query dell'ultima prova con cui ho inserito il testo prova.

Grazie intanto. Ti aggiorno più tardi sull'avanzamento (delle prove ))

Codice: [Seleziona]
INSERT INTO `v6754_content`
(`title`, `alias`, `introtext`, `fulltext`, `state`, `catid`, `created_by`, `created`, `modified`, `images`, `urls`, `attribs`, `metadata`, `metadesc`, `language`)
VALUES
('Test 01','test-01','Intro','Testo completo','1','14','742', '2024-04-14 12:00:00', '2024-04-14 12:00:00', '{"image_intro":"","image_intro_alt":"","float_intro":"","image_intro_caption":"","image_fulltext":"","image_fulltext_alt":"","float_fulltext":"","image_fulltext_caption":""}', '', '{"article_layout":"","show_title":"","link_titles":"","show_tags":"","show_intro":"","info_block_position":"","info_block_show_title":"","show_category":"","link_category":"","show_parent_category":"","link_parent_category":"","show_author":"","link_author":"","show_create_date":"","show_modify_date":"","show_publish_date":"","show_item_navigation":"","show_hits":"","show_noauth":"","urls_position":"","alternative_readmore":"","article_page_title":"","show_publishing_options":"","show_article_options":"","show_urls_images_backend":"","show_urls_images_frontend":""}', '{"robots":"","author":"","rights":""}', '', '*');

Offline stefbort

  • Nuovo arrivato
  • *
  • Post: 46
  • Sesso: Maschio
    • Mostra profilo
Re:Come fare un import massivo di articoli da file
« Risposta #7 il: 15 Apr 2024, 01:37:15 »
OK, ho trovato come fare: attraverso i webservice e le API di Joomla!
Qui di seguito riporto come ho inserito un articolo passandolo a Joomla attraverso delle righe di comando che possono diventare righe di comando che passano un file che contiene l'articolo in html.
Per l'esempio qui di seguito, da considerare come una prova di concetto, lo eseguo dalla shell del mio portatile linux e opero su un server locale usato per lo sviluppo del sito.
calla shell del portatile passo il seguente comando:

Codice: [Seleziona]
curl --location --request POST 'http://vm05.kbsb.loc/portal/api/index.php/v1/content/articles' \
--header 'Content-Type: application/json' \
-u superadmin \
--data-raw '{"alias": "test-04", "articletext": "My testo test 04", "catid": 14, "language": "*", "metadesc": "", "metakey": "", "title": "Test 04", "state": 1}'

Mi viene chiesta la password dell'utente superadmin con cui mi autentico ed il gioco è fatto.
Per rendere più fluido l'inserimento si può usare il token dell'utente Joomla con cui voglio inserire il contenuto.

Dalla manualistica con questa tecnica si può cancellare un articolo, modificarlo, gestire i tag, ecc... Un perfetto tool di intereoperabilità (per programmatori, però :)

Quando riesco a preparare il primo pacchetto di file da carica vi aggiorno con tutti i dettagli; dalla prova fatta ora tutto dice che questa tecnica funziona.

Offline stefbort

  • Nuovo arrivato
  • *
  • Post: 46
  • Sesso: Maschio
    • Mostra profilo
[RISOLTO] Come fare un import massivo di articoli da file
« Risposta #8 il: 17 Apr 2024, 17:29:56 »
Salve a tutti.
Come dai post precedenti ho trovato come fare un caricamento massivo in moto automatico.

Con (grande) soddisfazione sono partito da circa 12.000 vecchi file DOC e sono ondati aonline in circa 4 ore!!!

Condivido il processo di conversione e caricamento qui di seguito nella speranza che possa essere utile a qualcuno.

# PREMESSA
Ho operato da una postazione Linux desktop (Linux Mint 21) ed ho impiegato i seguenti software:
  • Libreoffice
  • unoconv
  • sed
  • find
  • curl
  • bash (per gli script di automazione).
Il sito su cui sono stati caricati i documenti è un Joomla 4.
Il caricamento è stato fatto attraverso le web API di Joomla e ho usaato il token di un utente come elemento di autenticazione.
NB: se si usa il dato user+password va attivato il plugin dentro Joomla: di default è disattivo!

Il processo per il caricamento automatico consta di 3 passi:
  • conversione DOC -> HTML
  • trattamento degli HTML
  • caricamento degli file.
Note:
  • per chi usa Windows o MAC basta usare i porting o software "equivalneti";
  • script:
  •   in Windows possiamo usare i preistorici batch o, meglio, scipt PowerShell
  •   in mac sono supportati gli script shell
  •   il codice degli script riportato di seguito è esemplificativo per dare un traccia guida.
Piccola nota più completa sull'HTML
  • in Joomla va carito un codice parziale non un codice //completo//. Es:
Codice: [Seleziona]
<h1>Titolo</h1>
<p>Testo</p>
<p>fine</p>
  • il caricamento via web API bypassa il check del codice HTML, pertanto va //pulito// a mano;
  • per le regole di parser bash nel metodo seguente:
  •   + gli apici ( " ) sono stati escappati in quanto devono restare per parte della sintassi HTML
  •   + gli apostrofi ( ' ) gli ho trasformati nella rappresentazione html in quanto parte del testo
  •   + non ho //filtrato// altri possibili caratteri o sequenze pericolosi: fate attenzione!
  • infine l'HTML da sotoporre a Joomla via web API non deve avere ritorni a capo, ma essere una riga unica con la sequenza "\r\n" al posto del ritorno a capo.
# 1 Conversione DOC -> HTML
La conversione è fatta con uniconv che invoca, in background, Libreoffice.
Lo script rende automatico l'invocazione di "uniconv nomefile.doc".
Tutti i file si trovano tutti in una directory.

Codice dello script:

Codice: [Seleziona]
#!/bin/bash

#
# Usage
# find V001/ -type f -exec bin/conver_docx2html.sh {} \;
#

#
# VAR
VINP=$1
VPATH=
VFILE=$(basename -- "$VINP")
VNAME=
VEXTORG=
VEXTLOW=

#
# conversione
# echo "unoconv -d document -f html $VINP 2> /dev/null"
unoconv -d document -f html $VINP 2> /dev/null

# 2 Trattamento degli HTML
Totti gli HTML ottenuti li ho spostati un una nuova directory.
Libreoffice produce un HTML completo, ma anche bruttino. Infatti cerca di mantenere le impostazioni del file da stampare.
Pertanto ho proceduto con:
  • rimozione dei tag inutili;
  • escaping e sostituzione dei caratteri equivoci, pericolosi e dei ritorni a capo
  • trasforma degli html in chiamate web API.
Questo primo script toglie i tag inutili dal file html:

Codice: [Seleziona]
#!/bin/bash
#
# Usage
# find V001/ -type f -exec bin/conver_html0-removehtml.sh {} \;

#
# VAR
VINP=$1

#
# sostituzioni e cancellazioni HTML
sed -i "/<!DOCTYPE.*/d" $VINP
sed -i "/<html>/d" $VINP
sed -i "/<head>/d" $VINP
sed -i "/<meta\ /d" $VINP
sed -i "/<title>/d" $VINP
sed -i "/<style type=\"text\/css\">/d" $VINP
sed -i "/@page\ {/d" $VINP
sed -i "/p\ {\ color:/d" $VINP
sed -i "/p\.western\ {/d" $VINP
sed -i "/p\.cjk\ {/d" $VINP
sed -i "/p\.ctl\ {/d" $VINP
sed -i "/<\/style>/d" $VINP
sed -i "/<\/head>/d" $VINP
sed -i "s/<body\ .*/<p>/" $VINP
sed -i "s/<p\ class=\"western\"\ style=\"line-height:\ 100\%;\ margin-bottom:\ 0cm\">/<p>/" $VINP
sed -i "/<\/body>/d" $VINP
sed -i "/<\/html>/d" $VINP
sed -i "s/\ \ /\&nbsp;\&nbsp;/g" $VINP
sed -i "s/\t/\&emsp;/g" $VINP
Questo secondo script, invece, escape gli " e sosituisce i caratteri equivoci:

Codice: [Seleziona]
#!/bin/bash
#
# Usage
# find V001/ -type f -exec bin/conver_html1-2html.sh {} \;
#

#
# VAR
VINP=$1

#
# - conversione ritorni a capo:
#   - eliminazione ritorno a capo
#   - codifica in "\r\n"
# -------------------------------------------
sed -i 's/\"/\\\"/g' $VINP
sed -ri "s/'/\&apos;/g" $VINP
sed -zi 's/\n/\\r\\n/g' $VINP

Questo terzo script crea òe chiamate web API partendo dai file HTML. Per ogni file HTML viene creato un file .sh che contiene la chiamata.
Nota:
  • il server del sito indicato è di fantasia ed anche il token (ovviamente)!!
  • possiamo usare l'indirizzo pubblico del sito per caricare dal proprio PC al server: questa procedura è più lenta;
  • possiamo usare l'indirizzo interno del server, ma in questo caso dobbiamo poter accedere al server e avere una console magari via ssh. Molto più veloce e sicuro.
Nel seguente codice uso l'ultima via.

Codice: [Seleziona]
#!/bin/bash
#
# Usage
# find V001/ -type f -exec bin/conver_html2-2api.sh {} \;
#

#
# VAR set STATIC
VAUTOR="Autore"
VCATID="14"
VARTINTRO="<hr id=\"system-readmore\" />"

#
# VAR GLOBAL
VINP=$1
VPATH=
VFILE=$(basename -- "$VINP")
VNAME=
VEXTORG=
VEXTLOW=
VCATEGORIA=

#
# popolamento variabili FILE
VPATH="$(dirname "${VINP}")"
VFILE="$(basename -- "${VINP}")"
VNAME="${VFILE%.*}"
VEXTORG="${VFILE##*.}"
VEXTLOW="${VEXTORG,,}"
VFILEOUT="${VPATH}/${VNAME}.sh"

#
# popolamento variabili per API
VTITLE="${VNAME^^}"
VALIAS="${VNAME,,}"

#
# NO SILENT mode: stampa solo un rapporto di upload ed errori
echo "curl --location --request POST 'http://localhost/api/index.php/v1/content/articles' \
--header 'Content-Type: application/json' \
--header 'X-Joomla-Token: c2hhMjU2EyMzhhNipiotrusyadflrtYjYxaAsdE 3YzFjZjQw' \
--data-raw '{
    \"title\": \"$VTITLE\",
    \"catid\": $VCATID,
    \"created_by_alias\": \"$VAUTOR\",
    \"language\": \"*\",
    \"metadesc\": \"\",
    \"metakey\": \"\",
    \"state\": 1,
    \"articletext\": \"$VARTINTRO<hr id=\\\"system-readmore\\\" />$(cat $VPATH/$VFILE)\"}'" > $VFILEOUT
chmod +x $VFILEOUT
Spiegazione delle variabili:
  • VTITLE: titolo dell'articolo
  • VAUTOR: da popolare con il nome dell'autore che vogliamo compaia;
  • VCATID: l'ID numeri della categoria in cui voglio inserire l'articolo;
  • VARTINTRO: testo fisso iniziale dell'articolo
  • "chmod +x $VFILEOUT": valido per linux e Mac rente il file di output .sh eseguibile.
# 3 caricamento degli file
Per velocizzare l'upload in Joomla e per operare in sicurezza migliore ho proceduto esenguendio gli .sh da dentro il server (infatti puntano tutti su "http://localhost/"):
  • ho zippato tutti gli .sh
  • ho fatto l'upload nel server
  • mi sonbo collegato al server ed ho estratto lo zip in nella directory "articoli".
A questo punto ho dato il seguente comando:

Codice: [Seleziona]
chmod +x articoli/*.sh
find articoli -type f -exec {} 2>&1 /dev/null \;
La prima riga è una ripetizione perchè i pacchetti zip fanno perdere alcune proprietà unix ai file.
La seconda riga è un comando che esegue automaticamente tutti i file contenuti nella cartella articoli uno ad uno.


# Wegrafia
Joomla Core APIs, https://docs.joomla.org/J4.x:Joomla_Core_APIs#Get_Single_Article
Joomla 4 API Introduction – Manage Articles via Joomla API, https://www.joomdev.com/joomla-4-api-introduction/



Spero possa essere di aiuto a qualcuno.Un saluto a tutti ;)
« Ultima modifica: 17 Apr 2024, 23:05:30 da stefbort »

 



Web Design Bolzano Kreatif