- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
可能应该命名为:“SonataMediaBundle - 缺少的操作方法在哪里?”。
我已经使用 SonataAdminBundle 和 SonataDoctrineORMAdminBundle(以及其他一些)制作了一些管理后端,大多数事情都按预期工作,但我将文件上传和处理留待以后处理,因为我想“这可能有多难?”。
长话短说 - 是否有任何关于最简单事物的文档 - 即将图像附加到帖子或条目,如何配置奏鸣曲管理类,如何以编辑形式显示图像缩略图等?
|首页documentation以“您可以访问您的管理仪表板”结尾,好像我可以期待那里有一些相关的更改,也许媒体管理器已启动并正在运行,或其他什么。但这种情况并非如此。
下一页简要介绍 heplers,然后是另一页,介绍相当复杂的 vimeo 提供商案例研究。
我已经在整个网络上进行了搜索,我能想到的最好的方法是带有 ajax 弹出窗口的上传字段和上传文件列表。
在我的管理类(class)中,我有:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->with('general')
->add('title')
->add('body')
->add('categories')
->end()
->with('media')
->add('images', 'sonata_type_model')
/**
* @ORM\ManyToMany(targetEntity="Application\Sonata\MediaBundle\Entity\Media")
*/
public $images;
Fatal error: Call to a member function add() on a non-object in [some-entity].php
尝试上传图像时,以及带有“加号”符号(我猜是sonata_type_model 字段)的可选图像ID 列表。
<?php
namespace Some\SiteBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Some\SiteBundle\Entity\News
*
* @ORM\Table(name="news")
*/
class News
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
//some stuff...
/**
* @var Document documents
* @ORM\ManyToMany(targetEntity="Document", cascade={"persist", "remove", "delete"} )
**/
protected $documents;
public function __construct()
{
$this->documents = new ArrayCollection();
}
[...]
/**
* Add documents
*
* @param Festus\SiteBundle\Entity\Document $documents
*/
public function addDocument(\Festus\SiteBundle\Entity\Document $document)
{
$this->documents[] = $document;
}
/**
* set document
*
* @param Festus\SiteBundle\Entity\Document $documents
*/
public function setDocument(\Festus\SiteBundle\Entity\Document $document)
{
foreach ($this->documents as $doc) {
$this->documents->removeElement($doc);
}
$this->documents[] = $document;
}
/**
* Get documents
*
* @return Doctrine\Common\Collections\Collection
*/
public function getDocuments()
{
return $this->documents;
}
// setters, getters...
<?php
namespace Some\SiteBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Some\SiteBundle\Entity\Document
*
* @ORM\Table(name="docs")
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class Document
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
*/
private $name;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $path;
/**
* @Assert\File(maxSize="6000000")
*/
private $theFile;
/**
* @ORM\Column(type="datetime", name="created_at")
*
* @var DateTime $createdAt
*/
protected $createdAt;
/**
* @ORM\Column(type="integer")
*/
private $type = 1;
public function __construct()
{
$this->createdAt = new \DateTime();
}
public function getAbsolutePath()
{
return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path;
}
public function getWebPath()
{
return null === $this->path ? null : $this->getUploadDir().'/'.$this->path;
}
protected function getUploadRootDir()
{
// the absolute directory path where uploaded documents should be saved
return __DIR__.'/../../../../web/'.$this->getUploadDir();
}
protected function getUploadDir()
{
// get rid of the __DIR__ so it doesn't screw when displaying uploaded doc/image in the view.
return 'uploads/documents';
}
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if (null !== $this->theFile) {
//var_dump($this);
// do whatever you want to generate a unique name
$this->path = uniqid().'.'.$this->theFile->guessExtension();
}
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
if (null === $this->theFile) {
return;
}
// if there is an error when moving the file, an exception will
// be automatically thrown by move(). This will properly prevent
// the entity from being persisted to the database on error
$this->theFile->move($this->getUploadRootDir(), $this->path);
unset($this->theFile);
}
/**
* @ORM\PostRemove()
*/
public function removeUpload()
{
if ($file = $this->getAbsolutePath()) {
unlink($file);
}
}
public function __toString()
{
return 'Document';
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set file
*
* @param string $file
*/
public function setTheFile($file)
{
$this->theFile = $file;
}
/**
* Get file
*
* @return string
*/
public function getTheFile()
{
return $this->theFile;
}
/**
* Set path
*
* @param string $path
*/
public function setPath($path)
{
$this->path = $path;
}
/**
* Get path
*
* @return string
*/
public function getPath()
{
return $this->path;
}
/**
* Set type
*
* @param string $type
*/
public function setType($type)
{
$this->type = $type;
}
/**
* Get type
*
* @return string
*/
public function getType()
{
return $this->type;
}
/**
* Gets an object representing the date and time the user was created.
*
* @return DateTime A DateTime object
*/
public function getCreatedAt()
{
return $this->createdAt;
}
/**
* Gets an object representing the date and time the user was created.
*
* @return DateTime A DateTime object
*/
public function getCreatedAtString()
{
return date_format($this->createdAt, "Y-m-d");
}
/**
* Set createdAt
*
* @param datetime $createdAt
*/
public function setCreatedAt($createdAt)
{
$this->createdAt = $createdAt;
}
}
<?php
namespace Some\SiteBundle;
use Some\SiteBundle\Form\Type\ImageShowType;
use Some\SiteBundle\Entity\Document;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Validator\ErrorElement;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\Request;
class NewsAdmin extends Admin
{
public function __construct($code, $class, $baseControllerName) {
parent::__construct($code, $class, $baseControllerName);
$this->setFormTheme(array_merge($this->getFormTheme(),
array('FestusSiteBundle:Form:image_form.html.twig')
));
}
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->with('ogólne')
->add('title', NULL, array('label' => 'tytuł:'))
->add('body', NULL, array('label' => 'treść:', 'attr' => array(
'class' => 'tinymce', 'data-theme' => 'simple')))
->add('categories', NULL, array('label' => 'kategorie:'))
->end()
->with('media')
->add('fileName', 'text', array(
"label" => 'tytuł obrazka:',
'property_path' => false,
'required' => false
))
->add('theFile', 'file', array(
"label" => 'wybierz plik',
'property_path' => false,
'required' => false
))
->end()
;
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('title')
->add('body')
;
}
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('title')
->add('categories')
->add('_action', 'actions', array(
'actions' => array(
'view' => array(),
'edit' => array(),
)
))
;
}
protected function configureShowFields(ShowMapper $showMapper)
{
$showMapper->add('title')
->add('body');
}
public function validate(ErrorElement $errorElement, $object)
{
$errorElement
->with('title')
->assertMinLength(array('limit' => 2))
->end()
;
}
public function prePersist($news) {
$this->saveFile($news);
}
public function preUpdate($news) {
$this->saveFile($news);
}
public function saveFile($news) {
$request = Request::createFromGlobals();
$requestData = current($request->request->all());
$filesData = current($request->files->all());
$document = new Document();
$theFile = $filesData['theFile'];
$name = $requestData['fileName'];
if($theFile != NULL){
$document->setName($name);
$document->setTheFile($theFile);
$news->setDocument($document);
}
}
}
<?php
namespace Some\SiteBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class SomeSiteBundle extends Bundle
{
public function getParent()
{
return 'SonataAdminBundle';
}
}
SomeSiteBundle/resources/views/CRUD/base_edit.html.twig
我稍微改变了模板,让用户看到当前设置的图片:
<div class="sonata-ba-collapsed-fields">
{% for field_name in form_group.fields %}
{% if admin.formfielddescriptions[field_name] is defined %}
{% if field_name == 'fileName' %}
<h5 style="margin-left: 40px">Obecny obrazek:</h5>
{% if object.documents[0] is defined %}
<img style="margin: 0 0 0 40px; border: 1px dotted #ccc" src="{{ asset(object.documents[0].webPath) }}" />
{% else %}
<div style="margin-left: 40px">brak</div>
{% endif %}
<hr><h5 style="margin-left: 40px">Wczytaj nowy:</h5>
{% endif %}
{{ form_row(form[field_name])}}
{% endif %}
{% endfor %}
</div>
$config['img_path'] = '/web/uploads/documents';
(或任何其他适合您的路径)在
web/bundles/stfalcontinymce/vendor/tiny_mce/plugins/jbimages/config.php
. (当然,您需要先安装 stfalcon tinymce 包)。然后我编辑了一下
web/bundles/stfalcontinymce/js/init.jquery.js
允许来自
config.yml
的更多选项阅读:
themeOptions.script_url = options.jquery_script_url;
//mine:
themeOptions.convert_urls = options.convert_urls;
themeOptions.relative_urls = options.relative_urls;
themeOptions.remove_script_host = options.remove_script_host;
themeOptions.document_base_url = options.document_base_url;
config.yml
:
[...]
stfalcon_tinymce:
include_jquery: true
tinymce_jquery: true
textarea_class: "tinymce"
relative_urls : false
convert_urls : false
remove_script_host : false
document_base_url : "http://somesite.home.pl/web/"
theme:
[...]
最佳答案
也许您可以在以下内容中找到问题的答案:
/admin/sonata/media/media/create?provider=sonata.media.provider.image&context=default
我对您的其他解决方案感兴趣,请发布代码。谢谢
关于symfony - SonataMediaBundle - 如何上传图片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11526457/
我开始从事一个用 Symfony 2.8 编写的大型项目。将整个项目升级到 SF 3 需要数百小时,现在还不可能。我想到了一个想法,将 symfony/symfony 包解压到它替换的单个包中(com
我在提交表单后使用 FOSUserEvents,但订阅者调用了两次。 这样我的验证码第一次有效第二次无效 这是我的代码 router = $router; $this->request
我有以下路线: blog_show: path: /test/123 defaults: { _controller: TotalcanBravofillBundle:Te
我是测试新手。我想测试我的功能。我已经成功安装了 phpUnit。我在互联网上查看了许多教程。但我无法获得有关测试的正确信息。这是我的功能代码: public function loginAction
我正在尝试重现 facebook batch requests 的行为在他们的图形 api 上运行。 所以我认为最简单的解决方案是在 Controller 上向我的应用程序发出几个请求,例如: pub
在 Symfony Progress Bar documentation有一个超酷酒吧的示例图像。不幸的是,看起来文档的其余部分没有解释如何获得这样的结果。 这是图片,以防您错过: 我怎么才能得到它?
我使用Finder发送假脱机电子邮件,但是自动名称生成器将点放在文件名中,有时它们出现在文件的开头。 查找程序似乎无法获取具有该名称的文件-那些文件被隐藏了……有人经历过这种行为吗?有什么建议如何使用
我正在尝试进行 LDAP 身份验证,我目前遇到此类错误: ServiceNotFoundException: The service "security.firewall.map.context.ma
有没有办法验证和检查集合数组是否为空。我已经尝试过: /** * @Assert\NotBlank() * @Assert\Length( min = 1) */ protected $work
使用Smyfony2和Doctrin2,可以使用以下示例创建数据固定装置:http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/i
我看到在大多数Symfony 2示例中,例如,不存在记录时,Symfony 2会引发异常。我认为这种方法对最终用户不友好。为什么有人更喜欢引发异常而不在Flashbag上添加一些错误消息? 最佳答案
我对项目中的以下服务有疑问: app.security.guardAuthenticatorLoginPassword: class: AppBundle\Security\LoginPa
symfony缓存和登录Docker容器存在问题。 Web服务器从www-data用户和组执行,当我使用docker上安装的php从docker容器中清除symfony缓存时,它从root执行。 因此
我想了解 symfony 中的服务 我已阅读http://symfony.com/doc/2.3/book/service_container.html#creating-configuring-se
因为我对 Symfony 和 Doctrine 还很陌生,所以我有一个可能很愚蠢的问题;-) 有人可以用简单的词语向我解释集合(尤其是实体中的ArrayCollections)吗?它是什么以及何时以及
我收到了这个表格: {{ form_start(form) }} {{ form_end(form) }} 我想检查用户是否登录,我这样做了: {% if is_g
我的网站已准备好部署,我正在尝试将其设置为在线。 一些信息: 主持人是 OVH。 它不允许 SSH,我必须使用 FTP 发送文件。也没有命令行。 我现在希望能够在子目录中设置网站:/www/test(
过去几个月以来,我一直在尝试与symfony合作。昨晚我自动删除了不需要的存储库。之后,我无法使用symfony命令创建新的symfony项目。当我在终端中运行Symfony new Security
In the environnement variable, then in system variable, I edited the path and added在环境变量中,然后在系统变量
我们有一个 Symfony 1.4 应用程序,想升级到 Symfony 4。是否有可能或者我们必须重新编程该应用程序? 我们询问了我们附近的一家软件公司,他们告诉我们必须重新编写应用程序。 最佳答案
我是一名优秀的程序员,十分优秀!