ošetření prázdných proměnných – trying to get property of non object

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
qteck
Člen | 164
+
0
-

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

qteck
Člen | 164
+
0
-

a on vrací false, tak to jsem trdlo

qteck
Člen | 164
+
0
-

Napadlo mě, ještě, není něják jednoduše možné aby se vyberala nějaká defaultní hodnota v případě, že ta zadávaná neexistuje?

Díky.

Oli
Člen | 1215
+
0
-

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
+
0
-

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
+
0
-

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.

qteck
Člen | 164
+
0
-

okay, tak teď tomu rozumim, ale setkávám se prvně se metodama actionDetail a renderDetail

jaký je mezi tím rozdíl, proč to nedát prostě do renderDefault

James_Scott
Člen | 55
+
0
-

Pročti si dokumentaci, zrovna tohle je jeden z nezbytně nutných základů

Oli
Člen | 1215
+
0
-

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
+
0
-

áá okay, :D, jsem to předtím četl, ale už je to dost dlouhá doba, jen na svoji obhajobu, :D.

Díky.

qteck
Člen | 164
+
0
-

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.

Oli
Člen | 1215
+
0
-

presne tak. v develop režimu vidíš laděnku a na produkci to zobrazí 404.latte

qteck
Člen | 164
+
0
-

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');
        }
}
Oli
Člen | 1215
+
0
-

Pokud máš ten kod, kterej jsem posílal já, tak si dupni co ti vrací $id. Pokud je $id == null, tak se ti ta podmínka nikdy neprovede protože null != false…

Ještě si dupni co vrací $this->gallery. Mělo by vracet buď ActiveRow nebo false.

Mysteria
Člen | 797
+
0
-

Nestačilo by to upravit takhle, protože negace NULL nebo FALSE bude vždy TRUE?

function actionDetail($id) {
	if (!($this->gallery = $this->pictures->getGallery($id))) throw new \Nette\Application\BadRequestException();
}
qteck
Člen | 164
+
0
-

jj stačilo.