Получать значение поля по его классу - это неправильный подход.
Да что вы говорите?

Связываем
QuickForm 2 + AcyMailing. Если у вас
много разных форм, и в них есть емейлы, то иногда хочется добавить их в рассылочную базу AcyMailing. От нас требуется передать в базу всего 2 значения: емейл и то, что будет именем подписчика в AcyMailing.
Всего 3 простых шага:
1) В файл \administrator\components\com_quickform\config.xml добавляем код:
<fieldset
name="AcyMailing"
label="AcyMailing"
description="Add a username and e-mail address to the AcyMailing database"
>
<field name="useradd" type="list" label="Add user On/Off" description="" default="0">
<option value="1">On</option>
<option value="0">Off</option>
</field>
<field type="spacer" class="" label="Username and e-mail address class of the QuickForm field:"/>
<field name="usermailclass" type="text" class="cartfilds" default="usermail" label="User e-mail class" description=""/>
<field name="usernameclass" type="text" class="cartfilds" default="username" label="User name class" description=""/>
<field type="spacer" class="" label="Assign name for all new users (if needed):"/>
<field name="userngroupname" type="text" class="cartfilds" default="Quick Form subscriber" label="Name for all new users" description=""/>
<field name="usernnameren" type="list" label="Rename always or only when username is not found in form" description="" default="1">
<option value="1">Rename only when username not found</option>
<option value="0">Rename username always</option>
</field>
<field type="spacer" class="" label="AcyMailing lists ID you want the user to be subscribed (0 - not subscribed):"/>
<field name="userlistid" type="text" class="cartfilds" default="0" label="Newsletter ID" description=""/>
</fieldset>
2) В файле components\com_quickform\classes\buildletters.php ищем функцию public function getMainForm($projectid), и перед return вставляем код, т.е. конец функции д.б. такой:
// AcyMailing
require_once JPATH_COMPONENT.'/classes/qfacymailing.php';
$addAcyMailing = qfAcyMailing($data);
return $data;
3) В папке components\com_quickform\classes\ создаем файлик qfacymailing.php следующего содержания:
<?php
/**
* @license GNU/GPL
*/
defined('_JEXEC') or die();
function qfAcyMailing($data) {
// Get config parameters
$qf_params = JComponentHelper::getParams('com_quickform');
$userAdd = $qf_params->get('useradd');
if ($userAdd == 0) {
//echo "Выключено! <br/>";
//die;
return false;
}
$userMailClass = $qf_params->get('usermailclass');
$userNameClass = $qf_params->get('usernameclass');
$userListId = $qf_params->get('userlistid');
$userGroupName = $qf_params->get('userngroupname');
$userNameRename = $qf_params->get('usernnameren');
$userDate = round(gettimeofday(true));
$userMail ="";
$userName="";
$db = JFactory::getDbo();
// Search user name and email
foreach ($data as $field) {
if ($field->class == $userMailClass) {
$userMail = $field->value;
//echo "userMail: ". $userMail. "<br/>";
break;
}
}
foreach ($data as $field) {
if ($field->class == $userNameClass) {
$userName = $field->value;
//echo "userName: ". $userName. "<br/>";
break;
}
}
If ($userMail == "") {
//echo "Email not found!". "<br/>";
return false;
}
if (($userNameRename == 1) or (empty($userName))) {
$userName = $userGroupName;
}
//echo "userMail: ". $userMail. "<br/>";
//echo "userName: ". $userName. "<br/>";
//die;
// Проверяем, есть ли mail в базе AcyMailing
$userSeek = qfAcyMailingBase($db,$userMail);
// Если email в базе AcyMailing отсутствует, добавляем нового подписчика
if (empty($userSeek)) {
if(!include_once(rtrim(JPATH_ADMINISTRATOR,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php')){
echo 'This code can not work without the AcyMailing Component';
return false;
}
$myUser = new stdClass();
$myUser->email = $userMail;
$myUser->name = $userName; //this information is optional
//die;
//If you require a confirmation but don't want the user to have to confirm his subscription via the API, you can set the confirmed field to 1:
//$myUser->confirmed = 1;
//You can add as many extra fields as you want if you already created them in AcyMailing
//$myUser->country = 'france';
//$myUser->phone = '064872754';
//...
$subscriberClass = acymailing_get('class.subscriber');
$subid = $subscriberClass->save($myUser); //this function will return you the ID of the user inserted in the AcyMailing table
//die;
// Получаем данные о новом подписчике
$userSeek = qfAcyMailingBase($db,$userMail);
if (!empty($userSeek ) and $userListId > 0) {
$userID = "'".$userSeek[0]."'";
$userStatus = "1";
// Подписываем на рассылку
$querydata = "'". $userListId. "', ". $userID. ", '". $userDate. "', '". $userStatus."'";
$query = "INSERT INTO #__acymailing_listsub (listid,subid,subdate,status) VALUES (". $querydata. ")";
$db->setQuery($query);
$db->execute();
} else {
// echo "Без подписки";
}
} else {
//echo "User already exist!";
return false;
}
}
function qfAcyMailingBase($db,$userMail) {
$query = $db->getQuery(true);
$query->select('*');
$query->from($db->quoteName('#__acymailing_subscriber'));
$query->where($db->quoteName('email'). " = ". "'".$userMail."'");
$db->setQuery($query);
$newuser = $db->loadRow();
return $newuser;
}
?>
Как все работает:
1) Идем в Настройки QuickForm 2 и включаем передачу данных в AcyMailing - если оно вам нужно.
2) Там же вписываем ту ID рассылки из AcyMailing, на которую будем подписывать все добавленные в базу емейлы.
3) Далее смотрим и запоминаем (или вводим свои названия), как обозваны классы, которыми мы будем
маркировать нужные поля в проектах QuickForm
4) Сохранямся, закрываем Настройки и переходим к проектам QuickForm 2.
5) Находим нужный проект, переходим к
полям и в параметрах нужного поля, например "Ваш емейл:" в параметре "class" вписываем одно из двух значений, в данном случае это "usermail", а например в поле "Ваше имя" - вписываем класс "username". Таким образом метим все нужные поля с именем юзера и его емейлом во всех формах, откуда мы хотим вытягивать подписчиков.