@ozzie
Ik gebruik de bovenste manier. Anders kost het veel te veel tijd ;-) Af en toe doe ik het wel met arrays maar waarom weet ik eigenlijk niet. (Terwijl ik eigenlijk wel altijd van de consistentie ben)
@eddy
Hebben we daar geen commentaar voor uit gevonden? Maak via de comment tags afscheiden aan. (Ik heb het nu over je CSS bestand)
@ozzie
Over die variabelen, soms zet ik bepaalde acties in variabelen en sommige niet.
Bijvoorbeeld, ik heb een object, genaamd `Banner`, wat een representatie van een row (uit een database tabel) is.
Aan een banner kunnen (image) areas, en artikelen gekoppeld zodat je een mooie image map kan maken. (denk er even aan dat je in de view zit, het banner object is naar de view geparsed)
Dat kan op twee manieren:
1:
<div class="banner">
<img src="<?php echo $this->banner->src_1 ?>" alt="<?php echo (string) $this->escape($this->banner) ?>" usemap="map_<?php echo (int) $this->banner->banner_id ?>" />
<?php if (count($this->banner->getAreas()) > 0): ?>
<map name="map_<?php echo (int) $this->banner->banner_id ?>">
<?php foreach ($this->banner->getAreas() as $area): ?>
<area shape="<?php echo $this->banner->shape ?>" coords="<?php echo $this->banner->coords ?>" href="<?php echo $this->escape($area->href) ?>" alt="<?php echo (string) $this->escape($area) ?>" />
<?php endforeach; ?>
</map>
<?php endif; ?>
</div>
<?php if (count($this->banner->getArticles()) > 0): ?>
<div class="banner-articles">
<?php foreach ($this->banner->getArticles() as $article): ?>
<div class="article">
<a href="<?php echo $this->url(array('article_id' => (int) $article->article_id, 'seotag' => $article->getSimplifyArticleName()), 'article') ?>" title="<?php echo (string) $this->escape($article) ?>">
<?php echo (string) $this->escape($this->article) ?>
</a>
<!-- overige elementen zoals afbeelding / prijs etc -->
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
2:
<div class="banner">
<img src="<?php echo $this->banner->src_1 ?>" alt="<?php echo (string) $this->escape($this->banner) ?>" usemap="map_<?php echo (int) $this->banner->banner_id ?>" />
<?php $areas = $this->banner->getAreas() ?>
<?php if (count($areas) > 0): ?>
<map name="map_<?php echo (int) $this->banner->banner_id ?>">
<?php foreach ($areas as $area): ?>
<area shape="<?php echo $this->banner->shape ?>" coords="<?php echo $this->banner->coords ?>" href="<?php echo $this->escape($area->href) ?>" alt="<?php echo (string) $this->escape($area) ?>" />
<?php endforeach; ?>
</map>
<?php endif; ?>
</div>
<?php $articles = $this->banner->getArticles() ?>
<?php if (count($articles) > 0): ?>
<div class="banner-articles">
<?php foreach ($articles as $article): ?>
<div class="article">
<a href="<?php echo $this->url(array('article_id' => (int) $article->article_id, 'seotag' => $article->getSimplifyArticleName()), 'article') ?>" title="<?php echo (string) $this->escape($article) ?>">
<?php echo (string) $this->escape($this->article) ?>
</a>
<!-- overige elementen zoals afbeelding / prijs etc -->
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
Het enige verschil in de bovenstaande codes is regel 3 en 13. Hoezo doe ik dit? Daarvoor moeten we eerst even naar de functies getAreas() en getAricles() op het Banner object bekijken. (Zie onderstaande codes)
<?php
class Application_Model_Banner extends Zend_Db_Table_Row {
public function getAreas() {
return $this->findDependentRowset('Application_Model_DbTable_BannerArea');
/**
Lees dit als:
SELECT area_id, title, shape, coords, href
FROM banner_area
WHERE banner_id = 1
**/
}
public function getArticles() {
return $this->findDependentRowset('Application_Model_DbTable_BannerArticles');
/**
Lees dit als:
SELECT
article_id, title, enz ............
FROM banner_articles AS ba
JOIN article AS a ON a.article_id = ba.article_id
JOIN article_size AS as ON as.article_id = a.article_id
WHERE ba.banner_id = 1
AND as.stock > 0
AND a.active = 'yes'
AND a.src_1 IS NOT NULL
enz enz enz
**/
}
}
?>
Zoals je ziet wordt er bij elke methode een query uitgevoerd (wel even op de zend manier, maar het gaat even om het idee). Dus, elke keer wanneer je die methode aanroept wordt die query uitgevoerd. Dat is de reden waarom ik bepaalde functionaliteit in variabeles zet. Deze query's zijn nog niet heel bijzonder maar join er maar eens een categorie, merk, kleur etc bij, en tot slot nog wat filtering voor voorraad locaties en al die zooi. (is slecht als je dat allemaal gedecentraliseerd regelt, maar het gaat natuurlijk even om het idee)
Als je dan die methode 4 of 5 om misschien wel 10 keer ergens aanroept, (gaat heel snel vergis je niet, denk bijvoorbeeld aan webshop filtering) dan wordt 10 keer die query aangeroepen / uitgevoerd en verwerkt. Dat ga je wel merken in de performance.
Een andere oplossing is het in het object oplossen. Zie onderstaand voorbeeld:
<?php
class Application_Model_Banner extends Zend_Db_Table_Row {
private $areas;
private $articles;
public function getAreas() {
if (!$this->areas instanceof Zend_Db_Table_Rowset_Abstract) { // even op de zend manier, je kan natuurlijk ook checken of het een array is
$this->areas = $this->findDependentRowset('Application_Model_DbTable_BannerArea');
}
return $this->areas;
}
public function getArticles() {
if (!$this->articles instanceof Zend_Db_Table_Rowset_Abstract) { // even op de zend manier, je kan natuurlijk ook checken of het een array is
$this->articles = $this->findDependentRowset('Application_Model_DbTable_BannerArticles');
}
return $this->articles;
}
}
?>
Zoals ik in het beveiliging topic al zei moet je heel goed nadenken over het gene wat je schrijft en wat de (mogelijke) gevolgen daarvan kunnen zijn.
Mee eens?
Niels