From d517db6f47d60bcb3d67c58fc6fb52a87b35edc7 Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Mon, 25 Aug 2014 02:02:05 +0200 Subject: [PATCH] Make it work with J3 and VM3; Fix some other smaller bugs Somehow the product's custom field config fails if the internal value of the selected option (auto-add, allow subscription) is 0. VM then always selects the first entry in the list, even though that has a value of -1... --- Makefile | 2 +- acymailing_subscribe_buyer.php | 50 ++++++++++++++---- acymailing_subscribe_buyer.script.php | 2 +- acymailing_subscribe_buyer.xml | 32 +++++++---- ...lg_vmcustom_acymailing_subscribe_buyer.ini | 2 +- ...lg_vmcustom_acymailing_subscribe_buyer.ini | 2 +- ...custom_acymailing_subscribe_buyer_v1.3.zip | Bin 0 -> 11811 bytes 7 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 releases/plg_vmcustom_acymailing_subscribe_buyer_v1.3.zip diff --git a/Makefile b/Makefile index 509e0d9..824740a 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ BASE=acymailing_subscribe_buyer PLUGINTYPE=vmcustom -VERSION=1.2 +VERSION=1.3 PLUGINFILES=$(BASE).php $(BASE).script.php $(BASE).xml index.html diff --git a/acymailing_subscribe_buyer.php b/acymailing_subscribe_buyer.php index 5409e27..5711a0d 100644 --- a/acymailing_subscribe_buyer.php +++ b/acymailing_subscribe_buyer.php @@ -16,6 +16,9 @@ defined('_JEXEC') or die( 'Direct Access to ' . basename( __FILE__ ) . ' is not */ 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')){ + // For some reason, J3.3 does not load the language file otherwice + $language = JFactory::getLanguage(); + $language->load('plg_vmcustom_acymailing_subscribe_buyer'); JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_ACYBUYER_ACYMAILING_NEEDED'), 'error'); return; } @@ -31,7 +34,7 @@ class plgVmCustomAcyMailing_subscribe_Buyer extends vmCustomPlugin { 'allow_subscribe_default'=>array(0, 'int'), 'lists'=>array(array(), 'array'), ); - $this->setConfigParameterable('custom_params',$varsToPush); + $this->setConfigParameterable((VM_VERSION<3)?'custom_params':'customfield_params',$varsToPush); } function plgVmOnSelfCallFE($type,$name,&$render) { if ($name != $this->_name || $type != 'vmcustom') return false; @@ -101,6 +104,8 @@ class plgVmCustomAcyMailing_subscribe_Buyer extends vmCustomPlugin { function plgVmOnProductEdit($field, $product_id, &$row,&$retValue) { if ($field->custom_element != $this->_name) return ''; $this->parseCustomParams($field); + +// JFactory::getApplication()->enqueueMessage("plgVmCustomAcyMailing_subscribe_Buyer::plgVmOnProductEdit: field=<pre>".print_r($field, 1)."</pre>", 'error'); $html = ''; $html .='<fieldset> <legend>'. JText::_('VMCUSTOM_ACYBUYER') .'</legend> @@ -118,14 +123,14 @@ class plgVmCustomAcyMailing_subscribe_Buyer extends vmCustomPlugin { $lists = $this->getAcyMailinglists(); if ($lists) { - $html .= VmHTML::row ('select','VMCUSTOM_ACYBUYER_LIST', 'custom_param['.$row.'][lists][]', $lists, $field->lists, ' multiple', 'listid', 'name', ''); + $html .= VmHTML::row ('select','VMCUSTOM_ACYBUYER_LIST', ((VM_VERSION<3)?'custom_param':'customfield_params').'['.$row.'][lists][]', $lists, $field->lists, ' multiple', 'listid', 'name', ''); - $html .= VmHTML::row('select', 'VMCUSTOM_ACYBUYER_AUTO_SUBSCRIBE', 'custom_param['.$row.'][subscribe_buyers]', + $html .= VmHTML::row('select', 'VMCUSTOM_ACYBUYER_AUTO_SUBSCRIBE', ((VM_VERSION<3)?'custom_param':'customfield_params').'['.$row.'][subscribe_buyers]', array_merge( array(array('id'=>'-1', 'name'=>JText::sprintf('VMCUSTOM_ACYBUYER_AUTO_DEFAULT', JText::_($autosubscribe_modes[$field->subscribe_buyers_default]['name'])))), $autosubscribe_modes), - $field->allow_subscribe,'','id', 'name', false); - $html .= VmHTML::row('select', 'VMCUSTOM_ACYBUYER_ALLOW_SUBSCRIBE', 'custom_param['.$row.'][allow_subscribe]', + $field->subscribe_buyers,'','id', 'name', false); + $html .= VmHTML::row('select', 'VMCUSTOM_ACYBUYER_ALLOW_SUBSCRIBE', ((VM_VERSION<3)?'custom_param':'customfield_params').'['.$row.'][allow_subscribe]', array_merge( array(array('id'=>'-1', 'name'=>JText::sprintf('VMCUSTOM_ACYBUYER_ALLOW_DEFAULT', JText::_($subscribe_modes[$field->allow_subscribe_default]['name'])))), $subscribe_modes), @@ -184,6 +189,15 @@ class plgVmCustomAcyMailing_subscribe_Buyer extends vmCustomPlugin { return $html; } + /** + * plgVmOnDisplayProductFEVM3 ... Called for all custom fields to display on the product details page + */ + function plgVmOnDisplayProductFEVM3(&$product,&$group) { + if ($group->custom_element != $this->_name) return ''; + $group->display .= $this->displayProduct($group); + return true; + } + /** * plgVmOnDisplayProductVariantFE ... Called for product variant custom fields to display on the product details page */ @@ -204,10 +218,20 @@ class plgVmCustomAcyMailing_subscribe_Buyer extends vmCustomPlugin { return true; } + function plgVmDeclarePluginParamsCustomVM3(&$data){ + return $this->declarePluginParams('custom', $data); + } + // TODO: really required??? + function plgVmGetTablePluginParams($psType, $name, $id, &$xParams, &$varsToPush){ + return $this->getTablePluginParams($psType, $name, $id, $xParams, $varsToPush); + } + + /** * We must reimplement this triggers for joomla 1.7 * vmplugin triggers note by Max Milbers */ + // TODO: Really required or deprecated? public function plgVmOnStoreInstallPluginTable($psType, $name) { return $this->onStoreInstallPluginTable($psType, $name); } @@ -250,7 +274,13 @@ class plgVmCustomAcyMailing_subscribe_Buyer extends vmCustomPlugin { } $customModel = VmModel::getModel('customfields'); foreach ($order['items'] as $item) { - $customs = $customModel->getproductCustomslist ($item->virtuemart_product_id); +// JFactory::getApplication()->enqueueMessage("plgVmConfirmedOrder, checking item: <pre>".print_r($item,1)."</pre>", 'error'); + if (VM_VERSION<3) { + $customs = $customModel->getproductCustomslist ($item->virtuemart_product_id); + } else { + $customs = $customModel->getCustomEmbeddedProductCustomFields (array($item->virtuemart_product_id)); + } +// JFactory::getApplication()->enqueueMessage("plgVmConfirmedOrder, CUSTOMS: <pre>".print_r($customs,1)."</pre>", 'error'); foreach ($customs as $field) { if ($field->custom_element != $this->_name) continue; $subscribe = ($field->subscribe_buyers>=0)?($field->subscribe_buyers):($field->subscribe_buyers_default); @@ -263,10 +293,10 @@ class plgVmCustomAcyMailing_subscribe_Buyer extends vmCustomPlugin { $notsubscribed = array_diff ($field->lists, $allsubscriptions); $this->subscribeUser($acyuid, $notsubscribed); // 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'); - // } +// foreach ($notsubscribed as $l) { +// $listname=$this->getAcyListname($l); +// JFactory::getApplication()->enqueueMessage(JText::sprintf('VMCUSTOM_ACYBUYER_ADDED_USER', $name, $email, $listname), 'info'); +// } } } } diff --git a/acymailing_subscribe_buyer.script.php b/acymailing_subscribe_buyer.script.php index fd72bcd..7b2c7fb 100644 --- a/acymailing_subscribe_buyer.script.php +++ b/acymailing_subscribe_buyer.script.php @@ -47,7 +47,7 @@ class plgVmCustomAcyMailing_subscribe_BuyerInstallerScript { // enabling plugin $db =& JFactory::getDBO(); - $db->setQuery('update #__extensions set enabled = 1 where type = "plugin" and element = "acy_subscribe_buyer" and folder = "vmcustom"'); + $db->setQuery('update #__extensions set enabled = 1 where type = "plugin" and element = "acymailing_subscribe_buyer" and folder = "vmcustom"'); $db->query(); return True; diff --git a/acymailing_subscribe_buyer.xml b/acymailing_subscribe_buyer.xml index 06c1f85..5312e3b 100644 --- a/acymailing_subscribe_buyer.xml +++ b/acymailing_subscribe_buyer.xml @@ -1,27 +1,41 @@ <?xml version="1.0" encoding="UTF-8" ?> -<install version="1.5" type="plugin" group="vmcustom" method="upgrade"> +<extension version="2.5" type="plugin" group="vmcustom" method="upgrade"> <name>VMCUSTOM_ACYBUYER</name> <creationDate>2014-04-27</creationDate> <author>Reinhold Kainhofer</author> <authorUrl>http://www.open-tools.net/</authorUrl> - <copyright>Copyright (C) 2013 Reinhold Kainhofer. All rights reserved.</copyright> + <copyright>Copyright (C) 2013-2014 Reinhold Kainhofer. All rights reserved.</copyright> <license>http://www.gnu.org/licenses/gpl.html GNU/GPL v3+</license> - <version>1.2.0</version> + <version>1.3.0</version> <description>VMCUSTOM_ACYBUYER_DESC</description> <files> <filename plugin="acymailing_subscribe_buyer">acymailing_subscribe_buyer.php</filename> <filename>acymailing_subscribe_buyer.script.php</filename> <folder>acymailing_subscribe_buyer</folder> <filename>index.html</filename> - <folder>language</folder> + <folder>language</folder> </files> <languages folder="language"> - <language tag="en-GB">en-GB/en-GB.plg_vmcustom_acymailing_subscribe_buyer.ini</language> - <language tag="de-DE">de-DE/de-DE.plg_vmcustom_acymailing_subscribe_buyer.ini</language> - <language tag="en-GB">en-GB/en-GB.plg_vmcustom_acymailing_subscribe_buyer.sys.ini</language> - <language tag="de-DE">de-DE/de-DE.plg_vmcustom_acymailing_subscribe_buyer.sys.ini</language> + <language tag="en-GB">en-GB/en-GB.plg_vmcustom_acymailing_subscribe_buyer.ini</language> + <language tag="de-DE">de-DE/de-DE.plg_vmcustom_acymailing_subscribe_buyer.ini</language> + <language tag="en-GB">en-GB/en-GB.plg_vmcustom_acymailing_subscribe_buyer.sys.ini</language> + <language tag="de-DE">de-DE/de-DE.plg_vmcustom_acymailing_subscribe_buyer.sys.ini</language> </languages> <scriptfile>acymailing_subscribe_buyer.script.php</scriptfile> + <vmconfig> + <fields name="params"> + <field name="subscribe_buyers_default" type="radio" scope="com_virtuemart" 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> + </field> + <field name="allow_subscribe_default" type="list" scope="com_virtuemart" default="0" label="VMCUSTOM_ACYBUYER_ALLOW_SUBSCRIBE" description="VMCUSTOM_ACYBUYER_ALLOW_SUBSCRIBE_DESC" > + <option value="0">VMCUSTOM_ACYBUYER_ALLOW_NONE</option> + <option value="1">VMCUSTOM_ACYBUYER_ALLOW_REGISTERED</option> + <option value="2">VMCUSTOM_ACYBUYER_ALLOW_ANONYMOUS</option> + </field> + </fields> + </vmconfig> + <params addpath="/administrator/components/com_virtuemart/elements"> <param type="vmjpluginwarning" /> <param name="subscribe_buyers_default" type="radio" default="1" label="VMCUSTOM_ACYBUYER_AUTO_SUBSCRIBE" description="VMCUSTOM_ACYBUYER_AUTO_SUBSCRIBE_DESC" > @@ -34,4 +48,4 @@ <option value="2">VMCUSTOM_ACYBUYER_ALLOW_ANONYMOUS</option> </param> </params> -</install> +</extension> diff --git a/language/de-DE/de-DE.plg_vmcustom_acymailing_subscribe_buyer.ini b/language/de-DE/de-DE.plg_vmcustom_acymailing_subscribe_buyer.ini index f090849..b4733c1 100644 --- a/language/de-DE/de-DE.plg_vmcustom_acymailing_subscribe_buyer.ini +++ b/language/de-DE/de-DE.plg_vmcustom_acymailing_subscribe_buyer.ini @@ -24,6 +24,6 @@ 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" +VMCUSTOM_ACYBUYER_SQL_ERROR="SQL Fehler! Bitte <a href='mailto:office@open-tools.net'>kontaktieren Sie den Autor</a> und geben Sie folgende Fehlermeldung an:<br/>%s" VMCUSTOM_ACYBUYER_ACYMAILING_NEEDED="Das Plugin 'VM Käufer zu AcyMailing Listen hinzufügen' benötigt, dass die AcyMailing Komponente installiert ist." diff --git a/language/en-GB/en-GB.plg_vmcustom_acymailing_subscribe_buyer.ini b/language/en-GB/en-GB.plg_vmcustom_acymailing_subscribe_buyer.ini index a38406d..c51db47 100644 --- a/language/en-GB/en-GB.plg_vmcustom_acymailing_subscribe_buyer.ini +++ b/language/en-GB/en-GB.plg_vmcustom_acymailing_subscribe_buyer.ini @@ -24,6 +24,6 @@ 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 <a href='mailto:reinhold@kainhofer.com'>contact the author</a> with the following information:<br/>%s" +VMCUSTOM_ACYBUYER_SQL_ERROR="SQL error, please <a href='mailto:office@open-tools.net'>contact the author</a> with the following information:<br/>%s" VMCUSTOM_ACYBUYER_ACYMAILING_NEEDED="The 'VM Subscribe Buyers to AcyMailing' plugin requires the AcyMailing Component to be installed" diff --git a/releases/plg_vmcustom_acymailing_subscribe_buyer_v1.3.zip b/releases/plg_vmcustom_acymailing_subscribe_buyer_v1.3.zip new file mode 100644 index 0000000000000000000000000000000000000000..62e1ecd79aa7775dabfa0e34f9f60490ae340fd8 GIT binary patch literal 11811 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 literal 0 HcmV?d00001 -- GitLab