Byla vydána verze 5.0 webového aplikačního frameworku napsaného v Pythonu Django (Wikipedie). Přehled novinek v poznámkách k vydání.
TuxClocker je Qt GUI nástroj pro monitorování a nastavování (přetaktovávání) hardwaru na Linuxu. Aktuální verze je 1.4.0. Z novinek lze vypíchnout monitorování využití AMD a NVIDIA VRAM nebo sledování spotřeby energie procesorů AMD a Intel.
O víkendu (15:00 až 23:00) probíhá EmacsConf 2023, tj. online konference vývojářů a uživatelů editoru GNU Emacs. Sledovat ji lze na stránkách konference. Záznamy jsou k dispozici přímo z programu.
Na čem aktuálně pracují vývojáři GNOME a KDE? Pravidelný přehled novinek i s náhledy aplikací v Týden v GNOME a Týden v KDE.
Organizace Apache Software Foundation (ASF) vydala verzi 20 integrovaného vývojového prostředí a vývojové platformy napsané v Javě NetBeans (Wikipedie). Přehled novinek na GitHubu. Instalovat lze také ze Snapcraftu a Flathubu.
Desktopové prostředí Cinnamon, vyvíjené primárně pro distribuci Linux Mint, dospělo do verze 6.0. Seznam změn obsahuje především menší opravy a v říjnovém přehledu novinek v Mintu avizovanou experimentální podporu Waylandu.
OpenZFS (Wikipedie), tj. implementace souborového systému ZFS pro Linux a FreeBSD, byl vydán ve verzích 2.2.2 a 2.1.14. Přináší důležitou opravu chyby vedoucí k možnému poškození dat.
V ownCloudu byly nalezeny tři kritické zranitelnosti: CVE-2023-49103, CVE-2023-49104 a CVE-2023-49105 s CVSS 10.0, 8.7 a 9.8. Zranitelnost CVE-2023-49103 je právě využívána útočníky. Nextcloudu se zranitelnosti netýkají.
I letos vychází řada ajťáckých adventních kalendářů. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2023. Pro programátory v Perlu je určen Perl Advent Calendar 2023. Zájemci o UX mohou sledovat Lean UXmas 2023. Pro zájemce o kybernetickou bezpečnost je určen Advent of Cyber 2023…
Byla vydána verze 2.12 svobodného video editoru Flowblade (GitHub, Wikipedie). Přehled novinek v poznámkách k vydání. Videoukázky funkcí Flowblade na Vimeu. Instalovat lze také z Flathubu.
soubor inc.php $cont = false; $cont .= 'Nějaký text'; $cont .= 'Nějaký jiný text'; soubor class.php class sel{ public function __construct(){ include_once(ABSPATH.'/inc.php'); } } soubor index.php include_once(ABSPATH.'/class.php'); $cont = new sel(); echo $cont;
__toString()
, ale jeví se mi to jako cesta do pekel.
function __toString() { include_once(ABSPATH.'/inc.php'); return $cont; }Fungovat by to mělo, ale je to celé hrozně nepřehledné. Opravdu to nemůžeš napsat pořádně?
Opravdu to nemůžeš napsat pořádně?Díky, určitě můžu, a poradíš jak to myslíš?
//soubor inc.php class inc{ protected $cont; public function __construct(){ $this->cont = false; $this->cont .= 'Nějaký text'; $this->cont .= 'Nějaký jiný text'; } }
//soubor sel.php class sel extends inc{ public function __toString(){ return $this->cont; } }
//soubor index.php function __autoload($class){ include(ABSPATH.'/'.$class.'.php'); } $cont = new sel(); echo $cont;
Jakých souborů je spousta?Souborů inc.php, akorát mají jinou cestu..
/novinky/inc.php /home/inc.php /kontakty/inc.php
Nemůžeš sem napsat, o co konkrétně se snažíš?Snažím se pomocí class zobrazit obsah souboru dle zadané url. Pokud nekdo zadá url
/novinky/tak se načte obsah souboru /novinky/inc.php
/kontakty/tak se načte obsah souboru /kontakty/inc.php. atd.. Díky
//soubor $modul/inc.php $this->cont = false; $this->cont .= 'Nějaký text'; $this->cont .= 'Nějaký jiný text';
//soubor sel.php class sel{ private $cont; public function __construct($modul) { include(ABSPATH.'/'.$modul.'/inc.php'); } public function __toString(){ return $this->cont; } }
//soubor index.php function __autoload($class){ include(ABSPATH.'/'.$class.'.php'); } $cont = new sel($modul); echo $cont;
// Společný soubor všem částem webu class Page { // ... cokoliv používáš všude protected $title = '(undefined)'; protected $config = array(); // tady máš nějaké volby public function getTitle() { return $this->title; } public function setPageConfig() { return $this->title; } // tato metoda by mohla byt abstract public function getContent() { // obecna stranka proste jen zobrazi index.html readfile($this->config['base_dir'].'index.html'); } }
// novinky/main.php class Novinky extends Page { protected $title = "Novinky"; // getter je zděděn public function createContent() { // nacteni novinek $q = dibi::select('news.*, ...'); if (isset($this->config['lang'])) { // pokud bylo zadano '/news/...' $q->where('news.Lang = %s', $this->config['lang']); } if (isset($this->config['path'][0])) { // pokud je url ve tvaru '/*/id' $q->where('news.id = %s', $this->config['path'][0]); } // ... cokoliv potřebuješ } }O samotné zpracování těchto tříd se pak postará index.php, na který na serveru nasměruješ úplně všecko.
// index.php $path = explode('/', trim($_SERVER['REQUEST_URI'], '/')); $page = isset($path[0]) ? $path[0] : '/'; // ošetření prázdné cesty (/) $page_map = array( '/' => array('class' => 'Page', 'base_dir' => './home/'), 'kontakty' => array('class' => 'Kontakty'), 'novinky' => array('class' => 'Novinky'), 'news' => array('class' => 'Novinky', 'lang' => 'en'), ); $page_config = $page_map[$page]; $page_config['path'] = array_slice($path, 1); $class_name = $page_config['class']; function __autoload($c) { include('class/'.strtolower($c).'.class.php'); // dle tveho umisteni souboru s tridama } if (class_exists($class_name)) { $p = new $class_name(); $p->setConfig($page_config); $p->createContent(); } else { header("Status: 404 Not Found"); echo 'Sorry, page not found!'; }Ve výsledku to dopadne tak, že pokud uživatel vleze na adresu http://example.com/, tak se mu zobrazí soubor ./home/index.html a pokud na http://example.com/novinky/1, tak se mu zobrazí novinka s ID 1. Prostým přidáváním tříd a záznamů do pole $page_map si můžeš aplikaci dle libosti rozšiřovat a přitom se z toho nezblázníš. A až tě to přestane bavit, tak sáhni po nějakém pěkném frameworku.
Tiskni
Sdílej: