Page 1 sur 1

Accéder à un objet dans un objet

Posté : 23 nov. 2010, 15:55
par VaN
Bonjour,

J'ai une classe User, une classe Artist qui hérite de la classe User, ainsi qu'une classe Media (qui stockent les oeuvres des artistes).

J'extend User pour créer la classe Artist, et je lui rajoute la methode get_newest_media(), que j'appelle dans le __construct, pour récupérer le media le plus récent créé par l'artiste.

classe Artist
<?php
class Artist extends User {
	
	private $artist_newest_media;
	
	public function __construct($id_or_array) {
		
		global $lang;
		$this->const_avatar_path 	= ROOT_PATH . "/images/avatars/";
		$this->const_avatar_url 	= ROOT_URL . "/images/avatars/";
		
		if(is_array($id_or_array)) {
			$user = $id_or_array;
		}
		else {
			$user = get_row_from_query(sprintf("SELECT * FROM " . TABLES__USERS . " WHERE user_id = '%d'", mysql_real_escape_string($id_or_array)));
		}
		
		if(!empty($user)) {
			$this->hydrate($user);
		}
		else {
			$_SESSION["notices"][] = array("type" => "F", "content" => $lang[LANG]["notices"]["failure"]["no_user_found"]);
		}
		
		$this->get_newest_media();
	}
	
	public function get_newest_media() {
		
		$item = get_row_from_query(sprintf("SELECT * FROM " . TABLES__MEDIAS . " WHERE media_user_id = '%d' ORDER BY media_datetime DESC LIMIT 1", mysql_real_escape_string($this->id())));
		
		if(!empty($item)) {
			$newest_media = new Media($item);
			$this->artist_newest_media = $newest_media;
		}
		
	}


}
?>
classe Media
<?php
class Media {
	
	
	private $media_id;
	private $media_user_id;
	private $media_type_id;
	private $media_datetime;
	private $media_title;
	private $media_description;
	private $media_file;
	private $media_statut;
	
	private $media_type_name;
	private $media_type_icon;
	private $media_user_name;
	private $media_file_extension;
	private $media_tmp_file;
	private $media_statut_name;
	private $media_statut_icon;
	
	//--- Class Constants
	private $media_path;
	private $media_url;
	private $media_icon_url;
	
	public function __construct($id_or_array) {
		
		global $lang;
		$this->media_path 				= ROOT_PATH . "/medias/";
		$this->media_url 				= ROOT_URL . "/medias/";
		$this->media_icon_url 			= ROOT_URL . "/common/images/icons/";
		$this->media_statut_icon_url 	= ROOT_URL . "/common/images/icons/";
		
		if(is_array($id_or_array)) {
			$media = $id_or_array;
		}
		else {
			$media = get_row_from_query(sprintf("SELECT MEDIAS.*, 
			MEDIAS_TYPES.type_name_fr AS media_type_name, MEDIAS_TYPES.type_icon AS media_type_icon, 
			CONCAT_WS(' ', USERS.user_firstname, USERS.user_lastname) AS media_user_name, 
			STATUTS.statut_name AS media_statut_name, STATUTS.statut_icon AS media_statut_icon
			FROM " . TABLES__MEDIAS . " MEDIAS, " . TABLES__MEDIAS_TYPES ." MEDIAS_TYPES, " . TABLES__USERS . " USERS, " . TABLES__STATUTS . " STATUTS 
			WHERE MEDIAS.media_type_id = MEDIAS_TYPES.type_id AND MEDIAS.media_user_id = USERS.user_id AND MEDIAS.media_statut = STATUTS.statut_statut AND STATUTS.statut_type = 'media'
			AND media_id = '%d'", mysql_real_escape_string($id_or_array)));
		}
		
		if(!empty($media)) {
			$this->hydrate($media);
		}
		else {
			$_SESSION["notices"][] = array("type" => "F", "content" => $lang[LANG]["notices"]["failure"]["no_media_found"]);
		}
		
	}
	
	public function hydrate($array) {
		foreach($array as $key => $value) {
			$this->$key = $value;
		}
	}
	
	public function id() {
		return $this->media_id;
	}
	public function user_id() {
		return $this->media_user_id;
	}
	public function type_id() {
		return $this->media_type_id;
	}
	public function datetime() {
		return $this->media_datetime;
	}
	public function title() {
		return $this->media_title;
	}
	public function description() {
		return $this->media_description;
	}
	public function file() {
		return $this->media_file;
	}
	public function statut() {
		return $this->media_statut;
	}
	
	public function type_name() {
		return $this->media_type_name;
	}
	public function type_icon() {
		return "<img src=\"".$this->media_icon_url.$this->media_type_icon."\" alt=\"\" align=\"left\" style=\"margin:0 5px 0 0;\" />";
	}
	public function user_name() {
		return $this->media_user_name;
	}
	public function statut_name() {
		return $this->media_statut_name;
	}
	public function statut_icon() {
		return "<img src=\"".$this->media_statut_icon_url.$this->media_statut_icon."\" alt=\"\" align=\"left\" style=\"margin:0 5px 0 0;\" />";
	}
	public function filename() {
		return file_get_filename($this->media_file);
	}
	public function file_extension() {
		return file_get_extension($this->media_file);
	}
	public function tmp_file() {
		return $this->media_tmp_file;
	}
	public function path() {
		return $this->media_path;
	}
	
	
	
	public function set_id($id) {
		$this->media_id = $id;
	}

}
?>
classe Artist_Manager :
<?php
class Artist_Manager extends User_Manager {

	public function get_list($order_by = "user_id") {
		$artists = get_array_from_query("SELECT * FROM " . TABLES__USERS . " WHERE user_account_type = 1 ORDER BY ".$order_by);
		
		foreach($artists as $artist_key => $artist) {
			$artists[$artist_key] = new Artist($artist["user_id"]);
		}
		
		if(empty($artists)) {
			$artists = array();
		}
		return $artists;
	}

}
?>
Sur une page PHP, je boucle sur les différents artistes de la base de données :
<?php
$tab = "\t\t";
?>
<div class="best_items">
		<h2><?php echo $lang[LANG]["best_items"]["title"]; ?></h2>
		<?php
$artists = $artist_manager->get_list();

print_r_pre($artists);

foreach($artists as $artist) {
	echo "<div class=\"item\">" . "\n";
	echo $tab . "\t" . "<div class=\"item_icon\">".$artist->avatar()."</div>" . "\n";
	echo $tab . "\t" . "<div class=\"item_title\"><a href=\"" . ROOT_URL ."/user.php?id=" . $artist->id() ."\">".$artist->name()."</a></div>" . "\n";
	echo $tab . "</div>" . "\n";
}
?>	
	</div>
Comment puis-je faire dans cette boucle pour accéder aux attributs de l'objet newest_media, contenu dans l'attribut $artist_newest_media de l'objet Artist ?

Re: Accéder à un objet dans un objet

Posté : 23 nov. 2010, 16:00
par stealth35
si tu fais un var_dump de $artist ca donne quoi ?

Re: Accéder à un objet dans un objet

Posté : 23 nov. 2010, 17:00
par VaN
Histoire que ça soit un peu mis en forme, j'ai fait un <pre>print_r()<pre> :
Array
(
[0] => Artist Object
(
[artist_newest_media:Artist:private] => Media Object
(
[media_id:Media:private] => 3
[media_user_id:Media:private] => 1
[media_type_id:Media:private] => 2
[media_datetime:Media:private] => 2010-11-23 12:44:48
[media_title:Media:private] => Back to Bind
[media_description:Media:private] => test
[media_file:Media:private] => 20101123124448-psp_back_to_bind.mp4
[media_statut:Media:private] => 1
[media_type_name:Media:private] =>
[media_type_icon:Media:private] =>
[media_user_name:Media:private] =>
[media_file_extension:Media:private] => mp4
[media_tmp_file:Media:private] =>
[media_statut_name:Media:private] =>
[media_statut_icon:Media:private] =>
[media_path:Media:private] => D:/www/Projects/artists/www/medias/
[media_url:Media:private] => http://127.0.0.1/Projects/artists/www/medias/
[media_icon_url:Media:private] => http://127.0.0.1/Projects/artists/www/c ... ges/icons/
[media_statut_icon_url] => http://127.0.0.1/Projects/artists/www/c ... ges/icons/
)

[user_id:User:private] => 1
[user_account_type:User:private] => 1
[user_mail:User:private] => [email protected]
[user_password:User:private] => 40f6b99491e4bc3fe36b1c73022ed73b
[user_activation_key:User:private] => 2vZyR7NwUe
[user_datetime:User:private] => 2010-11-22 17:04:30
[user_gender:User:private] => 1
[user_firstname:User:private] => mon_prenom
[user_lastname:User:private] => mon_nom
[user_birthdate:User:private] => 1983-03-29
[user_telephone:User:private] => 0123456789
[user_mobile:User:private] => 0623456789
[user_address_1:User:private] => 1 rue de Paris
[user_address_2:User:private] => 4ème étage
[user_zipcode:User:private] => 75001
[user_city:User:private] => Paris
[user_country:User:private] => 77
[user_avatar:User:private] => 1.jpg
[user_newsletters:User:private] => 1
[user_statut:User:private] => 0
[const_avatar_path:User:private] =>
[const_avatar_url:User:private] =>
[const_avatar_path] => D:/www/Projects/artists/www/images/avatars/
[const_avatar_url] => http://127.0.0.1/Projects/artists/www/images/avatars/
[user_new_mail] =>
[user_new_mail_key] =>
[user_new_password] =>
[user_new_password_key] =>
)

)
J'ai donc bien un objet Artist, dont l'attribut artist_newest_media contient bien un objet Media

Re: Accéder à un objet dans un objet

Posté : 23 nov. 2010, 17:49
par stealth35
c'est en private aussi, si tu veux y accéder faut le mettre en public, ou faire une méthode pour récupérer ca