У меня есть модуль администратора, в котором есть файл ввода, куда я хотел бы загрузить файл.
Я хочу загрузить файл в базу данных в виде большого двоичного объекта, поскольку это то, чем я ограничен. Я знаю, что это плохая практика, но я не могу добавлять файлы в файловую систему.
У меня есть следующая схема:
press_photo:
id: ~
blob_data_id: { type: INTEGER, required: true, foreignTable: blob_data, foreignReference: id, onDelete: cascade }
name: { type: VARCHAR, size: '100', required: true }
created_at: ~
updated_at: ~
blob_data:
id: ~
blob_data: { type: BLOB, required: true }
created_at: ~
updated_at: ~
Пока что я создал все виджеты и схемы в BlobForm.class.php, а затем попытался встроить эту форму в мой PressPhotoForm.class.php
$this->embedForm('blob_data', new BlobDataForm());
Теперь, когда я выбираю файл и загружаю его, он, кажется, добавляется в таблицу blob_data, но в таблице press_photo, blob_data_id пуст, и на виджете ввода нет флажка, чтобы сказать, что изображение есть.
Может ли кто-нибудь пролить свет на то, как я могу загрузить blob_data_id в таблицу press_photo при загрузке?
Спасибо
EDIT:
Вот мои формы:
class BlobDataForm extends BaseBlobDataForm
{
public function configure()
{
parent::configure();
$this->widgetSchema ['blob_data'] = new sfWidgetFormInputFileEditable ( array (
'label' => '',
'file_src' => $this->getObject()->getBlobData(),
'edit_mode' => ! $this->isNew () && $this->getObject()->getBlobData(),
'template' => '<div>%file%<br />%input%<br />%delete% %delete_label%</div>'
));
$this->setWidget('blob_data_type_id', new sfWidgetFormPropelChoice(array('model' => 'BlobDataType')));
//$this->widgetSchema['blob_data_id'] = new sfWidgetFormInputHidden();
$this->validatorSchema['blob_data'] = new sfValidatorPass();
$this->validatorSchema ['blob_data'] = new fdValidatorImageToDB(array(
'required'=>false
));
$this->validatorSchema['blob_data']->setOption('mime_types', array('image/jpg','image/jpeg','application/pdf','application/msword'));
$this->widgetSchema->setNameFormat('article_files[%s]');
$this->widgetSchema->setLabels(array(
'blob_data_type_id'=>'File Type',
'blob_data'=>'File'
));
$this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
unset(
$this['file_extension'],
//unsetting to hide the drop down select-list
//$this['blob_data_type_id'],
$this['image_width'],
$this['image_height'],
$this['filesize'],
$this['created_at'],
$this['updated_at']
);
}
класс PressPhotoForm расширяет BasePressPhotoForm
{
public function configure()
{
// Execute the configure of the parent
parent::configure();
// Configure
$this->configureWidgets();
$this->configureValidators();
//$this->embedForm('blob_data', new BlobDataForm());
unset($this['blob_data_id'],$this['created_at'], $this['url'], $this['updated_at'], $this['image_size']);
}
protected function configureWidgets()
{
$this->widgetSchema['description'] = new sfWidgetFormTextareaTinyMCE(array(
'width' => 550,
'height' => 350,
'config' => 'theme_advanced_disable: "anchor,image,cleanup,help"',
));
$subForm = new sfForm();
for ($i = 0; $i < 1; $i++)
{
$blobData = new BlobData();
$blobData->BlobData = $this->getObject();
$form = new BlobDataForm($blobData);
$pressPhoto = new PressPhoto();
$subForm->embedForm($i, $form);
$this->getObject()->setBlobDataId($blobData->getId());
}
$this->embedForm('blob_data', $subForm);
$this->widgetSchema->setLabels(array(
'blob_data'=>'File'
));
}
protected function configureValidators()
{
$this->validatorSchema['name']->setOption('required', true);
$this->validatorSchema['name']->setMessage('required', 'You must provide a name');
$this->validatorSchema['press_photo_category_id']->setOption('required', true);
$this->validatorSchema['press_photo_category_id']->setMessage('required', 'You must select a category');
}
public function saveEmbeddedForm($con = null, $forms = null)
{
$dataForms = $this->getEmbeddedForm('blob_data')->getEmbeddedForms();
foreach ($dataForms as $dataForm)
$dataForm->getObject()->setBlobDataId($this->getObject()->getId());
parent::saveEmbeddedForm($con, $forms);
}
}
Спасибо