Jiné : phpRS Fórum
Na něco jsme zapomněli?
phpRS - redakční a informační systém
Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: cross182 (IP adresa zaznamenána)
Datum: 2009-01-02, 00:16

Zdravím.
Mám jen takový dotaz. Používám plugin Poslední komentáře (// plugin do phpRS verze 2.3.5b // posledni update 5.9.2003) . Když někdo vloží delší slovo (např. slovo + hodně teček nebo odkaz na youtube), levý sloupec (kde se mi mj. vypisují i tyto poslední komentáře) se kvůli tomuto slovu roztáhne. Pak musím v administraci tato slova rozdělit.
Chtěl bych to ošetřit v PHP, jenže nevím kde (předpokládám, že v souboru posl_komentare.php v adresáři plugin.

if(strlen($retezec)>20)
echo substr($retezec,0,20) . "...";
else
echo $retezec;

řekl bych, že nějak takto - jenže nevím, na jakou proměnnou to mám aplikovat ...
Poradíte mi prosím někdo?

cross

×××---×××
www.ava-plus44.com
www.blink-182.cz

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: pa3k (IP adresa zaznamenána)
Datum: 2009-01-02, 10:58

2.8.X verzia má niečo takéto:
// maximalni povolena delka jednoho slova; vetsi slova budou automaticky rozdelena
$GLOBALS['rsconfig']['max_delka_slova']=50;

Ak to ten plugin nepodporuje, treba ho upraviť. Žiaľ nepoznám ho, ale ak by si sem hodil kód ktorý generuje obsah bloku v tom plugine, tak by sa to dalo vyriešiť veľmi jednoducho.

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: cross182 (IP adresa zaznamenána)
Datum: 2009-01-02, 11:03

Takže ten kód:



<?
// plugin do phpRS verze 2.3.5b
// vypis poslednich kometaru
// posledni update 5.9.2003
define('IN_CODE',true); // inic. ochranne konstanty

function dej_datum($datum)
{
$dat = explode("-",$datum);
$year = $dat[0];
$month = $dat[1];
$day = $dat[2];
return (int)$day.".".(int)$month.".".substr($year,-2,2);
}

function PoslKomentare()
{

// ---[ definice zakladnich parametru ]-----------------------
$mnozstvikomentaru = 5; // pocet zobrazenych kometaru
$zobrazenychznaku = 100; // pocet znaku, ktere se zobrazi z tela komentare
$oddelovackometare = "<font color=\"#730f0f\">&raquo;</font>"; // zacatek kazdeho kometare ve vypisu bude zacinat timto retezcem
$koneckomentare = "<p>";
$stylvypisu = "novtext";
// -----------------------------------------------------------

// vypis X kometaru
$dotazkomentare = phprs_sql_query("select idk,obsah,datum,clanek,titulek from ".$GLOBALS["rspredpona"]."komentare order by datum desc limit 0,".$mnozstvikomentaru,$GLOBALS["dbspojeni"]);
$pocetkom=phprs_sql_Num_Rows($dotazkomentare);

// overeni pritomnosti kometaru
if ($pocetkom==0):
$retezec="<p align=\"center\"><b><span class='".$stylvypisu."'>Databáze je prázdná!</span></b></p>\n";
else:


// vypis komentaru
$retezec="";
for ($pom=0;$pom<$pocetkom;$pom++):
$bezpecny_kometar = strip_tags(phprs_sql_Result($dotazkomentare,$pom,'obsah'));
// odstranime html tagy
$osekany_kometar = substr($bezpecny_kometar,0,$zobrazenychznaku);
// omezime delku na nastavenou hodnotu
if (strlen($bezpecny_kometar)>strlen($osekany_kometar)):
// pokud jsme komentar zkratili, pridame ". . . "
$osekany_kometar .= " . . . ";
endif;

// pridani nazvu clanku
$cisloclanku = phprs_sql_Result($dotazkomentare,$pom,'clanek');
$komen_cla=phprs_sql_query("SELECT titulek FROM ".$GLOBALS["rspredpona"]."clanky WHERE link='$cisloclanku'",$GLOBALS["dbspojeni"]);
$komen_clapocet=phprs_sql_Num_Rows($komen_cla);
// kontrola existence clanku
if ($komen_clapocet==0):
$cltit = "?";
else:
$cltit = phprs_sql_Result($komen_cla,0,'titulek');
endif;
//

// pridani nazvu clanku
$datum = phprs_sql_Result($dotazkomentare,$pom,'datum');
$datum_odeslani=phprs_sql_query("SELECT datum FROM ".$GLOBALS["rspredpona"]."komentare WHERE datum='$datum'",$GLOBALS["dbspojeni"]);
$datum_odeslanipocet=phprs_sql_Num_Rows($datum_odeslani);
// kontrola existence clanku
if ($datum_odeslanipocet==0):
$datum_vypis = "?";
else:
$datum_vypis = phprs_sql_Result($datum_odeslani,0,'datum');
endif;
//

$link_zobrazkomentare = "'comment.php?akce=fullview&cisloclanku='".$cisloclanku."#kom".phprs_sql_result($dotazkomentare,$pom,'idk');
if (trim(phprs_sql_result($dotazkomentare,$pom,'titulek'))!="") {$titulek = phprs_sql_result($dotazkomentare,$pom,'titulek');}else{$titulek="<em>bez titulku</em>";}

// $retezec .="<span class='".$stylvypisu."'>".$oddelovackometare.$osekany_kometar." (<a href='view.php?cisloclanku=".$cisloclanku."' title=\"Zobrazit článek\">".$cltit."</a>)\n".$koneckomentare;
$retezec .="<span class='".$stylvypisu."'>".$oddelovackometare." <a href='view.php?cisloclanku=".$cisloclanku."' title=\"Zobrazit článek s komentářem\">".$osekany_kometar."</a>\n(".dej_datum($datum_vypis).")".$koneckomentare;
endfor;
endif;

// zobrazeni menu
switch ($GLOBALS["vzhledwebu"]->AktBlokTyp()):
case 1: Blok1($GLOBALS["vzhledwebu"]->AktBlokNazev(),$retezec); break;
case 2: Blok2($GLOBALS["vzhledwebu"]->AktBlokNazev(),$retezec); break;
case 3: Blok3($GLOBALS["vzhledwebu"]->AktBlokNazev(),$retezec); break;
default: Blok1($GLOBALS["vzhledwebu"]->AktBlokNazev(),$retezec); break;
endswitch;
}
?>


×××---×××
www.ava-plus44.com
www.blink-182.cz

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: pa3k (IP adresa zaznamenána)
Datum: 2009-01-04, 17:52

.
.
.
// vypis komentaru
$retezec="";
for ($pom=0;$pom<$pocetkom;$pom++):
$bezpecny_kometar = strip_tags(phprs_sql_Result($dotazkomentare,$pom,'obsah'));
// odstranime html tagy
$osekany_kometar = substr($bezpecny_kometar,0,$zobrazenychznaku);
// omezime delku na nastavenou hodnotu
if (strlen($bezpecny_kometar)>strlen($osekany_kometar)):
// pokud jsme komentar zkratili, pridame ". . . "
$osekany_kometar .= " . . . ";
endif;
// rozdelenie slov dlhsich ako 20 znakov
$osekany_kometar = wordwrap($osekany_kometar, 20, " ");

// pridani nazvu clanku
$cisloclanku = phprs_sql_Result($dotazkomentare,$pom,'clanek');
.
.
.

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: cross182 (IP adresa zaznamenána)
Datum: 2009-01-05, 13:59

Díky moc, akorát to nefunguje :( Žádnou chybu to neháže, ale nic to taky nezkracuje. Zkoušel jsem zadat místo 20 i 16 (znaky jsem také spočítal, bylo jich ve slově něco přes 20).

×××---×××
www.ava-plus44.com
www.blink-182.cz

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: pa3k (IP adresa zaznamenána)
Datum: 2009-01-05, 20:39

pletú sa tam nejak premenné $bezpecny_kometar $osekany_kometar :) skús to takto:
.
.
.
for ($pom=0;$pom<$pocetkom;$pom++):
$bezpecny_kometar = strip_tags(phprs_sql_Result($dotazkomentare,$pom,'obsah'));

// rozdelenie slov dlhsich ako 20 znakov
$bezpecny_kometar = wordwrap($bezpecny_kometar, 20, " ");

// odstranime html tagy
$osekany_kometar = substr($bezpecny_kometar,0,$zobrazenychznaku);
.
.
.

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: cross182 (IP adresa zaznamenána)
Datum: 2009-01-06, 10:28

Též to nefunguje :(

×××---×××
www.ava-plus44.com
www.blink-182.cz

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: cross182 (IP adresa zaznamenána)
Datum: 2009-01-13, 14:39

Nějaké další nápady? :(

×××---×××
www.ava-plus44.com
www.blink-182.cz

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: JanVar (IP adresa zaznamenána)
Datum: 2009-01-13, 18:36

co takhle:

$text = "Velmi dlouhé slooooooooooovo.";
$newtext = wordwrap( $text, 8, "\n", 1);
echo "$newtext\n";

ukázka:
Velmi
dlouhé
sloooooo
ooooovo.

---------------------------------------------

see manual...

string wordwrap ( string str [, int width [, string break [, int cut]]] )

Zaláme řetězec str na sloupci určeném (volitelným) argumentem break.

Pokud není zadán argument width nebo break, wordwrap() automaticky zaláme řádky řetězce na sloupci 75 znakem '\n' (konec řádku).

Pokud má argument cut hodnotu 1, řetězec se na určenou šířku zalomí vždy. Takže pokud máte slovo delší než je daná šířka, rozdělí se.

-- JaV ---- [http://www.hades.cz] ---- security by obscurity ---------------------------------------------
motto:
It's OK to be ignorant; it's not OK to play stupid.
But it's simply not efficient for us to try to help people who are not willing to help themselves.
----------------------------------------------------------------------------------------------------------------------



Celkem upraveno 2×. Poslední úprava JanVar v 13.01.2009 18:41.

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: cross182 (IP adresa zaznamenána)
Datum: 2009-01-13, 19:24

Díky, ale já bych to potřeboval přesně zakomponovat do teho kódu :(
Nebo není nějaká ošetřená nová verze, která by šla lehce nahradit přes tu starou?

×××---×××
www.ava-plus44.com
www.blink-182.cz

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: cross182 (IP adresa zaznamenána)
Datum: 2009-01-23, 22:40

Nikdo? :(

×××---×××
www.ava-plus44.com
www.blink-182.cz

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: pa3k (IP adresa zaznamenána)
Datum: 2009-01-24, 19:21


Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: cross182 (IP adresa zaznamenána)
Datum: 2009-01-25, 12:14

Sakra, to je na mě moc odborný :(


×××---×××
www.ava-plus44.com
www.blink-182.cz

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: pa3k (IP adresa zaznamenána)
Datum: 2009-01-25, 20:06

Deklaráciu funkcie htmlwrap daj do config.php a všade v kóde nahraď wordwrap za htmlwrap.

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: cross182 (IP adresa zaznamenána)
Datum: 2009-01-25, 20:16

Hodil jsem do config


function htmlwrap($str, $width = 60, $break = "\n", $nobreak = "") {

  // Split HTML content into an array delimited by < and >
  // The flags save the delimeters and remove empty variables
  $content = preg_split("/([<>])/", $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

  // Transform protected element lists into arrays
  $nobreak = explode(" ", strtolower($nobreak));

  // Variable setup
  $intag = false;
  $innbk = array();
  $drain = "";

  // List of characters it is "safe" to insert line-breaks at
  // It is not necessary to add < and > as they are automatically implied
  $lbrks = "/?!%)-}]\\\"':;&";

  // Is $str a UTF8 string?
  $utf8 = (preg_match("/^([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC \xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\x BF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/", $str)) ? "u" : "";

  while (list(, $value) = each($content)) {
    switch ($value) {

      // If a < is encountered, set the "in-tag" flag
      case "<": $intag = true; break;

      // If a > is encountered, remove the flag
      case ">": $intag = false; break;

      default:

        // If we are currently within a tag...
        if ($intag) {

          // Create a lowercase copy of this tag's contents
          $lvalue = strtolower($value);

          // If the first character is not a / then this is an opening tag
          if ($lvalue{0} != "/") {

            // Collect the tag name   
            preg_match("/^(\w*?)(\s|$)/", $lvalue, $t);

            // If this is a protected element, activate the associated protection flag
            if (in_array($t[1], $nobreak)) array_unshift($innbk, $t[1]);

          // Otherwise this is a closing tag
          } else {

            // If this is a closing tag for a protected element, unset the flag
            if (in_array(substr($lvalue, 1), $nobreak)) {
              reset($innbk);
              while (list($key, $tag) = each($innbk)) {
                if (substr($lvalue, 1) == $tag) {
                  unset($innbk[$key]);
                  break;
                }
              }
              $innbk = array_values($innbk);
            }
          }

        // Else if we're outside any tags...
        } else if ($value) {

          // If unprotected...
          if (!count($innbk)) {

            // Use the ACK (006) ASCII symbol to replace all HTML entities temporarily
            $value = str_replace("\x06", "", $value);
            preg_match_all("/&([a-z\d]{2,7}|#\d{2,5});/i", $value, $ents);
            $value = preg_replace("/&([a-z\d]{2,7}|#\d{2,5});/i", "\x06", $value);

            // Enter the line-break loop
            do {
              $store = $value;

              // Find the first stretch of characters over the $width limit
              if (preg_match("/^(.*?\s)?([^\s]{".$width."})(?!(".preg_quote($break, "/")."|\s))(.*)$/s{$utf8}", $value, $match)) {

                if (strlen($match[2])) {
                  // Determine the last "safe line-break" character within this match
                  for ($x = 0, $ledge = 0; $x < strlen($lbrks); $x++) $ledge = max($ledge, strrpos($match[2], $lbrks{$x}));
                  if (!$ledge) $ledge = strlen($match[2]) - 1;

                  // Insert the modified string
                  $value = $match[1].substr($match[2], 0, $ledge + 1).$break.substr($match[2], $ledge + 1).$match[4];
                }
              }

            // Loop while overlimit strings are still being found
            } while ($store != $value);

            // Put captured HTML entities back into the string
            foreach ($ents[0] as $ent) $value = preg_replace("/\x06/", $ent, $value, 1);
          }
        }
    }

    // Send the modified segment down the drain
    $drain .= $value;
  }

  // Return contents of the drain
  return $drain;
}


a nahradil v posledni_komentare.php 1x wordwrap za htmlwrap, ale házelo to chybu na řádku, kde je ve výše uvedeném kódu $utf8 .. mám to kódované ve win-1250

Warning: preg_match() [function.preg-match]: Compilation failed: range out of order in character class at offset 87 in /home/ftpsite/ava-plus44.com/www/config.php on line 272


×××---×××
www.ava-plus44.com
www.blink-182.cz

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: pa3k (IP adresa zaznamenána)
Datum: 2009-01-26, 19:25

Vo win-1250 funguje wordwrap korektne, problém bude inde. Funkciu skopíruj priamo z odkazu: [http://www.greywyvern.com/code/php/htmlwrap.phps] - toto fórum rozdeluje dlhé riadky medzerami. :) Inak ak nefunguje wordwrap bude to zle umiestnené v kóde. Treba si to odladiť, debuguj, sprav si po každom kroku kde sa pracuje s tým stringom echo aby si vedel kde sa čo deje.

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: cross182 (IP adresa zaznamenána)
Datum: 2009-02-09, 19:19

Achjo :( Už nevím, jak na to :(
Okopíroval jsem tu fci, dal ji do root/www/config.php na konec před "?>", pak jsem v pluginu posledni_komentare.php nechal wordwrap, pak i htmlwrap a stejně to nic neudělalo :(
Můžu to testovat na webu za plném provozu, takže s tím nemůžu moc čachrovat :( A ani spíš nevím, co pomocí toho echa vypisovat atd :(

×××---×××
www.ava-plus44.com
www.blink-182.cz

Re: Poslední komentáře - zkrácení slova
Zaslán uživatelem/kou: Kubajs (IP adresa zaznamenána)
Datum: 2009-02-24, 14:10

Pro win kódování to opravdu jede bez problémů - v standardní verzi. Nainstaloval bych do podadresáře ještě jednou phprs a kouknul jestli to na tom novém, neupravovaném, bude dělat to stejné.



Lituji, ale pouze registrovaní uživatelé mohou zasílat příspěvky do této sekce.
This forum powered by Phorum and designed by STaNBoSS.