Я хочу загрузить pdf-файл из пользовательского компонента из бэкэнд в режиме редактирования. состояние находится сейчас, 1.- либо файл загружен правильно, но имя файла не записано в базе данных, 2.- или имя файла записано в базе данных, но файл PDF не рассматривается JFactory :: getApplication() -> вход;Joomla 3.3 MVC файл/pdf-загрузка в пользовательском компоненте backend
Я узнал, что имеет с enctype = "multipart/form-data". В случае ввода 1.- enctype = "multipart/form-data" и загружается pdf в случае 2.- имя файла pdf записывается в базу данных. Что делать? Мне нужны оба, конечно.
Вот так код, это небольшой компонент com_job с структурой MVC под Joomla! 3,3:
здесь только часть файла администратор/компоненты/com_job/просмотров/TMPL/edit.php с ENCTYPE = "многочастного/форма-данные"
<form method="post" action="<?php echo JRoute::_('index.php?option=com_job&layout=edit&id='.(int) $this->item->id); ?>" id="adminForm" name="adminForm" enctype="multipart/form-data">
<fieldset class="adminform">
<legend><?php echo JText::_('Details'); ?></legend>
<div class="control-group">
<div class="control-label">
<?php echo $this->form->getLabel('title'); ?>
</div>
<div class="controls">
<?php echo $this->form->getInput('title'); ?>
</div>
</div>
....
<div class="control-group">
<div class="control-label">
<?php echo $this->form->getLabel('upload_pdf'); ?>
</div>
<div class="controls">
<?php echo $this->form->getInput('upload_pdf'); ?>
</div>
</div>
........
здесь часть файла XML администратор/компоненты/com_job/модели/формы/job.xml
<?xml version="1.0" encoding="utf-8"?>
...
<field
id="title"
name="title"
type="text"
required="true"
label="Title"
description="title_Desc"
class="inputbox"
size="40"/>
<field
id="upload_pdf"
name="upload_pdf"
type="file"
required="false"
label="Upload_pdf"
description="upload_pdf_Desc"
class="inputbox"
size="40"
accept="application/pdf"/>
.....
здесь администратор контроллера/компоненты/com_job/Контроллеры/job.php
jimport('joomla.application.component.controlleradmin');
jimport('joomla.application.component.controllerform');
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
class JobControllerJob extends JControllerForm
{
public function save()
{
$jinput = JFactory::getApplication()->input;
$files = $jinput->files->get('jform', null);
$files['upload_pdf']['name'] = JFile::makeSafe($files['upload_pdf']['name']);
if (!empty($files['upload_pdf']['name'])) {
$pdf_path = JPATH_ROOT . '/images/upload_pdf';
if (!JFolder::exists($pdf_path)) {
$status = JFolder::create($pdf_path);
if (!$status) {
JError::raiseWarning(100, JText::_('could not create directory pdf'), '');
}
}
$file_path = JPath::clean($pdf_path . '/' . strtolower($files['upload_pdf']['name']));
$status = JFile::upload($files['upload_pdf']['tmp_name'], $file_path);
if (!$status) {
JError::raiseWarning(100, JText::_('could not copy pdf'), '');
}
}
return parent::save();
}
}
где ошибка? Я попытался поместить enctype = "multipart/form-data" в форму в файле job.xml (models), но это не сработало.
Я нашел решение по времени, в функции сохранения в контроллере, добавить этот код:
//$jform = $jinput->get(jform, null);
$pdf_filename = JFile::makeSafe($files['upload_pdf']['name']);
$jform = $_POST['jform'];
$tmp_pdf_filename = array('upload_pdf' => $pdf_filename);
$merged_jform = array_merge($jform,$tmp_pdf_filename);
$jinput->post->set('jform',$merged_jform);
первая линия с $ jinput не работал. Я пробовал много способов с помощью $ jinput, но ничего не получилось. Поэтому, наконец, я использовал напрямую $ _POST. Конечно, это не правильный путь, но, по крайней мере, он работает.
здесь полная функция сохранения:
public function save()
{
$jinput = JFactory::getApplication()->input;
$files = $jinput->files->get('jform', null);
$pdf_filename = JFile::makeSafe($files['upload_pdf']['name']);
if (!empty($pdf_filename)) {
$pdf_path = JPATH_ROOT . '/images/upload_pdf';
if (!JFolder::exists($pdf_path)) {
$status = JFolder::create($pdf_path);
if (!$status) {
JError::raiseWarning(100, JText::_('could not create directory pdf'), '');
}
}
$file_path = JPath::clean($pdf_path . '/' . strtolower($files['upload_pdf']['name']));
$status = JFile::upload($files['upload_pdf']['tmp_name'], $file_path);
if ($status) {
//$jform = $jinput->get(jform, null);
$jform = $_POST['jform'];
$tmp_pdf_filename = array('upload_pdf' => $pdf_filename);
$merged_jform = array_merge($jform,$tmp_pdf_filename);
$jinput->post->set('jform',$merged_jform);
} else {
JError::raiseWarning(100, JText::_('could not copy pdf'), '');
}
}
return parent::save();
}
Это должно сделать трюк. Затем в массиве $ file хранятся следующие ключи: ошибка имя размер tmp_name тип – user4592263