Jump to content
  • 0

Как сделать "прикрепить файл" (file attachment) в форму ОС стандартного контакта?


im0not
 Share

Question

Привет! :D

Собственно, я добавила само поле - но не могу заставить его работать - т.е. письмо приходит без прикрепленного файла.

Я догадываюсь, что нужно ковырять contact.php, но в PHP я ноль, поэтому если можно максимально подробно :)

Link to comment
Share on other sites

19 answers to this question

Recommended Posts

  • 0

Ойойой! Я забыла написать что речь идет о Joomla.. У меня не получается именно туда вставить правильный код, чтоб письмо отправлялось :o

Там как-то все взаимосвязано и используются свои, джумловские переменные, классы и методы.

К тому же, сам путь к файлу - может быть любой - и с рабочего стола и с какой-нибудь папки..

Я могу выложить код, если нужно!

Насколько я вижу проблему:

В ситуацию $mail->addAttachment($attachmentos); в $attachmentos нужно прописать полный путь к загружаемому с ПК файлу, я в текущей ситуации у меня от ипута передается только название файла, например vasia.jpg.

Но возможно проблема глубже..(

Edited by im0not
Link to comment
Share on other sites

  • 0

Да, но здесь я не понимаю именно вот этот момент: $mail->addAttachment(JPATH_BASE.DS.'tmp'.DS.'document.pdf');

Ведь JPATH_BASE указывает в корень приложения - тогда как файл грузится с любого места компа клиента.

А второе - "document.pdf" - это какое-то конкретное имя и расширение.. а ведь у меня имя и расширение должно быть любое..

Link to comment
Share on other sites

  • 0

ну можно попробовать что-то вроде:


<form enctype="multipart/form-data" action="...">
<input type="file" name="file_name">
if(!empty($_FILES['file_name']['tmp_name'])) {
$attachmentos = $_FILES['file_name']['name'];
}
$mail->addAttachment($attachmentos);
</form>

но скорее всего этим не обойтись...

Link to comment
Share on other sites

  • 0

теги form и input я привел лишь для примера, что бы было понятно например откуда взялось: $_FILES['file_name']['tmp_name']

а код вы же сами привели, значит взяли его откуда-то?


if(!empty($_FILES['file_name']['tmp_name'])) {
$attachmentos = $_FILES['file_name']['name'];
}
$mail->addAttachment($attachmentos);

Link to comment
Share on other sites

  • 0

Вот это то как раз и непонятно, потому что в джумле три файла в который можно это вставить.. :)

Вот что у меня в contact.xml


<field name="fileattachment"
type="file"
size="40"
id="fileattachment"
enctype="multipart/form-data"
description="COM_CONTACT_CONTACT_FILEATTACH_DESC"
label="COM_CONTACT_CONTACT_FILEATTACH_LABEL"
default="0"
/>

Вот что в default_form.php


<dt id="fileattach"><?php echo $this->form->getLabel('fileattachment'); ?></dt>
<dd id="fileattach"><?php echo $this->form->getInput('fileattachment'); ?></dd>

Вот что в contact.php


// Get the data from POST
$data = JRequest::getVar('jform', array(), 'post', 'array');
....
$name = $data['contact_name'];
$surname = $data['contact_surname'];
$email = $data['contact_email'];
$phone = $data['contact_phone'];
$positi = $data['contact_positis'];
$subject = $data['contact_subject'];
$body = $data['contact_message'];
$attachmentos = $data['fileattachment'];
...
$mail = JFactory::getMailer();
$mail->addRecipient($contact->email_to);
$mail->addReplyTo(array($email, $name));
$mail->setSender(array($mailfrom, $fromname));
$mail->setSubject($sitename.': '.$subject);
$mail->setBody($body);
$mail->addAttachment($attachmentos);
$sent = $mail->Send();

Добавлю что я шлю файл с локального сервера, если это имеет вообще значение..

Edited by im0not
Link to comment
Share on other sites

  • 0

если contact.php - это обработчик формы, то вставьте где-нибудь вверху распечатку массива $_FILES:


echo '<pre>'; print_r($_FILES); echo '</pre>';

и посмотрите что выводит, или как вариант можно еще распечатать массив $data и посмотреть, есть ли у него вообще ключ: fileattachment и есть ли у этого ключа какое-нибудь значение.

Link to comment
Share on other sites

  • 0

Не получается загнать под спойлер, сорри..

Массив $data я пробовала распечатать, правда по дурацки - через $prefix = JText::sprintf там внизу - получила Array, но то о чем вы говорите, я вообще не представляю себе куда пихать(

Вот где можно вставить ?


<?php
/**
* @package Joomla.Site
* @subpackage Contact
* @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/

defined('_JEXEC') or die;
jimport('joomla.application.component.controllerform');
class ContactControllerContact extends JControllerForm
{
public function getModel($name = '', $prefix = '', $config = array('ignore_request' => true))
{
return parent::getModel($name, $prefix, array('ignore_request' => false));
}
public function submit()
{
// Check for request forgeries.
JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
// Initialise variables.
$app = JFactory::getApplication();
$model = $this->getModel('contact');
$params = JComponentHelper::getParams('com_contact');
$stub = JRequest::getString('id');
$id = (int)$stub;
// Get the data from POST
$data = JRequest::getVar('jform', array(), 'post', 'array');

$contact = $model->getItem($id);

$params->merge($contact->params);
// Check for a valid session cookie
if($params->get('validate_session', 0)) {
if(JFactory::getSession()->getState() != 'active'){
JError::raiseWarning(403, JText::_('COM_CONTACT_SESSION_INVALID'));
// Save the data in the session.
$app->setUserState('com_contact.contact.data', $data);
// Redirect back to the contact form.
$this->setRedirect(JRoute::_('index.php?option=com_contact&view=contact&id='.$stub, false));
return false;
}
}
// Contact plugins
JPluginHelper::importPlugin('contact');
$dispatcher = JDispatcher::getInstance();
// Validate the posted data.
$form = $model->getForm();
if (!$form) {
JError::raiseError(500, $model->getError());
return false;
}
$validate = $model->validate($form, $data);
if ($validate === false) {
// Get the validation messages.
$errors = $model->getErrors();
// Push up to three validation messages out to the user.
for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) {
if ($errors[$i] instanceof Exception) {
$app->enqueueMessage($errors[$i]->getMessage(), 'warning');
} else {
$app->enqueueMessage($errors[$i], 'warning');
}
}
// Save the data in the session.
$app->setUserState('com_contact.contact.data', $data);
// Redirect back to the contact form.
$this->setRedirect(JRoute::_('index.php?option=com_contact&view=contact&id='.$stub, false));
return false;
}
// Validation succeeded, continue with custom handlers
$results = $dispatcher->trigger('onValidateContact', array(&$contact, &$data));
foreach ($results as $result) {
if ($result instanceof Exception) {
return false;
}
}
// Passed Validation: Process the contact plugins to integrate with other applications
$results = $dispatcher->trigger('onsubmitContact', array(&$contact, &$data));
// Send the email
$sent = false;
if (!$params->get('custom_reply')) {
$sent = $this->_sendEmail($data, $contact);
}
// Set the success message if it was a success
if (!($sent instanceof Exception)) {
$msg = JText::_('COM_CONTACT_EMAIL_THANKS');
} else {
$msg = 'Упс!' ;
}
// Flush the data from the session
$app->setUserState('com_contact.contact.data', null);
// Redirect if it is set in the parameters, otherwise redirect back to where we came from
if ($contact->params->get('redirect')) {
$this->setRedirect($contact->params->get('redirect'), $msg);
} else {
$this->setRedirect(JRoute::_('index.php?option=com_contact&view=contact&id='.$stub, false), $msg);
}
return true;
}
private function _sendEmail($data, $contact)
{
$app = JFactory::getApplication();
$params = JComponentHelper::getParams('com_contact');
if ($contact->email_to == '' && $contact->user_id != 0) {
$contact_user = JUser::getInstance($contact->user_id);
$contact->email_to = $contact_user->get('email');
}
$mailfrom = $app->getCfg('mailfrom');
$fromname = $app->getCfg('fromname');
$sitename = $app->getCfg('sitename');
$copytext = JText::sprintf('COM_CONTACT_COPYTEXT_OF', $contact->name, $sitename);
/*****/
$name = $data['contact_name'];
$surname = $data['contact_surname'];
$email = $data['contact_email'];
$phone = $data['contact_phone'];
$positi = $data['contact_positis'];
$subject = $data['contact_subject'];
$body = $data['contact_message'];
$attachmentos = $data['fileattachment'];
// Prepare email body
$prefix = JText::sprintf('COM_CONTACT_ENQUIRY_TEXT', JURI::base());
$body = $prefix."\n".$name.' <'.$email.'>'."\r\n\r\n"
.'Фамилия: '.$surname."\r\n\r\n"
.'Телефон: '.$phone."\r\n\r\n"
.'Должность, Организация: '.$positi."\r\n\r\n"
.'Attach: '.$data."\r\n\r\n"
.stripslashes($body);

/* $body = $prefix."\n".$name.' ('.$email.','.$surname.','.$phone.','.$positis.','.$organ.')'."\r\n\r\n".stripslashes($body);*/

$mail = JFactory::getMailer();
$mail->addRecipient($contact->email_to);
$mail->addReplyTo(array($email, $name));
$mail->setSender(array($mailfrom, $fromname));
$mail->setSubject($sitename.': '.$subject);
$mail->setBody($body);
$mail->addAttachment($attachmentos);
$sent = $mail->Send();
//If we are supposed to copy the sender, do so.
/*
// check whether email copy function activated
if ( array_key_exists('contact_email_copy', $data) ) {
$copytext = JText::sprintf('COM_CONTACT_COPYTEXT_OF', $contact->name, $sitename);
$copytext .= "\r\n\r\n".$body;
$copysubject = JText::sprintf('COM_CONTACT_COPYSUBJECT_OF', $subject);
$mail = JFactory::getMailer();
$mail->addRecipient($email);
$mail->addReplyTo(array($email, $name));
$mail->setSender(array($mailfrom, $fromname));
$mail->setSubject($copysubject);
$mail->setBody($copytext);
$sent = $mail->Send();
}
*/
return $sent;
}
}

Edited by im0not
Link to comment
Share on other sites

  • 0

ооп знаю плоховато, да и не ясно что именно является обработчиком и где вызывается данный класс, но можете попробовать так:


$obj = new ContactControllerContact();
echo '<pre>'; print_r($obj->_sendEmail($data)); echo '</pre>';

это в конце, после самой последней фигурной скобки.

Link to comment
Share on other sites

  • 0

Ну я вроде как бы уже давно поставила на печать во здесь:


// Prepare email body
$prefix = JText::sprintf('COM_CONTACT_ENQUIRY_TEXT', JURI::base());
$body = $prefix."\n".$name.' <'.$email.'>'."\r\n\r\n"
.'Фамилия: '.$surname."\r\n\r\n"
.'Телефон: '.$phone."\r\n\r\n"
.'Должность, Организация: '.$positi."\r\n\r\n"
.'Attach: '.$data."\r\n\r\n"
.stripslashes($body);

Видите в конце строчка

.'Attach: '.$data."\r\n\r\n"

И мне на почту приходит сообщение:

...

Attach: Array

...

Link to comment
Share on other sites

  • 0

Ну я вроде как бы уже давно поставила на печать во здесь:


// Prepare email body
$prefix = JText::sprintf('COM_CONTACT_ENQUIRY_TEXT', JURI::base());
$body = $prefix."\n".$name.' <'.$email.'>'."\r\n\r\n"
.'Фамилия: '.$surname."\r\n\r\n"
.'Телефон: '.$phone."\r\n\r\n"
.'Должность, Организация: '.$positi."\r\n\r\n"
.'Attach: '.$data."\r\n\r\n"
.stripslashes($body);

Видите в конце строчка

.'Attach: '.$data."\r\n\r\n"

И мне на почту приходит сообщение:

...

Attach: Array

...

ну так и сделайте вот так:


.'Attach: <pre>'.print_r($data)."</pre>\r\n\r\n"

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By infonikki
      Не отправляется мэил, все поля работают, во время отправки пишет "Отправка сообщения....." и виснет, мэил так и не доходит. Где проблема ?
      —————————————————--HTML:<h4> Форма: </h4></div><div class="toggle-content"><form method="post" id="contactForm" action="mailto:info@kingsize-trading.com"><input type="text" name="senderName" id="senderName" placeholder="Имя" class="requiredField" /><input type="text" name="senderEmail" id="senderEmail" placeholder="Email адрес" class="requiredField email" /><textarea name="message" id="message" placeholder="Сообщение" class="requiredField" rows="8"></textarea><input type="submit" id="sendMessage" name="sendMessage" value="Отправить" /><span>  </span></form> //———————————————--custom.js // Ajax Contactif ($("#contactForm")[0]) {$('#contactForm').submit(function () {$('#contactForm .error').remove();$('#contactForm .requiredField').removeClass('fielderror');$('#contactForm .requiredField').addClass('fieldtrue');$('#contactForm span strong').remove();var hasError = false;$('#contactForm .requiredField').each(function () {if (jQuery.trim($(this).val()) === '') {var labelText = $(this).prev('label').text();$(this).addClass('fielderror');$('#contactForm span').html('<strong>*Пожалуйста заполните все поля.</strong>');hasError = true;} else if ($(this).hasClass('email')) {var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;if (!emailReg.test(jQuery.trim($(this).val()))) {var labelText = $(this).prev('label').text();$(this).addClass('fielderror');$('#contactForm span').html('<strong>Не правильный mail адрес</strong>');hasError = true;}}});if (!hasError) {$('#contactForm').slideDown('normal', function () {$("#contactForm #sendMessage").addClass('load-color');$("#contactForm #sendMessage").attr("disabled", "disabled").addClass("btn-success").val('Отправка сообщения...');});var formInput = $(this).serialize();$.post($(this).attr('action'), formInput, function (data) {$('#contactForm').slideUp("normal", function () {$(this).before('<div class="notification-box notification-box-success"><p><i class="fa-check"></i>Спасибо!</strong> Сообщение успешно отправлено.</p></div>');});});}return false;});}
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy