Я использую пакет Sonata Admin и в основном, когда пользователь загружает изображение для карусели (у меня есть виджет загрузки), я хочу, чтобы столбец «имя файла» моей таблицы автоматически заполнялся именем файла с именами. Так что, если это «image_001.jpg», я хочу, чтобы в столбце имени файла автоматически говорилось «image_001.jpg» после загрузки файла. Как бы я пошел для достижения этого?
Также, если у вас есть какие-либо советы о том, что я могу сделать лучше, это было бы здорово! Я чувствую, что в моей таблице также должен быть столбец URL, но я не уверен, так как изображения для карусели всегда будут загружаться по пути, указанному в коде ниже.
Вот мой файл YAML:
Example\CmsBundle\Entity\Carousel:
type: entity
table: carousel
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
filename:
type: string
length: 100
updated:
type: datetime
nullable: true
lifecycleCallbacks:
prePersist: [ lifecycleFileUpload ]
preUpdate: [ lifecycleFileUpload ]
Мой файл сущности:
/**
* Carousel
*/
class Carousel
{
const SERVER_PATH_TO_IMAGE_FOLDER = 'bundles/examplecompany/images/carousel';
/**
* @var integer
*/
private $id;
/**
* @var stringß
*/
private $filename;
/**
* @var \DateTime
*/
private $updated;
/**
* Unmapped property to handle file uploads
*/
private $file;
/**
* Sets file.
*
* @param UploadedFile $file
*/
public function setFile(UploadedFile $file = null)
{
$this->file = $file;
}
/**
* Get file.
*
* @return UploadedFile
*/
public function getFile()
{
return $this->file;
}
/**
* Manages the copying of the file to the relevant place on the server
*/
public function upload()
{
// the file property can be empty if the field is not required
if (null === $this->getFile()) {
return;
}
// we use the original file name here but you should
// sanitize it at least to avoid any security issues
// move takes the target directory and target filename as params
$this->getFile()->move(
Carousel::SERVER_PATH_TO_IMAGE_FOLDER,
$this->getFile()->getClientOriginalName()
);
// set the path property to the filename where you've saved the file
$this->filename = $this->getFile()->getClientOriginalName();
// clean up the file property as you won't need it anymore
$this->setFile(null);
}
/**
* Lifecycle callback to upload the file to the server
*/
public function lifecycleFileUpload() {
$this->upload();
}
/**
* Updates the hash value to force the preUpdate and postUpdate events to fire
*/
public function refreshUpdated() {
$this->setUpdated(new \DateTime("now"));
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set filename
*
* @param string $filename
* @return Carousel
*/
public function setFilename($filename)
{
$this->filename = $filename;
return $this;
}
/**
* Get filename
*
* @return string
*/
public function getFilename()
{
return $this->filename;
}
/**
* Set updated
*
* @param \DateTime $updated
* @return Carousel
*/
public function setUpdated($updated)
{
$this->updated = $updated;
return $this;
}
/**
* Get updated
*
* @return \DateTime
*/
public function getUpdated()
{
return $this->updated;
}
/**
* @ORM\PrePersist
*/
/*public function lifecycleFileUpload()
{
// Add your code here
}*/
}
РЕДАКТИРОВАТЬ:
Код администратора карусели:
class CarouselAdmin extends Admin
{
// setup the default sort column and order
protected $datagridValues = array(
'_sort_order' => 'ASC',
'_sort_by' => 'updated_at'
);
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('file', 'file', array('required' => false))
->add('filename')
->add('text_block')
;
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('filename')
->add('updated_at')
;
}
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->add('')
->addIdentifier('filename')
->add('text_block')
->add('updated_at')
// add custom action links
->add('_action', 'actions', array(
'actions' => array(
'edit' => array(),
'delete' => array(),
)
))
;
}
protected function configureRoutes(RouteCollection $collection)
{
// remove the "Add New" button
//$collection->remove('create');
}
public function prePersist($image) {
$this->manageFileUpload($image);
}
public function preUpdate($image) {
$this->manageFileUpload($image);
}
private function manageFileUpload($image) {
if ($image->getFile()) {
$image->refreshUpdated();
}
}
}
Задача ещё не решена.
Других решений пока нет …