360 Zeilen
17 KiB
PHP
360 Zeilen
17 KiB
PHP
|
<?php
|
|||
|
|
|||
|
/**
|
|||
|
* Project:
|
|||
|
* Contenido Content Management System
|
|||
|
*
|
|||
|
* Description:
|
|||
|
* Frontend user editor
|
|||
|
*
|
|||
|
* Requirements:
|
|||
|
* @con_php_req 5.0
|
|||
|
*
|
|||
|
*
|
|||
|
* @package Contenido Backend includes
|
|||
|
* @version 1.0.0
|
|||
|
* @author Bj<EFBFBD>rn Behrens (HerrB)
|
|||
|
* @copyright four for business AG <www.4fb.de>
|
|||
|
* @license http://www.contenido.org/license/LIZENZ.txt
|
|||
|
* @link http://www.4fb.de
|
|||
|
* @link http://www.contenido.org
|
|||
|
* @since file available since contenido release <= 4.6
|
|||
|
*
|
|||
|
* {@internal
|
|||
|
* created 2007-01-01, Bj<EFBFBD>rn Behrens (HerrB)
|
|||
|
* modified 2008-06-27, Dominik Ziegler, add security fix
|
|||
|
*
|
|||
|
* $Id: include.recipients_import.php 128 2019-07-03 11:58:28Z oldperl $:
|
|||
|
* }}
|
|||
|
*
|
|||
|
*/
|
|||
|
if (!defined('CON_FRAMEWORK')) {
|
|||
|
die('Illegal call');
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
$oPage = new cPage;
|
|||
|
$oRecipients = new RecipientCollection;
|
|||
|
|
|||
|
if (is_array($cfg['plugins']['recipients'])) {
|
|||
|
foreach ($cfg['plugins']['recipients'] as $plugin) {
|
|||
|
plugin_include("recipients", $plugin . "/" . $plugin . ".php");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Check form data
|
|||
|
if ($_REQUEST["selDelimiter"] == "") {
|
|||
|
$_REQUEST["selDelimiter"] = "tab";
|
|||
|
}
|
|||
|
|
|||
|
$aFields = array();
|
|||
|
$aFieldDetails = array();
|
|||
|
$aFields["name"] = strtolower(i18n("Name", "cl_newsletter"));
|
|||
|
$aFieldDetails["name"]["fieldtype"] = "field"; // field, plugin or group
|
|||
|
$aFieldDetails["name"]["mandatory"] = false; // true or false
|
|||
|
$aFieldDetails["name"]["type"] = "string"; // string, boolean or date
|
|||
|
$aFieldDetails["name"]["link"] = false; // plugin name for plugins, recipient group id for groups
|
|||
|
$aFieldDetails["name"]["col"] = -1; // Stores column index where this field has been found
|
|||
|
$aFields["email"] = strtolower(i18n("Mail", "cl_newsletter"));
|
|||
|
$aFieldDetails["email"]["fieldtype"] = "field";
|
|||
|
$aFieldDetails["email"]["mandatory"] = true;
|
|||
|
$aFieldDetails["email"]["type"] = "string";
|
|||
|
$aFieldDetails["email"]["link"] = false;
|
|||
|
$aFieldDetails["email"]["col"] = -1;
|
|||
|
$aFields["deactivated"] = strtolower(i18n("Deactivated", "cl_newsletter"));
|
|||
|
$aFieldDetails["deactivated"]["fieldtype"] = "field";
|
|||
|
$aFieldDetails["deactivated"]["mandatory"] = false;
|
|||
|
$aFieldDetails["deactivated"]["type"] = "boolean";
|
|||
|
$aFieldDetails["deactivated"]["link"] = false;
|
|||
|
$aFieldDetails["deactivated"]["col"] = -1;
|
|||
|
$aFields["confirmed"] = strtolower(i18n("Confirmed", "cl_newsletter"));
|
|||
|
$aFieldDetails["confirmed"]["fieldtype"] = "field";
|
|||
|
$aFieldDetails["confirmed"]["mandatory"] = false;
|
|||
|
$aFieldDetails["confirmed"]["type"] = "boolean";
|
|||
|
$aFieldDetails["confirmed"]["link"] = false;
|
|||
|
$aFieldDetails["confirmed"]["col"] = -1;
|
|||
|
$aFields["confirmeddate"] = strtolower(i18n("Confirmed Date", "cl_newsletter"));
|
|||
|
$aFieldDetails["confirmeddate"]["fieldtype"] = "field";
|
|||
|
$aFieldDetails["confirmeddate"]["mandatory"] = false;
|
|||
|
$aFieldDetails["confirmeddate"]["type"] = "date";
|
|||
|
$aFieldDetails["confirmeddate"]["link"] = false;
|
|||
|
$aFieldDetails["confirmeddate"]["col"] = -1;
|
|||
|
$aFields["news_type"] = strtolower(i18n("Message type", "cl_newsletter"));
|
|||
|
$aFieldDetails["news_type"]["fieldtype"] = "field";
|
|||
|
$aFieldDetails["news_type"]["mandatory"] = false;
|
|||
|
$aFieldDetails["news_type"]["type"] = "boolean";
|
|||
|
$aFieldDetails["news_type"]["link"] = false;
|
|||
|
$aFieldDetails["news_type"]["col"] = -1;
|
|||
|
|
|||
|
// Check out if there are any plugins
|
|||
|
if (is_array($cfg['plugins']['recipients'])) {
|
|||
|
foreach ($cfg['plugins']['recipients'] as $sPlugin) {
|
|||
|
if (function_exists("recipients_" . $sPlugin . "_wantedVariables") && function_exists("recipients_" . $sPlugin . "_canonicalVariables")) {
|
|||
|
$aPluginTitles = call_user_func("recipients_" . $sPlugin . "_canonicalVariables");
|
|||
|
$aPluginFields = call_user_func("recipients_" . $sPlugin . "_wantedVariables");
|
|||
|
foreach ($aPluginFields as $sField) {
|
|||
|
//if ($_REQUEST["ckb".$sField]) {
|
|||
|
$aFields[$sField] = strtolower(str_replace(" ", "", $aPluginTitles[$sField]));
|
|||
|
$aFieldDetails[$sField]["fieldtype"] = "plugin";
|
|||
|
$aFieldDetails[$sField]["mandatory"] = false;
|
|||
|
$aFieldDetails[$sField]["type"] = "string";
|
|||
|
$aFieldDetails[$sField]["link"] = $sPlugin;
|
|||
|
$aFieldDetails[$sField]["col"] = -1;
|
|||
|
//}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Get groups
|
|||
|
$oRcpGroups = new RecipientGroupCollection;
|
|||
|
$oRcpGroups->setWhere("idclient", $client);
|
|||
|
$oRcpGroups->setWhere("idlang", $lang);
|
|||
|
$oRcpGroups->setOrder("groupname");
|
|||
|
$oRcpGroups->query();
|
|||
|
|
|||
|
while ($oRcpGroup = $oRcpGroups->next()) {
|
|||
|
$sField = "g" . $oRcpGroup->get($oRcpGroup->primaryKey);
|
|||
|
|
|||
|
$sGroupName = $oRcpGroup->get("groupname");
|
|||
|
$sGroupName = str_replace(" ", "", $sGroupName);
|
|||
|
$sGroupName = str_replace("\t", "", $sGroupName);
|
|||
|
$sGroupName = str_replace("\n", "", $sGroupName);
|
|||
|
$sGroupName = str_replace("\r", "", $sGroupName);
|
|||
|
$sGroupName = str_replace("\0", "", $sGroupName);
|
|||
|
$sGroupName = str_replace("\x0B;", "", $sGroupName);
|
|||
|
|
|||
|
// Only PHP5!
|
|||
|
//$sGroupName = str_replace(str_split(" \t\n\r\0\x0B;"), "", $oRcpGroup->get("groupname"));
|
|||
|
|
|||
|
$aFields[$sField] = strtolower(clHtmlEntities(trim(i18n("Group", "cl_newsletter") . "_" . $sGroupName)));
|
|||
|
$aFieldDetails[$sField]["fieldtype"] = "group";
|
|||
|
$aFieldDetails[$sField]["mandatory"] = false;
|
|||
|
$aFieldDetails[$sField]["type"] = "string";
|
|||
|
$aFieldDetails[$sField]["link"] = $oRcpGroup->get($oRcpGroup->primaryKey);
|
|||
|
$aFieldDetails[$sField]["col"] = -1;
|
|||
|
}
|
|||
|
|
|||
|
if ($action == "recipients_import_exec" && $perm->have_perm_area_action("recipients", "recipients_create")) {
|
|||
|
$_REQUEST["txtData"] = trim(stripslashes($_REQUEST["txtData"]));
|
|||
|
|
|||
|
if ($_REQUEST["txtData"]) {
|
|||
|
switch ($_REQUEST["selDelimiter"]) {
|
|||
|
case "semicolon":
|
|||
|
$sDelimiter = ";";
|
|||
|
break;
|
|||
|
default:
|
|||
|
$sDelimiter = "\t"; //chr(9);
|
|||
|
}
|
|||
|
|
|||
|
//echo "<pre>".nl2br(stripslashes($_REQUEST["txtData"]))."</pre>";
|
|||
|
$aLines = explode("\n", stripslashes($_REQUEST["txtData"]));
|
|||
|
$iAdded = 0;
|
|||
|
$iDublettes = 0;
|
|||
|
$iInvalid = 0;
|
|||
|
$iRow = 0;
|
|||
|
$iCol = 0;
|
|||
|
$bStop = false;
|
|||
|
$sMessage = "";
|
|||
|
$aMessage = array();
|
|||
|
$aInvalidLines = array();
|
|||
|
$oGroupMembers = new RecipientGroupMemberCollection;
|
|||
|
|
|||
|
foreach ($aLines as $sLine) {
|
|||
|
$iRow++;
|
|||
|
|
|||
|
$aParts = explode($sDelimiter, trim($sLine));
|
|||
|
|
|||
|
if ($iRow == 1) {
|
|||
|
$aInvalidLines[] = $sLine;
|
|||
|
|
|||
|
foreach ($aParts as $sHeader) {
|
|||
|
$sKey = array_search(strtolower(clHtmlEntities(trim($sHeader))), $aFields);
|
|||
|
if ($sKey === false) {
|
|||
|
$aMessage[] = sprintf(i18n("Given column header '%s' unknown, column ignored", "cl_newsletter"), $sHeader);
|
|||
|
} else {
|
|||
|
$aFieldDetails[$sKey]["col"] = $iCol;
|
|||
|
$iCol++;
|
|||
|
}
|
|||
|
}
|
|||
|
foreach ($aFieldDetails as $sKey => $aDetails) {
|
|||
|
if ($aDetails["mandatory"] && $aDetails["col"] == -1) {
|
|||
|
$aMessage[] = sprintf(i18n("Mandatory column '%s' wasn't found, import stopped", "cl_newsletter"), $aDetails[$sKey]);
|
|||
|
$bStop = true;
|
|||
|
}
|
|||
|
}
|
|||
|
if ($bStop) {
|
|||
|
exit;
|
|||
|
} else {
|
|||
|
$_REQUEST["txtData"] = "";
|
|||
|
}
|
|||
|
} else {
|
|||
|
$sEMail = trim($aParts[$aFieldDetails["email"]["col"]]);
|
|||
|
if ($aFieldDetails["name"]["col"] > -1) {
|
|||
|
$sName = trim($aParts[$aFieldDetails["name"]["col"]]);
|
|||
|
if ($sName == "") {
|
|||
|
$sName = $sEMail;
|
|||
|
}
|
|||
|
} else {
|
|||
|
$sName = $sEMail;
|
|||
|
}
|
|||
|
if ($sEMail == "") {
|
|||
|
$aMessage[] = sprintf(i18n("Item with empty mail address found, item ignored (name: %s, row: %s)", "cl_newsletter"), $sName, $iRow);
|
|||
|
$aInvalidLines[] = $sLine;
|
|||
|
$iInvalid++;
|
|||
|
} else if (!isValidMail($sEMail)) {
|
|||
|
$aMessage[] = sprintf(i18n("Mail address '%s' is invalid, item ignored (row: %s)", "cl_newsletter"), $sEMail, $iRow);
|
|||
|
$aInvalidLines[] = $sLine;
|
|||
|
$iInvalid++;
|
|||
|
} else if ($oRecipients->emailExists($sEMail)) {
|
|||
|
$aMessage[] = sprintf(i18n("Recipient with mail address '%s' already exists, item skipped (row: %s)", "cl_newsletter"), $sEMail, $iRow);
|
|||
|
$aInvalidLines[] = $sLine;
|
|||
|
$iDublettes++;
|
|||
|
} else {
|
|||
|
unset($sLine);
|
|||
|
|
|||
|
// Must be $recipient for plugins
|
|||
|
if ($recipient = $oRecipients->create($sEMail, $sName)) {
|
|||
|
$iID = $recipient->get($recipient->primaryKey);
|
|||
|
$iAdded++;
|
|||
|
|
|||
|
unset($aPluginValue);
|
|||
|
$aPluginValue = array();
|
|||
|
|
|||
|
foreach ($aFieldDetails as $sKey => $aDetails) {
|
|||
|
if ($aDetails["col"] > -1) {
|
|||
|
switch ($aDetails["fieldtype"]) {
|
|||
|
case "field":
|
|||
|
switch ($aDetails["type"]) {
|
|||
|
case "boolean":
|
|||
|
$sValue = strtolower(trim($aParts[$aDetails["col"]]));
|
|||
|
|
|||
|
// html is only treated as "true", to get html messages for recipients
|
|||
|
// - quick and dirty...
|
|||
|
if ($sValue == "yes" || $sValue == i18n("yes", "cl_newsletter") || $sValue == "true" ||
|
|||
|
(is_numeric($sValue) && $sValue > 0) ||
|
|||
|
$sValue == "html") {
|
|||
|
$recipient->set($sKey, 1);
|
|||
|
|
|||
|
if ($sKey == "confirmed") {
|
|||
|
// Ensure, that if a recipient is confirmed, a confirmed date
|
|||
|
// is available. As "confirmeddate" will be set after "confirmed"
|
|||
|
// a specified confirmeddate will overwrite this default
|
|||
|
$recipient->set("confirmeddate", date("Y-m-d H:i:s"), false);
|
|||
|
}
|
|||
|
} else {
|
|||
|
$recipient->set($sKey, 0);
|
|||
|
}
|
|||
|
break;
|
|||
|
case "date":
|
|||
|
// TODO: Check conversion: Result may be unpredictable...
|
|||
|
$sValue = trim($aParts[$aDetails["col"]]);
|
|||
|
$recipient->set($sKey, date("Y-m-d H:i:s", strtotime($sValue)), false);
|
|||
|
break;
|
|||
|
default:
|
|||
|
$sValue = trim($aParts[$aDetails["col"]]);
|
|||
|
$recipient->set($sKey, $sValue);
|
|||
|
}
|
|||
|
break;
|
|||
|
case "plugin":
|
|||
|
// type may be mentioned here, also, but as plugins currently can't
|
|||
|
// specify the type, just treat everything as string
|
|||
|
// There may be plugins which store more than one value per plugin_store-
|
|||
|
// function. As the plugin_store parameter is an array of values, collect
|
|||
|
// all values in an array for later storing... unfortunately, that means,
|
|||
|
// that we have to go through the fields array second time per item *sigh*
|
|||
|
$aPluginValue[$aDetails["link"]][$sKey] = trim($aParts[$aDetails["col"]]);
|
|||
|
break;
|
|||
|
case "group":
|
|||
|
// Add recipient to group
|
|||
|
$sValue = strtolower(trim($aParts[$aDetails["col"]]));
|
|||
|
|
|||
|
if ($sValue == "yes" || $sValue == i18n("yes", "cl_newsletter") ||
|
|||
|
$sValue == "true" || (is_numeric($sValue) && $sValue > 0)) {
|
|||
|
$oGroupMembers->create($aDetails["link"], $iID);
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// Store all base data
|
|||
|
$recipient->store();
|
|||
|
|
|||
|
// Store plugin data (to store plugin data, only, where the column has been found in the data
|
|||
|
// should be faster than going through all plugins and store mostly empty arrays)
|
|||
|
$sCurrentPlugin = "";
|
|||
|
foreach ($aFieldDetails as $sKey => $aDetails) {
|
|||
|
if ($aDetails["col"] > -1 &&
|
|||
|
$aDetails["fieldtype"] == "plugin" &&
|
|||
|
$aDetails["link"] !== $sCurrentPlugin) {
|
|||
|
$sCurrentPlugin = $aDetails["link"];
|
|||
|
|
|||
|
call_user_func("recipients_" . $sCurrentPlugin . "_store", $aPluginValue[$sCurrentPlugin]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (count($aInvalidLines) > 1) {
|
|||
|
$_REQUEST["txtData"] = implode("\n", $aInvalidLines);
|
|||
|
}
|
|||
|
if (count($aMessage) > 0) {
|
|||
|
$sMessage = $notification->returnNotification("warning", implode("<br />", $aMessage)) . "<br />";
|
|||
|
}
|
|||
|
$sMessage .= $notification->returnNotification("info", sprintf(i18n("%d recipients added, %d recipients skipped (email already exists) and %d invalid recipients/e-mail adresses ignored. Invalid recipients are shown (if any).", "cl_newsletter"), $iAdded, $iDublettes, $iInvalid));
|
|||
|
if ($iAdded > 0) {
|
|||
|
$oPage->setReload();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
$oForm = new UI_Table_Form("properties");
|
|||
|
$oForm->setVar("frame", $frame);
|
|||
|
$oForm->setVar("area", $area);
|
|||
|
$oForm->setVar("action", "recipients_import_exec");
|
|||
|
|
|||
|
$oForm->addHeader(i18n("Import recipients", "cl_newsletter"));
|
|||
|
|
|||
|
$oSelDelimiter = new cHTMLSelectElement("selDelimiter");
|
|||
|
$aItems = array();
|
|||
|
$aItems[] = array("tab", i18n("Tab", "cl_newsletter"));
|
|||
|
$aItems[] = array("semicolon", i18n("Semicolon", "cl_newsletter"));
|
|||
|
$oSelDelimiter->autoFill($aItems);
|
|||
|
$oSelDelimiter->setDefault($_REQUEST["selDelimiter"]);
|
|||
|
$oForm->add(i18n("Delimiter", "cl_newsletter"), $oSelDelimiter->render());
|
|||
|
|
|||
|
$oAreaData = new cHTMLTextarea("txtData", $_REQUEST["txtData"], 80, 20);
|
|||
|
|
|||
|
$sInfo = '<a href="javascript:fncShowHide(\'idInfoText\');"><strong>' . i18n("Import information", "cl_newsletter") . '</strong></a>' .
|
|||
|
'<div id="idInfoText" style="display: none">' .
|
|||
|
'<br /><br /><strong>' . i18n("Specify colum types:", "cl_newsletter") . '</strong>' .
|
|||
|
i18n("<br />The first line must contain the column names; this specifies the column order.<br /><column name>[delimiter]<column name>...", "cl_newsletter") .
|
|||
|
'<br /><br /><strong>' . i18n("Data structure:", "cl_newsletter") . '</strong><br />' .
|
|||
|
i18n("The recipients have to be entered using the following format:<br /><data>[Delimiter]<data>... - each recipient in a new line.", "cl_newsletter") .
|
|||
|
'<br /><br /><strong>' . i18n("Example:", "cl_newsletter") . '</strong>' .
|
|||
|
i18n("<br />name;mail;confirmed<br />Smith;jon.smith@example.org;1", "cl_newsletter") .
|
|||
|
'<br /><br /><strong>' . i18n("The following column names will be recognized:", "cl_newsletter") . '</strong><br />' .
|
|||
|
implode("<br />\n", $aFields);
|
|||
|
|
|||
|
$oForm->add(i18n("Recipients", "cl_newsletter"), $oAreaData->render() . "<br />" . $sInfo);
|
|||
|
unset($sInfo);
|
|||
|
|
|||
|
$sExecScript = '
|
|||
|
<script type="text/javascript">
|
|||
|
/* Enabled/Disable group box */
|
|||
|
function fncShowHide(strItemID) {
|
|||
|
objItem = document.getElementById(strItemID);
|
|||
|
|
|||
|
if (objItem.style.display == "none") {
|
|||
|
objItem.style.display = "inline";
|
|||
|
} else {
|
|||
|
objItem.style.display = "none";
|
|||
|
}
|
|||
|
}
|
|||
|
</script>';
|
|||
|
|
|||
|
$oPage->addScript('execscript', $sExecScript);
|
|||
|
$oPage->setContent($sMessage . $oForm->render(true));
|
|||
|
$oPage->render();
|
|||
|
?>
|