Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jakie proponujecie rozwiązanie
Forum PHP.pl > Inne > Hydepark
acztery
hej,

Mam taki kłopot mam pewien serwis. Klient zażyczył sobie takiej funkcjonalność

W serwisie jest słownik gdzie jest np 1000 haseł.

Na którejś z podstron serwisu mamy jakiś tam tekst i chce aby słowa w tego tekstu odsyłały do słownika. np w tekscie mamy słowo modelowanie to po klikniecu przejdziemy do słownika i hasła modelowanie.

Tylko jest małe alee.

tresc na stronie wyśwetlam w smarty za pomoca foreach i tak musi zostać...? moze jakies sugestie ?
domis86
musi to na rusi smile.gif

smarty to shit

ale jak juz uzywasz, to tą tresc przekazujesz skądś do tych smartow, wiec prepusc ją wczesnie przez jakiś filtr ktory pododaje linki do tresci i dopiero wyslij do smartow.

Ale takie filtrowanie za pomoca slownika z bazy bedzie wolne, wiec lepiej chyba zapisac tresc w bazie z linkami od razu, albo jakoś cachowac te tresci.
acztery
smarty dobre czy złe każdy ma swoje zdanie i niech tak zostanie. filtrowanie przed dodaniem lub przed wysłaniem do smarty nie wchodzi w grę w serwisie ok 1000 podstron i tyle samo haseł myślałem zeby napisać poszperać w samej smarty. ale nie wiem ..
domis86
Cytat(acztery @ 27.09.2007, 19:19:56 ) *
smarty dobre czy złe każdy ma swoje zdanie i niech tak zostanie. filtrowanie przed dodaniem lub przed wysłaniem do smarty nie wchodzi w grę w serwisie ok 1000 podstron i tyle samo haseł myślałem zeby napisać poszperać w samej smarty. ale nie wiem ..


w smarty bedziesz filtrowal? czemu nie wchodzi w gre przed wyslaniem? wchodzi, i to jest jedyne wyjscie.
acztery
bo edytowanie plików mi zajmnie tydzien. jedyne to to żę Bóg istnieje. Mysle ze tak będa filtorował to w samej klasie smarty. nie zaglądałem do źródła ale może zmienie cos z metodą związana z foreach. wtedy zmienia w 1 miejscu i zmiany sa automatycznie wszędzie widziane.
domis86
lol, kombinujesz jak kon pod gore. Nie uda ci sie przerbionie smartow, jesli nawet porzadnie systemu nie umiesz zaprojektowac.
Zrob lepiej jakąś funkjce(albo klase) ktora bedzie uruchamiana na wszystkich danych zanim pojda do smartów.
qqrq
Cytat(domis86 @ 27.09.2007, 18:47:15 ) *
smarty to shit


Sam jesteś shit.

acztery => Ta, a edycja kodu źródłowego Smarty ci napewno pójdzie jak po maśle, co? Znajdź w kodzie to miejsce, gdzie przypisywana jest zmienna Smarty (która potem wchodzi do pętli foreach w szablonie) i dodaj niej linki, do których się chcesz odwołać, a następnie zmodyfikuj kod wewnątrz pętli foreach w szablonie.
domis86
Cytat(qqrq @ 27.09.2007, 21:46:54 ) *
acztery => Ta, a edycja kodu źródłowego Smarty ci napewno pójdzie jak po maśle, co? Znajdź w kodzie to miejsce, gdzie przypisywana jest zmienna Smarty (która potem wchodzi do pętli foreach w szablonie) i dodaj niej linki, do których się chcesz odwołać, a następnie zmodyfikuj kod wewnątrz pętli foreach w szablonie.


A jak sobie wyobrażasz taką funkcje dodającą linki do tekstu?
AxZx
w smarty to sie robi tak

Kod
{$dane.teskt|zamien}


zamien jest to funkcja ktora wyszuka slowa w tekscie i zamieni je na link. t u juz mozesz wyrazeniami regularnymi przejechac ten tekst.
domis86
Cytat(AxZx @ 27.09.2007, 22:53:55 ) *
w smarty to sie robi tak

Kod
{$dane.teskt|zamien}


zamien jest to funkcja ktora wyszuka slowa w tekscie i zamieni je na link. t u juz mozesz wyrazeniami regularnymi przejechac ten tekst.


Ok, ale zeby dodac linki to trzeba pobrac całą tabele z bazy. To nie bedzie zbyt wydajne blinksmiley.gif
acztery
"jesli nawet porzadnie systemu nie umiesz zaprojektowac." a co to znaczy questionmark.gif bo nie kumam.

PS młody jesteś wiec nie mów lepiej co się da w php a co się nie da...

AxZx tylko Twoje rozwiązanie wymagało by edycji wszystkich stron....
domis86
Cytat(acztery @ 27.09.2007, 23:10:18 ) *
"jesli nawet porzadnie systemu nie umiesz zaprojektowac." a co to znaczy questionmark.gif bo nie kumam.

Powinieneś mieć jakiś model(lub modele) gdzie pobierasz tresci i zwracasz je do akcji. Dodawanie linkow powinno już być tam, wtedy byłyby one na wszystkich stronach. A jezeli mowisz, ze trzeba edytowac wszystkei strony zeby to zrobic to masz lipny system.

Cytat(acztery @ 27.09.2007, 23:10:18 ) *
PS młody jesteś wiec nie mów lepiej co się da w php a co się nie da...

Ty za to jesteś stary i jak widać twoja nauka poszła w las.
qqrq
Czekaj, czekaj. Piszesz, że masz w serwisie "1000 podstron". I w każdej trzeba przerobić zwykłe napisy na linki? Porażka... No ale zaraz - jak PHP, to strony są pewnie generowane dynamicznie, więc o co chodzi, gdzie problem?

OK. W pliku PHP gdzieś musi być coś takiego tablica wczytana jakimś zapytaniem z bazy danych, a potem wyrzucona do Smarty:

  1. <?php
  2. // Przykład...
  3.  // ...
  4.  $query = mysql_query("SELECT slowo FROM slowa");
  5.  $tablica = array();
  6.  while ($row = mysql_fetch_array($query))
  7. $tablica[] = $row['slowo'];
  8.  $smarty->assign('Slowa',$tablica);
  9. ?>


a w pliku *.tpl mamy:

  1. {foreach from=$Slowa item=slowo}
  2. {$slowo}
  3. {/foreach}


No to zmieniamy to jakoś tak:


  1. <?php
  2. // Przykład...
  3.  // ...
  4.  $query = mysql_query("SELECT slowo,link FROM slowa");
  5.  $tablica = array();
  6.  while ($row = mysql_fetch_array($query))
  7. $tablica[] = $row;
  8.  $smarty->assign('Slowa',$tablica);
  9. ?>


  1. {foreach from=$Slowa item=slowo}
  2. <a href="index.php?slowo={$slowo.linl}">{$slowo.slowo}</a>
  3. {/foreach}


Ale to tylko zgadywanka. Póki nie podasz fragmentu kodu (co mogłeś w sumie dawno zrobić) nic innego nie poradzimy.
acztery
domis widze ze wiesz co do MVC.

mam funkcje która zwraca array zeby ci pokazać wkleje ja tutaj chodz wątpie ze to coś da...

  1. <?php
  2. public function getDoc()
  3. {
  4. if (self::countId($this->_where,$this->_lang) == 0)
  5. {
  6. throw new Exception(HExc(1,$this->_where));
  7. }else{
  8.  
  9. self::uploadCounter($this->_where,$this->_lang);
  10.  
  11. $db = parent::Connect();
  12. $db->query("set names 'utf8'");
  13. $db->whereAdd("documents.Lang = '$this->_lang'");
  14. $db->whereAdd("documents.Id = '$this->_where'");
  15. $pis = DB_DataObject::factory('user');
  16. $db->joinAdd($pis);
  17. $db->selectAdd('documents.CreateDate as CreateDate2');
  18. $db->limit(1);
  19. $db->find();
  20. while($db->fetch()) {
  21. $result['data'][] = $db->toArray();
  22. }
  23. return $result = isset($result) ? $result : null;
  24.  
  25. }
  26. }
  27. ?>



wiec ta metoda niech zwraca co sobie array po co mam w nią ładować dodatkowe rzeczy które tylko obciążą serwis.. Dlatego napisz modyfikator dla smarty.

qqrq chyba zabardzo nie rozumiesz co ja chce osiągnąć...

a osiągnac chce cos takiego

1 table 1 - tabela słówka w słowniku
2 table 2 - tresc danej podstrony

mamy np tekst.

"
Piosenka Kasi Groniec za darmo!
Jest to druga piosenka wybrana z albumu, który ukazał się w kwietniu tego roku. Nowy singiel łączy w sobie lekkość wykonania i głębię
"

w słowniku mamy np taki wyrażenia jak Groniec, singielm, lekkość

i wynikiem było by

"
Piosenka Kasi <a href="slownik,groniec.html">Groniec</a> za darmo!
Jest to druga piosenka wybrana z albumu, który ukazał się w kwietniu tego roku. Nowy <a href="slownik,gronsingiel.html">singiel</a> łączy w sobie <a href="slownik,lekkosc.html">lekkość</a> wykonania i głębię
"

teraz powinno byc zrozumiałe.
NoiseMc
acztery, do widoku nie nalezy sprawdzanie czy slowo moze zalinkowac do slownika. To nalezy do modelu tak wiec w swojej funkcji getDoc() dodaj zamiast:
  1. <?php
  2. return $result = isset($result) ? $result : null;
  3. ?>

daj
  1. <?php
  2. if (! isset ($result))
  3. {
  4. return null;
  5. }
  6.  
  7. // Tutaj przykladowo tylko
  8. $text= $result['content']; //albo jak tam masz $result->content; wyciagasz tekst 'Piosenka Kasi...'
  9.  
  10. $words = explode (' ', $text);
  11.  
  12. foreach ($words as $key => $word)
  13. {
  14. // zapytaj baze czy ma w slowniku slowo
  15. if ($jestWSlownikuSlowo)
  16. {
  17. $word = '<a href="link.html">' . $word . '</a>';
  18. $words[$key] = $word;
  19. }
  20. }
  21.  
  22. $text = implode (' ', $words);
  23.  
  24. return $text;
  25. ?>


Oczywiscie porozbijaj sobie wszystko na zdania i pamietaj o przecinkach, to co napisalem to tylko taki szkic rozwiazania.
Jezeli natomiast nie chcesz pakowac za duzo kodu do klasy modelu to opakuj sobie ja w dekorator gdzie mozesz umiescic metode podlinkowujaca. Przykladu nie podam bo srednio mam wzorzec dekoratora opanowany ale cos mi swita ze pasowaloby go tutaj uzyc smile.gif
Potem wrzucasz gotowy tekst do smartow i nie martwisz sie o modyfikacje szablonow wcale.
qqrq
No i jasne, kolega ci tu ładnie podał.

Cytat(acztery @ 28.09.2007, 00:39:33 ) *
qqrq chyba zabardzo nie rozumiesz co ja chce osiągnąć...


No fakt, bo tak napisałeś. Trzeba było od razu napisać w ten sposób to byśmy nie gadali bez sensu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.