Закрыть Авторизация

     

Отправка файлов через форму обратной связи Joomla

прикрепить файл в форме обратной связи 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/.... корня вашего хостинга.

Пожалуйста, обратите внимание, что хотя этот код был предложен Вам с учетом безопасности вашего сайта, можно сделать гораздо больше, чтобы предотвратить загрузку "неправильного" контента.