2

ユーザーが公開ニュースと非公開ニュースを公開できる小さなブログアプリを書いています。ユーザーはこれらのニュースにファイルを添付できます。このアプリには 2 つのコンテキストpublic_newsがあります。およびprivate_news、ユーザーがログオンしている場合にのみアクセスできるファイル。

ユーザーがニュースをパブリックからプライベートに、またはその逆に変更したときに、ファイルを public_news コンテキストから private_news コンテキストに移動できるようにしたいと考えています。

のような単純なことをしたいと思っていまし$media->setContext('private_news');たが、これでは物理ファイルをあるディレクトリから別のディレクトリに移動できません。

4

1 に答える 1

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);
}

ただし、新しいメディア エンティティを保存する前にそれを行わないでください。

于 2013-08-20T14:06:20.750 に答える