Többnyelvű blog megvalósítása
Sziasztok!
Szeretném kérni a segítségeteket egy többnyelvű blog elkészítésében. Ismereteimet autodidaktaként szereztem ezért erősen hiányosnak érzem a tudásom. CMS és FW nélkül szeretném megvalósítani a blogot natív kódolással. A blog adatbázisa egyelőre így néz ki:A kulcsokat – FOREIGN KEY – hogyan kellene megoldani a `post` táblában? Más észrevételt is szívesen fogadok az adatbázissal kapcsolatban.
A .htaccess fájl tartalma:A nyelvválasztás így néz ki: http://domain.tld/
A bejegyzések listája az alábbi címeken:
http://domain.tld/hu
http://domain.tld/en
Egy blog bejegyzést így lehet elérni:
http://domain.tld/hu/elso-bejegyzes
http://domain.tld/en/first-post
http://domain.tld/hu/masodik-bejegyzes
http://domain.tld/en/second-post
Hogyan kellene megírnom az SQL lekérdezéseket a bejegyzések listázásához valamint a bejegyzések megjelenítéséhez? Azért nem egyszerű a történet mert előfordulhatnak olyan bejegyzések amik nem lettek a `language` táblában található összes nyelvre lefordítva. Továbbá szeretném ha tanácsot adnátok azzal kapcsolatban is, hogy a fenti adatbázist hogyan kéne módosítanom ahhoz, hogy lehessen blog szerkesztés közben piszkozatokat is menteni és módosításkor visszalehessen keresni a módosítások előtti bejegyzések állapotait?
A bejegyzésekhez hozzászólás nem lesz. Admin felülettel sem kell most foglalkozni. A legfontosabb most az adatbázis megtervezése lenne a lekérdezésekkel.
Kérlek szépen titeket, hogy ne könyv címeket és ne linkeket küldjetek hanem konkrétan ennek a blognak a megvalósításában segédkezzetek a hozzászólásaitokkal!
Nagyon szépen köszönöm előre is mindenkinek aki időt szakít rám!
■ Szeretném kérni a segítségeteket egy többnyelvű blog elkészítésében. Ismereteimet autodidaktaként szereztem ezért erősen hiányosnak érzem a tudásom. CMS és FW nélkül szeretném megvalósítani a blogot natív kódolással. A blog adatbázisa egyelőre így néz ki:
CREATE TABLE IF NOT EXISTS `language` (
`id` TINYINT ( 1 ) AUTO_INCREMENT PRIMARY KEY,
`code` CHAR ( 2 ) NOT NULL,
`name` VARCHAR ( 10 ) NOT NULL,
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO `language` ( `code`, `name` ) VALUES
( 'HU', 'Magyar' ),
( 'EN', 'English' );
CREATE TABLE IF NOT EXISTS `translate` (
`id` SMALLINT ( 2 ) AUTO_INCREMENT PRIMARY KEY,
`language_id` TINYINT ( 1 ) NOT NULL, -- language.id
`code` SMALLINT ( 2 ) NOT NULL,
`content` TEXT NOT NULL,
FOREIGN KEY ( `language_id` ) REFERENCES `language` ( `id` )
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO `translate` ( `language_id`, `code`, `content` ) VALUES
( 1, 1, 'Első bejegyzés' ),
( 2, 1, 'First post' ),
( 1, 2, 'Első tartalom.' ),
( 2, 2, 'First content.' ),
( 1, 3, 'elso-bejegyzes' ),
( 2, 3, 'first-post' ),
( 1, 4, 'Második bejegyzés' ),
( 2, 4, 'Second post' ),
( 1, 5, 'Második tartalom.' ),
( 2, 5, 'Second content.' ),
( 1, 6, 'masodik-bejegyzes' ),
( 2, 6, 'second-post' );
CREATE TABLE IF NOT EXISTS `post` (
`id` TINYINT ( 1 ) AUTO_INCREMENT PRIMARY KEY,
`date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`title_translate_id` SMALLINT ( 2 ) NOT NULL,
`content_translate_id` SMALLINT ( 2 ) NOT NULL,
`uri_translate_id` SMALLINT ( 2 ) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO `post` ( `title_translate_id`, `content_translate_id`, `uri_translate_id` ) VALUES
( 1, 2, 3 ),
( 4, 5, 6 );
A .htaccess fájl tartalma:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
SELECT * FROM `language`;
A bejegyzések listája az alábbi címeken:
http://domain.tld/hu
http://domain.tld/en
Egy blog bejegyzést így lehet elérni:
http://domain.tld/hu/elso-bejegyzes
http://domain.tld/en/first-post
http://domain.tld/hu/masodik-bejegyzes
http://domain.tld/en/second-post
Hogyan kellene megírnom az SQL lekérdezéseket a bejegyzések listázásához valamint a bejegyzések megjelenítéséhez? Azért nem egyszerű a történet mert előfordulhatnak olyan bejegyzések amik nem lettek a `language` táblában található összes nyelvre lefordítva. Továbbá szeretném ha tanácsot adnátok azzal kapcsolatban is, hogy a fenti adatbázist hogyan kéne módosítanom ahhoz, hogy lehessen blog szerkesztés közben piszkozatokat is menteni és módosításkor visszalehessen keresni a módosítások előtti bejegyzések állapotait?
A bejegyzésekhez hozzászólás nem lesz. Admin felülettel sem kell most foglalkozni. A legfontosabb most az adatbázis megtervezése lenne a lekérdezésekkel.
Kérlek szépen titeket, hogy ne könyv címeket és ne linkeket küldjetek hanem konkrétan ennek a blognak a megvalósításában segédkezzetek a hozzászólásaitokkal!
Nagyon szépen köszönöm előre is mindenkinek aki időt szakít rám!
Segítség
A felmerült kérdések megválaszolásában sokat segít, ha elképzeled, vagy ha vizuális típus vagy, le is rajzolod a programot, a táblákat és a köztük lévő összefüggéseket, így a legtöbb dolog nyilvánvalóvá válik.
Konkrétan mi az, amivel elakadtál, milyen hibaüzenetet kapsz vissza?
Probléma
A másik nagy probléma, hogy nem minden bejegyzés lesz lefordítva az összes nyelvre. Ezekhez nem tudom megírni az SQL lekérdezéseket azon az oldalakon ahol az összes bejegyzés listája látható valamint a `post` tábla létrehozásához a másodlagos kulcsokat nem tudom megírni. Túl bonyolult nekem.
Volt már hasonló munkám, ott
Probléma
Ehhez hogyan írnád meg a lekérdezést ha csak annyit tudnál, hogy a $language_id PHP változó értéke: 'hu'?
Nem tudok bonyolult SQL lekérdezéseket írni, csak a nagyon alapokat.
Külön táblában kéne tárolnom őket? Ha igen, akkor még bonyolultabb a listázás ahol az összes bejegyzés látható.
Ahol
WHERE
.A másodikhoz: meg lehet egy táblával is oldani, azokat a rekordokat, amelyekben a piszkozatot tárolod, meg lehet jelölni egy extra mezővel, amit magyarul flag-nek szoktak hívni, s ezeket egyszerűen nem kell kilistázni. A kulcsszó itt is a
WHERE
.Csak azért se linkelek.
Probléma
SQL
Ami biztos, hogy az URL-ből ezt PHP-vel megoldom:
Éppen ezért elsősorban
Segítségkérés
Szerk.: MySQL adatbázis tervezése
Pár tipp
Ilyen több nyelvű blogokkal akadtam már össze, és fele annyira sem egyszerű, mint az jól esne. Többféle módon is megoldhatod, minden lehetőségednek van előnyös, és problémás oldala.
Tábla szerkezetben lehet próbálkozni nagyon összetett lekérdezésekkel, azt több idő lesz megtervezni, kitesztelni, és nehezebben lesz fejleszthető, cserébe gyorsabb lesz. A másik lehetőséged több külön lekérdezéssel csinálni meg a funkciókat. Egyszerűbb, gyorsabban tesztelhető ki, fejleszthetőbb, de a végeredmény lassabb lesz.
Ha több bejegyzés verziót akarsz menteni, kell egy adatverzió változó is. Az egyik lehetőséged, hogy elrakod mindegyik verzióját a bejegyzésnek külön-külön, ez több helyet fog foglalni, de gyorsabb lesz. A másik lehetőséged pedig, hogy csinálsz saját magadnak afféle adatváltozás leíró stringeket, mint amit az svn-ek is használnak, az munkában és kitesztelésben lesz sokkal több, lassabb is lesz, cserébe kevesebb helyet fog foglalni.
A nyelv választásnál a jelek szerint még nem jutottál el odáig, hogy akarni fogod elrakni azt is, milyen nyelven lett rögzítve a bejegyzés eredetileg. De majd eljutsz oda is.
Hogy mennyire szeretnéd kiadni külső munkába, azt nem úgy szokás megfogalmazni, hogy "kérem szépen", hanem egy számszerű összeggel, hogy cégként számla ellenében annyit érne meg neked.
Munka
Őszintén szólva ez a dolog nem sokat érne meg nekem mert már lassan rá is jövök a helyes adatbázis struktúrára.
Ez sokat segített mert szükséges lesz. Nem is gondoltam arra, hogy az eredeti nyelvű szöveget jelöljem valahogy.
Pár gondolat
Tessék egy kis segítség: ilyen irányba indulj el:
http://sqlfiddle.com/#!2/9a312a/2
Verziókezelés
Verziókezelés
A post táblába vegyél fel még három mezőt. Az egyik legyen az aktualis, a másik pedig a verzioszam, a harmadik a csoport. Az aktuálisra tegyél egy indexet.
Az összes kiiró query-be fel kell venned, hogy csak aktualis = 1 értékü elemeket figyelje.
A verziószámba én egy timestampet raknék, és egy getmypid -el lekérdezett értéket. Igy nagyon kicsire csökkent az ütközés veszélye.
a csoport mező értéke pedig megegyezik a sorozatban elősször létrehozott elem id-javal. Igy url változáskor, bármikor tudod, hogy mely history elemek tartoznak egybe.
Minden mentéskor beszursz, egy új sort a post táblába, ami tartlmaz minden adatot. Ha valaki élesre állította az adott bejegyzést, akkor minden más az adott csoportba tartozó elemnek 0-ra rakod az aktualis értékét, a fenti elemnek meg egyre.
A fenti módszer hátránya, hogy szorgos adminokkal elég hamar össze szedhető pár 10e verziózott elem, amire később irhatsz valamilyen takaritó algoritmust.
Ezzel így csak az a bajom,
Nem érdemes minden mezőt
Több tábla
Illetve mentéskor küzdhetnél, hogy minden mezőröl megállapitsd, hogy változott -e.
Itt a mentéskori ellenörzés könnyü. Az aktuális mezőihez egy szimpla == müvelettel összehasonlítod, ha van valamelyik mezőnél eltérés beszúrsz egy új sort, ha nincs, akkor nem csinálsz semmit.
A rengeteg redundánsan tárolt adat az adatbázisban, nem okoz gondot. Mentéskor figyelhetsz arra, hogy törölsz a db-ből (pl a 30 napnál régebbi verziókat törlöd, vagy az utolsó 20 verziót tartod csak meg). éjszaka pedig egyszer nyomsz cron-ból egy optimize-t a táblára, hogy úgy érezd mindent megtettél.
A unique indexbe több mezőt