首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sonata Media:以编程方式更改上下文

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

Stack Overflow用户
提问于 2013-08-16 14:15:45
回答 1查看 1.3K关注 0票数 2

我正在写一个小的博客应用程序,用户可以发布公开和私人的新闻。用户可以将文件附加到这些新闻。这个应用程序有两个上下文:public_news和private_news,前者包含所有人都可以访问的文件,后者包含仅当用户登录时才能访问的文件。

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

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

EN

回答 1

Stack Overflow用户

发布于 2013-08-20 22:06:21

您对重新创建此媒体有何看法?

代码语言:javascript
复制
$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可能不会删除您的物理文件,如果您希望创建自己的提供商,则可能需要创建自己的提供商。

编辑:

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

代码语言:javascript
复制
if ($pool->getFilesystem()->has($path)) {
    $pool->getFilesystem()->delete($path);
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18266949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档