up
up
uno dei metodi più utilizzati per le webapp multilingua è questo:
testi
id | testo1 | testo2 | ecc..
dove id è la chiave primaria ed essume valori tipo it, en, ecc.. e i campi contengono o le singole stringhe che utilizzi o stringhe concatenate con un separatore divise per ambiti.
in generale quindi utilizzi un record per ogni lingua.
nell'applicazione poi, appena definita la lingua, setti delle variabili di sessione per tutte le stringhe della lingua in uso, quindi nelle pagine utilizzi sempre e solo le variabili di sessione... così se devi aggiungere eliminare o modificare una lingua agisci solo su db senza toccare le pagine php
Ciao Nika90,
la struttura che mi aveva suggerita daniele_dll, è molto semplice, volevo sapere come devo inserire questi campi nel db.
Io credo che bisogna fare così:
TABELLA LINGUE
id_lingua, codice_lingua, lingua.
TABELLA NEWS
id, id_news, id_lingua, titolo, descrizione.
Volevo un aiuto con qualche esempio di come inserire i dati nel db. Tipo così:
TABELLA LINGUE
1, it, Italiano
2,en, English
4,fr, Francais
TABELLA NEWS
1,1, 1, ciao, ciao mondo
2,1, 2, hello, hello world
3,1, 4, bonjour, bonjour monde
4,2, 1, il mio nome, mi chiamo Daniele
5,2, 2, my name, my name is Daniele
6,2, 4, mon nom, Mon nom est Daniele
Cioè far ripetere lo stesso id (id_news) in base quante lingue sono.
Il problema è che non riesco a far ripetere lo stesso id n volte quante sono le lingue, sapresti aiutarmi con un esempio pratico?
no, scusami, ma sinceramente quel metodo non solo è poco utilizzato ma è considerevolmente peggiore del precedente -.-'Originariamente inviato da Nika90
uno dei metodi più utilizzati per le webapp multilingua è questo:
testi
id | testo1 | testo2 | ecc..
dove id è la chiave primaria ed essume valori tipo it, en, ecc.. e i campi contengono o le singole stringhe che utilizzi o stringhe concatenate con un separatore divise per ambiti.
in generale quindi utilizzi un record per ogni lingua.
nell'applicazione poi, appena definita la lingua, setti delle variabili di sessione per tutte le stringhe della lingua in uso, quindi nelle pagine utilizzi sempre e solo le variabili di sessione... così se devi aggiungere eliminare o modificare una lingua agisci solo su db senza toccare le pagine php
Cosi devi modificare la struttura del database per variare le lingue ... ottimo![]()
Per questo tipo di situazioni la struttura della tabella si cerca di espanderla verticalmente e non orizzontalmente
------
provo a spiegarti la procedura di inserimento in due parole:Originariamente inviato da m4tt86
Ciao Nika90,
la struttura che mi aveva suggerita daniele_dll, è molto semplice, volevo sapere come devo inserire questi campi nel db.
Io credo che bisogna fare così:
TABELLA LINGUE
id_lingua, codice_lingua, lingua.
TABELLA NEWS
id, id_news, id_lingua, titolo, descrizione.
Volevo un aiuto con qualche esempio di come inserire i dati nel db. Tipo così:
TABELLA LINGUE
1, it, Italiano
2,en, English
4,fr, Francais
TABELLA NEWS
1,1, 1, ciao, ciao mondo
2,1, 2, hello, hello world
3,1, 4, bonjour, bonjour monde
4,2, 1, il mio nome, mi chiamo Daniele
5,2, 2, my name, my name is Daniele
6,2, 4, mon nom, Mon nom est Daniele
Cioè far ripetere lo stesso id (id_news) in base quante lingue sono.
Il problema è che non riesco a far ripetere lo stesso id n volte quante sono le lingue, sapresti aiutarmi con un esempio pratico?
- viene caricata la pagina di aggiunta news
- leggi dall'apposita tabella l'elenco delle lingue presenti nel sistema
- per ogni lingua stampi a video un pezzo di codice HTML per inserire il testo della news in quella lingua (magari ci stampi accanto la lingua di riferimento o li stampi in un blocco a se stante sempre riferendo la lingua e cosi via)
- una volta premuto il tasto invia tu prendi i dati via post che saranno strutturati in un modo ben preciso (lo trovi più sotto)
- questi dati in post li elabori per come ti serve (ergo lanci uno stripslashes se magic_quote_gpc è attivo e poi lanci un mysql_real_escape_string ... ovviamente se non è in utf8 prima di lanciare l'escape lanci un htmlentities)
- i dati cosi come sono li butti nel database tramite delle insert
Il form che hai postato prima lo vari da cosi
a cosicodice:<?php while ($row_leggi_lingue = mysql_fetch_assoc($leggi_lingue -> result)){ ?> <tr> <td><input type="text" name="titolo_[<?php echo $row_leggi_lingue['id'] ?>]"></td> </tr> <tr> <td><textarea name="descrizione_[<?php echo $row_leggi_lingue['id'] ?>]"></textarea></td> </tr> <?php } ?>
Una volta che hai fatto questo giochino dentrocodice:<?php while ($row_leggi_lingue = mysql_fetch_assoc($leggi_lingue->result)){ ?> <tr> <td><input type="text" name="news[<?php echo $row_leggi_lingue['id']; ?>][titolo]"></td> </tr> <tr> <td><textarea name="news[<?php echo $row_leggi_lingue['id']; ?>][testo]"></textarea></td> </tr> <?php } ?>
$_POST['news']['1']['titolo']
ci starà il titolo della lingua italiana e in
$_POST['news']['1']['testo']
ci starà il testo
semplicemente per tirarli fuori puoi fare o un foreach si news, ovvero
dentro il ciclo ti basta effettuare le operazioni di cui ti parlavo prima (striplslashes e mysql_real_escape_string ed un eventuale htmlentities se non usi utf8) di fare l'insert ed il gioco è fattocodice:foreach($_POST['news'] as $languageID => $newsDatas) { // $newsDatas['titolo'] contiene il titolo mentre $newsDatas['testo'] ci sta il testo ... dentro $languageID ci sta l'id della lingua }
www.php.net/mysql_real_escape_string
www.php.net/stripslashes
www.php.net/htmlentities
www.php.net/get_magic_quotes_gpc
L'ultima funzione serve appunto per controllare il magic quote
Quando devi stampare il tutto a video ti basta prendere la roba cosi come e mandarla a video
Se ti serve avere un pseudo BBCODE, dato che questo non ti verrà toccato dall'htmlentities (le quadre, l'uguale, gli apici e cosi via sono caratteri che non vengono convertite nelle relative entità), non devi fare altro che convertirlo alla visualizzazione per tua semplice altrimenti al momento dell'inserimento, dopo che lanci l'htmlentities, converti il tutto in html cosi per la visualizzazione non ti tocca fare nulla ed ottieni il massimo delle performance
The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand
non sono d'accordo, una volta fatta l'analisi e progettato il db in modo corretto aggiungere una lingua è una cavolata...Originariamente inviato da daniele_dll
no, scusami, ma sinceramente quel metodo non solo è poco utilizzato ma è considerevolmente peggiore del precedente -.-'
Cosi devi modificare la struttura del database per variare le lingue ... ottimo![]()
Per questo tipo di situazioni la struttura della tabella si cerca di espanderla verticalmente e non orizzontalmente
volevo fare una cosa del genere anch'io... il prof mi ha detto brutte parole
fate come volete
certo, ottimo, il prof probabilmente ti avrà detto brutte parole anche quando si parlava di reusabilità del codice e programmazione ad oggettiOriginariamente inviato da Nika90
non sono d'accordo, una volta fatta l'analisi e progettato il db in modo corretto aggiungere una lingua è una cavolata...
volevo fare una cosa del genere anch'io... il prof mi ha detto brutte parole
fate come volete
Il database, quando lo progetti, non devi PER FORZA riorganizzarlo da ZERO!!!
Se hai un sistema di gestione delle lingue con un set di funzioni e funzionalità (o di classi) che ti gestisca il tutto perché il sistema, flessibile, proprio grazie ad una espansione verticale, lo prevede non vedo perché dovresti riscriverlo-riadattarlo OGNI volta che ti variano le lingue coinvolte
La cosa può essere resa ancora più astratta e flessibile di come l'ha strutturata lui per adesso: io, per esempio, ho delle tabelle ad hoc che mi contengono i contenuti multilingua e le tabelle di riferimento vengono joinate per recuperare le informazioni necessarie ed in questo modo tengo il contenuto multi lingua fuori dalle tabelle (news ... articoli e cosi via ... solo una voce nelle loro relative tabelle)
in questo modo ho un object_type ed un object_id nelle tabelle del multi lingua che mi permettono di fare tutti i collegamenti che mi pare e piace senza dover cambiare una virgola ... neanche se cambia TOTALMENTE il tipo di contenuto che devono andare a gestire (news, articoli ... immagini [anche queste devono essere multi lingua in certe situazioni] e cosi via)
Ovviamente non ho una sola tabella che tiene dentro tutti i contenuti ma un tabella per tipologia ed in questo modo gli articoli, cosi come le categorie degli articoli od i commenti faranno riferimento alla tabella
i18n_traslations_articles
mentre le news
i18n_traslations_news
e cosi via
dove object_type sarà, ad esempio, text, comment, image e cosi via mentre l'id sarà l'id di rifermento utilizzato nella tabella del componente che usa il multi lingua
The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand
ok
Grazie daniele_dll,
quindi dentro il db devo ripetere l'id n volte quante sono le lingue giusto?
Ciao daniele_dll,
ho fatto l'inserimento e la modifica, è troppo bello :-) sei un genio, è venuto un codice molto pulito.
Ho un altra domanda da farti, ho fatto la modifica e funziona tutto, l'unico problema che non so gestire è che se aggiungo un altra lingua nella modifica il campo spunta e anche se lo riempio nella modifica non me lo salva, proprio perchè ovviamente il record non è stato creato, come posso risolvere questo problema?
ecco il codice della modifica:
P.S. non fare caso a "$mod_news -> update (...);" è una classe che mi sono creato ma fa la modifica nel db.Codice PHP:$id_post_news = $_POST['id_news']; //id della news
foreach($_POST['news'] as $languageID => $newsDatas)
{
$languageID; //id lingua
$titolo = $newsDatas['titolo']; //titolo news
$descrizione = $newsDatas['testo']; //testo news
$mod_news -> update ("news", "id_lingua = '$languageID', titolo = '$titolo', descrizione = '$descrizione' WHERE id_news = '$id_post_news' AND id_lingua = '$languageID'", NULL);
}
Grazie per il tuo favoloso aiuto
Matt86
beh, in questi casi ti conviene usare la sintassi di REPLACE più che di UPDATE perché cosi raggruppi l'inserimento e la modifica nello stesso pezzo di codice con la differenza che la modifica va solo a pre-popolare i campi al primo accesso mentre per i successivi, in entrambi i casi, i campi vanno popolati tramite i dati passati via post
per maggiori informazioni
http://dev.mysql.com/doc/refman/5.0/en/replace.html
The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand