Jak udělat basePath statickou pro vytvoření placeholderu v Modelu

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

Ahoj,

nevíte někdo, jak vyřešit následující situaci?

Mám entitu Member, která má následující metodu

<?php
public function getProfileImage($isInternal = FALSE, $force = FALSE)
	{
		if($this->profileImage !== NULL) {
			return $this->profileImage;
		} else {
			return Image::getDefaultProfileImage();
		}
	}
?>

funkce getDefaultProfileImage vypadá takto:

<?php
/**
	 * @return Image
	 */
	public static function getDefaultProfileImage()
	{
		$image = new Image();
		$image->setOriginal('http://localhost/myApp/www/images/placeholder.png');
		$image->setLarge('http://localhost/myApp/www/images/placeholder.png');
		$image->setMedium('http://localhost/myApp/www/images/placeholder.png');
		$image->setSmall('http://localhost/myApp/www/images/placeholder.png');

		return $image;
	}
?>

Potřeboval bych sem nějak dostat $basePath, abych tady nemusel mít natvrdo absolutní url…

Předal bych ji nějak předal do Image, problém je, že metoda getDefaultProfileImage musí být statická, protože getProfileImage používám na Doctrine entitách, kam si konstruktorem nemůžu nic předat (zároveň i Image je entita, ale to by se dalo vyřešit přesunutím funkce na ImageService)

Napadlo mě, že by se dalo udělat tohle:

<?php
class ImageService {

	public static $basePath;

	public function __construct($basePath){
		self::$basePath = $basePath;
	}
}

?>

a pak to volat:

<?php
	  $image->setOriginal(ImageService::$basePath.'/images/placeholder.png');
?>

ale nepřijde mi to hezké, například proto, že není jisté, že se konstruktor ImageService zavolá (nemusím ImageService vůbec použít a díky lazy loadingu se proto nenainicializuje ani $basePath)

Neřešili jste někdo něco podobného?

Editoval Vokrik (25. 9. 2015 11:16)

newPOPE
Člen | 648
+
0
-

No, $basePath nema v modeli co robit. Riesil by som to nejak tak, ze model mi akurat dodat dajme tomu SplFileInfo a v danom helperi, makre, … si to uz spracujem ako potrebujem.

A co tak to urobit tak, ze budes mat sluzbu ktora bude dynamicka (cize bude mat $basePath) a ta ti vrati nastaveny image. Cize cez nu prezenies entitu a je.

Vokrik
Člen | 15
+
0
-

No on je trochu problém, že si v databázi držím pouze absolutní url všech obrázků, protože je hostujeme na Amazon S3.. Takže pak v šablonách k tomu přistupuju takhle

<?php
<img n:src="$member->profileImage->large">
?>

A tam se mi vrazí buď absolutní url obrázku z amazonu, nebo absolutní url na serveru aplikace. To makro|filter by pak muselo zkoumat, jestli na začátku stringu té url je http:// nebo https://, a pokud ne, tak tam dát $basePath … Asi to není úplně špatný nápad, ale kdyby se to dalo udělat nějak bez parsování stringu, tak by to bylo hezčí