私はフォーラムに参加したばかりなので、フォーラムのルールを尊重し、明確にするために最善を尽くします。
私は symfony から始めて、フォームとエンティティ、およびそれらの使用法を発見しています。ユーザーに新しい画像を追加するか、既存の画像を選択するように促すフォームを表示したいと思います。
エンティティ「ページ」とエンティティ「画像」の 2 つのエンティティがあります。ページを追加する形で、画像を追加するためのネストと、画像フォームを選択するためのドロップダウン リストが必要です。
数時間の調査とテストの後、私はまだ同じ問題に直面しており、解決方法がわかりません。
誰かが私を助けてくれるか、どうすればよいか教えてくれますか?
ありがとうございました。
編集
ああ、ごめんなさい、私の意図ではありませんでした。
私のエンティティ「ページ」のコードは次のとおりです。
<?php
namespace Test\AdminBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Pages
*
* @ORM\Table(name="app_pages")
* @ORM\Entity
*/
class Pages
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=90, nullable=true)
*/
private $title;
/**
* @var string
*
* @ORM\Column(name="page_title", type="string", length=90)
*/
private $pageTitle;
/**
* @var string
*
* @ORM\Column(name="page_name", type="string", length=90)
*/
private $pageName;
/**
* @var string
*
* @ORM\Column(name="content", type="text", nullable=true)
*/
private $content;
/**
* @ORM\OneToOne(targetEntity="Test\AdminBundle\Entity\Image", cascade={"persist"})
* @ORM\JoinColumn(nullable=false)
*/
private $image;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set title
*
* @param string $title
* @return Pages
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* Set pageTitle
*
* @param string $pageTitle
* @return Pages
*/
public function setPageTitle($pageTitle)
{
$this->pageTitle = $pageTitle;
return $this;
}
/**
* Get pageTitle
*
* @return string
*/
public function getPageTitle()
{
return $this->pageTitle;
}
/**
* Set pageName
*
* @param string $pageName
* @return Pages
*/
public function setPageName($pageName)
{
$this->pageName = $pageName;
return $this;
}
/**
* Get pageName
*
* @return string
*/
public function getPageName()
{
return $this->pageName;
}
/**
* Set content
*
* @param string $content
* @return Pages
*/
public function setContent($content)
{
$this->content = $content;
return $this;
}
/**
* Get content
*
* @return string
*/
public function getContent()
{
return $this->content;
}
/**
* Set image
*
* @param \Test\AdminBundle\Entity\Image $image
* @return Pages
*/
public function setImage(\Test\AdminBundle\Entity\Image $image = null)
{
$this->image = $image;
return $this;
}
/**
* Get image
*
* @return \Test\AdminBundle\Entity\Image
*/
public function getImage()
{
return $this->image;
}
}
私のエンティティ「画像」のコードは次のとおりです。
<?php
namespace Test\AdminBundle\Entity;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Group
*
* @ORM\Table(name="app_images")
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class Image
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
* @Assert\NotBlank
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="alt", type="string", length=255)
*/
private $alt;
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255, nullable=true)
*/
private $path;
/**
* @Assert\Image(maxSize="2M")
*/
private $file;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return Image
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set file.
*
* @param UploadedFile $file
* @return Image
*/
public function setFile(UploadedFile $file = null)
{
$this->file = $file;
// check if we have an old image path
if ( isset($this->path) ) {
// store the old name to delete after the update
$this->temp = $this->path;
$this->path = null;
}
else {
$this->path = 'initial';
}
return $this;
}
/**
* Get file.
*
* @return UploadedFile
*/
public function getFile()
{
return $this->file;
}
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if (null !== $this->getFile()) {
// do whatever you want to generate a unique name
$filename = sha1(uniqid(mt_rand(), true));
$this->path = $filename.'.'.$this->getFile()->guessExtension();
}
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
if (null === $this->getFile()) {
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->getFile()->move($this->getUploadRootDir(), $this->path);
// check if we have an old image
if (isset($this->temp)) {
// delete the old image
unlink($this->getUploadRootDir().'/'.$this->temp);
// clear the temp image path
$this->temp = null;
}
$this->file = null;
}
/**
* @ORM\PostRemove()
*/
public function removeUpload()
{
if ($file = $this->getAbsolutePath()) {
unlink($file);
}
}
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
// images should be saved
return __DIR__.'/../../../../web/'.$this->getUploadDir();
}
protected function getUploadDir()
{
// get rid of the __DIR__ so it doesn't screw up
// when displaying uploaded doc/image in the view.
return 'uploads/images';
}
/**
* Set alt
*
* @param string $alt
* @return Image
*/
public function setAlt($alt)
{
$this->alt = $alt;
return $this;
}
/**
* Get alt
*
* @return string
*/
public function getAlt()
{
return $this->alt;
}
/**
* Set path
*
* @param string $path
* @return Image
*/
public function setPath($path)
{
$this->path = $path;
return $this;
}
/**
* Get path
*
* @return string
*/
public function getPath()
{
return $this->path;
}
}
pagesType (buildForm 関数):
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', 'text', array('required' => false))
->add('pageTitle', 'text')
->add('pageName', 'text')
->add('content', 'textarea', array('required' => false))
->add('comment', 'text', array('required' => false))
/* Add new image */
->add('image', new ImageType())
/* Select an existing image */
/*->add('image', 'entity', array(
'class' => 'TestAdminBundle:Image',
'property' => 'name',
'multiple' => false
))*/
;
}
今のところ、ネストされたフォームまたはドロップダウン リストを配置できます。私が両方を持っていることを除いて。
エンティティの「ページ」に「一時的な」変数(永続化しない変数)を追加し、入力した変数を変数の画像に入れることを考えました。しかし、私は私がどのように取るつもりなのかわかりません。私はそれに取り組んでいます。
誰かが私を助けてくれることを願っています。下手な英語で申し訳ありません。