Отправка файлов через форму обратной связи Joomla
Дорогие друзья! Очень часто у пользователей возникает вопрос, как добавить возможность прикладывать файлы или картинки к форме обратной связи Joomla. Именно поэтому мы хотели бы поделиться нашим кодом с вами.
Данное решение актуально для стандартной формы связи Joomla 3 и 2.5
Создание поля загрузки в файл вашего шаблона \templates\НАЗВАНИЕ ШАБЛОНА\html\com_contact\contact\default_form.php
Данная форма должна выглядеть следующим образом:
<?php
/**
* @package Joomla.Site
* @subpackage com_contact
*
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
JHtml::_('behavior.keepalive');
JHtml::_('behavior.formvalidation');
if (isset($this->error)) : ?>
<div class="contact-error">
<?php echo $this->error; ?>
</div>
<?php endif; ?>
<div class="contact-form">
<form id="contact-form" action="<?php echo JRoute::_('index.php'); ?>" method="post" class="form-validate form-horizontal" enctype="multipart/form-data">
<fieldset>
<legend><?php echo JText::_('COM_CONTACT_FORM_LABEL'); ?></legend>
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel('contact_name'); ?></div>
<div class="controls"><?php echo $this->form->getInput('contact_name'); ?></div>
</div>
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel('contact_email'); ?></div>
<div class="controls"><?php echo $this->form->getInput('contact_email'); ?></div>
</div>
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel('contact_subject'); ?></div>
<div class="controls"><?php echo $this->form->getInput('contact_subject'); ?></div>
</div>
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel('contact_message'); ?></div>
<div class="controls"><?php echo $this->form->getInput('contact_message'); ?></div>
</div>
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel('front_side_image'); ?></div>
<div class="controls"><?php echo $this->form->getInput('front_side_image'); ?></div>
</div>
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel('back_side_image'); ?></div>
<div class="controls"><?php echo $this->form->getInput('back_side_image'); ?></div>
</div>
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel('logo_image'); ?></div>
<div class="controls"><?php echo $this->form->getInput('logo_image'); ?></div>
</div>
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel('qr_image'); ?></div>
<div class="controls"><?php echo $this->form->getInput('qr_image'); ?></div>
</div>
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel('vcard_file');; ?></div>
<div class="controls"><?php echo $this->form->getInput('vcard_file'); ?></div>
</div>
<?
if ($this->params->get('show_email_copy')) { ?>
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel('contact_email_copy'); ?></div>
<div class="controls"><?php echo $this->form->getInput('contact_email_copy'); ?></div>
</div>
<?php } ?>
<?php //Dynamically load any additional fields from plugins. ?>
<?php foreach ($this->form->getFieldsets() as $fieldset) : ?>
<?php if ($fieldset->name != 'contact'):?>
<?php $fields = $this->form->getFieldset($fieldset->name);?>
<?php foreach ($fields as $field) : ?>
<div class="control-group">
<?php if ($field->hidden) : ?>
<div class="controls">
<?php echo $field->input;?>
</div>
<?php else:?>
<div class="control-label">
<?php echo $field->label; ?>
<?php if (!$field->required && $field->type != "Spacer") : ?>
<span class="optional"><?php echo JText::_('COM_CONTACT_OPTIONAL');?></span>
<?php endif; ?>
</div>
<div class="controls"><?php echo $field->input;?></div>
<?php endif;?>
</div>
<?php endforeach;?>
<?php endif ?>
<?php endforeach;?>
<div class="form-actions"><button class="btn btn-primary validate" type="submit"><?php echo JText::_('COM_CONTACT_CONTACT_SEND'); ?></button>
<input type="hidden" name="option" value="com_contact" />
<input type="hidden" name="task" value="contact.submit" />
<input type="hidden" name="return" value="<?php echo $this->return_page;?>" />
<input type="hidden" name="id" value="<?php echo $this->contact->slug; ?>" />
<?php echo JHtml::_('form.token'); ?>
</div>
</fieldset>
</form>
</div>
Для реализации функции прикрепления файлов нам необходимо создать плагин, который запускается из:
\components\com_contact\controllers\contact.php
public function submit()
и с помощью
$dispatcher->trigger('onValidateContact', array(&$contact, &$data));
или
$dispatcher->trigger('onSubmitContact', array(&$contact, &$data));
Создайте плагин на вашем сайте (или скачайте его внизу). Создайте файл attachment.php в следующей директории:
\plugins\contact\attachment\attachment.php
Он будет включать этот простой код и записывать загружаемые файлы в папку ВЫШЕ корневой папки Joomla, благодаря чему он не будет доступен через браузер.
<?php
/**
* @package attachement for contact form
* @copyright Copyright (c)2010-2013 RuposTel.com
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
*/
defined('_JEXEC') or die();
JLoader::import('joomla.plugin.plugin');
class plgContactAttachment extends JPlugin
{
public function onSubmitContact(&$contact, &$data)
{
jimport( 'joomla.filesystem.file' );
$email = str_replace('@','__at__', $data['contact_email']);
$dir = DIRECTORY_SEPARATOR.'upload'.DIRECTORY_SEPARATOR.JFile::makeSafe($email).DIRECTORY_SEPARATOR;
$data['images'] = array();
foreach ($_FILES['jform']['tmp_name'] as $key=>$file)
{
if (empty($_FILES['jform']['tmp_name'][$key])) continue;
$key = JFile::makeSafe($key);
JFolder::create($dir);
$ext = JFile::getExt($_FILES['jform']['name'][$key]);
$x = JFile::upload($_FILES['jform']['tmp_name'][$key], $dir.$key.'.'.$ext);
$data['images'][] = $dir.$key.'.'.$ext;
}
}
}
Эта простая функция будет записывать все файлы, которые будут загружены в форму. Вы можете напрямую скачать установочный плагин отправки файлов через контактную форму Joomla 2.5 и 3 отсюда.
Если вы хотите отправить файлы по электронной почте администратору, то вам придется изменить файл ядра системы Joomla. Для этого откройте
\components\com_contact\controllers\contact.php
Найдите код:
$sent = $mail->Send();
и добавьте эту строку выше:
$mail->addAttachment($data['images']);
$sent = $mail->Send();
Без данного хака для контактной формы, загрузочный плагин будет сохранять файлы с именами, введенными в полях формы в папку /upload/.... корня вашего хостинга.
Пожалуйста, обратите внимание, что хотя этот код был предложен Вам с учетом безопасности вашего сайта, можно сделать гораздо больше, чтобы предотвратить загрузку "неправильного" контента.