[addon webloader] Extras/webloader
- Michalek
- Člen | 211
Když vygooglím ten svůj error kód, najde to pár věcí.
Číslama to i odpovídá, dál jsem to neřešil, páč přes to moje pole to nedělá.
Note, however, that this can have some drawbacks if you are using a database with connection limits that are exceeded by persistent child connections. If your database has a limit of 16 simultaneous connections, and in the course of a busy server session, 17 child threads attempt to connect, one will not be able to. If there are bugs in your scripts which do not allow the connections to shut down (such as infinite loops), the database with only 16 connections may be rapidly swamped
Nezkoumal jsem, kde se to může stávat, jestli je to už na straně nette a přístup k souborům na serveru, přes safe://, nebo jestli to vzniká až někde ve webloaderu, nebo je to na straně xamppu nebo php…
Editoval Michalek (27. 1. 2013 19:34)
- MartinitCZ
- Člen | 580
@**enumag**: To mám :)
Řešením je, toto přidat do apache konfigurace, alespon mě to funguje.
<IfModule mpm_winnt_module>
ThreadStackSize 8388608
</IfModule>
- JakubJarabica
- Gold Partner | 184
Nový Webloader je paráda, vďaka! Len ma štve Packagist, že sa tam ešte neprejavil ten začlenený pull request s možnosťou vypnutia kontroly aktualizácie času zdrojových súborov.
Každopádne CSSmin s Twitter Boostrapom nefunguje – problém mu robia media queries a @keyframes. Našiel som toto: http://www.catswhocode.com/…es-using-php a tam metódu The Reinhold Weber method, ktorá je primitívna a robí to čo má.
- Jan Mikeš
- Člen | 771
Libi se mi zpusob pouziti jaky je uvedeny na githubu pomoci extension: https://github.com/…ek/WebLoader
Nemuzu ale prijit na to, jak pouzit filtry pro less a minify pres config stejne jak je tam wlCssFilter, muzete nekdo poradit?
A dalsi otazka, co je lepsi/cistejsi zpusob? Vytvorit si compiler v configu a pak se na nej jen odkazat v tovarnicce na komponentu, nebo vse definovat v tovarnicce (viz 1. priklad na githubu)?
Predem diky za rady.
- Honza Marek
- Člen | 1664
Je potřeba vytvořit třídu s magickou metodou __invoke, pak jsou její objekty spustitelné jako funkce nebo callback a jdou zaregistrovat jako filtr.
class CssMinFilter
{
public function __invoke($code)
{
return cssmin::minify($code, "remove-last-semicolon");
}
}
Lepší je určitě vytvořit si compiler v configu.
- Jan Mikeš
- Člen | 771
Takze config by pak mohl vypadat takto?
services:
wlCssFilter: WebLoader\Filter\CssUrlsFilter(%wwwDir%)
cssMinFilter: CssMinFilter
lessFilter: LessFilter
webloader:
css:
default:
files:
- style.css
- {files: ["*.css", "*.less"], from: %appDir%/presenters} # Nette\Utils\Finder support
filters:
- @wlCssFilter
- @cssMinFilter
- @lessFilter
A webloader se postara sam o predani $code do filtru?
Edit: jeste me napada, neni zbytecne vytvaret service kdyz ten filtr nikde nez v CSS loaderu nepouziju? Neslo by to i takto?:
filters:
- @wlCssFilter #nazev service
- CssMinFilter #nazev tridy
- LessFilter #nazev tridy
Edit 2: Tak uz mi to frci :) prvni ukazka v tomhle prispevku funguje, druha ne, protoze jsem prisel na to ze tridy se musi instancovat a ne volat staticky.
Editoval Lexi (8. 2. 2013 15:22)
- Jan Mikeš
- Člen | 771
Dale bych se rad zeptal, jestli se da nejakym zpusobem extension zaregistrovat i jako service, abych si jej pak mohl injectnout do basepresenteru a vyhnout se tim pouziti $this->context->webloader … nebo je to v tomto pripade v poradku?
Vsude je totiz momentalne vtloukano do hlavy vyhnout se contextu a vse injectovat :)
- Honza Marek
- Člen | 1664
Zajímavý dotaz. Určitě jednoduše použít inject nejde, protože webloader extension vytváří více služeb, které mají stejnou třídu. Takže nefunguje autowiring. Pokud jde do presenteru bez úpravy presenter factory procpat služba bez autowiringu, tak by se šlo obejít bez contextu, ale mám obavu že to nejde.
- Ivorius
- Nette Blogger | 119
Zkusil jsem nastavit webloader dle https://github.com/…ek/WebLoader#… do master verze nette. Bohužel při zavolání $this->context->webloader u továrničky createComponentCss mi nette vyhodí
Nette\DI\MissingServiceException
Service 'webloader' not found.
Přitom v systemcontaineru nějaké služby jsou:
webloader.cssAdminCompiler no WebLoader\Compiler
webloader.cssAdminFiles no WebLoader\FileCollection
webloader.cssFrontCompiler no WebLoader\Compiler
webloader.cssFrontFiles no WebLoader\FileCollection
webloader.cssNamingConvention no WebLoader\DefaultOutputNamingConvention
webloader.jsAdminCompiler no WebLoader\Compiler
webloader.jsAdminFiles no WebLoader\FileCollection
webloader.jsFrontCompiler no WebLoader\Compiler
webloader.jsFrontFiles no WebLoader\FileCollection
webloader.jsNamingConvention no WebLoader\DefaultOutputNamingConvention
wlCssFilter yes WebLoader\Filter\CssUrlsFilter
- Ivorius
- Nette Blogger | 119
Nene, v bootstrapu to mám, tedy doufám že je to ve správném pořadí:
$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->onCompile[] = function ($configurator, $compiler) {
$compiler->addExtension('dibi', new DibiNetteExtension);
};
//Webloader
$webloaderExtension = new \WebLoader\Nette\Extension();
$webloaderExtension->install($configurator);
$container = $configurator->createContainer();
Ono to i nějaké ty service vytvoří, ale nevím jestli bych to v tom basePresenteru neměl zapsat nějak jinak:
protected function createComponentCss() {
return new \WebLoader\Nette\CssLoader(
$this->context->webloader->cssFrontCompiler, // service generated by extension
$this->template->basePath . '/webtemp'
);
}
protože to zdechá na tom $this->context->webloader
- Filip Procházka
- Moderator | 4668
V masteru byla zrušena podpora NetteAccessorů, musíš takto
/**
* @return WebLoader\Nette\CssLoader
*/
public function createComponentCss()
{
$compiler = $this->context->getService('webloader.cssDefaultCompiler');
/** @var \WebLoader\Compiler $compiler */
return new \WebLoader\Nette\CssLoader($compiler, $this->template->basePath . '/webtemp');
}
/**
* @return WebLoader\Nette\JavaScriptLoader
*/
public function createComponentJs()
{
$compiler = $this->context->getService('webloader.jsDefaultCompiler');
/** @var \WebLoader\Compiler $compiler */
return new \WebLoader\Nette\JavaScriptLoader($compiler, $this->template->basePath . '/webtemp');
}
- Jack06
- Člen | 168
No já nevím, ale když si vypíšu container, tak tam mám následující:
webloader => array(4) {
jsDefaults => array(8) {
sourceDir => "C:/Program Files (x86)/VertrigoServ/www/myps/www/js" (51)
tempDir => "C:/Program Files (x86)/VertrigoServ/www/myps/www/webtemp" (56)
tempPath => "webtemp" (7)
files => array(0)
remoteFiles => array(0)
filters => array(0)
fileFilters => array(0)
namingConvention => "@webloader.jsNamingConvention" (29)
}
cssDefaults => array(8) {
sourceDir => "C:/Program Files (x86)/VertrigoServ/www/myps/www/css" (52)
tempDir => "C:/Program Files (x86)/VertrigoServ/www/myps/www/webtemp" (56)
tempPath => "webtemp" (7)
files => array(0)
remoteFiles => array(0)
filters => array(0)
fileFilters => array(0)
namingConvention => "@webloader.cssNamingConvention" (30)
}
js => array(0)
css => array(0)
}
a padá mi to stále na: Service ‚webloader.cssDefaultCompiler‘ not found. Registruji si to přímo v Configuratoru:
protected function createCompiler() {
$this->compiler = parent::createCompiler();
$this->compiler->addExtension('webloader', new \WebLoader\Nette\Extension);
return $this->compiler;
}
- stefi023
- Člen | 71
Ahoj, chtel jsem se zeptat, zda, pripadne jak, mate vyresene nasledujici:
Pouzivam less filtr, v less souborech pouziju @import direktivu pro nacteni dalsiho souboru. Kdyz ale v takto importovanem souboru neco zmenim, Webloader to samozrejme nepozna, protoze kontroluje pouze zmeny na definovane kolekci souboru… CSS se tudiz v dev modu nezkompiluje znovu.
Da se to nejak rozumne vyresit bez velkeho zasahu do Webloaderu?
Diky
- Honza Marek
- Člen | 1664
Vyřešené to není. Dá se jedině buď po změně smazat vygenerované css soubory nebo místo lessového importu načítat více less souborů přímo webloaderem.
Co se týče případné úpravy WebLoaderu, nejjednodušší by bylo přidat volbu pro generování css souboru při každém requestu, která by mohla být na devu zaplá.
- stefi023
- Člen | 71
Diky za info.
Mazat se mi to rucne samozrejme nechce a rad bych vyuzil to vkladani primo lessem. Ale asi tam mozna narazim na problem s cestama v URL, ze? – budou asi potreba zadavat relativne k tomu hlavnimu souboru, nebo to ma sam osobe less vyresene? Jeste jsem to nezkousel, s lessem zacinam…
Az me to zacne vytacet a nebude jineho zbyti pripravim pull na tu konfiguracni volbu :)
- Filip111
- Člen | 244
Ahoj, potřeboval bych poradit, jak použít wl v kompoentě. Moje představa je taková, že mám komponentu v samostatném adresáři, v ní je adresář public a v něm js, css apod.
V šabloně komponenty bych pak chtěl použít např
{control js 'public/nejakyscript.js'}
Mám zprovozněný webloader jako extension, konstruktorem si ho předám do komponenty kde budu mít továrničku například.:
public function createComponentJs() {
// return $this->webloader->
}
Netuším ale co by měla vrátit, případně jak teď v té továrničce
přidám ještě vlastní js soubory.
Případně jak používáte wl v komponentách vy? Všude se tu píše jen
o presenterech nebo jsem našel továrny, kde vytvoří JavaScriptLoader, ale
nikde jsem neviděl použití v komponentě.
Díky.
- Honza Marek
- Člen | 1664
Kvůli ušetření počtu HTTP dotazů a kešování je většinou výhodné načítat pro celý web všechny styly najednou, i když se použijí třeba jen na některých podstránkách. Což je typický příklad komponent. Je tedy nutné zařídit, aby se styly komponent dostaly do spojeného CSS.
Pokud jsou všechny komponenty v jedné složce, tak by třeba šlo zkusit něco takového:
webloader:
css:
default:
files:
- styl1.css
- {files: "*.css", from: %appDir%/controls} # načte všechny css soubory z controls a podadresářů
- Filip111
- Člen | 244
Asi bych to mohl použít jak popisuješ, ale spousta css a js se budou tahat
naprosto zbytečně. Mám CMS se spoustou komponent a většina z nich má
vlastní scripty, případně css.
Na webu, kde se CMS použije je ale použita třeba jen jedna z 30-ti
komponent, tedy je naprosto zbytečné tahat ostatní soubory.
A nechci definovat u každého webu zvlášť css,js soubory, které má
webloader zpracovávat. Přijde mi čistší nadefinovat továrničky komponent
v neonu a o nějaké css,js se vůbec nestarat.
- dada-amater
- Bronze Partner | 52
Ahoj,
mam problem s CssUrlsFilter.php, haze mi chyby. Problem je, ze v Compiler.php se ve funkci
call_user_func($filter, $file_content, $this)
vola konstruktor a nepredava se mu treti parametr $file. Ten sice muze byt
null, ale pak to rve ve funkci
\WebLoader\Path::normalize(…);
Upravil jsem tedy puvodni kod:
public function getContent(array $files = null)
{
if ($files === null) {
$files = $this->collection->getFiles();
}
// load content
$content = '';
foreach ($files as $file) {
$content .= PHP_EOL . $this->loadFile($file);
}
// apply filters
foreach ($this->filters as $filter) {
$content = call_user_func($filter, $content, $this);
}
return $content;
}
na
public function getContent(array $files = null)
{
if ($files === null) {
$files = $this->collection->getFiles();
}
// load content
$content = '';
foreach ($files as $file) {
$file_content = PHP_EOL . $this->loadFile($file);
// apply filters for each file
foreach ($this->filters as $filter) {
$file_content = call_user_func($filter, $file_content, $this, $file);
}
$content .= $file_content;
}
return $content;
}
a vse uz funguje spravne. Filtr se zavola na kazdy soubor zvlast a ne na ten spojeny obsah. Dejte mi vedet, pokud jsem neco udelal spatne a kvuli tomu mi to nefungovalo.
- Honza Marek
- Člen | 1664
Ve WebLoaderu jsou dva typy filtrů – filters a fileFilters. FileFilters se volají na každý soubor zvlášť. CssUrlsFilter je tedy potřeba registrovat jako fileFilter.
- dada-amater
- Bronze Partner | 52
Diky Honzo. Pak je treba opravit navod na GITu . Diky za peknou komponentu.
- Ondřej Altman
- Člen | 17
Zdravím,
díky za supr komponentu. Teď jsem narazil na takový problém a nemůžu přijít na to jak to vyřešit.
Mám soubory:
app\FrontModule\less\first.less
@import "../../theme"
p {
...
}
app\AdminModule\less\second.less
@import "../../theme"
h1 {
...
}
app\theme.less
@import "../libs/twitter/bootstrap/less/bootsrap"
.hero-unit {
...
}
libs\twitter\bootstrap\less\bootstrap.less
Co chci udělat je, že v theme.less naimportuju Bootstrap a přepíšu nějaké hodnoty. V souborech first.less a second.less pak chci importovat theme.less a používat proměnné z něj. Jenže narážím na problém. Pokud to takhle zapíšu a v configu dám, že chci kompilovat first.less a second.less, tak mi to zkompiluje bootstrap dvakrát. Což u takhle velké knihovny bolí.
Jak tohle řešíte vy?
- Honza Marek
- Člen | 1664
Doporučil bych v importovaných souborech používat pouze proměnné a bootstrap pak vložit zvlášť v configu, ne přes import.
- Honza Marek
- Člen | 1664
Nastavil jsem v composeru verzi Nette na ~2.0. To by snad v budoucnu mělo fungovat s jakýmkoliv Nette menším než 3.0.
- Jan Mikeš
- Člen | 771
Zdravim, chtel bych pouzivat nezkompilovane .less soubory TB, tak abych v mem screen.less mohl pouzivat mixins a classy z bootstrapu, nejak takhle:
@import 'bootstrap/bootstrap.less';
.someObject {
.pull-right;
.text-center;
.well;
}
Nejak se mi ale nedari. Jaky pro toto pouzivate postup vy? Mam kompilovat vsechny soubory less, nebo pouze screen.less?
Pouzivam adresarovou strukturu:
CSS/screen.less
CSS/bootstrap/bootstrap.less
CSS/bootstrap/xxx.less
Webloader mam v bootstrap.php zaregistrovany jako extension
webloader:
css:
default:
remoteFiles:
- 'xxx'
files:
- {files: ["*.css", "*.less"], exclude: "*print*", from: %wwwDir%/css}
filters:
- @wlCssFilter
fileFilters:
- @lessFilter
Zkousel jsem u files menit „from“ na „in“ aby finder neprochazel rekurzivne vsechny slozky, ale pouze screen.less
Tovarnicka:
// $this->webloader = $this->context->webloader;
public function createComponentCss(){
return new \WebLoader\Nette\CssLoader(
$this->webloader->cssDefaultCompiler,
$this->template->basePath . '/webtemp'
);
}
Predem diky za vase rady jak na to.
Editoval Lexi (15. 7. 2013 12:58)
- sinner
- Člen | 20
Ahoj,
v configu mám vytvořený service, v BasePresenteru mám vytvořenou
kompomentu (nemá v sobě zatim žádné soubory) a všechny soubory mám
v hlavní šabloně @layout.latte pomocí {control css
„skript.css“}.
Chtěl bych se zeptat zdali je možné v presenteru dodatečně dodefinovat nějaké další soubory popřípadě nějak controlku oddědit např. v default.latte
Snažím se udělat pro každý presenter jinou sadu css/js souborů, abych
je neměl všechny na jedné hromadě.
Děkuji.
- 2bfree
- Člen | 248
Zkusil jsem rozchodit webloader podle návodu z GITu přes extension a
narazil jsem na zvlášnost.
Přes extension je možné nastavit parametr „tempPath“, ale v presenteru
kde registruji komponentu musím uvést jako druhý parametr
CssLoader::_construct() respektive předka Webloader::_construct(), čímž tuto
direktivu přepíšu.
Zkusil jsem tedy v tomto místě vytáhnout nastavení z configu, ale nedostal jsem se k přehlednějšímu způsobu získání tohoto nastavení než:
public function createComponentCss()
{
$webloader = $this->getContext()->webloader;
$cssLoader = new \WebLoader\Nette\CssLoader(
$webloader->cssDefaultCompiler, // service generated by extension
(isset($webloader->parameters['css']['default']['tempPath']) ? $webloader->parameters['css']['default']['tempPath'] : $webloader->parameters['cssDefaults']['tempPath'])
);
return $cssLoader;
}
Editoval 2bfree (9. 8. 2013 15:20)
- Honza Marek
- Člen | 1664
Pokud je filtr nastaven jako fileFilter místo filter, tak dostane ve třetím parametru cestu k souboru. Podle toho se pak dá určit, jestli filtr má být aplikován nebo ne.
- Siam
- Člen | 54
Díky Honzo. Prosím tě, nemohl by jsi mi napsat přesněji, jak se používá ten fileFilter? Já vůbec netuším jaký třetí argument, když u normálního filtru používám jenom jeden. Zkoušel jsem to neúspěšně třeba takto:
public function createComponentCss()
{
$files = new \WebLoader\FileCollection(__DIR__ . '/../../www/css');
$files->addFiles(array(
'bootstrap.min.css',
'lightview.css',
'screen.css'
));
$compiler = \WebLoader\Compiler::createCssCompiler($files, __DIR__ . '/../../www/webtemp');
$compiler->addFileFilter(array('lightview.css', 'screen.css'), function ($code) {
return cssmin::minify($code);
});
return new \WebLoader\Nette\CssLoader($compiler, $this->template->basePath . '/webtemp');
$control->setMedia('screen');
return $control;
}
- Honza Marek
- Člen | 1664
$compiler->addFileFilter(function ($code, $compiler, $path) {
if (in_array(basename($path), array('lightview.css', 'screen.css'))) {
return cssmin::minify($code);
} else {
return $code;
}
});
- MartinitCZ
- Člen | 580
Jak používáte NetteExtension? Jde mi o to, že je super nadefinovat si
hlavní soubory v neonu, ale nějak se mi nelíbí šahání na
$this->context
viz:
return new WebLoader\Nette\CssLoader(
$this->context->getService('webloader.cssDefaultCompiler'),
$this->template->basePath . '/webtemp'
);
- Jan Suchánek
- Člen | 404
@martinit: Vyrobil jsem si model \Model\Webloader (nevím zda se neblížím moc nějakému Service Locatoru, ale spravuje mi Front i Back a mohu mu přidat i jiné srandy) a vytvářím ho pomocí továrniček a má předané z Neonu závislosti:
Neon:
frontWebloader:
implement: Model\IFrontWebloader
setup:
- setCssCompiler(@webloader.cssFrontCompiler)
- setJsCompiler(@webloader.jsFrontCompiler)
backWebloader:
implement: Model\IBackWebloader
setup:
- setCssCompiler(@webloader.cssBackCompiler)
- setJsCompiler(@webloader.jsBackCompiler)
Webloader:
<?php
namespace Model;
use WebLoader\Nette\CssLoader;
use WebLoader\Nette\JavaScriptLoader;
class Webloader extends \Nette\Object
{
private $jsCompiler;
private $cssCompiler;
public function setJsCompiler($jsCompiler){
$this->jsCompiler = $jsCompiler;
}
public function setCssCompiler($cssCompiler){
$this->cssCompiler = $cssCompiler;
}
public function getCss($path)
{
return new CssLoader($this->cssCompiler, $path);
}
public function getJs($path)
{
return new JavaScriptLoader($this->jsCompiler, $path);
}
}
interface IFrontWebloader
{
/** @return \Model\Webloader */
function create();
}
interface IBackWebloader
{
/** @return \Model\Webloader */
function create();
}
:)
Je to Good practice || Bad practice?
- MartinitCZ
- Člen | 580
@**jenicek**: Když to je moc psaní :) V jednom projektu mám
6 různých webloaderů (velmi rodílná css i js pro stránky/moduly) a to
bych se upsal.
Já bych si to představoval nějak takto:
/** @var Webloader\Nette\Instances @inject */
public $wlInstances;
protected function createComponentCss()
{
return new WebLoader\Nette\CssLoader(
$this->wlInstaces->cssDefaultCompiler,
$this->template->basePath . '/webtemp'
);
}
Tzv. třída Webloader\Nette\Instances bude vracet object compilerů :)
Editoval martinit (14. 11. 2013 12:28)
- Jan Suchánek
- Člen | 404
@martinit:
Ach jo, ale já měl dojem, že to tak přesně mám. Mohu použít
i 6 webloaderu nebo 10 a vše definuju jen v neonu a předávam přez
jediný objekt, který si továrničkou vyrobím
$webloader->create();.
Tohle mam jen v Presentru a dalo by se to definovat i podle modulu, tak aby se psaní ještě více zkrátilo.
Namespace by se mohl menovat /** @var Webloader\Nette\Instances */ ale injecotval by se pomoci Interface
Edit: toto je příklad jen pro Front to samé stačí použít i pro Backend či další stov… podobných, a možná si je pak můžeš i doplňovat, možná by stálo za úvahu vyhodit i ten self::WEBTEMP a přenechat ho objektu, který jsi pojmenoval Webloader\Nette\Instances a já ho pojmenovávám Model\Webloader
Front\DefaultPresenter:
public function injectWebloader(\Model\IFrontWebloader $webloader)
{
$this->webloader = $webloader->create();
}
/**
* @return \WebLoader\Nette\CssLoader
*/
protected function createComponentCss()
{
return $this->webloader->getCss($this->template->basePath . '/' . self::WEBTEMP);
}
/**
* @return \WebLoader\Nette\JavaScriptLoader
*/
protected function createComponentJs()
{
return $this->webloader->getJs($this->template->basePath . '/' . self::WEBTEMP);
}
a v neonu mam toto:
factories:
frontWebloader:
implement: Model\IFrontWebloader
setup:
- addCssCompiler(@webloader.cssFrontCompiler)
- addJsCompiler(@webloader.jsFrontCompiler)
backWebloader:
implement: Model\IBackWebloader
setup:
- addCssCompiler(@webloader.cssBackCompiler)
- addJsCompiler(@webloader.jsBackCompiler)
webloader:
css:
back:
remoteFiles:
- %assets.bootstrap-css%
- %assets.jquery-ui-smoothness%
files:
- back.css
front:
remoteFiles:
- %assets.bootstrap-css%
- %assets.jquery-ui-smoothness%
files:
- front.css
js:
back:
remoteFiles:
- %assets.jquery%
- %assets.jquery-ui%
- %assets.bootstrap-js%
files:
- %assets.netteforms%
- %wwwDir%/js/nette.ajax.js/nette.ajax.js
- %wwwDir%/js/nette.ajax.js/working.ajax.js
- %wwwDir%/js/nette.ajax.js/confirm.ajax.js
- %wwwDir%/js/back.js
front:
remoteFiles:
- %assets.jquery%
files:
- %assets.netteforms%
Editoval jenicek (14. 11. 2013 12:47)
- Jan Suchánek
- Člen | 404
romiix.org: Asi ano, jen je to skoro totéž ne? Stejně v layoutu napíšu {control css} {control js} a nic víc.
Edit: na ten doplněk Header mrknu vypadá dost zajímavě.
Editoval jenicek (14. 11. 2013 12:53)
- romiix.org
- Člen | 343
jenicek napsal(a):
Ja som nereagoval na tvoj príspevok, ale na tie vyššie:) Keď som začal ten príspevok písať, tvoj tu ešte nebol;)
- MartinitCZ
- Člen | 580
@**jenicek**: No to já právě nevim :) Zas tak dobře na tom s php nejsu. Nechce se mi šahat na $this->context, ale zároven nehci psát pro každou instanci interface.
- Jan Suchánek
- Člen | 404
@martinit: ja to vyřešil právě těma továrničkama stejně se takhle dělají pro formuláře a dlaší věci tak je to podle dogma správně, jediná pruda je, že je budu muset mít vyjmenované :)
Ten tvůj model by stejně musel jako ten můj dostat compilery všechny, kdyžto přez továrničku dostane jen dva.
Výhodnost/nevýhodnost je samozřejmě sporná :).
Editoval jenicek (14. 11. 2013 14:03)