ugrás a tartalomhoz

adatbázisban tárolt tartalom nem egységes megjelenítése

jzsolti · 2012. Már. 1. (Cs), 22.48
Sziasztok!

Hogyan szokás azt megoldani hogy egy webáruház tartalmát adatbázisban tároljuk de van több mint 10 féle html oldal struktúra, amiben meg kell jeleníteni a tartalmat. Mindez két nyelvű oldalon.

A tartalmat HTML kódostul tárolni az adatbázisban, vagy minden egyes html tag-ban megjelenítendő tartalmat
külön sorban tárolni, és php-ban összerakni az oldalt?
Az utóbbival próbálkoztam egy ilyen táblában tárolva a tartalmat:
tartalom_id int
html_tag set('h1', 'h2', 'h3', 'h4', 'h5', 'p', 'ul', 'img')
tartalom_hu text
tartalom_en text
sorszam int
css_class varchar(20)
css_id varchar(20)
termek_id int

a sorszam mező szerint rendezem sorba a tag-okat az oldalon és a termek_id a külső kulcs ami az egyes termékhez kapcsolja a tartalmakat

Van esetleg más jobb megoldás is?
 
1

adat

Poetro · 2012. Már. 1. (Cs), 23.40
Semmiképp se HTML-ben tárold, mert ha változik az oldal design-ja, esetleg csak bizonyos részek kellenek, más sorrendben, vagy több adat, akkor kezdheted előröl. Azaz tárold külön a termékek egyes mezőit, és egy sablonozó rendszerrel (ami lehet pusztán PHP is) rakd össze ezekből a mezőkből a megjelenő tartalmat. Az a html_tag mező nem tudom mit keres ott, vagy hogy hogyan is van elképzelve ez a tartalom. Mint már írtam, az adatoknak semmilyen információt nem kell hordozni arról, hogy hogyan fog az megjelenni, az a sablonozó rendszer része.
2

mivel sokféle oldal struktúra

jzsolti · 2012. Már. 2. (P), 00.20
mivel sokféle oldal struktúra van akkor ha mindegyik oldaltipushoz csinálok egy sablont akkor gondolom minden sablonhoz más más tábla kellene az adatbázisban , így kellene megoldani?
Kezdő vagyok ebben azért kérdem.

most egy darab termek.php oldal van és a html_tag mező tartalmától függően csinál a php
egy megfelelő html tag-ot benne a tartalom_hu mező tartalmával:


class html_tag_maker
{
   protected $linksResult = array();
   
   public function __construct($linksResult)
   {
	  $this->linksResult = $linksResult;
   }
   
   /**
   * This function replace the adequate words to <a></a> html tag.
   * $linksResult = links table content from database.
   */
   protected function linkMaker($value)
   {
	  while ($row = mysqli_fetch_array($this->linksResult)){
         $word = $row['word'];
         $replace = "<a href='".$row['url']."'>".$row['word']."</a>";
         $value = str_replace($word,$replace,$value);
      }
	  mysqli_data_seek($this->linksResult,0);
	  return $value;
   }
   
   /**
   * This function insert the id and class attributes into  
   * the adequate html tag.
   */
   function css_id_class($cssId,$cssClass)
   {
      
      if($cssId != NULL && $cssClass != NULL){
	     $css =  " id='".$cssId."' class='".$cssClass."' ";
	  }elseif($cssId != NULL){
	     $css =  " id='".$cssId."' ";
	  }elseif($cssClass != NULL){
	     $css =  " class='".$cssClass."' ";
	  }
	  return $css;
   }
   
   /**
   * The following functions make html tags 
   * from database table content.
   */
   public function hTag($tag,$value,$cssId,$cssClass)
   {
	  if($cssId != NULL || $cssClass != NULL){
	     $css = $this->css_id_class($cssId,$cssClass);
	  }
	  
	  if(isset($css)){
	     $h = "<".$tag.$css.">".$value."</".$tag.">";
	  }else{
	     $h = "<".$tag.">".$value."</".$tag.">";
	  }
	  return $h;
   }
   
   public function pTag($value,$cssId,$cssClass)
   {
	  if($cssId != NULL || $cssClass != NULL){
	     $css = $this->css_id_class($cssId,$cssClass);
	  }
	  		 
	  $value = $this->linkMaker($value);	
	  
	  if(isset($css)){
	     $p = "<p ".$css.">".$value."</p>";
	  }else{
	     $p = "<p>".$value."</p>";
	  }
	  return $p;	  
   }
   
   public function ulTag($value,$cssId,$cssClass)
   {	  
	  $ulArray = explode('#',$value);
	  
	  for($i=1; $i<count($ulArray); $i++){
	     $ulArray[$i] = $this->linkMaker($ulArray[$i]);
	  }
	  
	  if($cssId != NULL || $cssClass != NULL){
	     $css = $this->css_id_class($cssId,$cssClass);
	  }
	  
	  if(isset($css)){
	     $ul = "<div ".$css.">";
	  }else{
	     $ul = "<div>";
	  }
	  $ul .= "<h3 class='ulHead'>".$ulArray[0]."</h3>";
	  $ul .= "<ul>";
	  for($i=1; $i < count($ulArray); $i++){
	     $ul .= "<li>".$ulArray[$i]."</li>";
	  }
	  $ul .= "</ul>";
	  $ul .= "</div>";
	  return $ul;
   }
   
   public function imgTag($value,$cssId,$cssClass)
   {
	  if($cssId != NULL || $cssClass != NULL){
	     $css = $this->css_id_class($cssId,$cssClass);
	  }
	  
	  if(isset($css)){
	     $img = "<span ".$css.">";
	     $img .= "<img src='images/".$value."'  />";
		 $img .= "</span>";
	  }else{
	     $img= "<img src='images/".$value."'  />"; 
	  }
	  return $img;   
   } 
}/*-- html_tag_maker class end --*/

$htmlMakerObj = new html_tag_maker($linksResult);

while ($row = mysqli_fetch_array($Result)){
   $tag = $row['htmltag'];
   $value = $row['tartalom'];
   $cssClass = $row['cssclass'];
   $cssId = $row['cssid'];
   switch($tag){
      case 'h1':
         echo $htmlMakerObj->hTag($tag,$value,$cssId,$cssClass);
         break;
      case 'h2':
         echo $htmlMakerObj->hTag($tag,$value,$cssId,$cssClass);		 
	     break;
      case 'h3':
         echo $htmlMakerObj->hTag($tag,$value,$cssId,$cssClass);		 
	     break;
      case 'h4':
         echo $htmlMakerObj->hTag($tag,$value,$cssId,$cssClass);
         break;			
      case 'h5':
         echo $htmlMakerObj->hTag($tag,$value,$cssId,$cssClass);
	     break;			
      case 'p':
	     echo $htmlMakerObj->pTag($value,$cssId,$cssClass);
	     break;			
      case 'ul':
	     echo $htmlMakerObj->ulTag($value,$cssId,$cssClass);
	     break;
      case 'img':
	     echo $htmlMakerObj->imgTag($value,$cssId,$cssClass);
	     break;
      case 'a':
	     echo $htmlMakerObj->aTag($value,$cssId,$cssClass);
	     break;			
   }		 
}
4

Árúval verébre

Blintux · 2012. Már. 2. (P), 12.41
Ez már az ágyúval verébre kategória szerintem, nem kell ennyire bonyolultnak lennie.
Az adatbázisban tényleg csak az információ legyen tárolva, pl.: termek_id, termek_nev, termek_leiras_hu, termek_leiras_en

Ha van egy termékeket listázó oldalad (temeklista.php), akkor ott lekérdezed a termékeket egy tömbbe, majd mondjuk egy foreach ciklussal végigmész ezen a tömbön, amiben echo-val kiíratod a nevüket, tetszőleges HTML körítést használva.
Ezeken a neveken lehet egy link, ami mondjuk a termek.php?termek=termek_id oldalra mutat. (Értelemszerűen a termek_id lesz a termékhez tartozó azonosító)

A termek.php-ban pedig csak a kívánt azonosítójú terméket kérdezed le, ugyan abból a táblából természetesen. Majd ennek jellemzőit (Név, Leírás) szintén tetszőleges HTML környezetbe kiíratod.

Remélem ebből az egyszerű példából érted, hogy is kellene ezt megtervezni. Az egyes fájlok tulajdonképpen sablonok, amelyekben csak a nyers adatot kell lekérdezned és azokat ott helyben ellátni HTML tagekkel.

Tipp: Kezdők még bele szoktak esni abba a hibába, hogy hajlamosak minden statikus HTML kódrészt PHP-val kiíratni. Tehát, ha például a termékeket egy táblázatba jeleníted meg, akkor a táblázat fejlécét, vagy magának az oldalnak a fej, illetve láblécét, nem dinamikusan előállított tartalmait nem kell PHP-val echo-ztatni, mert csak feleslegesen fut át az értelmezőn.
Ugyan ez igaz a te esetedben is, az adatbázisban tárolt HTML-el. Feleslegesen foglalja a helyet az adatbázisban, feleslegesen kapja meg a PHP értelmező, csak lassít az oldal működésén. Legyen statikus ami csak lehet.
3

kicsit túlbonyolítottadd

Kubi · 2012. Már. 2. (P), 02.42
kicsit túlbonyolítottadd :)

Tippem szerint a többnyelvűség zavart meg egy kicsit.

Egyszerű példa: adott termékről tárolni kell nevét, leírását, árát, képeket

webshop_product tábla
  id
  price

webshop_product_i18n tábla (product_id és lang legyen közössen a primary key, így egy termékhez egy nyelven csak egy  bejegyzés kerülhet be)
  product_id
  lang
  description
  title

webshop_product_images tábla
  id
  product_id
  image


ha a magyar nyelvű termékre van szükséged:

SELECT * FROM webshop_product JOIN webshop_product_i18n ON (webshop_product_i18n.product_id = webshop_product.id AND webshop_product_i18n.lang = 'hu')
plusz rácsatolod az images táblát, most nem írom le.


Olyat is tehetsz, hogy ha pl angol nyelven (lang='en'), nincs meg az adott termék (mert nincs hozzá bejegyzés az i18n táblában), akkor csinálsz egy lang='hu' lekérdezést és azt jelentíted meg, íj módon fallback, ha az admin csak egy nyelvet töltött ki akkor is megjelenjen a termék az angol oldalon is.

A description mezőben nyugodtan tárolhatsz html tartalmat (nem a teljes oldalét, csak a formázott leírást), sőt javaslom tinymce vagy ckeditor használatát.

A lényeg, hogy logikai részekre bontsd szét,pl.: a leírást nem kell soha tovább bontanod, az egy egységes. Ha kell más adat, pl termék súlya, termék mérete, színe stb. ezeknek külön külön egy egy mező kell(és ezeket fordítani sem kell, mehetnek webshop_product táblába)
5

Köszönöm a segítséget.

jzsolti · 2012. Már. 2. (P), 16.54
Köszönöm a segítséget.

Lehet hogy nem jól írtam le a problémát.

Tehát lesz kb 50 féle termék de a termékeket megjelenítő oldalak szinte mindegyik más, mert minden termékhez más más információ tartozik, amik terjedelemben is különböznek és megjelenésben is és a felsorolások táblázatok bekezdések más más sorrendben jönnek egymás után. Tehát lesz egy termékoldal ami így néz ki:
cím
alcím
felsorolás
bekezdés
felsorolás

aztán egy másik:
cím
egy bekezés
második bekezdés
harmadik bekezdés

aztán egy harmadikféle:
cím
egy bekezdés
táblázat1
táblázat2

Erre értettem hogy sokféle oldalstruktúra lesz.

Ezt hogy lehetne megoldani úgy hogy egy táblában tárolom az információt a termékekről és egy (vagy többféle?) sablonnal
megjelenítem azokat?

Kubi javaslata egyszerűbbé teszi a dolgot. Egy ilyen CKeditor-os megoldás (és html az adatbázisban) azt hiszem segíteni fog.
6

Hát, ha tényleg

Pepita · 2012. Már. 2. (P), 20.38
ennyire különböztetni akarod a termékleírásokat, akkor lehet, hogy mégis HTML kell DB-be...

De szerintem próbáld meg a leírásokat "szabványosítani", én még nem láttam olyan webshopot, ahol ilyen megoldás lett volna.

És ez nem feltétlenül jelenti azt, hogy a tiéd "nyerő" lesz az újdonság miatt. Arra is gondolj, hogy:
- Mi lesz, ha a terméklista kibővül 50-ről mondjuk 500-ra?
- A Júzernek mennyire lesz csábító, hogy a különböző termékekről nagyon más formában kell olvasnia? (Szerintem ez inkább negatívum.)
- Ki és hogyan rögzíti a termékleírást? (Ugye aki nem ért HTML-ül, annak kezébe még wysiwyg eszközzel sem szívesen adunk tag-eket!)
- Hogyan oldod meg egy termékleírás módosítását?

Szóval javaslom, hogy bevált megvalósítások közül válassz.
7

Szerintem még így is lehet

Blintux · 2012. Már. 2. (P), 21.13
Szerintem még így is lehet sablonosítani a dolgot.
Mondjuk egy mezőbe az kerül, hogy melyik sablon tartozik az adott termékhez, aztán hogy azt a sablont egy teljes fáj, vagy egy függvény, vagy csupán switch case elágazás generálja, az attól függ mennyire bonyolult a megjelenésbeli különbség.

Gondolom az oldal fő részei nem fognak változni: fejléc, lábléc, tartalmi sáv, oldalsáv... Ezek is lehetnek külön fájlokban, amit a fő program össze includeol a lekérdezett termék sablonnal egyetemben.

Egyébként tényleg nem szerencsés nagyon eltérő megjelenést használni egy webshopban, csak összezavarja a felhasználókat. Inkább a színekkel, design elemekkel érdemes az adott termék egyediségére felhívni a figyelmet. Mondjuk nő parfümök esetében egy lágy nőies színekkel felépített sablon, még szerszámok esetében erősebb, gépiesebb hatású sablon. De ettől függetlenül a betűméretek, az információk elhelyezése és maga a layout szerkezet ugyanaz maradjon.
8

Igazad van

Pepita · 2012. Már. 2. (P), 21.59
Én sem mondtam, hogy nem lehet sablonnal, de ha "pont annyi" sablon kéne, ahány termék van, nos, ott már nem érdemes. Bár... Na, elnézést, fáradt vagyok. (Törölhető)
9

Nem egy szokványos webáruház

jzsolti · 2012. Már. 2. (P), 22.15
Nem egy szokványos webáruház lesz széles célcsoportal. Inkább egy céges oldal ahol a saját fejlesztésű
hardver termékeket kell megjeleníteni (amit persze meg is lehet rendelni) emellett disztribútorai is lesznek egy szintén hardvertermékeket gyártó külföldi cégnek.
plusz szolgáltatások pl hardver szoftver tervezés megvalósítás. Nem lehet egységesíteni a tartalmat.

Tehát nem hajszárítókat meg csavarhúzókat akarnak árusítani hanem minden termék egyedi egészen különböző műszaki információkkal. Különböző terjedelemben is és mint írtam valahol van táblázat mert olyan info van amit abban lehet megjeleníteni valahol több felsorolás valahol kevesebb stb.
10

Akkor egyértelmű: A termék

Blintux · 2012. Már. 2. (P), 22.28
Akkor egyértelmű: A termék leírásban kell használni HTML kódokat, amik így lesznek elmentve az adatbázisba. Mint egy bejegyzés egy blog oldalon, ahol egységes minden, de minden bejegyzés lehet teljesen különböző.
Szóval az adott termék teljes infó oldalának formázása legyen SQL-ben eltárolva.
Felvitelhez, átszerkesztéshez pedig lehet használni valamilyen wisiwing szerkesztőt, mondjuk TinyMCE-t.
11

Másik ötlet

Pepita · 2012. Már. 2. (P), 23.55
Itt már nem értek egyet Blintux-al.

Szerintem ez vagy nem webshop, vagy (inkább) egy websop és egy dokumentációs (gyártói) oldal.

Igazad van, a saját gyártású termékhez szükséges a részletes leírás, ez minden termék esetében teljesen egyedi is, viszont a shopban, ahol csak összeklattyolgatja a Júzer a kosarába a termékeket, ott nem kell ezt teljes terjedelmében megjeleníteni. Csak annyit pl., hogy ez egy ilyen-olyan vrinyó, ködlámpával meg klímával, teljes "júzermanuálll" itt-és-itt. Ezzel a megoldással egységesíteni tudod a shopot, a visszatérő vásárló/megrendelő nem kell, hogy a nagy tartalmat nézegesse (-> gyorsan és könnyen vásárol és örül neki), aki pedig "most jött", az lát először egy áttekintést és azt a cuccost, ami jobban érdekli, megnézheti részletesebben. Ahogy ebből a rövid leírásodból megítélem: mindenkinek ez a jobb. (Persze a részletes leírásokat már másik táblába, akár HTML-ben.)

Szerk.: Hidraulikus cuccokat forgalmazó cégnél láttam is ilyet, shopban minimális infó + link a doksihoz. A doksik meg a gyártó(k)tól származó pdf-ek voltak.