From 1f517f9af8545e5a332f83cad8f04246ba6b35b9 Mon Sep 17 00:00:00 2001 From: cash Date: Wed, 23 Mar 2011 01:24:29 +0000 Subject: Fixes #3160 just needed a small variation off of [8762] to handle getting filestore before metadata is set but after the guid is set git-svn-id: http://code.elgg.org/elgg/trunk@8822 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/classes/ElggFile.php | 57 ++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 29 deletions(-) (limited to 'engine') diff --git a/engine/classes/ElggFile.php b/engine/classes/ElggFile.php index 961a6ef13..fe25491a8 100644 --- a/engine/classes/ElggFile.php +++ b/engine/classes/ElggFile.php @@ -302,8 +302,8 @@ class ElggFile extends ElggObject { /** * Return a filestore suitable for saving this file. - * This filestore is either a pre-registered filestore, a filestore loaded from metatags saved - * along side this file, or the system default. + * This filestore is either a pre-registered filestore, + * a filestore as recorded in metadata or the system default. * * @return ElggFilestore */ @@ -313,44 +313,43 @@ class ElggFile extends ElggObject { return $this->filestore; } - // If filestore meta set then retrieve filestore - // @todo Better way of doing this? - // ^ Yes....yes there is. - $metas = elgg_get_metadata(array( - 'guid' => $this->guid, - 'limit' => 0 - )); - $parameters = array(); - if (is_array($metas)) { - foreach ($metas as $meta) { - if (strpos($meta->name, "filestore::") !== false) { - // Filestore parameter tag - $comp = explode("::", $meta->name); - $name = $comp[1]; - - $parameters[$name] = $meta->value; + // ask for entity specific filestore + // saved as filestore::className in metadata. + // need to get all filestore::* metadata because the rest are "parameters" that + // get passed to filestore::setParameters() + if ($this->guid) { + $db_prefix = elgg_get_config('dbprefix'); + $options = array( + 'guid' => $this->guid, + 'where' => array("n.string LIKE 'filestore::%'"), + ); + + $mds = elgg_get_metadata($options); + + $parameters = array(); + foreach ($mds as $md) { + list($foo, $name) = explode("::", $md->name); + if ($name == 'filestore') { + $filestore = $md->value; } + $parameters[$name] = $md->value; } } - if (isset($parameters['filestore'])) { - if (!class_exists($parameters['filestore'])) { + // need to check if filestore is set because this entity is loaded in save() + // before the filestore metadata is saved. + if (isset($filestore)) { + if (!class_exists($filestore)) { $msg = elgg_echo('ClassNotFoundException:NotFoundNotSavedWithFile', - array($parameters['filestore'], - $this->guid)); + array($filestore, $this->guid)); throw new ClassNotFoundException($msg); } - // Create new filestore object - $this->filestore = new $parameters['filestore'](); - + $this->filestore = new $filestore(); $this->filestore->setParameters($parameters); - } else { - // @todo - should we log error if filestore not set } - - // if still nothing then set filestore to default + // this means the entity hasn't been saved so fallback to default if (!$this->filestore) { $this->filestore = get_default_filestore(); } -- cgit v1.2.3