Autor Zpráva
Fisak
Profil
Dobrý den. Mám problém s mým template systémem po nasazení dibi a už si nevím rady. Pokud bude mít někdo náladu a čas mi pomoct budu jedině rád...

class.template.php:
<?php
class Template {

private $DB;
public function __construct(DB $DB) {
    $this->DB = $DB;
}

public function sqlDefaultTemplate($string) {
    $sql = $this->DB->query("SELECT * FROM [:pref:page] where page = %s", mypage("page"));
    return $sql->fetchSingle($string);
}

public function insertTemplate($temp, $in = false)
{
  $content = file_get_contents("./system/template/".$temp.".html");
  if ($in)
  {
    foreach ($in as $k => $v)
    {
      $content = str_replace("{#$k}", $v, $content);
    }
  }
  return $content;
}

public function template_admin()
{

    load_page("admin/php_modules/".$this->sqlDefaultTemplate("page")."/index.php"); //php modul administrace
    load_page("themes/admin/".get_current_lang()."/index.php"); //šablona s html modulem administrace
    
}

public function template_inc()
{

    if(file_exists("php_modules/".$this->sqlDefaultTemplate("page")."/index.php")) {
                
        load_page("php_modules/".$this->sqlDefaultTemplate("page")."/index.php"); //php modul
            
    }
        
        $bad_url = str_replace("index.php", "", $_SERVER['PHP_SELF']);  
        $serv_url = "."".$bad_url]."".$bad_url]."".$bad_url]http://".$_SERVER['SERVER_NAME']."".$bad_url;
 
        $h = array();
        $h['title'] = title();
         $h['language'] = get_current_lang();
        $h['keywords'] = options("seo_keywords");
        $h['author'] = options("author");
        $h['description'] = options("seo_description");
        if(!$this->sqlDefaultTemplate("style")){ $h['style'] = ($serv_url."themes/web/".get_current_lang()."/".options("template")."/images/styles.css"); }
        else { $h['style'] = ($serv_url."themes/web/".get_current_lang()."/".options("template")."/images/".$this->sqlDefaultTemplate("style").".css"); }
                
        ob_start();

        load_page("/themes/web/".get_current_lang()."/".options("template")."/skin/".$this->sqlDefaultTemplate("skin").".php");

        $load_c = ob_get_contents();
            
        ob_end_clean();
        
        $c = array();
        $c['content'] = $load_c;
        
        echo $this->insertTemplate('head', $h);
        echo $this->insertTemplate('content', $c);
        echo $this->insertTemplate('footer');

}

public function print_template()
{

    $tpl = $this->sqlDefaultTemplate("page");
    if(!empty($tpl)) {
        
        
        //administrace
        if ($this->sqlDefaultTemplate("type") == "admin") {
            
            $this->template_admin();
        
        }
        
        //obsah
        if ($this->sqlDefaultTemplate("type") == "inc") {
        
            $this->template_inc();
        
        }
        
    } else {
    //neexistující stránka
    redirect_page("defense", "1");
    }
    
}

}

core.php:
load_page("system/class/class.template.php"); //načte stránku class.template.php
    $template = new Template($DB);
    $template->print_template();
Tori
Profil
Co přesně dělá funkce load_page? Umí si ošetřit situaci, kdy jí chybně zadáte absolutní adresu od rootu filesystému (ř.58)?
A mohl byste napsat, co to má dělat a nedělá. Zkuste prosím do řádku 45 mezi řetězce http:// a $_SERVER přidat značku pro rušení bbcode: [!], je to nějaké přeházené.
Fisak
Profil
Tori:
to sice neumí ale adresy sou tam dobré.. jde o ten db layer.. dřív sem to dělal klasicky
$link = mysql_connect(...);

$res = mysql_query('...', $link);
while ($row = mysql_fetch_assoc($res)) {
   ...
}
a fungovalo to.. nyní jak se pokouším předělat svůj systém na dibi tak to nejde.. takže nejspíš bude chyba někde v tech mysql dotazech..
Tori
Profil
Aha, hned se mi to zdálo divné a kouknutí do API to zdání potvrdilo - řádky 10-11 by měly vypadat spíš takhle:
$sql = $this->DB->query("SELECT %n FROM [:pref:page] where [page] = %s", $string, mypage("page"));
    return $sql->fetchSingle();
Fisak
Profil
Tori:
děkuji.. ale stále mi to hlásí chybu :( fakt už si nevím rady...


tady je verze bez dibi layeru

class.template.php:
<?php
class Template {

private $db;
public function __construct(db $db) {
    $this->db = $db;
}

public function sqlDefaultTemplate($string) {
    $sql = $this->db->query_system("SELECT * FROM page where page = '".mypage("page")."'");
    $Data_TMP=mysql_fetch_assoc($sql);
    return $Data_TMP[$string];
}

public function insertTemplate($temp, $in = false)
{
  $content = file_get_contents("./system/template/".$temp.".html");
  if ($in)
  {
    foreach ($in as $k => $v)
    {
      $content = str_replace("{#$k}", $v, $content);
    }
  }
  return $content;
}

public function template_admin()
{

    load_page("admin/php_modules/".$this->sqlDefaultTemplate("page")."/index.php"); //php modul administrace
    load_page("themes/admin/".get_current_lang()."/index.php"); //šablona s html modulem administrace
    
}

public function template_inc()
{

    if(file_exists("php_modules/".$this->sqlDefaultTemplate("page")."/index.php")) {
                
        load_page("php_modules/".$this->sqlDefaultTemplate("page")."/index.php"); //php modul
            
    }
 
        $h = array();
        $h['title'] = title();
         $h['language'] = get_current_lang();
        $h['keywords'] = options("seo_keywords");
        $h['author'] = options("author");
        $h['description'] = options("seo_description");
        if(!$this->sqlDefaultTemplate("style")){ $h['style'] = ("./themes/web/".get_current_lang()."/".options("template")."/images/styles.css"); }
        else { $h['style'] = ("./themes/web/".get_current_lang()."/".options("template")."/images/".$this->sqlDefaultTemplate("style").".css"); }
                
        ob_start();

        load_page("/themes/web/".get_current_lang()."/".options("template")."/skin/".$this->sqlDefaultTemplate("skin").".php");

        $load_c = ob_get_contents();
            
        ob_end_clean();
        
        $c = array();
        $c['content'] = $load_c;
        
        echo $this->insertTemplate('head', $h);
        echo $this->insertTemplate('content', $c);
        echo $this->insertTemplate('footer');

}

public function print_template()
{

    $tpl = $this->sqlDefaultTemplate("page");
    if(!empty($tpl)) {
        
        
        //administrace
        if ($this->sqlDefaultTemplate("type") == "admin") {
            
            $this->template_admin();
        
        }
        
        //obsah
        if ($this->sqlDefaultTemplate("type") == "inc") {
        
            $this->template_inc();
        
        }
        
    } else {
    //neexistující stránka
    redirect_page("defense", "1");
    }
    
}

}

core.php:
load_page("system/class/class.template.php");
    $db = new db();
    $template = new Template($db);
    $template->print_template();
to normálně fungovalo v pohodě..


šlo jen o to upravit dotazy tak aby fungovali na dibi
Tori
Profil
Fisak:
A nechcete nám oběma ušetřit čas a rovnou psát, jakou chybu to hlásí, co přesně nefunguje atd.?

Ještě to možná mělo být takhle, teď si nejsem jistá jestli se musí hodnoty psát hned za modifikátorem, nebo až všechny naráz.
$this->DB->query("SELECT %n", $string, " FROM [:pref:page] where [page] = %s", mypage("page"));
Fisak
Profil
Tori:
class.db.php je umístění dibi.min.php
Warning: DB::addSubst() is deprecated; use DB::getSubstitutes()->expr = val; instead. in F:\localhost\insignia\system\class\class.db.php on line 805
Call Stack
#    Time    Memory    Function    Location
1    0.0122    338200    {main}( )    ..\index.php:0
2    0.0351    385160    require_once( 'F:\localhost\insignia\system\config-db.php' )    ..\index.php:23
3    0.0722    2498256    DB::addSubst( )    ..\config-db.php:25
4    0.0722    2498440    trigger_error ( )    ..\class.db.php:80
( ! ) Notice: Undefined variable: DB in F:\localhost\insignia\system\core.php on line 15
Call Stack
#    Time    Memory    Function    Location
1    0.0122    338200    {main}( )    ..\index.php:0
2    0.3839    2664184    require_once( 'F:\localhost\insignia\system\core.php' )    ..\index.php:29
v core.php 15 řádek je:
$template = new Template($DB);

Catchable fatal error: Argument 1 passed to Template::__construct() must be an instance of DB, null given, called in F:\localhost\insignia\system\core.php on line 15 and defined in F:\localhost\insignia\system\class\class.template.php on line 5
Call Stack
#    Time    Memory    Function    Location
1    0.0122    338200    {main}( )    ..\index.php:0
2    0.3839    2664184    require_once( 'F:\localhost\insignia\system\core.php' )    ..\index.php:29
3    0.4280    2705992    Template->__construct( )    ..\core.php:15



jinak sem přejmenoval dibi::query na DB::query ale to jste si nejspíš již všimnul
Kcko
Profil
Tori:
Oba způsoby jsou možné.

Fisak:
Nauč se debugovat dotazy přes dibi::dump(); // za každým zavolaným dotazem, tím si ho vypíšeš a uvidíš co je špatně a co ne.
Fisak
Profil
Kcko:
no ono to totiž neni v tom dotazu.. nejspíš to bude v napojení na to dibi .. v tom constructoru
public function __construct(db $db) {
    $this->db = $db;
}



ten dotaz sem zkoušel mimo tuhle třídu a funguje normálně v pohodě..
Kcko
Profil
tak to vyhod, dibi můžes používat staticky. Není důvod to dělat jinak.dibi::

...
Fisak
Profil
Kcko:
paráda děkuju to je to co sem potřeboval !!!
ještě jedna chybka.. nevíte někdo prosím o co se může jednat ??
Warning: DB::addSubst() is deprecated; use DB::getSubstitutes()->expr = val; instead. in F:\localhost\insignia\system\class\class.db.php on line 805
Call Stack
#    Time    Memory    Function    Location
1    0.0756    338440    {main}( )    ..\index.php:0
2    0.0977    385400    require_once( 'F:\localhost\insignia\system\config-db.php' )    ..\index.php:23
3    0.1383    2498512    DB::addSubst( )    ..\config-db.php:25
4    0.1383    2498696    trigger_error ( )    ..\class.db.php:805
Prochy
Profil
Ale dyť ti to hlásí to varování, co máš za problém. Už jenom kdyby si zkusil použít překladač, tak zjistíš v čem je problém.

A navíc stačí hodit do googlu hodit addsubst deprecated a najdeš to hned na prvním odkazu. Možná by si příště mohl projevit více snahy. :-)
Fisak
Profil
Prochy:
dobře paráda díky :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: