Accéder à un objet dans un objet

VaN
Mammouth du PHP | 1107 Messages

23 nov. 2010, 15:55

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 ?

ViPHP
ViPHP | 5462 Messages

23 nov. 2010, 16:00

si tu fais un var_dump de $artist ca donne quoi ?

VaN
Mammouth du PHP | 1107 Messages

23 nov. 2010, 17:00

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

ViPHP
ViPHP | 5462 Messages

23 nov. 2010, 17:49

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