Sonata Media:以编程方式更改上下文

时间:2013-08-16 06:15:45

标签: symfony sonata-admin

我正在编写一个小博客应用程序,用户可以在其中发布公共和私人新闻。用户可以将文件附加到这些新闻。我有两个这个应用程序的上下文:public_news,文件可供所有人访问;和private_news,文件只有在用户登录时才能访问。

当用户将新闻从公开更改为私有时,我希望能够将文件从public_news上下文移动到private_news上下文,反之亦然。

我希望做一些像$media->setContext('private_news');这样简单的事情,但这不会将物理文件从一个目录移动到另一个目录。

1 个答案:

答案 0 :(得分:1)

您如何重新创建此媒体?

$oldMedia = getYourOldMedia();

// $media = clone($oldMedia); # For me it didn't work as expected
                              # YMMV - I didn't spend lots wondering about that
$media = new Media();

// This will work fine with image and file provider, 
// but it was not tested with other providers
$pool = $container->get('sonata.media.pool');
$provider = $pool->getProvider($oldMedia->getProviderName());
$media->setBinaryContent($provider->getReferenceFile($oldMedia));

}

$media->setProviderName($oldMedia->getProviderName());
$media->setContext('private_news');
/* copy any other data you're interested in */

$mediaManager->save($media);
$mediaManager->delete($oldMedia); 

$mediaManager->delete可能不会删除您的物理文件,具体取决于提供商,如果您愿意,可能需要创建自己的提供商。

编辑:

在进一步研究中,我发现您可以在删除旧媒体之前手动删除文件:

if ($pool->getFilesystem()->has($path)) {
    $pool->getFilesystem()->delete($path);
}

但是在保存新媒体实体之前不要这样做。