Redirect s pridanim #retezce
- VaKvas
- Začátečník | 111
Tak mensi zmena:
treba zde to funguje:
function actionCatDelete($id) {
if ($this->documentsModel->getDocuments()->where('category', $id)->count() >= 1) {
$this->flashMessage('Kategorie obsahuje dokumenty, nelze smazat');
$this->redirect('Documents:#tabs-9');
}
ALE pokud mam treba toto:
function formDocSubmitted($form) {
$values = $form->values;
if($values['file']->getTemporaryFile()) {
$binarydata = file_get_contents($values['file']->getTemporaryFile());
$values['type'] = $values->file->getContentType();
$values['size'] = $values->file->getSize();
$values['binfile'] = $binarydata;
$values['name'] = $values->file->getName();
}
$values['by'] = $this->user->id;
$values['inserted'] = new \DateTime();
unset($values['file']);
if ($this->action === 'docEdit') {
$this->documentsModel->updateDocuments($values, $this->getParam('id'));
} else {
try {
$this->documentsModel->addDocument($values);
} catch (\Exception $e) {
$form->addError($e->getMessage());
return;
}
}
$this->flashMessage('Dokument byl uložen');
$this->redirect('Documents:#tabs-9');
}
tak to nefunguje… a to mozna proto, ze vyuzivam setView.. je to mozne?
function renderDocEdit($id) {
$this->setView('docEdit');
}
function renderDocAdd($id) {
$this->setView('docAdd');
}
jak by slo toto osetrit, prosim ?
Moc diky !
Editoval VaKvas (2. 5. 2011 13:48)
- VaKvas
- Začátečník | 111
Byl jsi rychlejsi… :-)
To setView jsem pouzil z nejakeho prikladu a uz jsem jej tam nechal… ani nevim na co tam je, kdyz tam template docAdd i docEdit mam.. u funguje, ale treba formular bez toho setView odeslat nejde (hodi 404)..
radsi poslu cely presenter, protoze tam nekde mozna bude nejaka blbost … :
<?php
namespace FrontModule;
use Nette\Application\Presenter, Nette, Nette\Application\AppForm,
Nette\Forms\FormContainer, Nette\Database\Statement;
class DocumentsPresenter extends BasePresenter {
public function startup() {
parent::startup();
if (!$this->getUser()->isAllowed('dokumenty', 'view')) {
$this->flashMessage('Neoprávněný přístup');
$this->redirect('Pages:');
}
}
public function renderDefault() {
//$this->user->roles[0];
$this->template->docCat = $this->documentsModel->getDocumentsCat();
$this->template->doc = $this->documentsModel->getDocuments();
$this->template->registerHelper('icon', function ($typ) {
switch ($typ) {
case 'image/jpeg' :
$icon = "<img align='left' src='images/icons/image.png'>";
break;
case 'application/pdf' :
$icon = "<img align='left' src='images/icons/pdf.png'>";
break;
case 'application/vnd.ms-excel' :
$icon = "<img align='left' src='images/icons/xls.png'>";
break;
case 'application/msword' :
$icon = "<img align='left' src='images/icons/doc.png'>";
break;
default :
$icon = "<img align='left' src='images/icons/file.png'>";
}
return "$icon";
});
}
public function renderDoc($id) {
$item = $this->documentsModel->getDocuments()->where('id', $id)->fetch();
$contents = $item->binfile;
$response = $this->getHttpResponse();
$response->setContentType($item->type);
$response->setHeader('Content-Disposition', 'attachment; filename="' . $item->name . '"');
echo $contents;
$this->terminate();
}
function createComponentDocCatForm() {
$form = new AppForm;
$form->addText('name', 'Název:')
->setRequired('Vyplňte název !');
$form->addSubmit('save', 'Uložit');
$form->onSubmit[] = callback($this, 'formSubmitted');
if ($this->action === 'catEdit') {
$docCategory = $this->documentsModel->getDocumentsCat()->where('id', $this->getParam('id'))->fetch();
if (!$docCategory) {
throw new Nette\Application\BadRequestException;
}
$form->setDefaults($docCategory->toArray());
}
return $form;
}
function createComponentDocUploadForm() {
$form = new AppForm;
$form->addSelect('category', 'Kategorie', $this->documentsModel->getDocumentsCat()->fetchPairs('id', 'name'));
if ($this->action === 'docEdit') {
$form->addFile('file', 'Soubor');
$form->addText('name', 'Název:')
->setRequired('Vyplňte název !');
$doc = $this->documentsModel->getDocuments()->where('id', $this->getParam('id'))->fetch();
if (!$doc) {
throw new Nette\Application\BadRequestException;
}
$form->setDefaults($doc->toArray());
} else {
$form->addFile('file', 'Soubor')
->setRequired('Zvolte soubor !');
}
$form->addText('desc', 'Popis:')->setAttribute('size', 50);
$form->addSubmit('save', 'Uložit');
$form->onSubmit[] = callback($this, 'formDocSubmitted');
return $form;
}
function formSubmitted($form) {
$values = $form->values;
if ($this->action === 'catEdit') {
$this->documentsModel->updateDocumentsCat($values, $this->getParam('id'));
} else {
try {
$this->documentsModel->addDocumentsCat($values);
} catch (\Exception $e) {
$form->addError($e->getMessage());
return;
}
}
$this->flashMessage('Kategorie byla ulozena');
$this->redirect('Documents:');
}
function formDocSubmitted($form) {
$values = $form->values;
if($values['file']->getTemporaryFile()) {
$binarydata = file_get_contents($values['file']->getTemporaryFile());
$values['type'] = $values->file->getContentType();
$values['size'] = $values->file->getSize();
$values['binfile'] = $binarydata;
$values['name'] = $values->file->getName();
}
$values['by'] = $this->user->id;
$values['inserted'] = new \DateTime();
unset($values['file']);
if ($this->action === 'docEdit') {
$this->documentsModel->updateDocuments($values, $this->getParam('id'));
} else {
try {
$this->documentsModel->addDocument($values);
} catch (\Exception $e) {
$form->addError($e->getMessage());
return;
}
}
$this->flashMessage('Dokument byl uložen');
$this->redirect('Documents:#tabs-9');
}
function actionCatDelete($id) {
if ($this->documentsModel->getDocuments()->where('category', $id)->count() >= 1) {
$this->flashMessage('Kategorie obsahuje dokumenty, nelze smazat');
$this->redirect('Documents:#tabs-'.$id);
}
$this->documentsModel->getDocumentsCat()->where('id', $id)->delete();
$this->flashMessage('Kategorie byla smazána');
$this->redirect('Documents:');
}
function actionDocDelete($id) {
$this->documentsModel->getDocuments()->where('id', $id)->delete();
$this->flashMessage('Dokument byl smazán');
$this->redirect('Documents:');
}
function renderCatEdit($id) {
$this->setView('catEdit');
}
function renderCatAdd($id) {
$this->setView('catAdd');
}
function renderDocEdit($id) {
$this->setView('docEdit');
}
function renderDocAdd($id) {
$this->setView('docAdd');
}
}
?>
- VaKvas
- Začátečník | 111
Tak opet… v IE to generuje blbe a v Mozille dobre…
Nefunguje znamena, ze v linku po redirectu v IE vubec nevidim to $tabs-9 …
ale v Mozille ano…
Nic mene, bych pozadal to objaseni, proc tam musim mit to setView… podotykam, ze jen po odeslani formulare to hodi 404 pokud tam ty metody render nejsou..
Diky !!!
- 22
- Člen | 1478
nevim, co na to Laděnka nebo fireLogger?
btw komponentu by jsi měl přiřadit do stromu komponent:
protected function createComponentForm($name)
{
$form = new AppForm($this, $name);
...
}
a ve zpracování by jsi měl kontrolovat, jestli ti data přišly z formuláře
public function formSubmitted(AppForm $form)
{
...
}
Editoval 22 (2. 5. 2011 14:58)
- VaKvas
- Začátečník | 111
Ze by byl problem v tom?
Nekde jsem cetl, ze je to proto, ze mam stejny form na editaci i na novy zaznam…
Jinak pokud zakomentuju ty rendery na konci tak:
Nette\Application\BadRequestException #404
a hodi to chybu tuto:
$doc = $this->documentsModel->getDocuments()->where('id', $this->getParam('id'))->fetch();
if (!$doc) {
throw new Nette\Application\BadRequestException; TUTO !!!!!
.....
- VaKvas
- Začátečník | 111
22 napsal(a):
nevim, co na to Laděnka nebo fireLogger?
btw komponentu by jsi měl přiřadit do stromu komponent:protected function createComponentForm($name) { $form = new AppForm($this, $name); ... }
a ve zpracování by jsi měl kontrolovat, jestli ti data přišly z formuláře
public function formSubmitted(AppForm $form) { ... }
Co prosim teda jako udela toto, resp, jaky je rozdil v tom, co tam mam ja s timto…
- Patrik Votoček
- Člen | 2221
Rozdíl vpostatě žádný v jednom případě připojuješ komponentu až po nadefinování a ve druhém ještě před nadefinováním.
BTW jaký má význam:
VaKvas napsal(a):
<?php class DocumentsPresenter extends BasePresenter { function renderCatEdit($id) { $this->setView('catEdit'); } function renderCatAdd($id) { $this->setView('catAdd'); } function renderDocEdit($id) { $this->setView('docEdit'); } function renderDocAdd($id) { $this->setView('docAdd'); } } ?>
- je na přenastavení view ve view je pozdě!
- proč přenastavuješ aktivní view na stejné view?
- Patrik Votoček
- Člen | 2221
VaKvas napsal(a):
Ale nekdo me rikal, ze to musi byt, pokud mas stejny form pro new i edit…
bullshit
- VaKvas
- Začátečník | 111
Tak to zkousim…
pokud vkladam, tak to jde.. tzn, mluvim o kodu:
function createComponentDocCatForm($name) {
$form = new AppForm($this, $name);
$form->addText('name', 'Název:')
->setRequired('Vyplňte název !');
$form->addSubmit('save', 'Uložit');
$form->onSubmit[] = callback($this, 'formSubmitted');
if ($this->action === 'catEdit') {
$docCategory = $this->documentsModel->getDocumentsCat()->where('id', $this->getParam('id'))->fetch();
if (!$docCategory) {
throw new Nette\Application\BadRequestException;
}
$form->setDefaults($docCategory->toArray());
}
return $form;
}
function formSubmitted(AppForm $form) {
$values = $form->values;
if ($this->action === 'catEdit') {
$this->documentsModel->updateDocumentsCat($values, $this->getParam('id'));
} else {
try {
$this->documentsModel->addDocumentsCat($values);
} catch (\Exception $e) {
$form->addError($e->getMessage());
return;
}
}
ale pokud edituji, tedy akce catEdit, tak to hodi
if (!$docCategory) {
throw new Nette\Application\BadRequestException;
tedy v pripade, ze odmazu
function renderCatEdit($id) {
$this->setView('catEdit');
}
function renderCatAdd($id) {
$this->setView('catAdd');
}
domnivam se, tedy aspon nevidim jiny rozdil, ze tam neposilam to $id…
Jak na to prosim?
Editoval VaKvas (2. 5. 2011 20:34)
- VaKvas
- Začátečník | 111
22 napsal(a):
tak to bude asi tím, že není proměnná $doc, protože se ti to asi nenaplní, protože se ti nepředá parametr v URL, kterej tam čteš..tak buď persistent nebo třeba
if (!$doc && !$this->getHttpRequest()->post) { ... }
toto take zkousim a zas me to hodi
Call to a member function toArray() on a non-object
na radce
$form->setDefaults($docCategory->toArray());
mam to nejak blbe poskladany.. asi.. kdyz uz jsme to nakousli, tak bych se rad toho setView zbavil :) pac nevim na co tam je ..
- 22
- Člen | 1478
…protože asi máš tu proměnnou taky prázdnou a tedy v ní není
určitě ani objekt a tedy nepůjde převést do pole. Ty prostě musíš nějak
aplikaci ošetřit na to, že nemusí existovat v URL parametr id
a nebo ho nějakým způsobem komponentě vždy zajistit. Navíc asi je
zbytečné vykonávat dotaz v modelu, který asi je databázový, když tam
předávaš id
=NULL a vrátí nula záznamů, ušetříš
minimálně dotaz. Jinak tu logiku naplnění dat dej aspoň mimo ten form,
ne-li pryč z komponenty a udělat to až v render metodě třeba.
- 22
- Člen | 1478
doporučuju kouknout na životní cyklus a
používat Debugger::dump(), Debugger::barDump(), Debugger::fireLog().
Můžeš si do fireLoggeru poslat z jednotlivých části nějakou značku, aby
ti bylo jasné, v jakém pořadí se presenter zpracovává.
- VaKvas
- Začátečník | 111
Tak $id jsem nastavil jako persistentni a jede to v pohode…
Ovsem ten problem s nepridani $#tab-x (jen v IE) je divny… (aspon pro
me:-)
ALE TADY SE PRIDA jak v IE tak v Mozille
function actionCatDelete($id) {
if ($this->documentsModel->getDocuments()->where('category', $id)->count() >= 1) {
$this->flashMessage('Kategorie obsahuje dokumenty, nelze smazat');
$this->redirect('Documents:#tabs-'.$id);
}
$this->documentsModel->getDocumentsCat()->where('id', $id)->delete();
$this->flashMessage('Kategorie byla smazána');
$this->redirect('Documents:');
}
A TADY NE !
function formDocSubmitted($form) {
$values = $form->values;
if($values['file']->getTemporaryFile()) {
$binarydata = file_get_contents($values['file']->getTemporaryFile());
$values['type'] = $values->file->getContentType();
$values['size'] = $values->file->getSize();
$values['binfile'] = $binarydata;
$values['name'] = $values->file->getName();
}
$values['by'] = $this->user->id;
$values['inserted'] = new \DateTime();
unset($values['file']);
if ($this->action === 'docEdit') {
$this->documentsModel->updateDocuments($values, $this->getParam('id'));
} else {
try {
$this->documentsModel->addDocument($values);
} catch (\Exception $e) {
$form->addError($e->getMessage());
return;
}
}
$this->flashMessage('Dokument byl uložen');
$this->redirect('Documents:#tabs-'.$values->category);
}
22 napsal(a):
Navíc asi je zbytečné vykonávat dotaz v modelu, který asi je databázový, když tam předávaš
id
=NULL a vrátí nula záznamů, ušetříš minimálně dotaz. Jinak tu logiku naplnění dat dej aspoň mimo ten form, ne-li pryč z komponenty a udělat to až v render metodě třeba.
Jak to ? vykonavam jej, abych naplnil ten form… nebo jsem zas mimo :-)
A priznam se, ze nevim, jak bych mel dat logiku jinam ci do render… Moc
prosim… ukazal by jsi me to …
Ja jdu si du nekolikrat precist zivotnost aplikace :)
Diky za trpelivost !
- 22
- Člen | 1478
- dotaz do modelu – ano, pokud existuje vždy
id
tak pak je to v pořádku. - plnění v render metodě:
public renderNeco($id)
{
$formData = .../něco pro získání dat
$form = $this->getComponent('form');
$form->setDefaults($formData);
$this->template->form = $form;
}
Výhodou je, že komponenta je je nezávislá na Presenteru a jeho logice, takže ji můžeš příště použít i někde jinde…
- s tím tabem nevím, zatím nevidím nic, proč by to nemělo fungovat, respektive nikdy jsem zatím nepoužíval, tak jestli s tím někdo dělal a poradí ti..zkus se podívat ve firebugu, kam se to vlastně redirectuje, jestli náhodou tam nemáš 2× ten redirect a jak ten link vypadá..
- 22
- Člen | 1478
jaká action se má provést, se přece zjistí z URL, která má zákl. tvar většinou presenter->action->id a máš to také definováné v routách, takže metoda action nemusí být vůbec uvedena a vykoná se rovnou render. stejně tak nemusíš uvádět ani render metody a vystačí ti úplně šablona v templatu příslušnýho presenteru.
- VaKvas
- Začátečník | 111
Tak ti nevim…
Muzes me prosim ukazat, jak by to melo byt na tomto kusu kodu :
Pokud bych pridal renderCatEdit() musel bych do toho dat cely form, protoze
jinak ho nenaplnim.. Nehlede na fakt, ze pokud chci novou kategorii, volam take
akci CatEdit ..
Ted jsem pekne zblbej , nebo blbej :-))
function createComponentDocCatForm() {
$form = new AppForm;
$form->addText('name', 'Název:')
->setRequired('Vyplňte název !');
$form->addSubmit('save', 'Uložit');
$form->onSubmit[] = callback($this, 'formSubmitted');
if ($this->action === 'catEdit') {
$docCategory = $this->documentsModel->getDocumentsCat()->where('id', $this->getParam('id'))->fetch();
if (!$docCategory) {
throw new Nette\Application\BadRequestException;
}
$form->setDefaults($docCategory->toArray());
}
return $form;
}
function formSubmitted($form) {
$values = $form->values;
if ($this->action === 'catEdit') {
$this->documentsModel->updateDocumentsCat($values, $this->getParam('id'));
} else {
try {
$this->documentsModel->addDocumentsCat($values);
} catch (\Exception $e) {
$form->addError($e->getMessage());
return;
}
}
$this->flashMessage('Kategorie byla ulozena');
$this->redirect('Documents:');
}
- 22
- Člen | 1478
function createComponentDocCatForm($name)
{
$form = new AppForm($this, $name);
$form->addText('name', 'Název:')
->setRequired('Vyplňte název !');
$form->addSubmit('save', 'Uložit');
$form['save']->onClick[] = callback($this, 'formSubmitted');
return $form;
}
function formSubmitted(SubmitButton $form)
{
$data = $form->form->values;
...
}
public function renderCatEdit($id)
{
$form = $this->getComponent('docCatForm');
$data = $this->documentsModel->getDocumentsCat()->where('id', $id)->fetch();
if($data) $form->setDefaults($data);
...
}
nová kategorie by mělo být jiné view, tam asi žádný data plnit nepotřebuješ, takže ti stačí šablona, která odpovídá názvu toho linku, kterým to aktivuješ např.
Editoval 22 (3. 5. 2011 15:18)
- VaKvas
- Začátečník | 111
To vypada srozumitelne.. diky !!! vyzkousim
Jinak zkosim ruzne krokovat ten redirect s #tab-x a ne a ne na to prijit.
Je nejaky rozdil v tom, zda redirectuju v actionXXXX nebo function formSumited? Tady mam tu ukazku kodu
Po celou dobu krokovani vidim, ze jako code nebu url ci param se vyskytuje #tab-x, ale pak tam proste v IE neni…
Jestli ona nahodou Mozilla si to nekam necachuje a nedela cely refresh?
- VaKvas
- Začátečník | 111
Takze takto by to melo vypadat?
Funguje to, ale pro jistotu, jestli tam zas nemam neco zbytecne :-)
function createComponentDocCatForm($name) {
$form = new AppForm($this, $name);
$form->addText('name', 'Název:')
->setRequired('Vyplňte název !');
$form->addSubmit('save', 'Uložit');
$form->onSubmit[] = callback($this, 'formSubmitted');
return $form;
}
function formSubmitted($form) {
$values = $form->values;
if ($this->action === 'catEdit') {
$this->documentsModel->updateDocumentsCat($values, $this->getParam('id'));
} else {
try {
$this->documentsModel->addDocumentsCat($values);
} catch (\Exception $e) {
$form->addError($e->getMessage());
return;
}
}
$this->flashMessage('Kategorie byla ulozena');
$this->redirect('Documents:#tabs-' . $this->getParam('id'));
}
function renderCatEdit($id) {
$form = $this->getComponent('docCatForm');
$data = $this->documentsModel->getDocumentsCat()->where('id', $id)->fetch();
if($data) $form->setDefaults($data);
}
- VaKvas
- Začátečník | 111
Jinak resim porad ty taby a napadlo me zkusit odeslat formulat jinak nez pres
callbak()..
Pokud to ale zmenim, pise me to, ze formSubmitted is not callable…
Muze byt nejaky rozdil volani callbacku a treba funkce…
Chytam se jen toho, ze kdyz volam napr. actionDelete tak to jede dobre, ale pokud odesilam form, tak ne…
Jen takova uvaha a prosba o objasneni..
Diky !
EDIT: zjistil jsem, ze pokud mu predhodim jiny kod:
$this->redirect(300, ‚Documents:#tabs-‘ . $values->category);
tak sice hodi stranku o redirectu, ale posle i s potrebnym #tabs-xx..
Tedy IE evidentne vadi vychozi http kod 302 .. co s tim? napada vas neco?
Editoval VaKvas (4. 5. 2011 12:00)
- 22
- Člen | 1478
Tak jsem se k tomu dneska nějak dostal a můžu potvrdit, že kotva se v IE ignoruje a nepřidá se do URL, pokud ji volám z nějaké submit metody přes:
$this->redirect('this#kotva');
netuším, jestli je to bug nebo se to má řešit jinak, ale co jsem koukal po foru, tak je to nějaký bug.
- Yaromil
- Backer | 20
Zdravím,
nyní jsem se se stejným problémem setkal i já, nepodařilo se to někomu již vyřešit? Co jsem prozatím vypozoroval, tak chyba se projevuje pouze v IE a u mě v případě pokud použiji redirect v komponentě, která je připojená k rodičovské komponentě.
Např.:
Presenter Articles
--- komponenta ArticleFrom
------ v callbacku formuláře pak
$this->parent->redirect('edit#images', $insertId);
Při tomto redirectu pod IE v URL zůstane i potřebné „#images“.
Naopak pokud je odeslán redirect z komponenty, která je připojená k rodičovké komponentě, tak se již potřebný parametr pod IE nepřenese.
Presenter Articles
---komponenta UploadImages
------komponenta UploadImageForm
--------- v callbacku pak
$this->parent->redirect('this#images');
(tady jsou zkoušel všechny možné variace jako např. redirect(‚Articles:edit#images‘, 9), ale nic nepomohlo)
Opakuji, že se to děje jen pod IE, jinde to funguje dobře.
Neví někdo čím by to mohlo být? Velice děkuji za každou radu.