Autor Zpráva
lopikol
Profil
Zkouším si napsat vlastní framework. Chtěl bych jen aby uměl vyrendrovat proměné, if/else a include. Nic jiného nepotřebuji. Další věc je ta, že se takovými pokusy dá sot naučit.
Jenže jsem narazil na problém. Určitě se najde někdo, kdo zná Nette. Zde se zapisuje do Presenteru ve tvaru:

 
Presenter:
$this->template->name = 'Framework';

Template:
{$name}


Zajímalo by mne jak toto převedu? Jde mi o to, že sem si vytvořil:
$fw->set('name', 'Framework');

function set($tag, $var, $if = NULL){....}


Jde mi o to, že pokud použiju takto závorky {set()}, tak je mi to úplně jasné > přeměnit to, ale s těmi šipkami opravdu netušim.

Nemohl by mi někdo poradit nějaký příklad, sepsat ..... ?? Děkuji.
Alphard
Profil
Zřejmě hledáte __set(). Od tvůrce objektového frameworku bych očekával, že tohle zná...
lopikol
Profil
Díky za radu. Ted jen pochopit, jak mi to pomůuže používat

$this->template->name = 'Framework';


místo

$fw->set('name', 'Framework');
Radek9
Profil
lopikol:
Spusť si Example #1 a zkoušej.
lopikol
Profil
tak už se mi povedlo docílit abych měl formát
$this->name = 'Framework'; 


Ted ještě přijít na to jak ta předělat na
$this->template->name = 'Framework'; 
jsim
Profil
metoda __get() ... místo $this->getTemplate() budeš psát $this->template
lopikol
Profil
Mám toto:
<?php
class PropertyTest {
var $arrays  = array();
    public function __set($name, $value) {
        echo "Setting '$name' to '$value'\n";
        $this->arrays[$name] = $value;
    }

    public function __get($name) {
        echo "Getting '$name'\n";
        if (array_key_exists($name, $this->arrays)) {
            return $this->arrays[$name];
        }
     }
  }
     


<?php
$obj = new PropertyTest;

$obj->a = Jedna;
echo $obj->a . "\n\n";


Tak at kamkoliv zkusim dát templates->, tak to prostě nefunguje a vezme to že hodnota je templates a ne Jedna
Radek9
Profil
lopikol:
Nevím, jestli to není prasárna, ale co to zkusit takhle?
$obj = new PropertyTest();
$obj->template = new PropertyTest();
$obj->template->name = "Framework";
echo $obj->template->name."\r\n";
jsim
Profil
<?php
class Template {

    /** @var array */
    private $variables;
    
    public function __set($name, $var){
      $this->variables[$name] = $var;
    }

    public function __get($name){ 
     return $this->variables[$name]; 
    }   
}


abstract class Controller {

    /** @var Template */
    private $template;
    
    public function __get($name){
      $method = 'get' . ucfirst($name);      
      return $this->$method();     
    }

    public function getTemplate(){
      return $this->template;
    }

    public function setTemplate($template){
      if($template instanceof Template){
        $this->template = $template; 
      } else {
        throw new Exception("...");
      }	
    }
}

class HomepageController extends Controller {

    public function actionHome(){
      $this->template->something = 'variable';
    }
}

$template = new Template;
$homepage = new HomepageController;
$homepage->setTemplate($template); // lepsi by bylo vyresit to jinak ... tohle neni idealni
$homepage->actionHome();
echo $template->something; //vypise variable


mělo by to fungovat ... nejsou tam ošetřený některý věci .. s tím už si musíš pohrát sám ...
lopikol
Profil
Díky moc zkusím to. Mám problém s Exception.

Chtěl jsem udělat, jakmile bude nějaká chyba, tak použiju throw new Exception("...");, ale problém je v tom, že bych musel mít vše v try{vše}catch(Exception $e){výpis}

To mi přijde dost na hlavu? Jak by jste to řešili vy?
jsim
Profil
práce s výjimkami není na hlavu .. jen musíš vědět jak a kde je zpracovat ...
jestli jsi s nimi nikdy nepracoval, zkus si najít na netu nějaký články a něco pročíst ..
lopikol
Profil
neřikám, že vyjímky jsou na hlavu, ale zatim jsem nepřišel na jiný způsob, než mít celý web v try{} abych mohl zachytávat vyjímky!
jsim
Profil
nerozumím, jak mít celý web v try{}? prostě pokud máš někde zachytit vyjímku, tak ji zachyť ... od toho snad jsou bloky try - catch
a nepoužíval bych třídu Exception ... ta je podle mě obecná, spíš bych si buďto definoval vlastní výjimky a nebo použil už definované viz. link
lopikol
Profil
Jde o to, že když chci někde použít Exception, tak to budu muset mít v try abych ji mohl zachytit. Příklad:
try {

  if (!mysql_connect(DB_Server, DB_User, DB_Password)){
      throw new TemplateException('K databázi se nelze připojit!');
  }
  
  if (!mysql_select_db(DB_Table)){
      throw new TemplateException('Zadaná databáze nebyla nenalezena!');  
  } 

}catch(TemplateException $e){
                         
$obj->set('exMessage', $e->MessageException());

}    

Takhle to budu muset mít všude.

Toto by bylo nejlepší:
  if (!mysql_connect(DB_Server, DB_User, DB_Password)){
      throw new TemplateException('K databázi se nelze připojit!');
  }
  
  echo $this->MessageException();
lopikol
Profil
Tak přes set_exception_handler() docílíte toho co jsem chtěl :) -> nemusim řešit vykreslování chyb :)

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: