Redakčný systém v php 05. (pridavanie clankov)

18.04.2002 21:49 | blackhole

Tak už si v našom RS vieme vytvoriť jednotlivé kategórie pod ktorými budú naše články figurovať. Máme taktiež definované rôzne funkcie na pripojenie databázy, na tabuľky a pod. Ale chýba nám najdôležitejšia vec. Články. Teda vysvetlíme si ako pridávať a zobrazovať články.

Krátky náčrt problému vyzerá asi takto. Cez redakciu vložíme článok, a na našej stránke sa ukáže výpis 10 najnovších s krátkym popisom, počtom vzhliadnutí, počtom komentárov a s menom autora. Po kliknutí na nadpis sa nám zobrazí celý článok s možnosťou hlasovať a pridať komentár. Takže sa vrhnime nato.

REDAKCIA:
V adresári /skripts si vytvoríme skript s názvom addarticle.php. Do menu.php v redakcii pridáme naň odkaz: <br><b>article</b><BR><a href=\"index.php?b=addarticle\"><LI><b>add</b></a>teraz potrebujeme tabuľku v databáze do ktorej budeme články ukladať: create table article (id int(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,nadpis varchar(50),autor varchar(50),rubrika varchar(50),uvod text,article text,cas int,datum varchar(20),odkaz int(255),body int(255),videnie int(255),pocet_komentarov int(255));id – podľa tohto údaja budeme organizovať články
nadpis – nadpis článku
autor – autor článku
rubrika – rubrika kde je článok uložený (napr. auta, motorky, počítače. záleží na vás. ako jednotlivé rubriky vytvárať a spravovať si pozrite časť č. 04.)
uvod – tu bude krátky úvod. popis, ktorý sa bude zobrazovať v krátkom prehľade. napr. 10 najnovších)
article – samotný článok.
cas – čas podľa ktorého budeme zoraďovať
datum – dátum (dátum dňa. musím priznať, že jedno z týchto polí tu je zbytočne. ale keď som tento RS tvoril (pred 10 mesiacmi ?). tak som nevedel dobre pracovať s časom a zoraďoval som si polia podľa času a dátum som zobrazoval z poľa dátum :)
odkaz – tu zaznamenávam koľko ľudí bodovalo
body – počet bodov (aby sa neskôr dal vypočítať priemer. aké hodnotenie dostal článok)
videnie – počet videní
pocet_komentarov – tu sa vkladá počet komentárov. pre lepšie triedenie a určovanie v ktorom článku je najviac komentárov

Keďže už máme tabuľku vytvorenú, môžeme prejsť na vkladanie článku. (viď. komentáre k zdrojaku) <? /*  kontrola, či prihlásení je šefredáktor alebo autor. (môžete si zo zmeniť. vysvetlené v tretej časti seriálu */if (($name[5]==1)||($name[5]==2)) {$zone = mysql_query(\"select nazov from menu where 'zone' like typ order by id\");while ($poleZ = mysql_fetch_row($zone)) {}?>//html formulár na vkladanie<form action=\"index.php?b=addarticle\" method=post>nadpis<br><input type=\"text\" name=\"nadpis\" size=\"30\" maxlength=50></input><br>rubrika<br>//tu nám vyberie sekcie (rubriky). ake sme si nadefinovali v redakcii. <select name=\"rubrika\" ><?$zone = mysql_query(\"select nazov from menu where 'zone' like typ order by id\");while ($poleZ = mysql_fetch_row($zone)) {echo \"<option value=\"$poleZ[0]\">$poleZ[0]</option>\";}?></select><br>// uvod clankuuvod<br><textarea name=\"uvod\" cols=70 rows=5 ></textarea><br>article<br><textarea name=\"article\" cols=70 rows=15></textarea><br><br>//meno autora. automaticky sa doplna meno prihlaseneho, ale da sa zmenitautor<br><input type=\"text\" name=\"creator\" value=\"<?echo\"$name[1]\";?>\"></input><br><br><input type=\"submit\" value=\"ODOSLI\"></input><br></form><?/* kontrola, ci bol zadany nadpis, rubrika, uvod a samotny article. o5 si to môžete prispôsobiť. ak to, aby nebol zadany uvod pokladate za malickost, mozete to odstranit */if (($nadpis ==\"\")OR($rubrika==\"\")OR($uvod==\"\")OR($article==\"\")) {echo \"nie su zadane vsetky udaje\";}//ak bolo vsetko potrebne zadane, ideme nato.else {/* volame funkciu format_text(); tato funkcia nam odstrani niektore html tagy, zarovna nam vsetko podla potreby a automaticky vyznaci odkazy... opis funkcie vid. pod tymto skriptom*/$uvod = format_text($uvod, 100);$upravena = addslashes(format_text($article, 100));$cas = Time(); //ziskanie casu$datum=getdate(); //ziskanie datumu/* sformatovanie datumu. tu používam ešte starší spôsob formátovania dátumu. ale stále funkcni */$fdatum=$datum[\"hours\"].\":\".$datum[\"minutes\"].\" - \".$datum['mday'].\".\".$datum['mon'].\".\".$datum['year'];/*vlozenie vsetkeho potrebneho do databazy */MySQL_Query(\"insert into article values('','$nadpis','$creator','$rubrika','$uvod','$upravena','$cas','$fdatum','$odkaz','','','')\");}}/* tu nam vypise chybovu hlasku, ak sa pokusal article pridat niekto iny ako sefredaktor alebo autor */else {alert();}?>Teraz máme článok vložený v databáze. Už nám stačí iba vytvoriť skripty, ktoré to budú z databázy vyťahovať a zobrazovať. Predtým však vysvetlím funkciu format_text. Musím sa priznať . Táto funkcia nie je môj vytvor, ale poslal mi ju kamoš menom milusko. Keďže je to dosť zložitá funkcia jej opis by bol na samostatný článok (ktorý aj miluško napísal a zverejnil na www.interval.cz). Napíšem, o čo sa táto funkcia bude starať.

Táto funkcia sa nám postará o to, aby všetko čo napíšeme zobrazilo tak ako to vložíme. Teda všetko formátovanie aké má váš článok keď ste ho písali sa zachová. Taktiež automaticky prevedie odkazy typu: www.nieco.sk. http://nieco.sk a niekto@nieco.sk na aktívne odkazy na ktoré sa bude dať kliknuť. Jej najlepšou vlastnosťou je asi to, že dokáže rozdeliť dlheeeeeeeeeeee slovo ktoré má viac znakov ako je dané v parametri $dlzka. Toto má opodstatnenie hlavne na diskusných fórach kde sa rôzny chytráci snažia rozbiť krásu webu ;). Túto funkciu budú používať aj naše diskusné fóra.

(komentár k funkcii napísal milusko. tento zdroják si stačí napastovať do skriptu funkcie.php v redakčnej časti) <?function format_text($text, $dlzka){$text = Trim($text);$text = HTMLSpecialChars($text); //prevedieme špeciálne znaky na ich entity$text = Str_Replace(\"r\",\"\",$text); //Win systemy používajú ako konce riadkov znak n ale rn (r tu nieje podstatné, a preto ho odstránim)$text = Ereg_Replace(\"n{3,}\",\" nn \", $text);//ak sa v článku nachádza viac ako 3 súvislé konce riadkov nahradíme ich dvomi$text = Str_Replace(\"n\",\" <br> \",$text); //vlastná NL2BR()$novyText = \"\";$slovo = Split(\"[[:blank:]]+\", $text);//z textu si vytvorím pole, ktorého prvkami budú jednotlivé slováfor ($i=0;$i<Count($slovo);$i++):    // v tomto cykle si zistíme, či dané slovo nieje odkaz, a či má každé povolenú dĺžku  $slovo[$i] = Trim($slovo[$i]); //najprv odstránim prípadné medzery  if (Eregi(\"^www.[a-z0-9]+[a-z0-9._=/&?~]*$\", $slovo[$i])):      //slovo je odkaz typu www.nieco.sk    if (StrLen($slovo[$i]) > $dlzka):          //ak je odkaz dlhší, ako je povolené      $noveSlovo = \"<a href=\"http://\".$slovo[$i].\"\">\" . SubStr($slovo[$i], 0, $dlzka-3) . \"...</a>\"; //zobrazím z odkazu len $dlzka znakov a zvyšné nahradím (...)    else: //odkaz má povolenú dĺžku a môžem ho zobraziť celý      $noveSlovo = \"<a href=\"http://\".$slovo[$i].\"\">\" . $slovo[$i] . \"</a>\";    endif;  elseif (Eregi(\"^http://[a-z0-9]+[a-z0-9._=/&?/~]*$\", $slovo[$i])):      //odkaz je typu http://nieco.sk    if(StrLen($slovo[$i]) > $dlzka): //a znova to isté      $noveSlovo = \"<a href=\"\".$slovo[$i].\"\">\" . SubStr($slovo[$i],0,$dlzka-3) . \"...</a>\";    else:      $noveSlovo = \"<a href=\"\".$slovo[$i].\"\">\" . $slovo[$i] . \"</a>\";    endif;  elseif (Eregi(\"^[a-z0-9]+[a-z0-9._-]*[a-z0-9]+@[a-z0-9]+[a-z0-9._-]*[a-z0-9]+.[a-z]{2,3}$\", $slovo[$i])):    //a môže to byť ešte emailová adresa. Regulárny výraz pochádza z článku Regulárne výrazy II z www.interval.cz */    if(strlen($slovo[$i]) > $dlzka): //do tretice všetko dobré        //nie som si istý, či emailová adresa môže mať maximálne 40 znakov.      $noveSlovo = \"<a href=\"mailto:\".$slovo[$i].\"\">\" . SubStr($slovo[$i],0,80) . \"...</a>\";    else:      $noveSlovo = \"<a href=\"mailto:\".$slovo[$i].\"\">\" . $slovo[$i] . \"</a>\";    endif;  else:      //nejedná sa o židny odkaz, ale o normálne slovo    if (StrLen($slovo[$i]) > $dlzka): //ak je dlhšie...      $noveSlovo = Chunk_Split($slovo[$i], $dlzka, \" \");  /*funkcia chunk_split(retazec, dlzka , lep) rozdelí reťazec vždy po dĺžka znakov na menšie, a spojí ich lepom*/    else:      $noveSlovo = $slovo[$i]; //normálne slovo do povolenej dĺžky    endif;  endif;  $novyText .= $noveSlovo . \" \"; //nakoniec slová znovu pospájame do textuendfor;  $povolene[0] = \">\";            $entita[0] = \"&gt;\";  $povolene[1] = \"<b>\";        $entita[1] = \"&lt;b>\";  $povolene[2] = \"</b>\";      $entita[2] = \"&lt;/b>\";  $povolene[3] = \"<font \";      $entita[3] = \"&lt;font\";  $povolene[4] = \"</font>\";    $entita[4] = \"&lt;/font>\";  $povolene[5] = \"<a\";          $entita[5] = \"&lt;a\";  $povolene[6] = \"</a>\";        $entita[6] = \"&lt;/a>\";  $povolene[7] = \"&\";            $entita[7] = \"&amp;\";  $povolene[8] = \"<i>\";          $entita[8] = \"&lt;i>\";  $povolene[9] = \"</i>\";        $entita[9] = \"&lt;/i>\";  $povolene[10] = \"\"\";          $entita[10] = \"&quot;\";  $povolene[11] = \"<u>\";          $entita[11] = \"&lt;u>\";  $povolene[12] = \"</u>\";        $entita[12] = \"&lt;/u>\";  $povolene[13] = \"<img\";        $entita[13] = \"&lt;img\";  $povolene[14] = \"<table\";      $entita[14] = \"&lt;table\";  $povolene[15] = \"</table>\";    $entita[15] = \"&lt;/table>\";  $povolene[16] = \"</td>\";        $entita[16] = \"&lt;/td>\";  $povolene[17] = \"</tr>\";        $entita[17] = \"&lt;/tr>\";  $povolene[18] = \"<td\";          $entita[18] = \"&lt;td\";  $povolene[19] = \"<tr\";          $entita[19] = \"&lt;tr\";//  $povolene[20] = \"'\";          $entita[20] = \"'\";//miso: tu mozete vydiet, aké tagy sú povolené. for ($x=0;$x<Count($povolene);$x++):    $novyText = Eregi_Replace($entita[$x], $povolene[$x], $novyText);  endfor;  return $novyText;} //nezabudnite funkiu zavrieť?> To by bolo dnes asi všetko. Rozhodol som sa písať trošku kratšie časti seriálu, ale pridávať ich častejšie. Teda nabudúce si napíšeme skripty na zobrazovanie, bodovanie, a pridávanie komentáru k článku. To keď zvládneme, bude ta najhoršia časť za nami a na rad prídu pikošky ako anketový systém, pridávanie newsov, diskusie, Download, linky a pod. Teda chcel by som, aby ste sa vyjadrili v komentároch k článku alebo mne na mail, a neskôr napíšem článok s odpoveďami na vaše otázky. (niečo ako FAQ). Aby bolo všetko jasné.

Taktiež tvorím stránku pre tento RS, kde budú zdrojáky a návody ako to rozbehať, budú tam diskusné fóra o tomto RS atď. Chcel by som to viesť ako open source projekt, kde každý by to mohol vylepšiť, dorobiť nejaké vychytávky aby nakoniec z toho vznikol naozaj poriadny RS ;). Záujemcovia môžete sa hlásiť už teraz. Teším sa na ďalšie pokračovanie, ktoré bude skoro ;).mis0 truban