Skip to content
Snippets Groups Projects
Commit 2ddc8d2c authored by Reinhold Kainhofer's avatar Reinhold Kainhofer
Browse files

Version 1.1: Fix permission handling for the link display (pending...), store statistics in sql

parent 048f92f1
No related branches found
No related tags found
No related merge requests found
BASE=downloads_for_sale
PLUGINTYPE=vmcustom
VERSION=1.0
VERSION=1.1
PLUGINFILES=$(BASE).php $(BASE).script.php $(BASE).xml index.html
......
......@@ -23,6 +23,8 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
function __construct(& $subject, $config) {
parent::__construct($subject, $config);
$this->_tablepkey = 'id';
$this->tableFields = array_keys($this->getTableSQLFields());
$varsToPush = array(
'media_id'=>array(0,'char'),
'invoice_link_type'=>array('text', 'char'),
......@@ -30,6 +32,7 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
'download_type'=>array('free_download','char'),
);
$this->setConfigParameterable('custom_params',$varsToPush);
$this->onStoreInstallPluginTable($this->_psType);
}
function getDownloadFiles () {
......@@ -43,39 +46,76 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
return $db->loadObject();
}
function checkDownloadable ($field, &$output) {
$userId = (int) JFactory::getUser()->get('id');
if ($field->download_type == 'free_download') {
return true;
} elseif ($field->download_type == 'registered_download') {
if ($userId<=0) {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_NOT_AUTHORIZED'), 'error');
}
return ($userId>0);
} elseif ($field->download_type == 'paid_download') {
$order_number = JRequest::getString('order_number', null);
$order_pass = JRequest::getString('order_pass', null);
$orderModel = VmModel::getModel('orders');
function getCustomfieldOrderitems ($field, $user, $show_warnings) {
$orderModel = VmModel::getModel('orders');
$order_number = JRequest::getString('order_number', null);
$order_pass = JRequest::getString('order_pass', null);
$orders = array();
if ($order_number && $order_pass) {
$order_id = $orderModel->getOrderIdByOrderPass ($order_number, $order_pass);
if ($order_id) {
$orders[] = $orderModel->getOrder($order_id);
}
if (empty($orders) && $show_warnings) {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_WRONG_PASSWD'), 'error');
}
} elseif ($order_number) {
// Check if user has access
$order_id = $orderModel->getOrderIdByOrderNumber ($order_number);
if ($order_id) {
$order = $orderModel->getOrder($order_id);
if ($order && in_array($order['details']['BT']->order_status, $this->status_allowed)) {
foreach ($order['items'] as $i) {
if ($i->virtuemart_product_id == $field->virtuemart_product_id) {
if (in_array($i->order_status, $this->status_allowed)) {
return $i->virtuemart_order_item_id;
} else {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_STATUS_NOT_AUTHORIZED'), 'error');
}
if ($order['details']['BT']->virtuemart_user_id == $user) {
$orders[] = $order;
} elseif ($show_warnings) {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_NOT_AUTHORIZED'), 'error');
}
} elseif ($show_warnings) {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_ORDER_NOT_FOUND'), 'error');
}
} else {
if ($user>0) {
$os = $orderModel->getOrdersList($user, true);
foreach ($os as $o) {
$orders[] = $orderModel->getOrder($o->virtuemart_order_id);
}
}
}
$prodid = $field->virtuemart_product_id;
if (empty($prodid)) {
JFactory::getApplication()->enqueueMessage(JText::sprintf("WARNING: no product ID given in custom field. Please contact the plugin developer and copy this message: <pre>%s</pre>", print_r($field,1)), 'error');
}
$orderitems = array();
foreach ($orders as $order) {
if ($order && in_array($order['details']['BT']->order_status, $this->status_allowed)) {
foreach ($order['items'] as $i) {
if ($i->virtuemart_product_id == $prodid) {
if (in_array($i->order_status, $this->status_allowed)) {
$orderitems[] = $i;
} elseif ($show_warnings) {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_STATUS_NOT_AUTHORIZED'), 'error');
}
}
} else {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_STATUS_NOT_AUTHORIZED'), 'error');
}
} else {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_WRONG_PASSWD'), 'error');
}
}
return $orderitems;
}
function checkDownloadable ($field, $orderitem=null, $show_warnings=false) {
// Free downloads are always allowed
if ($field->download_type == 'free_download') {
return true;
}
// For registered downloads it suffices to be logged in (that's not neccessary, giving
// the order nr/pwd should also work, so don't return false here!)
$userId = (int) JFactory::getUser()->get('id');
if (($field->download_type == 'registered_download') && ($userId>0)) {
return ($userId>0);
}
// In all other cases, check that the orderitem has the correct state
if ($orderitem && in_array($orderitem->order_status, $this->status_allowed)) {
return true;
}
return false;
}
......@@ -117,31 +157,66 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
}
function updateDownloadCounterSQL ($field, $orderitem) {
$db = JFactory::getDBO();
$sql = "SELECT `id` FROM `" . $this->_tablename . "` WHERE `virtuemart_customfield_id`=" . (int)$field->virtuemart_customfield_id .
" AND `virtuemart_order_item_id`=" . (int)($orderitem?$orderitem->virtuemart_order_item_id:0);
$user = (int)JFactory::getUser()->get('id');
$date = JFactory::getDate()->toMySQL();
$db->setQuery($sql);
$id = $db->loadResult();
if ($id) {
// Entry found, update downloaded
$sql = "UPDATE `" . $this->_tablename . "` SET `downloaded`=(`downloaded`+1), `modified_on` = '" . $date . "', `modified_by`=" . (int)$user . " WHERE `id`=" . (int)$id;
$db->setQuery($sql);
$db->query();
} else {
// New entry, insert with value 1
$sql = "INSERT INTO `" . $this->_tablename .
"` (`virtuemart_customfield_id`, `virtuemart_order_item_id`, `downloaded`, `created_on`, `created_by`) " .
"VALUES (" . (int)$field->virtuemart_customfield_id . ", " . (int)($orderitem?($orderitem->virtuemart_order_item_id):0) .
", 1, '" . $date . "', " . (int)$user . ")";
$db->setQuery($sql);
$db->query();
}
}
function plgVmOnSelfCallFE($type,$name,&$render) {
if ($name != $this->_name || $type != 'vmcustom') return false;
$handled = false;
$field_id = JRequest::getInt('customfield_id',0);
$customModel = VmModel::getModel('customfields');
if ($field_id) {
$field = $this->loadCustomfieldData ($field_id);
$this->parseCustomParams($field);
$orderitems = $this->getCustomfieldOrderitems ($field, JFactory::getUser()->get('id'), true);
$orderitem = empty($orderitems)?null:$orderitems[0];
if ($field) {
if ($this->checkDownloadable ($field, $render)) {
if ($this->checkDownloadable ($field, $orderitem, true)) {
// TODO: Update download counter in the mysql table
$this->updateDownloadCounterSQL ($field, $orderitem);
$handled = true;
$this->downloadFile ($field->media_id, $render);
return true;
} else {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_NOT_AUTHORIZED_UNKNOWN'), 'error');
// JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_NOT_AUTHORIZED_UNKNOWN'), 'error');
}
} else {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_LOAD_FAILURE'), 'error');
}
}
if (!$handled) {
$user = JFactory::getUser()->get('id');
// If we have an order number and password, display all downloads of that order, even if the user is not logged in:
$field_id = JRequest::getInt('customfield_id',0);
$order_number = JRequest::getString('order_number', null);
$order_pass = JRequest::getString('order_pass', null);
$orders = array();
if ($order_number || $order_pass) {
if ($order_number && $order_pass) {
$orderModel = VmModel::getModel('orders');
$order_id = $orderModel->getOrderIdByOrderPass ($order_number, $order_pass);
if ($order_id) {
......@@ -150,12 +225,22 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
if (empty($orders)) {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_WRONG_PASSWD'), 'error');
}
} elseif ($order_number) {
$orderModel = VmModel::getModel('orders');
$order_id = $orderModel->getOrderIdByOrderNumber ($order_number);
if ($order_id) {
$order = $orderModel->getOrder($order_id);
if ($order['details']['BT']->virtuemart_user_id == $user) {
$orders[] = $order;
}
}
if (empty($orders)) {
JFactory::getApplication()->enqueueMessage(JText::_('VMCUSTOM_DLSALE_ERROR_NOT_AUTHORIZED'), 'error');
}
} else {
$_currentUser = JFactory::getUser();
$cuid = $_currentUser->get('id');
if ($cuid>0) {
if ($user>0) {
$orderModel = VmModel::getModel('orders');
$os = $orderModel->getOrdersList($cuid, true);
$os = $orderModel->getOrdersList($user, true);
foreach ($os as $o) {
$orders[] = $orderModel->getOrder($o->virtuemart_order_id);
}
......@@ -163,7 +248,6 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
}
$customModel = VmModel::getModel('customfields');
$orderdownloads = array();
foreach ($orders as $order) {
if (!in_array($order['details']['BT']->order_status, $this->status_allowed)) {
......@@ -177,7 +261,7 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
$productinfo->downloads = array();
$customs = (array)$customModel->getproductCustomslist ($i->virtuemart_product_id);
foreach ($customs as $field) {
if ($field->custom_element == $this->_name) {
if (($field->custom_element == $this->_name) && ($this->checkDownloadable ($field, $i, false))) {
$productinfo->downloads[] = $this->createDownloadLink ($field, 'order', $field->invoice_link_type, $i);
}
}
......@@ -190,7 +274,7 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
}
}
print $this->renderByLayout('downloads', array($orderdownloads));
print $this->renderByLayout('downloads', array($orderdownloads, $order_number));
return true;
}
}
......@@ -251,6 +335,7 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
$_currentUser = JFactory::getUser();
$cuid = $_currentUser->get('id');
$this->parseCustomParams($field);
// TODO: Extract download statistics
switch ($field->download_type) {
case 'free_download': break;
case 'registered_download': if ($cuid<=0) return false; break;
......@@ -278,6 +363,30 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
return $this->renderByLayout($view.'_'.$type, array($url, $field, $media));
}
function createProductDownloadLinks ($field, $type) {
$return = '';
if ($type != 'none') {
$items = $this->getCustomfieldOrderitems ($field, JFactory::getUser()->get('id'), false);
foreach ($items as $i) {
if ($this->checkDownloadable ($field, $i, false)) {
$dllink = $this->createDownloadLink($field, "product", $type, $i);
if (!empty($dllink)) {
$return .= $dllink;
}
}
}
// Handle downloads without a corresponding order
if (empty($items) && $this->checkDownloadable ($field, null, false)) {
$dllink = $this->createDownloadLink($field, "product", $type, null);
if (!empty($dllink)) {
$return .= $dllink;
}
}
}
return $return;
}
/**
* plgVmOnDisplayProductVariantFE ... Called for product variant custom fields to display on the product details page
*/
......@@ -285,15 +394,10 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
// default return if it's not this plugin
if ($field->custom_element != $this->_name) return '';
$this->parseCustomParams($field);
$type = $field->product_link_type;
if ($type != 'none') {
$dllink = $this->createDownloadLink($field, "product", $type);
if (!empty($dllink)) {
$group->display .= $dllink;
return true;
} else {
return false;
}
$output = $this->createProductDownloadLinks ($field, $field->product_link_type);
if (!empty($output)) {
$group->display .= $output;
return true;
} else {
return false;
}
......@@ -305,17 +409,12 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
function plgVmOnDisplayProductFE( $product, &$idx,&$field){
// default return if it's not this plugin
if ($field->custom_element != $this->_name) return '';
$field->virtuemart_product_id = $product->virtuemart_product_id;
$this->parseCustomParams($field);
$type = $field->product_link_type;
if ($type != 'none') {
// The $field for non-cart-variant fields does NOT have the product_id set!
$field->virtuemart_product_id = $product->virtuemart_product_id;
$ret = $this->createDownloadLink($field, "product", $type);
if (!empty($ret)) {
$field->display .= $ret;
return true;
} else
return false;
$output = $this->createProductDownloadLinks ($field, $field->product_link_type);
if (!empty($output)) {
$field->display .= $output;
return true;
} else {
return false;
}
......@@ -343,23 +442,28 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
*/
function plgVmDisplayInOrderFE($item, $row, &$html) {
if (empty($item->productCustom->custom_element) or $item->productCustom->custom_element != $this->_name) return '';
$this->parseCustomParams($item->productCustom);
$type = $item->productCustom->product_link_type;
$type = $item->productCustom->invoice_link_type;
$return = false;
if ($type != 'none') {
$html .= $this->createDownloadLink($item->productCustom, "order", $type, $item);
return true;
} else {
return false;
if ($this->checkDownloadable ($item->productCustom, $item, false)) {
$dllink = $this->createDownloadLink($item->productCustom, "order", $type, $item);
if (!empty($dllink)) {
$html .= $dllink;
$return = true;
}
}
}
return $return;
}
/**
* We must reimplement this triggers for joomla 1.7
* vmplugin triggers note by Max Milbers
*/
public function plgVmOnStoreInstallPluginTable($psType) {
return $this->onStoreInstallPluginTable($psType);
public function plgVmOnStoreInstallPluginTable($psType, $name) {
return $this->onStoreInstallPluginTable($psType, $name);
}
function plgVmDeclarePluginParamsCustom($psType,$name,$id, &$data){
......@@ -374,23 +478,36 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
return $this->onDisplayEditBECustom($virtuemart_custom_id,$customPlugin);
}
/**
* This function is called, when the order is confirmed by the shopper.
*
* Here are the last checks done by payment plugins.
* The mails are created and send to vendor and shopper
* will show the orderdone page (thank you page)
*
*/
function plgVmConfirmedOrder($cart, $order) {
// TODO: Add record to the database to store # of downloads etc.
// TODO
JFactory::getApplication()->enqueueMessage("plgVmConfirmedOrder", 'error');
}
/**
* Create the database table for this plugin. So far, we don't store
* anything, so don't create the table, either.
* Create the database table for this plugin.
*/
public function getVmPluginCreateTableSQL() {
//return $this->createTableSQL('Spiral Downloads tracking table');
return $this->createTableSQL('Downloads for Sale tracking');
}
function getTableSQLFields() {
/* $SQLfields = array(
$SQLfields = array(
'id' => 'int(1) UNSIGNED NOT NULL AUTO_INCREMENT',
'virtuemart_customfield_id' => 'int(11) UNSIGNED NOT NULL DEFAULT 0',
'virtuemart_order_item_id' => 'int(11) UNSIGNED NULL DEFAULT 0',
'downloaded' => 'int(11) UNSIGNED NOT NULL DEFAULT 0',
);
return $SQLfields;*/
return array();
return $SQLfields;
}
}
......
......@@ -6,7 +6,7 @@
<authorUrl>http://www.kainhofer.com/</authorUrl>
<copyright>Copyright (C) 2013 Reinhold Kainhofer. All rights reserved.</copyright>
<license>http://www.gnu.org/licenses/gpl.html GNU/GPL v3+</license>
<version>1.0.0</version>
<version>1.1.0</version>
<description>VMCUSTOM_DLSALE_DESC</description>
<files>
<filename plugin="downloads_for_sale">downloads_for_sale.php</filename>
......
......@@ -42,8 +42,12 @@ if(JFile::exists(JPATH_SITE.DS.'plugins'.DS.'vmcustom'.DS.'downloads_for_sale'.D
</form>
</p>
<?php if (empty($viewData[0])) { ?>
<h2><?php echo JText::_('VMCUSTOM_DLSALE_DLPAGE_NO_DOWNLOADS'); ?></h2>
<?php if (empty($viewData[0])) {
if (empty($viewData[1])) { ?>
<h2><?php echo JText::_('VMCUSTOM_DLSALE_DLPAGE_NO_DOWNLOADS'); ?></h2>
<?php } else { ?>
<h2><?php echo JText::sprintf('VMCUSTOM_DLSALE_DLPAGE_ORDER_NO_DOWNLOADS', $viewData[1]); ?></h2>
<?php } ?>
<?php } else { ?>
<h2><?php echo JText::_('VMCUSTOM_DLSALE_DLPAGE_DOWNLOADS'); ?></h2>
......
......@@ -35,6 +35,7 @@ VMCUSTOM_DLSALE_ERROR_NOT_AUTHORIZED_UNKNOWN="Not authorized to download."
VMCUSTOM_DLSALE_DLPAGE_TITLE="Downloads for Sale"
VMCUSTOM_DLSALE_DLPAGE_BUTTON_VIEW="See Downloads"
VMCUSTOM_DLSALE_DLPAGE_NO_DOWNLOADS="No Downloads Available"
VMCUSTOM_DLSALE_DLPAGE_ORDER_NO_DOWNLOADS="No Downloads Available for order %s"
VMCUSTOM_DLSALE_DLPAGE_DOWNLOADS="Available Downloads"
VMCUSTOM_DLSALE_DLPAGE_ORDERPRODUCT="Order number %s: %s (%s)"
......
images/downloads_for_sale_-_downloadaread_menuitem1.png

95.5 KiB

File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment