Ostatní témata (Off Topic témata) : phpRS Fórum
Máte problém s konfigurací počítače? Hledáte nejlepší webhosting pro vaši aplikaci? Nevíte si rady s nějakým zajímavým programátorským oříškem? Týká se dotaz fóra? ... Pokud ano, tak je toto diskuzní fórum určeno právě vám.
phpRS - redakční a informační systém
Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: ZdenekPNJ (IP adresa zaznamenána)
Datum: 2009-06-09, 16:09

Zdravím.
Mám jeden problém. Dělám plugin, který by měl v bloku vedle článku vypisovat poslední 3 články z rubriky ve které se uživatel nachází. Avšak když vezmu plugin nejnovější články a přidělám do něj podmínku na omezení rubriky podle tématu vypíše mi to pouze články z rubriky avšak ne už z podrubrik a podrubrik podrubrik atd. Vypíše to články, které mají číslo rstema stejné.
Jak docílit toho, aby se mi zobrazovali články i z těchto několika násobně vnořených podrubrik. V podstatě to stejné, co provádí search.php, taky zorazí všechny články z rubriky včetně podrubrik.

function NoveClankytema()
{
if (isset($_GET['rstema'])):
// oznacenie aktivnej vetvy stromu
$tema = $_GET['rstema'];
else: $tema = 1;
endif;
//Definice parametrů
$kolikClanku=3; //kolik se bude vypisovat clanku
$razeno=DESC; //styl razeni clanku (DESC sestupne (od nevetsiho po nejmensi) ASC vzestupne(od nejmensiho po nejvetsi) cim vetsi id tim je novejsi clanek
$stylvypisu = "modul"; //zde je mozne uvest styl vypisu (hodnoty lze udat v css souboru laylotu ktery se pouziva)
//------------------------------------------------------------------------------

$dnesnidatum=date("Y-m-d H:i:s");

$poddotaz=$_GET['rstema'];

//volání z databáze
$result=mysql_query('SELECT link, titulek, uvod, idc, visible, datum, autor, obrazek,tema FROM '.$GLOBALS['rspredpona'].'clanky WHERE (visible = 1) AND tema=' . $poddotaz . ' AND (datum <= "'.$dnesnidatum.'") ORDER BY idc ' . $razeno . ' LIMIT 0,'.$kolikClanku, $GLOBALS['dbspojeni']);

if ($result==0):
$retezec="<p align=\"center\" class=\"z\">Chybí zdrojová databáze!</p>\n";
endif;

// overeni pritomnosti clanku
if (mysql_num_rows($result)==0):
$retezec="<p align=\"center\" class=\"z\">Neexistují vhodná data!</p>\n";
else:
// vypis clanku
$retezec="";
while($line=mysql_fetch_array($result)) {
$retezec.='<div class='.$stylvypisu.'>'.$oddelovac.' <a href="view.php?cisloclanku='.$line['link'].'&amp;rstema='.$line['tema'].'"><div class="modul_nadpis"><img src="'.$GLOBALS['rsimgsmallthumb'].''.$line['obrazek'].'" width="80" alt="'.$line['titulek'].'"></div><div class="nahled-text"><div class="cla-nadpis-nahled">'.$line['titulek'].'</div><div class="cla-uvod-nahled">'.$line['uvod'].'</div></div></a></div><div style="clear: both"></div><br />'.$konec;
}


endif;

Děkuji za vaše nápady.

Re: Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: pa3k (IP adresa zaznamenána)
Datum: 2009-06-09, 21:26

Najprv treba z db sosnúť ídéčka podrubrík, používa sa na to napríklad rekurzia, prípadne sosnúť z db celý strom a vybrať ich pomocou php. Mrkni napr. do TopicTree tam je použitá rekurzia. Následne ich získané ídéčka použiješ systémom ... WHERE tema IN (1, '.phprs_sql_real_escape_string(implode(',',$pole_obsahujuce_idecka_podrubrik))).' LIMIT 5;

Re: Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: ZdenekPNJ (IP adresa zaznamenána)
Datum: 2009-06-11, 22:21

No,jelikož aý moc php a sql nerozumím, tak mi to chvilku trvá, zkouším, zkouším a pak mi to něco vyplivne.
např. upravil jsem kód:
define("MAX_LEVEL",9);


function getTreetema($parent=0,$maxlevel=99,$tree="") {
$result = mysql_query(" SELECT idt,
nazev,
popis,
level
FROM ".$GLOBALS["rspredpona"]."topic
WHERE id_predka= ".$parent." and zobrazit=1 and
level<".$maxlevel."
ORDER BY nazev
",$GLOBALS["dbspojeni"]);

if (mysql_num_rows($result)>0) {
if ($parent==0) {
$tree.= "tema=\n";
} else {
$tree.= "\n";
}
while ($row = mysql_fetch_assoc($result)) {
$tree .= getTreetema(
$row['idt'],
$maxlevel,
"tema=".$row['idt']." or\n"
);
}
$tree.= "";
}
return $tree;
}

function GenerateTreetema() {
$cachetema = mysql_query(" SELECT `cachetema`
FROM ".$GLOBALS['rspredpona']."cachetema
",$GLOBALS["dbspojeni"]);

if (false === $cachetema || mysql_num_rows($cachetema)!==1) {
$newcachetema = getTreetema(0,MAX_LEVEL);

$create = mysql_query(" CREATE TABLE IF NOT EXISTS ".$GLOBALS['rspredpona']."cachetema(
`cachetema` TEXT NOT NULL,) TYPE = MYISAM
",$GLOBALS['dbspojeni']);

$erase = mysql_query(" TRUNCATE TABLE `".$GLOBALS['rspredpona']."cachetema`
",$GLOBALS['dbspojeni']);

$write = mysql_query(" INSERT INTO `".$GLOBALS['rspredpona']."cachetema` ( `cachetema` )
VALUES ('".addslashes($newcachetema)."');
",$GLOBALS['dbspojeni']);

return("<!-- NEW -->\n".$newcachetema);
} else {
$row = mysql_fetch_assoc($cachetema);
return("<!-- CACHED -->\n".$row['cachetema']);
}
}


$obsahbloku = "";
$obsahbloku .= GenerateTreetema();
$obsahbloku .= "";



a když dám echo vypíše to:
tema= tema=1 or tema=211 .....všechns témata....tema=6 or

No a teď absolutně nevím jak dál, jak z toho dostanu je ty rubriky, které potřebuji, zkoušel jsem nahradit a dát napevno id_predka=5 a nevyjelo to nic. A taky jak pak tyto vžpisy vložit do kódu, jestli by to šlo jen přes

//volání z databáze
$result=mysql_query('SELECT link, titulek, uvod, idc, visible, datum, autor, obrazek,tema FROM '.$GLOBALS['rspredpona'].'clanky WHERE (visible = 1) AND tema IN (1, '.phprs_sql_real_escape_string(implode(","$osahbloku))).' AND (datum <= "'.$dnesnidatum.'") ORDER BY idc ' . $razeno . ' LIMIT 0,'.$kolikClanku, $GLOBALS['dbspojeni']);

Díky za každou radu

Re: Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: pa3k (IP adresa zaznamenána)
Datum: 2009-06-14, 17:14

Tu je kó, ktorý ti naplní pole idčkami rubrík, ktoré sú potomkami rubriky s id, ktorá je na vstupe. Ak script uložíš do súboru, zavolaním /subor.php?idt=0 ti to vypíše pole prvkov, ktoré sú potomkami rubriky s id=0. Zloženie dotazu pre tvoj účel cez implode snáď už zvládneš.

<?php
define('IN_CODE',true); 
include_once("config.php");
include_once("myweb.php");

function getAllChildTopicIds($parent_id=0, $maxlevel=9, $ids_array=array()) {
    $sql = "
        SELECT  idt
        FROM    ".$GLOBALS["rspredpona"]."topic
        WHERE   id_predka= ".(int)$parent_id."
                AND
                zobrazit=1
                AND
                level < ".(int)$maxlevel."
        ORDER BY
                hodnost DESC
        ;
    ";
    $result = phprs_sql_query($sql, $GLOBALS["dbspojeni"]);
    if (false !== $result && phprs_sql_num_rows($result)>0) {
        while ($row = phprs_sql_fetch_assoc($result)) {
            $ids_array[] = $row['idt'];
            $ids_array = getAllChildTopicIds($row['idt'], $maxlevel, $ids_array);
        }
    }
    return $ids_array;
}

$vzhledwebu->Generuj();
ObrTabulka();  

    echo "<pre>";
    print_r(getAllChildTopicIds($_GET['idt']));
    echo "</pre>";

KonecObrTabulka();  
$vzhledwebu->Generuj();

?>

Re: Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: MirekS (IP adresa zaznamenána)
Datum: 2009-06-14, 17:36

mozna by zde bylo vyhodnejsi nepouzivat pole s id vsech potomku, ale rovnou string, kde budou carkami oddelene ty id (takze pak se to da pouzit rovnou v klasuli WHERE id IN(...) a pouzit k tomu funkci SQL GROUP_CONCAT()

odpadne tim ten while cyklus na nacitani id-cek (bude tam jen jedno nacteni, vsech najednou), pak vyhledani vsech potomku v dalsi rade se provede jednim dotazem (kde bude ten seznam vsech rodicu z predchoziho kroku -zde se pro kazde id vola ta funkce opakovane, takze pokud se vrati 100 potomku, bude se volat 100x, coz je zbytecne) a nakonec se usetri to spojeni id-cek v poli do toho stingu pro tu podminku

Re: Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: pa3k (IP adresa zaznamenána)
Datum: 2009-06-14, 19:44

Explode je rýchle, ale použitie GROUP_CONCAT by u rozsiahlejších stromov rubrík mohlo ušetriť dosť dotazov do databázy. Takže áno, bolo by to vhodnejšie ale neriešim to :) je to len ukážka ako sa to dá spraviť. Navyše každá rekurzia je pri určitom počte a štruktúre rubrík dosť veľká záťaž, takže sa to IMHO vždy oplatí cache-ovať alebo nejak predpripraviť hneď v admine pri generovaní/editácii rubrík.



Celkem upraveno 1×. Poslední úprava pa3k v 14.06.2009 20:08.

Re: Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: raberia (IP adresa zaznamenána)
Datum: 2009-06-21, 10:08

Marně hledám na fóru a na netu základní plugin Nové články. Pomůže někdo laikovi ?

Re: Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: Kubajs (IP adresa zaznamenána)
Datum: 2009-06-22, 23:14

Ten základní byl tohle?
[http://www.phprs.net/forum/list.php?16]

Re: Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: pa3k (IP adresa zaznamenána)
Datum: 2009-06-23, 12:01


Re: Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: raberia (IP adresa zaznamenána)
Datum: 2009-06-24, 09:23

Děkuji všem za rady a omlouvám se, že jsem dotaz vložil do nesprávné sekce fora.

Re: Plugin Nejnovější články z rubriky a všech ( i několikanásobně vnořených) podrubrik
Zaslán uživatelem/kou: ZdenekPNJ (IP adresa zaznamenána)
Datum: 2013-05-26, 17:22

VYŘEŠENO a FUNGUJE - prosím o kontrolu

Stačilo se inspirovat v search.php, a jen předělat tohle:
$pole_obsah_podminka[]='c.tema IN ('.$vysl_str_temata.')';
na
$pole_obsah_podminka='tema IN ('.$vysl_str_temata.')'

---
// omezeni na tema
if (isset($GLOBALS["rstema"])&&($GLOBALS["rstema"]!='nic')):
// inic. $pomseznamu
$pomseznam[0][0]=phprs_sql_escape_string($GLOBALS["rstema"]);
$pomseznam[0][1]=1; // umele zapnute rodicovstvi z duvodu neznamosti stavu
$poc_pomseznam=1; // celkovy pocet polozek v $pomseznam
$akt_poz_pomseznam=0; // akt. pozice v $pomseznam
$vysl_str_temata='';
$spojka_temata='';
// sestaveni stromu temat
while($poc_pomseznam>$akt_poz_pomseznam):
// zapis temata do vysledku
$vysl_str_temata.=$spojka_temata.$pomseznam[$akt_poz_pomseznam][0];
$spojka_temata=",";
// test na rodicovstvi ID_tema
if ($pomseznam[$akt_poz_pomseznam][1]==1):
$dotazpodtema=phprs_sql_query("select idt,rodic from ".$GLOBALS["rspredpona"]."topic where id_predka='".$pomseznam[$akt_poz_pomseznam][0]."'",$GLOBALS["dbspojeni"]);
// zapis nove nalezenych podsekci do pole $pomseznam
if ($dotazpodtema!=0&&phprs_sql_num_rows($dotazpodtema)):
while ($pole_podtema = phprs_sql_fetch_assoc($dotazpodtema)):
$pomseznam[$poc_pomseznam][0]=$pole_podtema['idt'];
$pomseznam[$poc_pomseznam][1]=$pole_podtema['rodic'];
$poc_pomseznam++;
endwhile;
endif;
endif;
// posunuti na dalsi pozici v seznamu
$akt_poz_pomseznam++;
endwhile;
// ulozeni vysledku do podminkoveho pole
$pole_obsah_podminka='tema IN ('.$vysl_str_temata.')';
endif;

----

a následně přidat do

$result=mysql_query('SELECT *(nebo vybranépoložky) FROM '.$GLOBALS['rspredpona'].'clanky WHERE (visible = 1) AND ' . $pole_obsah_podminka. ' AND (datum <= "'.$dnesnidatum.'") AND level_clanku=1 ORDER BY datum DESC LIMIT 0,'.$kolikClanku, $GLOBALS['dbspojeni']);


Regiony ČR.cz - 1. responzivní zpravodajství z regionů ČR | Medializujeme ČESKO.cz - Revoluční program podpory a modernizace obcí ČR | Obce2016.cz - Moderní řešení profesionálního webu pro obce



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.