ošetření prázdných proměnných – trying to get property of non object
- qteck
- Člen | 164
Ahoj,
function getGallery($id)
{
return $this->conn->table('galleries')->get($id);
}
Jedná se mi o to, že když tam někdo zadá id které neexistuje vyhodí mi to hlášku z nadpisu výše.
Zajímá mě, zda je možné to něják rozumně ošetřit.
už si nevzpomínám jak jsem to dělával normálně bez fw, ale tady mě napadá snad dát nějaký if? jenomže to je zase…, oni mi tu hlášku vrací proměnný v šabloně.
Jednoduše řečeno jak mohu z tohoto dostat informaci, zda v tom je to co v tom být má?
Thx
- Oli
- Člen | 1215
Jasně že to možný je. Obalíš to ifem. Ale z vlastní zkušenosti ti nedoporučuju vracet něco jinýho než ActiveRow, Selection nebo false. Pokud použiješ fetch(), tak to vrátí vždycky ActiveRow nebo false. Nepoužiješ fetch(), takt o vrátí Selection, kde jsem dřív vracel false pokud neexistoval žádnej řádek. To ale nedělej! Lepší je zavolat
if(count($selection)){} // ke $selection je instance Selection
- qteck
- Člen | 164
já moc nerozumím co tím míníš.
znamená to že existuje také instance ActiveRow? kteoru mohu najít pod $activeRow třeba? Rozdíl mezi ActiveRow a Selection je jaký.
*/
function getGallery($id)
{
$q = $this->conn->table('galleries')->get($id); // vrací false
if(!$q)
{
$q = $this->conn->table('galleries')->order('id DESC')->limit(1); //pokud někdo zadá id neexistujícího článku, vyberu a vypíšu ten nejnovější.
}
return $q;
}
a ještě bych tam dotoho mohl hodit flash a informovat uživatele, ikdyž normální uživatel idéčka měnit nebude leda by se tam dostal z vyheldávače na nějakej smazanej..
Takhle bych to řešil já. Co si o tom myslíš?
.-----okay- selection je třída. asctiv row asi taky.
Editoval qteck (3. 6. 2014 21:43)
- Oli
- Člen | 1215
qteck: Jsem to asi blbě vysvětlil a trochu ti to zamotal.
Tak to zkusím zase rozmotat.
Udělal bych to zhruba takhle:
//model
function getGallery($id = null)
{
if (is_null($id))
{
//vrací vždy instanci Selection
return $this->conn->table('galleries');
} else
{
// vrací vždy instanci ActiveRow nebo false
return $this->conn->table('galleries')->get($id);
}
}
// presenter
public function actionDetail($id)
{
$this->gallery = $this->galleryRepository->getGallery($id);
// Pokud je $this->gallery false, tak vyhod 404 - stránka nenalezena
if (!$this->gallery)
{
throw new BadRequestException();
}
}
public function renderDetail()
{
$this->template->gallery = $this->gallery;
}
public function renderDefault()
{
$this->template->galleries = $this->galleryRepository->getGallery();
}
default.latte
{* Je vždy instancí selection. Pokud je počet řádků roven 0 tak se if neprovede *}
{if count($galleries)} {* muzes pouzit i konstrukci $galleries->count() *}
{foreach $galleries as $gallery}
...
{/foreach}
{/if}
Rozdíl mezi Selection a ActiveRow je ten, že selection je několik řádků tabulky. V podstatě je to pole, které obsahuje jednotlivé ActiveRow. ActiveRow je už jeden konkrétní řádek z tabulky.
- Oli
- Člen | 1215
Ajaj, jak jsem četl nedávno dceři z Křemílka a Vochomůrky: „Zase jedna neučesaná“. Rozuměj, zase jeden co nečetl dokumentaci ;-)
- qteck
- Člen | 164
Ještě jedna otázka:
když vyhodim BadRequestException() co to vlastně znamená? Vidím že mi nette hází 404 v laděnce a že k=od znamená stránka nenalezena, ale co bych s tím měl dělat dál? ono to přesměruje samo v produkčním módu na tu error stránku co má v error pohledech?
Díky za zodpovídání takových blbých otázek :D.
- qteck
- Člen | 164
díky, domníval jsem se že rozumim tomu jak to unguje, ale nezdá se, ta podmínka se nikdy neprovede. gallery vyhazuje false, tak jsem tam šoupl false, ale jakoby se actionDetail nevykonal. Proměnné se nenaplní a vyhodí mi to undefined variable.
první se vykoná actionDetail kde by to mělo vyhodit výjimku, pokud ji to nevyhodí, přiřadí se obsah z db do proměnné template v renderDetail.
Dělá to jakoby tam vůbec ta výjimka nebyla, v čem dělám chybu?
function actionDetail($id)
{
$this->gallery = $this->pictures->getGallery($id);
if($this->gallery == false)
{
echo "doesnt work";
throw new \Nette\Application\BadRequestException();
}
}
function renderDetail()
{
$this->template->gallery = $this->gallery;
}
function renderDefault($id)
{
$this->template->pictures = $this->pictures->getPictures($id);
if(count($this->template->pictures) == 0)
{
$this->flashMessage('Galerie je prozatím bez obsahu.', 'info');
}
}