From ca2559a64f94ac6c48e4d4d4c056b8bba806daf4 Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Mon, 25 Feb 2013 15:46:14 +0100 Subject: [PATCH] Version 1.0: First version, automatic and manual subscription works --- Makefile | 7 +- acy_subscribe_buyer.php | 76 ++++++++++-------- acy_subscribe_buyer.xml | 11 +-- acy_subscribe_buyer/tmpl/button_subscribe.php | 32 +++++++- .../tmpl/button_subscribe_anon.php | 20 ----- .../tmpl/button_unsubscribe.php | 20 ----- de-DE.plg_vmcustom_acy_subscribe_buyer.ini | 18 +++++ ...E.plg_vmcustom_acy_subscribe_buyer.sys.ini | 7 ++ en-GB.plg_vmcustom_acy_subscribe_buyer.ini | 3 +- .../plg_vmcustom_acy_subscribe_buyer_v1.0.zip | Bin 0 -> 9942 bytes 10 files changed, 106 insertions(+), 88 deletions(-) delete mode 100644 acy_subscribe_buyer/tmpl/button_subscribe_anon.php delete mode 100644 acy_subscribe_buyer/tmpl/button_unsubscribe.php create mode 100644 de-DE.plg_vmcustom_acy_subscribe_buyer.ini create mode 100644 de-DE.plg_vmcustom_acy_subscribe_buyer.sys.ini create mode 100644 releases/plg_vmcustom_acy_subscribe_buyer_v1.0.zip diff --git a/Makefile b/Makefile index 729711b..42aa07c 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,14 @@ -BASE=downloads_for_sale +BASE=acy_subscribe_buyer PLUGINTYPE=vmcustom -VERSION=1.1 +VERSION=1.0 PLUGINFILES=$(BASE).php $(BASE).script.php $(BASE).xml index.html TRANSLATIONS=$(call wildcard,*.plg_$(PLUGINTYPE)_$(BASE).*ini) INDEXFILES=$(BASE)/index.html TMPLFILES=$(call wildcard,$(BASE)/tmpl/*.php) $(BASE)/index.html $(BASE)/tmpl/index.html -ASSETS=$(call wildcard,assets/*.png) $(call wildcard,assets/*.css) assets/index.html +ASSETS=$(call wildcard,assets/*.png) $(call wildcard,assets/*.css) +# assets/index.html ZIPFILE=plg_$(PLUGINTYPE)_$(BASE)_v$(VERSION).zip diff --git a/acy_subscribe_buyer.php b/acy_subscribe_buyer.php index 6b6859c..493ccab 100644 --- a/acy_subscribe_buyer.php +++ b/acy_subscribe_buyer.php @@ -15,6 +15,10 @@ defined('_JEXEC') or die( 'Direct Access to ' . basename( __FILE__ ) . ' is not * http://kainhofer.com */ if (!class_exists('vmCustomPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php'); +if(!include_once(rtrim(JPATH_ADMINISTRATOR,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php')){ + echo 'This plugin requires the AcyMailing Component to be installed'; + return; +}; class plgVmCustomAcy_subscribe_Buyer extends vmCustomPlugin { @@ -67,7 +71,7 @@ class plgVmCustomAcy_subscribe_Buyer extends vmCustomPlugin { function getUserSubscriptions ($uid) { if (!($uid>0)) return array(); $db = &JFactory::getDBO(); - $q = "SELECT `listid` FROM `#__acymailing_listsub` WHERE `subid` = '".(int)$uid."'"; + $q = "SELECT `listid` FROM `#__acymailing_listsub` WHERE `subid` = '".(int)$uid."' AND `status`='1'"; $db->setQuery($q); $subscribed = $db->loadColumn(); return $subscribed; @@ -79,7 +83,6 @@ class plgVmCustomAcy_subscribe_Buyer extends vmCustomPlugin { $q = "SELECT `id`, `name`, `email` FROM `#__users` WHERE `id`=".(int)$uid; $db->setQuery($q); $userinfo = $db->loadObject(); -// print("<pre>addAcyUser ($name, $email, $uid): loaded user data <br>(SQL: $q) <br/>".print_r($userinfo,1)."</pre>"); if (empty($email)) $email = $userinfo->email; if (empty($name)) @@ -97,7 +100,7 @@ class plgVmCustomAcy_subscribe_Buyer extends vmCustomPlugin { } return $db->insertid(); } - /** Adds the acy user to all the given lists (the subscriber has already been created).*/ + /** Adds the acy user to all the given lists (the subscriber has already been created). If the user has unsubscribed, he will not be subscribed again! */ function subscribeUser ($acyuid, $lists) { $db = &JFactory::getDBO(); foreach ($lists as $l) { @@ -109,10 +112,6 @@ class plgVmCustomAcy_subscribe_Buyer extends vmCustomPlugin { $db->query(); } } - /** Removes the user from all the given lists */ - function unsubscribeUser ($acyuid, $lists) { - // TODO - } /** * @see Form displayed in the product edit page in the BE, configure the download file @@ -144,29 +143,40 @@ class plgVmCustomAcy_subscribe_Buyer extends vmCustomPlugin { return true ; } + function addAcyStuff () { + acymailing_initModule('header',null); + } + function getThisURL() { + if (isset ($_SERVER['REQUEST_URI'])) { + $request_uri = $_SERVER['REQUEST_URI']; + } else { + $request_uri = $_SERVER['PHP_SELF']; + if (!empty($_SERVER['QUERY_STRING'])) $request_uri .= '?' . $_SERVER['QUERY_STRING']; + } + return ((empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) != "on") ? "http://" : "https://") . $_SERVER['HTTP_HOST'].$request_uri; + } + + function displayProduct($field) { -$this->addAcyUser("Reinhold Kainhofer", "reinhold@kainhofer.com" , 673); $html = ''; $this->parseCustomParams($field); - $user = JFactory::getUser()->get('id'); - if ($user>0) { - $acyuid = $this->getAcyUidFromUser($user); + $user = JFactory::getUser(); + $uid = $user->get('id'); + if ($uid>0) { + $acyuid = $this->getAcyUidFromUser($uid); $allsubscriptions = $this->getUserSubscriptions($acyuid); - $subscribed = array_intersect ($field->lists, $allsubscriptions); - $notsubscribed = array_diff ($field->lists, $allsubscriptions); - if (!empty($notsubscribed)) { - $html .= $this->renderByLayout('button_subscribe', array($notsubscribed, $user, $field)); - // TODO: implement subscribe button - } - if (!empty($subscribed)) { - // TODO: implement unsubscribe button - $html .= $this->renderByLayout('button_unsubscribe', array($subscribed, $user, $field)); - } -// $html .= "<pre>USER: $user, field: ".print_r($field,1).", all subscriptions: ".print_r($allsubscriptions,1).", subscriptions: ".print_r($subscribed,1).", unsubscriptions: ".print_r($notsubscribed,1).", lists: ".print_r($field->lists, 1)."</pre>"; + $uinfo = array( + 'id' => $uid, + 'name' => $user->get('name'), + 'email' => $user->get('email'), + 'subscribed' => array_intersect ($field->lists, $allsubscriptions), + 'notsubscribed' => array_diff ($field->lists, $allsubscriptions), + ); + $this->addAcyStuff(); + $html .= $this->renderByLayout('button_subscribe', array(acymailing_getModuleFormName(), $uinfo, $field->lists, $this->getThisURL(), $field)); } elseif ($field->allow_subscribe) { - $html .= $this->renderByLayout('button_subscribe_anon', array($field->lists, $field)); - // TODO: Display anonymous subscribe button - $html = "<pre>NO USER, SUBSCRIBE allowed</pre>"; + $this->addAcyStuff(); + $html .= $this->renderByLayout('button_subscribe', array(acymailing_getModuleFormName(), array(), $field->lists, $this->getThisURL(), $field)); } else { // Not logged in, manual subscription not allowed } @@ -245,25 +255,23 @@ $this->addAcyUser("Reinhold Kainhofer", "reinhold@kainhofer.com" , 673); $customModel = VmModel::getModel('customfields'); foreach ($order['items'] as $item) { $customs = $customModel->getproductCustomslist ($item->virtuemart_product_id); -JFactory::getApplication()->enqueueMessage("<pre>Custom fields: ".print_r($customs,1)."</pre>", 'error'); foreach ($customs as $field) { if ($field->custom_element != $this->_name) continue; if (!$field->subscribe_buyers) continue; // Add the user to the lists: if(!($acyuid>0)) { - $acyuid = $this->addAcyUser($name, $email, $uid); + $acyuid = $this->addAcyUser ($name, $email, $uid); } - $allsubscriptions = $this->getUserSubscriptions($acyuid); + $allsubscriptions = $this->getUserSubscriptions ($acyuid); $notsubscribed = array_diff ($field->lists, $allsubscriptions); $this->subscribeUser($acyuid, $notsubscribed); - foreach ($notsubscribed as $l) { - $listname=$this->getAcyListname($l); - JFactory::getApplication()->enqueueMessage(JText::sprintf('VMCUSTOM_ACYBUYER_ADDED_USER', $name, $email, $listname), 'info'); - } + // TODO: Shall we display an infor message about the subscription? + // foreach ($notsubscribed as $l) { + // $listname=$this->getAcyListname($l); + // JFactory::getApplication()->enqueueMessage(JText::sprintf('VMCUSTOM_ACYBUYER_ADDED_USER', $name, $email, $listname), 'info'); + // } } } - // TODO: If auto-subscribe -JFactory::getApplication()->enqueueMessage("plgVmConfirmedOrder, cart: <pre>".print_r($cart,1)."</pre><br><h2>ORDER:</h2><pre>".print_r($order,1)."</pre>", 'error'); } } diff --git a/acy_subscribe_buyer.xml b/acy_subscribe_buyer.xml index e8df6c9..7597a46 100644 --- a/acy_subscribe_buyer.xml +++ b/acy_subscribe_buyer.xml @@ -15,16 +15,11 @@ </files> <languages> <language tag="en-GB">en-GB.plg_vmcustom_acy_subscribe_buyer.ini</language> + <language tag="de-DE">de-DE.plg_vmcustom_acy_subscribe_buyer.ini</language> + <language tag="en-GB">en-GB.plg_vmcustom_acy_subscribe_buyer.sys.ini</language> + <language tag="de-DE">de-DE.plg_vmcustom_acy_subscribe_buyer.sys.ini</language> </languages> <scriptfile>acy_subscribe_buyer.script.php</scriptfile> <params addpath="/administrator/components/com_virtuemart/elements"> - <param name="auto_subscribe" type="radio" default="1" label="VMCUSTOM_ACYBUYER_AUTO_SUBSCRIBE" description="VMCUSTOM_ACYBUYER_AUTO_SUBSCRIBE_DESC" > - <option value="0">COM_VIRTUEMART_NO</option> - <option value="1">COM_VIRTUEMART_YES</option> - </param> - <param name="allow_registered_subscribe" type="radio" default="1" label="VMCUSTOM_ACYBUYER_ALLOW_SUBSCRIBE" description="VMCUSTOM_ACYBUYER_ALLOW_SUBSCRIBE_DESC" > - <option value="0">COM_VIRTUEMART_NO</option> - <option value="1">COM_VIRTUEMART_YES</option> - </param> </params> </install> diff --git a/acy_subscribe_buyer/tmpl/button_subscribe.php b/acy_subscribe_buyer/tmpl/button_subscribe.php index 0b4c40e..72bee4b 100644 --- a/acy_subscribe_buyer/tmpl/button_subscribe.php +++ b/acy_subscribe_buyer/tmpl/button_subscribe.php @@ -9,6 +9,13 @@ * **/ +// Data passed to this template (as $viewData array): +// $viewData[0] ... acy mailing form name +// $viewData[1] ... user info (id, mail, name, subscribed, notsubscribed), typically extracted from the registered user +// $viewData[2] ... list ids for this product +// $viewData[3] ... Redirect URL +// $viewData[4] ... the whole custom field + defined('_JEXEC') or die(); if(JFile::exists(JPATH_SITE.DS.'plugins'.DS.'vmcustom'.DS.'acy_subscribe_buyer'.DS.'assets'.DS.'acy_subscribe_buyer.css')) { $doc =& JFactory::getDocument(); @@ -16,5 +23,28 @@ if(JFile::exists(JPATH_SITE.DS.'plugins'.DS.'vmcustom'.DS.'acy_subscribe_buyer'. } ?> <div class="acy_subscribe_buyer"> -<div style="background: #00FF00;">Subscribe user <?php echo $viewData[1]; ?> to: <?php print_r($viewData[0]); ?></div> +<form name="<?php echo $viewData[0]?>" method="post" onsubmit="return submitacymailingform('optin','<?php echo $viewData[0]?>')" action="<?php echo JRoute::_('index.php'); ?>" id="<?php echo $viewData[0]?>"> +<?php if (empty($viewData[1]['name']) && empty($viewData[1]['email'])) { ?> + <input type="text" value="Your Name" name="user[name]" id="user_name_<?php echo $viewData[0]?>"> + <input type="text" value="email@example.com" name="user[email]" id="user_email_<?php echo $viewData[0]?>"> +<?php } else { ?> + <input type="hidden" value="<?php echo $viewData[1]['name'];?>" name="user[name]" id="user_name_<?php echo $viewData[0]?>"> + <input type="hidden" value="<?php echo $viewData[1]['email'];?>" name="user[email]" id="user_email_<?php echo $viewData[0]?>"> +<?php } ?> + <input type="hidden" value="0" name="ajax"> + <input type="hidden" value="sub" name="ctrl"> + <input type="hidden" value="notask" name="task"> + <input type="hidden" value="<?php echo $viewData[3];?>" name="redirect"> + <input type="hidden" value="<?php echo $viewData[3];?>" name="redirectunsub"> + <input type="hidden" value="com_acymailing" name="option"> + <input type="hidden" value="" name="visiblelists"> + <input type="hidden" value="<?php echo implode (',', $viewData[2]); ?>" name="hiddenlists"> + <input type="hidden" value="<?php echo $viewData[0]?>" name="acyformname"> +<?php if (!isset($viewData[1]['notsubscribed']) or !empty($viewData[1]['notsubscribed'])) { ?> + <input type="submit" onclick="try{ return submitacymailingform('optin','<?php echo $viewData[0]?>'); }catch(err){alert('The form could not be submitted '+err);return false;}" name="Submit" value="Subscribe" class="button subbutton btn btn-primary"> +<?php } + if (!isset($viewData[1]['subscribed']) or !empty($viewData[1]['subscribed'])) { ?> + <input type="button" onclick="return submitacymailingform('optout','<?php echo $viewData[0]?>')" name="Submit" value="Unsubscribe" class="button unsubbutton btn btn-inverse"> +<?php } ?> +</form> </div> \ No newline at end of file diff --git a/acy_subscribe_buyer/tmpl/button_subscribe_anon.php b/acy_subscribe_buyer/tmpl/button_subscribe_anon.php deleted file mode 100644 index 90fd0f8..0000000 --- a/acy_subscribe_buyer/tmpl/button_subscribe_anon.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/** - * - * @author Reinhold Kainhofer - * @package VirtueMart - * @subpackage custom - * @copyright Copyright (C) 2013 RK - All rights reserved. - * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php - * - **/ - -defined('_JEXEC') or die(); -if(JFile::exists(JPATH_SITE.DS.'plugins'.DS.'vmcustom'.DS.'acy_subscribe_buyer'.DS.'assets'.DS.'acy_subscribe_buyer.css')) { - $doc =& JFactory::getDocument(); - $doc->addStyleSheet(JURI::root().'plugins/vmcustom/acy_subscribe_buyer/assets/acy_subscribe_buyer.css'); -} -?> -<div class="acy_subscribe_buyer"> -<div style="background: #00FF00;">Subscribing anonymous to: <?php print_r($viewData[0]); ?></div> -</div> \ No newline at end of file diff --git a/acy_subscribe_buyer/tmpl/button_unsubscribe.php b/acy_subscribe_buyer/tmpl/button_unsubscribe.php deleted file mode 100644 index bf1370e..0000000 --- a/acy_subscribe_buyer/tmpl/button_unsubscribe.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/** - * - * @author Reinhold Kainhofer - * @package VirtueMart - * @subpackage custom - * @copyright Copyright (C) 2013 RK - All rights reserved. - * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php - * - **/ - -defined('_JEXEC') or die(); -if(JFile::exists(JPATH_SITE.DS.'plugins'.DS.'vmcustom'.DS.'acy_subscribe_buyer'.DS.'assets'.DS.'acy_subscribe_buyer.css')) { - $doc =& JFactory::getDocument(); - $doc->addStyleSheet(JURI::root().'plugins/vmcustom/acy_subscribe_buyer/assets/acy_subscribe_buyer.css'); -} -?> -<div class="acy_subscribe_buyer"> -<div style="background: red">Unsubscribe user <?php echo $viewData[1]; ?> from: <?php print_r($viewData[0]); ?></div> -</div> \ No newline at end of file diff --git a/de-DE.plg_vmcustom_acy_subscribe_buyer.ini b/de-DE.plg_vmcustom_acy_subscribe_buyer.ini new file mode 100644 index 0000000..362b07a --- /dev/null +++ b/de-DE.plg_vmcustom_acy_subscribe_buyer.ini @@ -0,0 +1,18 @@ +; Virtuemart! Project +; Copyright (C) 2011 Virtuemart Team. All rights reserved. +; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php +; Note : All ini files need to be saved as UTF-8 - No BOM + +VMCUSTOM_ACYBUYER="VM Käufer zu AcyMailing Listen hinzufügen" +VMCUSTOM_ACYBUYER_DESC="VirtueMart Benutzerfeld-Plugin, um Käufer automatisch zu AcyMailing Listen hinzuzufügen, bzw. die manuelle Bestellung/Abbestellung von Newslettern auf der Produkseite zu ermöglichen." + +VMCUSTOM_ACYBUYER_AUTO_SUBSCRIBE="Käufer automatisch eintragen" +VMCUSTOM_ACYBUYER_AUTO_SUBSCRIBE_DESC="Trägt jeden Käufer des Produkts automatisch nach Abschluss der Bestellung in die Mailingliste ein." +VMCUSTOM_ACYBUYER_ALLOW_SUBSCRIBE="Manuelle Eintragung erlauben" +VMCUSTOM_ACYBUYER_ALLOW_SUBSCRIBE_DESC="Zeigt auf der Produktseite die Möglichkeit, die AcyMailing Listen des jeweiligen Produktes zu abonnieren oder abzubestellen. Für registrierte Benutzer wird dabei die Mail-Adresse des Joomla Kontos benutzt, anonyme Benutzer können die Adresse eingeben." + +VMCUSTOM_ACYBUYER_NO_LISTS="Es sind keine AcyMailing Listen verfügbar" +VMCUSTOM_ACYBUYER_LIST="AcyMailing Listen:" + +VMCUSTOM_ACYBUYER_ADDED_USER="Benutzer '%s' (%s) zur Liste '%s' hinzugefügt." +VMCUSTOM_ACYBUYER_SQL_ERROR="SQL Fehler! Bitte <a href='mailto:reinhold@kainhofer.com'>kontaktieren Sie den Autor</a> und geben Sie folgende Fehlermeldung an:<br/>%s" \ No newline at end of file diff --git a/de-DE.plg_vmcustom_acy_subscribe_buyer.sys.ini b/de-DE.plg_vmcustom_acy_subscribe_buyer.sys.ini new file mode 100644 index 0000000..ee2b586 --- /dev/null +++ b/de-DE.plg_vmcustom_acy_subscribe_buyer.sys.ini @@ -0,0 +1,7 @@ +; Virtuemart! Project +; Copyright (C) 2011 Virtuemart Team. All rights reserved. +; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php +; Note : All ini files need to be saved as UTF-8 - No BOM + +VMCUSTOM_ACYBUYER="VM Käufer zu AcyMailing Listen hinzufügen" +VMCUSTOM_ACYBUYER_DESC="VirtueMart Benutzerfeld-Plugin, um Käufer automatisch zu AcyMailing Listen hinzuzufügen, bzw. die manuelle Bestellung/Abbestellung von Newslettern auf der Produkseite zu ermöglichen." diff --git a/en-GB.plg_vmcustom_acy_subscribe_buyer.ini b/en-GB.plg_vmcustom_acy_subscribe_buyer.ini index c5d85a3..f640671 100644 --- a/en-GB.plg_vmcustom_acy_subscribe_buyer.ini +++ b/en-GB.plg_vmcustom_acy_subscribe_buyer.ini @@ -6,7 +6,6 @@ VMCUSTOM_ACYBUYER="VM Subscribe Buyers to AcyMailing" VMCUSTOM_ACYBUYER_DESC="VirtueMart custom field plugin to automatically subscribe buyers to AcyMailing lists." -VMCUSTOM_ACYBUYER_ALLOW_SUBSCRIBE VMCUSTOM_ACYBUYER_AUTO_SUBSCRIBE="Auto-subscribe buyers" VMCUSTOM_ACYBUYER_AUTO_SUBSCRIBE_DESC="Automatically add users to the mailing list after a successful purchase." VMCUSTOM_ACYBUYER_ALLOW_SUBSCRIBE="Allow manual subscription" @@ -16,4 +15,4 @@ VMCUSTOM_ACYBUYER_NO_LISTS="No AcyMailing lists are available" VMCUSTOM_ACYBUYER_LIST="AcyMailing lists:" VMCUSTOM_ACYBUYER_ADDED_USER="User '%s' (%s) added to mailing list %s." -VMCUSTOM_ACYBUYER_SQL_ERROR="SQL error, please contact the author with the following information:<br/>%s" \ No newline at end of file +VMCUSTOM_ACYBUYER_SQL_ERROR="SQL error, please <a href='mailto:reinhold@kainhofer.com'>contact the author</a> with the following information:<br/>%s" \ No newline at end of file diff --git a/releases/plg_vmcustom_acy_subscribe_buyer_v1.0.zip b/releases/plg_vmcustom_acy_subscribe_buyer_v1.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..eacb7ee7c7a86ec072b575b47a2de18f60bf1336 GIT binary patch literal 9942 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 literal 0 HcmV?d00001 -- GitLab