Related
How can i use the data that will be stored when entered and on a click of a button certain fields will automatically fiilled in to an email template.
Array ( 'bookingsid', 'vtiger_bookings', 'bookingsid' ),);
/**
* Mandatory table for supporting custom fields.
*/
var $customFieldTable = Array('vtiger_bookingscf', 'bookingsid');
/**
* Mandatory for Saving, Include tables related to this module.
*/
var $tab_name = Array('vtiger_crmentity', 'vtiger_bookings', 'vtiger_bookingscf');
/**
* Mandatory for Saving, Include tablename and tablekey columnname here.
*/
var $tab_name_index = Array(
'vtiger_crmentity' => 'crmid',
'vtiger_bookings' => 'bookingsid',
'vtiger_bookingscf'=>'bookingsid');
/**
* Mandatory for Listing (Related listview)
*/
var $list_fields = Array (
/* Format: Field Label => Array(tablename, columnname) */
// tablename should not have prefix 'vtiger_'
'Name' => Array('bookings', 'name'),
'Assigned To' => Array('crmentity','smownerid')
);
var $list_fields_name = Array (
/* Format: Field Label => fieldname */
'Name' => 'name',
'Assigned To' => 'assigned_user_id',
);
// Make the field link to detail view
var $list_link_field = 'name';
// For Popup listview and UI type support
var $search_fields = Array(
/* Format: Field Label => Array(tablename, columnname) */
// tablename should not have prefix 'vtiger_'
'Name' => Array('bookings', 'name'),
'Assigned To' => Array('vtiger_crmentity','assigned_user_id'),
);
var $search_fields_name = Array (
/* Format: Field Label => fieldname */
'Name' => 'name',
'Assigned To' => 'assigned_user_id',
);
// For Popup window record selection
var $popup_fields = Array ('name');
// For Alphabetical search
var $def_basicsearch_col = 'name';
// Column value to use on detail view record text display
var $def_detailview_recname = 'name';
// Used when enabling/disabling the mandatory fields for the module.
// Refers to vtiger_field.fieldname values.
var $mandatory_fields = Array('name','assigned_user_id');
var $default_order_by = 'name';
var $default_sort_order='ASC';
function Bookings() {
$this->db = PearDatabase::getInstance();
}
/**
* Invoked when special actions are performed on the module.
* #param String Module name
* #param String Event Type
*/
function vtlib_handler($moduleName, $eventType) {
global $adb;
if($eventType == 'module.postinstall') {
// TODO Handle actions after this module is installed.
$this->init($moduleName);
} else if($eventType == 'module.disabled') {
// TODO Handle actions before this module is being uninstalled.
} else if($eventType == 'module.enabled') {
// TODO Handle actions before this module is being uninstalled.
} else if($eventType == 'module.preuninstall') {
// TODO Handle actions when this module is about to be deleted.
} else if($eventType == 'module.preupdate') {
// TODO Handle actions before this module is updated.
} else if($eventType == 'module.postupdate') {
// TODO Handle actions after this module is updated.
}
}
function get_emails($id, $cur_tab_id, $rel_tab_id, $actions=false) {
global $currentModule;
$related_module = vtlib_getModuleNameById($rel_tab_id);
require_once("modules/$related_module/$related_module.php");
$other = new $related_module();
vtlib_setup_modulevars($related_module, $other);
$returnset = '&return_module='.$currentModule.'&return_action=CallRelatedList&return_id='.$id;
$button = '';
$userNameSql = getSqlForNameInDisplayFormat(array('first_name'=>'vtiger_users.first_name', 'last_name' => 'vtiger_users.last_name'), 'Users');
$query = "SELECT CASE WHEN (vtiger_users.user_name NOT LIKE '') THEN $userNameSql ELSE vtiger_groups.groupname END AS user_name,
vtiger_activity.activityid, vtiger_activity.subject, vtiger_activity.activitytype, vtiger_crmentity.modifiedtime,
vtiger_crmentity.crmid, vtiger_crmentity.smownerid, vtiger_activity.date_start, vtiger_activity.time_start,
vtiger_seactivityrel.crmid as parent_id FROM vtiger_activity, vtiger_seactivityrel, vtiger_bookings, vtiger_users,
vtiger_crmentity LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid WHERE
vtiger_seactivityrel.activityid = vtiger_activity.activityid AND
vtiger_bookings.bookingsid = vtiger_seactivityrel.crmid AND vtiger_users.id = vtiger_crmentity.smownerid
AND vtiger_crmentity.crmid = vtiger_activity.activityid AND vtiger_bookings.bookingsid = $id AND
vtiger_activity.activitytype = 'Emails' AND vtiger_crmentity.deleted = 0";
$return_value = GetRelatedList($currentModule, $related_module, $other, $query, $button, $returnset);
if($return_value == null) $return_value = Array();
$return_value['CUSTOM_BUTTON'] = $button;
return $return_value;
}
/**
* When install module
* #param $moduleName
*/
public function init($moduleName) {
$module = Vtiger_Module::getInstance($moduleName);
// Enable Activities
$activityFieldTypeId = 34;
$this->addModuleRelatedToForEvents($module->name, $activityFieldTypeId);
// Enable ModTracker
require_once 'modules/ModTracker/ModTracker.php';
ModTracker::enableTrackingForModule($module->id);
// Enable Comments
$commentInstance = Vtiger_Module::getInstance('ModComments');
$commentRelatedToFieldInstance = Vtiger_Field::getInstance('related_to', $commentInstance);
$commentRelatedToFieldInstance->setRelatedModules(array($module->name));
// Customize Record Numbering
$prefix = 'NO';
if (strlen($module->name) >= 2) {
$prefix = substr($module->name, 0, 2);
$prefix = strtoupper($prefix);
}
$this->customizeRecordNumbering($module->name, $prefix, 1);
}
/**
* #param string $moduleName
* #param int $fieldTypeId
*/
public function addModuleRelatedToForEvents($moduleName, $fieldTypeId)
{
global $adb;
$sqlCheckProject = "SELECT * FROM `vtiger_ws_referencetype` WHERE fieldtypeid = ? AND type = ?";
$rsCheckProject = $adb->pquery($sqlCheckProject, array($fieldTypeId, $moduleName));
if ($adb->num_rows($rsCheckProject) pquery("INSERT INTO `vtiger_ws_referencetype` (`fieldtypeid`, `type`) VALUES (?, ?)",
array($fieldTypeId, $moduleName));
}
}
/**
* #param string $sourceModule
* #param string $prefix
* #param int $sequenceNumber
* #return array
*/
public function customizeRecordNumbering($sourceModule, $prefix = 'NO', $sequenceNumber = 1)
{
$moduleModel = Settings_Vtiger_CustomRecordNumberingModule_Model::getInstance($sourceModule);
$moduleModel->set('prefix', $prefix);
$moduleModel->set('sequenceNumber', $sequenceNumber);
$result = $moduleModel->setModuleSequence();
return $result;
}
/**
* Save the related module record information. Triggered from CRMEntity->saveentity method or updateRelations.php
* #param String This module name
* #param Integer This module record number
* #param String Related module name
* #param mixed Integer or Array of related module record number
*/
function save_related_module($module, $crmid, $with_module, $with_crmids) {
$adb = PearDatabase::getInstance();
if(!is_array($with_crmids)) $with_crmids = Array($with_crmids);
foreach($with_crmids as $with_crmid) {
if($with_module == 'Calendar') {
$checkpresence = $adb->pquery("SELECT crmid FROM vtiger_seactivityrel WHERE crmid = ? AND activityid = ?", Array($crmid, $with_crmids));
// Relation already exists? No need to add again
if ($checkpresence && $adb->num_rows($checkpresence))
continue;
$adb->pquery("INSERT INTO vtiger_seactivityrel(crmid, activityid) VALUES(?,?)", array($crmid, $with_crmids));
}else {
parent::save_related_module($module, $crmid, $with_module, $with_crmid);
}
}
}
}
I have a site build using Codeiginiter 1.0. It was crowdfunding site and using wepay auth. When user register it was redirect to wepay landing and after loging in to wepay it was redirect back to home page. But now an error appear.
A PHP Error was encountered
Severity: Notice
Message: Undefined property: stdClass::$account_uri
Filename: controllers/home.php
Line Number: 114
A PHP Error was encountered
Severity: Warning
Message: Cannot modify header information - headers already sent by (output started at /home/content/x/e/b/xebragroup3/html/ext_domains/undercoverfunder/system/core/Exceptions.php:185)
Filename: libraries/Session.php
Line Number: 675
Here is home.php
<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
class Home extends CI_Controller {
function __construct()
{
parent::__construct();
$this->load->helper(array('form','url'));
$this->load->library('form_validation');
$this->load->library('session');
$this->load->library('pagination');
$this->load->library('email');
$this->load->model('home_model');
$this->load->model('search_model');
$this->load->helper('wepay');
$this->load->library('tank_auth');
$this->lang->load('tank_auth');
}
function index()
{
$data['categories']= $this->home_model->getallCategories();
$data['home_active']='active';
$per_page = 12;
if($this->uri->segment(3)==''){ $off = 0; }else{ $off = $this->uri->segment(3); }
$result = $this->home_model->count_getallprojects();
$base_url = base_url().'/home/index/';
$data['projects'] = $this->home_model->getallprojects($off,$per_page);
$config['uri_segment'] = '3';
$total = count($result);
//code for pagging
$config['base_url'] = $base_url;
$config['total_rows'] = $total;
$config['per_page'] = $per_page;
$config['full_tag_open'] = '<span>';
$config['full_tag_close'] = '</span>';
$config['cur_tag_open'] = '<b>';
$config['cur_tag_close'] = '</b>';
$config['first_link'] = '« First';
$config['last_link'] = ' Last »';
$config['last_tag_open'] = '<span>';
$config['last_tag_close'] = '</span>';
$config['next_link'] = 'Next';
$config['next_tag_open'] = '<span>';
$config['next_tag_close'] = '</span>';
$config['prev_link'] = 'Prev';
$config['prev_tag_open'] = '<span>';
$config['prev_tag_close'] = '</span>';
$this->load->library('pagination',$result);
$this->pagination->initialize($config);
$this->load->view('frontend/home/home_view',$data);
}
function wepay()
{
if(isset($_GET['code']))
{
$url = wepayurl.$_GET['code'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5');
$response = curl_exec($ch);
curl_close($ch);
$response_r = json_decode($response);
if(isset($response_r))
{
if (!$this->tank_auth->is_logged_in()) {
//before login
$user_id = $this->session->userdata('ses_userid_lf');
$user_fname= $this->session->userdata('ses_name_lf');
}
else
{ //after login
$user_id = $this->session->userdata('user_id');
$user_fname = $this->session->userdata('front_username');
}
$data_wepay = array('user_id'=>$user_id,'wepay_user_id'=>$response_r->user_id,'wepay_user_access_token'=>$response_r->access_token);
$this->db->insert('wc_wepay_user_account_dtls',$data_wepay);
$client_id = wepay_clientid;
$client_secret = wepay_scrite;
$access_token = $response_r->access_token;
// change to useProduction for live environments
//Wepay::useStaging($client_id, $client_secret);
Wepay::useProduction($client_id, $client_secret);
$wepay = new WePay($access_token);
$res = $wepay->request('account/create/', array(
'name' => $user_fname,
'description' => 'Subscribed to Letsfund.it.'
));
if(!empty($res))
{
if (!$this->tank_auth->is_logged_in()) { $user_id = $this->session->userdata('ses_userid_lf'); }
else
{ $user_id = $this->session->userdata('user_id');}
$currdate = date('Y-m-d h:i:s');
$data = array('account_uri'=>$res->account_uri,'account_id'=>$res->account_id,'dt_created'=>$currdate);
$this->db->where('user_id',$user_id);
$this->db->update('wc_wepay_user_account_dtls',$data);
if (!$this->tank_auth->is_logged_in()) {
$this->session->set_flashdata('message','You have successfully registered. Check your email address to activate your account.');
//redirect('auth/register');
}
else{
$this->session->set_flashdata('message','You have successfully given permitted Undercoverfunder to manage your wepay account.');
//redirect('campaign');
}
}
}
}
if(isset($_GET['error']))
{
$this->session->set_flashdata('msg','You denied the request so your account is not activated.');
//redirect('auth/register');
}
} //end function
}
Session.php :
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* CodeIgniter
*
* An open source application development framework for PHP 5.1.6 or newer
*
* #package CodeIgniter
* #author ExpressionEngine Dev Team
* #copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
* #license http://codeigniter.com/user_guide/license.html
* #link http://codeigniter.com
* #since Version 1.0
* #filesource
*/
// ------------------------------------------------------------------------
/**
* Session Class
*
* #package CodeIgniter
* #subpackage Libraries
* #category Sessions
* #author ExpressionEngine Dev Team
* #link http://codeigniter.com/user_guide/libraries/sessions.html
*/
class CI_Session {
var $sess_encrypt_cookie = FALSE;
var $sess_use_database = FALSE;
var $sess_table_name = '';
var $sess_expiration = 7200;
var $sess_expire_on_close = FALSE;
var $sess_match_ip = FALSE;
var $sess_match_useragent = TRUE;
var $sess_cookie_name = 'ci_session';
var $cookie_prefix = '';
var $cookie_path = '';
var $cookie_domain = '';
var $cookie_secure = FALSE;
var $sess_time_to_update = 300;
var $encryption_key = '';
var $flashdata_key = 'flash';
var $time_reference = 'time';
var $gc_probability = 5;
var $userdata = array();
var $CI;
var $now;
/**
* Session Constructor
*
* The constructor runs the session routines automatically
* whenever the class is instantiated.
*/
public function __construct($params = array())
{
log_message('debug', "Session Class Initialized");
// Set the super object to a local variable for use throughout the class
$this->CI =& get_instance();
// Set all the session preferences, which can either be set
// manually via the $params array above or via the config file
foreach (array('sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', 'sess_expire_on_close', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', 'cookie_domain', 'cookie_secure', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key') as $key)
{
$this->$key = (isset($params[$key])) ? $params[$key] : $this->CI->config->item($key);
}
if ($this->encryption_key == '')
{
show_error('In order to use the Session class you are required to set an encryption key in your config file.');
}
// Load the string helper so we can use the strip_slashes() function
$this->CI->load->helper('string');
// Do we need encryption? If so, load the encryption class
if ($this->sess_encrypt_cookie == TRUE)
{
$this->CI->load->library('encrypt');
}
// Are we using a database? If so, load it
if ($this->sess_use_database === TRUE AND $this->sess_table_name != '')
{
$this->CI->load->database();
}
// Set the "now" time. Can either be GMT or server time, based on the
// config prefs. We use this to set the "last activity" time
$this->now = $this->_get_time();
// Set the session length. If the session expiration is
// set to zero we'll set the expiration two years from now.
if ($this->sess_expiration == 0)
{
$this->sess_expiration = (60*60*24*365*2);
}
// Set the cookie name
$this->sess_cookie_name = $this->cookie_prefix.$this->sess_cookie_name;
// Run the Session routine. If a session doesn't exist we'll
// create a new one. If it does, we'll update it.
if ( ! $this->sess_read())
{
$this->sess_create();
}
else
{
$this->sess_update();
}
// Delete 'old' flashdata (from last request)
$this->_flashdata_sweep();
// Mark all new flashdata as old (data will be deleted before next request)
$this->_flashdata_mark();
// Delete expired sessions if necessary
$this->_sess_gc();
log_message('debug', "Session routines successfully run");
}
// --------------------------------------------------------------------
/**
* Fetch the current session data if it exists
*
* #access public
* #return bool
*/
function sess_read()
{
// Fetch the cookie
$session = $this->CI->input->cookie($this->sess_cookie_name);
// No cookie? Goodbye cruel world!...
if ($session === FALSE)
{
log_message('debug', 'A session cookie was not found.');
return FALSE;
}
// Decrypt the cookie data
if ($this->sess_encrypt_cookie == TRUE)
{
$session = $this->CI->encrypt->decode($session);
}
else
{
// encryption was not used, so we need to check the md5 hash
$hash = substr($session, strlen($session)-32); // get last 32 chars
$session = substr($session, 0, strlen($session)-32);
// Does the md5 hash match? This is to prevent manipulation of session data in userspace
if ($hash !== md5($session.$this->encryption_key))
{
log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.');
$this->sess_destroy();
return FALSE;
}
}
// Unserialize the session array
$session = $this->_unserialize($session);
// Is the session data we unserialized an array with the correct format?
if ( ! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity']))
{
$this->sess_destroy();
return FALSE;
}
// Is the session current?
if (($session['last_activity'] + $this->sess_expiration) < $this->now)
{
$this->sess_destroy();
return FALSE;
}
// Does the IP Match?
if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI->input->ip_address())
{
$this->sess_destroy();
return FALSE;
}
// Does the User Agent Match?
if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 120)))
{
$this->sess_destroy();
return FALSE;
}
// Is there a corresponding session in the DB?
if ($this->sess_use_database === TRUE)
{
$this->CI->db->where('session_id', $session['session_id']);
if ($this->sess_match_ip == TRUE)
{
$this->CI->db->where('ip_address', $session['ip_address']);
}
if ($this->sess_match_useragent == TRUE)
{
$this->CI->db->where('user_agent', $session['user_agent']);
}
$query = $this->CI->db->get($this->sess_table_name);
// No result? Kill it!
if ($query->num_rows() == 0)
{
$this->sess_destroy();
return FALSE;
}
// Is there custom data? If so, add it to the main session array
$row = $query->row();
if (isset($row->user_data) AND $row->user_data != '')
{
$custom_data = $this->_unserialize($row->user_data);
if (is_array($custom_data))
{
foreach ($custom_data as $key => $val)
{
$session[$key] = $val;
}
}
}
}
// Session is valid!
$this->userdata = $session;
unset($session);
return TRUE;
}
// --------------------------------------------------------------------
/**
* Write the session data
*
* #access public
* #return void
*/
function sess_write()
{
// Are we saving custom data to the DB? If not, all we do is update the cookie
if ($this->sess_use_database === FALSE)
{
$this->_set_cookie();
return;
}
// set the custom userdata, the session data we will set in a second
$custom_userdata = $this->userdata;
$cookie_userdata = array();
// Before continuing, we need to determine if there is any custom data to deal with.
// Let's determine this by removing the default indexes to see if there's anything left in the array
// and set the session data while we're at it
foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
{
unset($custom_userdata[$val]);
$cookie_userdata[$val] = $this->userdata[$val];
}
// Did we find any custom data? If not, we turn the empty array into a string
// since there's no reason to serialize and store an empty array in the DB
if (count($custom_userdata) === 0)
{
$custom_userdata = '';
}
else
{
// Serialize the custom data array so we can store it
$custom_userdata = $this->_serialize($custom_userdata);
}
// Run the update query
$this->CI->db->where('session_id', $this->userdata['session_id']);
$this->CI->db->update($this->sess_table_name, array('last_activity' => $this->userdata['last_activity'], 'user_data' => $custom_userdata));
// Write the cookie. Notice that we manually pass the cookie data array to the
// _set_cookie() function. Normally that function will store $this->userdata, but
// in this case that array contains custom data, which we do not want in the cookie.
$this->_set_cookie($cookie_userdata);
}
// --------------------------------------------------------------------
/**
* Create a new session
*
* #access public
* #return void
*/
function sess_create()
{
$sessid = '';
while (strlen($sessid) < 32)
{
$sessid .= mt_rand(0, mt_getrandmax());
}
// To make the session ID even more secure we'll combine it with the user's IP
$sessid .= $this->CI->input->ip_address();
$this->userdata = array(
'session_id' => md5(uniqid($sessid, TRUE)),
'ip_address' => $this->CI->input->ip_address(),
'user_agent' => substr($this->CI->input->user_agent(), 0, 120),
'last_activity' => $this->now,
'user_data' => ''
);
// Save the data to the DB if needed
if ($this->sess_use_database === TRUE)
{
$this->CI->db->query($this->CI->db->insert_string($this->sess_table_name, $this->userdata));
}
// Write the cookie
$this->_set_cookie();
}
// --------------------------------------------------------------------
/**
* Update an existing session
*
* #access public
* #return void
*/
function sess_update()
{
// We only update the session every five minutes by default
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
{
return;
}
// Save the old session id so we know which record to
// update in the database if we need it
$old_sessid = $this->userdata['session_id'];
$new_sessid = '';
while (strlen($new_sessid) < 32)
{
$new_sessid .= mt_rand(0, mt_getrandmax());
}
// To make the session ID even more secure we'll combine it with the user's IP
$new_sessid .= $this->CI->input->ip_address();
// Turn it into a hash
$new_sessid = md5(uniqid($new_sessid, TRUE));
// Update the session data in the session data array
$this->userdata['session_id'] = $new_sessid;
$this->userdata['last_activity'] = $this->now;
// _set_cookie() will handle this for us if we aren't using database sessions
// by pushing all userdata to the cookie.
$cookie_data = NULL;
// Update the session ID and last_activity field in the DB if needed
if ($this->sess_use_database === TRUE)
{
// set cookie explicitly to only have our session data
$cookie_data = array();
foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
{
$cookie_data[$val] = $this->userdata[$val];
}
$this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));
}
// Write the cookie
$this->_set_cookie($cookie_data);
}
// --------------------------------------------------------------------
/**
* Destroy the current session
*
* #access public
* #return void
*/
function sess_destroy()
{
// Kill the session DB row
if ($this->sess_use_database === TRUE && isset($this->userdata['session_id']))
{
$this->CI->db->where('session_id', $this->userdata['session_id']);
$this->CI->db->delete($this->sess_table_name);
}
// Kill the cookie
setcookie(
$this->sess_cookie_name,
addslashes(serialize(array())),
($this->now - 31500000),
$this->cookie_path,
$this->cookie_domain,
0
);
// Kill session data
$this->userdata = array();
}
// --------------------------------------------------------------------
/**
* Fetch a specific item from the session array
*
* #access public
* #param string
* #return string
*/
function userdata($item)
{
return ( ! isset($this->userdata[$item])) ? FALSE : $this->userdata[$item];
}
// --------------------------------------------------------------------
/**
* Fetch all session data
*
* #access public
* #return array
*/
function all_userdata()
{
return $this->userdata;
}
// --------------------------------------------------------------------
/**
* Add or change data in the "userdata" array
*
* #access public
* #param mixed
* #param string
* #return void
*/
function set_userdata($newdata = array(), $newval = '')
{
if (is_string($newdata))
{
$newdata = array($newdata => $newval);
}
if (count($newdata) > 0)
{
foreach ($newdata as $key => $val)
{
$this->userdata[$key] = $val;
}
}
$this->sess_write();
}
// --------------------------------------------------------------------
/**
* Delete a session variable from the "userdata" array
*
* #access array
* #return void
*/
function unset_userdata($newdata = array())
{
if (is_string($newdata))
{
$newdata = array($newdata => '');
}
if (count($newdata) > 0)
{
foreach ($newdata as $key => $val)
{
unset($this->userdata[$key]);
}
}
$this->sess_write();
}
// ------------------------------------------------------------------------
/**
* Add or change flashdata, only available
* until the next request
*
* #access public
* #param mixed
* #param string
* #return void
*/
function set_flashdata($newdata = array(), $newval = '')
{
if (is_string($newdata))
{
$newdata = array($newdata => $newval);
}
if (count($newdata) > 0)
{
foreach ($newdata as $key => $val)
{
$flashdata_key = $this->flashdata_key.':new:'.$key;
$this->set_userdata($flashdata_key, $val);
}
}
}
// ------------------------------------------------------------------------
/**
* Keeps existing flashdata available to next request.
*
* #access public
* #param string
* #return void
*/
function keep_flashdata($key)
{
// 'old' flashdata gets removed. Here we mark all
// flashdata as 'new' to preserve it from _flashdata_sweep()
// Note the function will return FALSE if the $key
// provided cannot be found
$old_flashdata_key = $this->flashdata_key.':old:'.$key;
$value = $this->userdata($old_flashdata_key);
$new_flashdata_key = $this->flashdata_key.':new:'.$key;
$this->set_userdata($new_flashdata_key, $value);
}
// ------------------------------------------------------------------------
/**
* Fetch a specific flashdata item from the session array
*
* #access public
* #param string
* #return string
*/
function flashdata($key)
{
$flashdata_key = $this->flashdata_key.':old:'.$key;
return $this->userdata($flashdata_key);
}
// ------------------------------------------------------------------------
/**
* Identifies flashdata as 'old' for removal
* when _flashdata_sweep() runs.
*
* #access private
* #return void
*/
function _flashdata_mark()
{
$userdata = $this->all_userdata();
foreach ($userdata as $name => $value)
{
$parts = explode(':new:', $name);
if (is_array($parts) && count($parts) === 2)
{
$new_name = $this->flashdata_key.':old:'.$parts[1];
$this->set_userdata($new_name, $value);
$this->unset_userdata($name);
}
}
}
// ------------------------------------------------------------------------
/**
* Removes all flashdata marked as 'old'
*
* #access private
* #return void
*/
function _flashdata_sweep()
{
$userdata = $this->all_userdata();
foreach ($userdata as $key => $value)
{
if (strpos($key, ':old:'))
{
$this->unset_userdata($key);
}
}
}
// --------------------------------------------------------------------
/**
* Get the "now" time
*
* #access private
* #return string
*/
function _get_time()
{
if (strtolower($this->time_reference) == 'gmt')
{
$now = time();
$time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now));
}
else
{
$time = time();
}
return $time;
}
// --------------------------------------------------------------------
/**
* Write the session cookie
*
* #access public
* #return void
*/
function _set_cookie($cookie_data = NULL)
{
if (is_null($cookie_data))
{
$cookie_data = $this->userdata;
}
// Serialize the userdata for the cookie
$cookie_data = $this->_serialize($cookie_data);
if ($this->sess_encrypt_cookie == TRUE)
{
$cookie_data = $this->CI->encrypt->encode($cookie_data);
}
else
{
// if encryption is not used, we provide an md5 hash to prevent userside tampering
$cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
}
$expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time();
// Set the cookie
setcookie(
$this->sess_cookie_name,
$cookie_data,
$expire,
$this->cookie_path,
$this->cookie_domain,
$this->cookie_secure
);
}
// --------------------------------------------------------------------
/**
* Serialize an array
*
* This function first converts any slashes found in the array to a temporary
* marker, so when it gets unserialized the slashes will be preserved
*
* #access private
* #param array
* #return string
*/
function _serialize($data)
{
if (is_array($data))
{
foreach ($data as $key => $val)
{
if (is_string($val))
{
$data[$key] = str_replace('\\', '{{slash}}', $val);
}
}
}
else
{
if (is_string($data))
{
$data = str_replace('\\', '{{slash}}', $data);
}
}
return serialize($data);
}
// --------------------------------------------------------------------
/**
* Unserialize
*
* This function unserializes a data string, then converts any
* temporary slash markers back to actual slashes
*
* #access private
* #param array
* #return string
*/
function _unserialize($data)
{
$data = #unserialize(strip_slashes($data));
if (is_array($data))
{
foreach ($data as $key => $val)
{
if (is_string($val))
{
$data[$key] = str_replace('{{slash}}', '\\', $val);
}
}
return $data;
}
return (is_string($data)) ? str_replace('{{slash}}', '\\', $data) : $data;
}
// --------------------------------------------------------------------
/**
* Garbage collection
*
* This deletes expired session rows from database
* if the probability percentage is met
*
* #access public
* #return void
*/
function _sess_gc()
{
if ($this->sess_use_database != TRUE)
{
return;
}
srand(time());
if ((rand() % 100) < $this->gc_probability)
{
$expire = $this->now - $this->sess_expiration;
$this->CI->db->where("last_activity < {$expire}");
$this->CI->db->delete($this->sess_table_name);
log_message('debug', 'Session garbage collection performed.');
}
}
}
// END Session Class
/* End of file Session.php */
/* Location: ./system/libraries/Session.php */
I have the following magento helper class.
class CommissionJunction extends Mage_Core_Helper_Data
{
/**
* Get SKU, quantity, price and discount amount for each product in a given order
* #param object $order
* #return array
*/
private function _getOrderProductsList($order) {
$orderItems = $order->getAllItems();
$purchasedSkus = array();
$count_orderItems = count($orderItems);
for($i = 0; $i < $count_orderItems; $i++) {
$purchasedSkus[$i] = array(
'ITEM' => $orderItems[$i]['sku'],
'QTY' => number_format($orderItems[$i]['qty_ordered'],0), // no decimals
'AMT' => number_format($orderItems[$i]['price'],2) // 2 decimal places
'DCNT' => number_format(abs($orderItems[$i]['discount_amount']),2) */
);
}
return $purchasedSkus;
}
/**
* Get the Universal Data (JSON) Object for Commission Junction.
* This object contains the order details passed on to Commission Junction for reporting purposes
* on the Checkout Success / Order Confirmation page.
* Notes:
* - CID, TYPE AND CURRENCY are hard coded
* #param string $orderId
* #return JSON object Universal Data Object for Commission Junction $json_masterTmsUdp
*/
public function getCommissionJunctionUdo($orderId) {
$order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
$udo = array();
$udo['CID'] = 'XXXX';
$udo['TYPE'] = 'XXXX';
$udo['CURRENCY'] = 'USD';
$udo['OID'] = $orderId;
$udo['DISCOUNT'] = number_format(abs($order->discount_amount),2);
$order_coupon_code = $order->coupon_code;
if(!is_null($order_coupon_code) && !empty($order_coupon_code)) {
$udo['COUPON'] = $order_coupon_code;
}
$udo['PRODUCTLIST'] = self::_getOrderProductsList($order);
if(Mage::getModel('core/cookie')->get('aff_commissionjunction') == 'cjafflx') {
$udo['FIRECJ'] = "TRUE";
}
else {
$udo['FIRECJ'] = "FALSE";
}
$masterTmsUdo['CJ'] = $udo;
$json_masterTmsUdo = json_encode($masterTmsUdo);
return $json_masterTmsUdo;
}
}
And I found this site where they explain how to register a helper class
http://codegento.com/2011/02/creating-a-helper-class/
The only thing I dont know its:
Where in the magento structure should I add this php class?
Where is the config.xml I should edit?
User created classes should be placed in this folder:
app/code/community
Another issue, you should use the same naming convention for your class as Magento uses i.e.
MOduleNameSpace_ComissionJunction_Helper_Data
Also the config XML should be placed in your app/code/community/ MOduleNameSpace/ComissionJunction/etc folder
I'm having the following two classes:
Class I:
<?php
/**
* Wrapper class for the Envato marketplaces API
*/
class envato_api_wrapper {
protected $api_key;
protected $cache_dir = 'cache';
public $cache_expires = 2;
protected $public_url = 'http://marketplace.envato.com/api/edge/set.json';
public function __construct($api_key = null) {
if ( isset($api_key) ) $this->api_key = $api_key; // allow the user to pass the API key upon instantiation
}
/**
* Attach your API key.
*
* #param string $api_key Can be accessed on the marketplaces via My Account
* -> My Settings -> API Key
*/
public function set_api_key($api_key)
{
$this->api_key = $api_key;
}
/**
* Retrieve the value of your API KEY, if needed.
*
* #return string The requested API Key.
*/
public function get_api_key()
{
if ( ! isset($this->api_key) ) return 'No API Key is set.';
return $this->api_key;
}
/**
* Sets the cache directory for all API calls.
*
* #param string $cache_dir
*/
public function set_cache_dir($cache_dir)
{
$this->cache_dir = $cache_dir;
}
/**
* Retrieve the value of your cache directory, if needed.
*
* #return string The requested cache directory.
*/
public function get_cache_dir()
{
return $this->cache_dir;
}
/**
* Available sets => 'vitals', 'earnings-and-sales-by-month', 'statement', 'recent-sales', 'account', 'verify-purchase', 'download-purchase'
*
*/
public function private_user_data($user_name, $set, $purchase_code = null)
{
if ( ! isset($this->api_key) ) exit('You have not set an api key yet. $class->set_api_key(key)');
if (! isset($set) ) return 'Missing parameters';
$url = "http://marketplace.envato.com/api/edge/$user_name/$this->api_key/$set";
if ( !is_null($purchase_code) ) $url .= ":$purchase_code";
$url .= '.json';
$result = $this->fetch($url);
if ( isset($result->error) ) return 'Username, API Key, or purchase code is invalid.';
return $result->$set;
}
/**
* Can be used to verify if a person did in fact purchase your item.
*
* #param $user_name Author's username.
* #param $purchase_code - The buyer's purchase code. See Downloads page for
* receipt.
* #return object|bool If purchased, returns an object containing the details.
*/
public function verify_purchase($user_name, $purchase_code)
{
$validity = $this->private_user_data($user_name, 'verify-purchase', $purchase_code);
return isset($validity->buyer) ? $validity : false;
}
/**
* Retrieve details for your most recent sales.
*
* #param string $user_name The username attached to your API KEY.
* #param int $limit The number of sales to return.
* #return array A list of your recent sales.
*/
public function recent_sales($user_name, $limit = null)
{
$sales = $this->private_user_data($user_name, 'recent-sales');
return $this->apply_limit($sales, $limit);
}
/**
* Retrieve your account information -- balance, location, name, etc.
*
* #param string $user_name The username attached to your API KEY.
* #return array A list of account information for the user.
*/
public function account_information($user_name)
{
$private_data = $this->private_user_data($user_name, 'account');
return json_decode(json_encode($private_data), true);
}
/**
* Grab quick monthly stats - number of sales, income, etc.
*
* #param string $user_name The username attached to your API KEY.
* #param int $limit The number of months to return.
* #return array A list of sales figures, ordered by month.
*/
public function earnings_by_month($user_name, $limit = null)
{
$earnings = $this->private_user_data($user_name, 'earnings-and-sales-by-month');
return $this->apply_limit($earnings, $limit);
}
/**
* Generic method, to be used in combination with the marketplace API docs.
*
* #param string $user_name The user name of the seller to track.
* #return array The returned data wrapped in an array.
*/
public function public_user_data($user_name)
{
$url = preg_replace('/set/i', 'user:' . $user_name, $this->public_url);
return $this->fetch($url, 'user');
}
/**
* Retrieve the details for a specific marketplace item.
*
* #param string $item_id The id of the item you need information for.
* #return object Details for the given item.
*/
public function item_details($item_id)
{
$url = preg_replace('/set/i', 'item:' . $item_id, $this->public_url);
return $this->fetch($url, 'item');
}
/**
* Similar to new_files, but focuses on a specific author's files.
*
* #param string $user_name The desired username.
* #param string $marketplace_name The desired marketplace name.
* #param int $limit The number of files to return.
* #return array A list of recently added files by one user.
*/
public function new_files_from_user($user_name, $marketplace_name = 'themeforest', $limit = null)
{
$cache_path = "$this->cache_dir/$user_name-$marketplace_name-new_files";
$url = preg_replace('/set/i', 'new-files-from-user:' . $user_name . ',' . $marketplace_name, $this->public_url);
return $this->apply_limit( $this->fetch($url, 'new-files-from-user'), $limit );
}
/**
* Display the number of items the author has for sale by marketplace
*
* #param string $user_name The desired username.
*/
public function user_items_by_site($user_name)
{
$cache_path = "$this->cache_dir/$user_name";
$url = preg_replace('/set/i', 'user-items-by-site:' . $user_name, $this->public_url);
return $this->fetch($url, 'user-items-by-site');
}
/**
* Retrieves general marketplace member information.
*
* #param string $user_name The username to query.
* #return object Contains the requested user information.
*/
public function user_information($user_name)
{
$url = preg_replace('/set/i', 'user:' . $user_name, $this->public_url);
return $this->fetch($url, 'user');
}
/*
* Either fetches the desired data from the API and caches it, or fetches the cached version
*
* #param string $url The url to the API call
* #param string $set (optional) The name of the set to retrieve.
*/
protected function fetch($url, $set = null)
{
// Use the API url to generate the cache file name.
// So: http://marketplace.envato.com/api/edge/collection:739793.json
// Becomes: collection-739793.json
$cache_path = $this->cache_dir . '/' . str_replace(':', '-', substr(strrchr($url, '/'), 1));
if ( $this->has_expired($cache_path) ) {
// get fresh copy
$data = $this->curl($url);
if ($data) {
$data = isset($set) ? $data->{$set} : $data; // if a set is needed, update
} else exit('Could not retrieve data.');
$this->cache_it($cache_path, $data);
return $data;
} else {
// if available in cache, use that
return json_decode(file_get_contents($cache_path));
}
}
/**
* Filters returned result, according to the supplied $limit.
*
* #param string $orig_arr The original array to work on.
* #param int $limit Specifies the number of array items in the result.
* #return array A new array with a count equal to the passed $limit.
*/
public function apply_limit($orig_arr, $limit)
{
if ( !is_int($limit) ) return $orig_arr;
// Make sure that there are enough items to filter through...
if ( $limit > count($orig_arr) ) $limit = count($orig_arr);
$new_arr = array();
for ( $i = 0; $i <= $limit - 1; $i++ ) {
$new_arr[] = $orig_arr[$i];
}
return $new_arr;
}
/**
* General purpose function to query the marketplace API.
*
* #param string $url The url to access, via curl.
* #return object The results of the curl request.
*/
protected function curl($url)
{
if ( empty($url) ) return false;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
$data = json_decode($data);
return $data; // string or null
}
/*
* Caches the results request to keep from hammering the API
*
* #param string $cache_path - A path to the cache file
* #param string $data - The results from the API call - should be encoded
*/
protected function cache_it($cache_path, $data)
{
if ( !isset($data) ) return;
!file_exists($this->cache_dir) && mkdir($this->cache_dir);
file_put_contents( $cache_path, json_encode($data) );
return $cache_path;
}
/*
* Determines whether the provided file has expired yet
*
* #param string $cache_path The path to the cached file
* #param string $expires - In hours, how long the file should cache for.
*/
protected function has_expired($cache_path, $expires = null)
{
if ( !isset($expires) ) $expires = $this->cache_expires;
if ( file_exists($cache_path) ) {
return time() - $expires * 60 * 60 > filemtime($cache_path);
}
return true;
}
/*
* Helper function that deletes all of the files in your cache directory.
*/
public function clear_cache(){
array_map('unlink', glob("$this->cache_dir/*"));
}
}
Class II:
<?php
/**
* Operation Class for Envato API Wrapper
*/
class envato_api_class {
protected $api_key;
protected $username;
public $envato_api_wrapper;
public $path_to_envato_api_wrapper;
public function __construct($api_key = null, $username = null) {
if ( isset($api_key) ) {
$this->api_key = $api_key;
} elseif ( isset($username) ) {
$this->username = $username;
}
$this->path_to_envato_api_wrapper = 'envato_api_wrapper.php';
require($this->path_to_envato_api_wrapper);
$this->envato_api_wrapper = new envato_api_wrapper($api_key);
}
public function get_all_items_by_site() {
$items_by_marketplace = $this->envato_api_wrapper->user_items_by_site($this->username);
$marketplaces = array();
foreach ($items_by_marketplace as $key) {
$marketplaces[] = array(
'Marketplace' => $key->site,
'Items' => $key->items
);
}
foreach ($marketplaces as $key) {
$items[$key['Marketplace']] = $this->envato_api_wrapper->new_files_from_user($this->username, $key['Marketplace']);
}
return json_decode(json_encode($items), true);
}
public function get_all_items() {
$items_by_marketplace = $this->envato_api_wrapper->user_items_by_site($this->username);
$marketplaces = array();
$items = array();
$item = array();
foreach ($items_by_marketplace as $key) {
$marketplaces[] = array(
'Marketplace' => $key->site,
'Items' => $key->items
);
}
foreach ($marketplaces as $key) {
$items[$key['Marketplace']] = $this->envato_api_wrapper->new_files_from_user($this->username, $key['Marketplace']);
}
foreach ($items as $main_key) {
foreach ($main_key as $secondary_key) {
$item[] = array(
'ID' => $secondary_key->id,
'Item' => $secondary_key->item,
'URL' => $secondary_key->url,
'User' => $secondary_key->user,
'Thumb' => $secondary_key->thumbnail,
'Sales' => $secondary_key->sales,
'Rating' => $secondary_key->rating,
'Cost' => $secondary_key->cost,
'Uploaded' => $secondary_key->uploaded_on,
'Tags' => $secondary_key->tags,
'Category' => $secondary_key->category,
'Preview' => $secondary_key->live_preview_url
);
}
}
return $item;
}
}
?>
And I'm trying to execute the following code in another file, three levels above where the classes are located:
<?php
require 'assets/class/envato/envato_api_class.php';
$api_key = 'some_key_here';
$username = 'some_username_here';
$envato = new envato_api_class($api_key, $username);
$items = $envato->get_all_items();
function rating($cluster) {
for ($i = 1; $i <= $cluster; $i++) {
echo '<img src="assets/gfx/filled-star.png" alt="Rating" />';
}
$empty = 5 - $cluster;
if ($empty > 0) {
for ($i = 0; $i < $empty; $i++) {
echo '<img src="assets/gfx/empty-star.png" alt="Rating" />';
}
}
}
// Adding Rows instead of altogether...
$halfway = floor(count($items)/2);
$count=0;
echo '<div class="item-row">';
foreach ($items as $key) {
// Check if we can add the second row
if($count==$halfway){
echo '</div><div class="item-row">';
}
$count++;
echo '<div class="product id-'.$key['ID'].'">';
echo '<div class="description">';
echo '<div class="thumb">';
echo '<i class="icon"><img src="'.$key['Thumb'].'" alt="Thumb"/><span class="preview" data-image-link="'.$key['Preview'].'"><img src="assets/gfx/zoom-icon.png" alt="Zoom"/></span></i>';
echo '</div>';
echo '<div class="info">';
echo '<div class="sales">';
echo '<div class="icon">';
echo '<img src="assets/gfx/sales-icon.png" alt="Sales Icon"/>';
echo '</div>';
echo '<div class="text">';
echo '<p>'.$key['Sales'].'</p>';
echo '</div>';
echo '</div>';
echo '<div class="rating">';
rating($key['Rating']);
echo '</div>';
echo '</div>';
echo '</div>';
echo '<div class="purchase">';
echo '<div class="info">';
echo '<i class="icon"><span class="tooltip">$ '.$key['Cost'].'</span></i>';
echo '</div>';
echo '<div class="proceed">';
echo '<a class="button" href="'.$key['URL'].'?ref='.$username.'">Purchase</a>';
echo '</div>';
echo '</div>';
echo '</div>';
}
echo '</div>'; // End Item Row
?>
But when testing on localhost I get the following error:
Notice: Undefined property: stdClass::$user-items-by-site in C:\xampp\htdocs\Envato\assets\class\envato\envato_api_wrapper.php on line 233
Can someone tell me why am I getting that error ? What am I doing wrong there ?
You get that error because of this line (198):
return $this->fetch($url, 'user-items-by-site');
In combination with line 233:
$data = isset($set) ? $data->{$set} : $data; // if a set is needed, update
You're apparently trying to access a member that does not exist.
Because the data comes from a remote source and is then parsed as JSON, we probably can't help much more.
In Magento I am trying to create a Credit Memo API and have already found a good starting point. That allows me to create credit memos. The one thing that user is able to do from the front end that I can not see how to replicate is if the user creates a credit memo from the front end they get a "Refund to Store Credit" option which I need to add to the API. How do you refund a credit memo to a store credit? When looking through the Creditmemo.php file in Magento I do not see any methods pertaining to creating a store credit for the credit memo.
Below is the credit memo API I found on the Magento Forums
class Mage_Sales_Model_Order_Creditmemo_Api extends Mage_Sales_Model_Api_Resource
{
public function __construct()
{
}
/**
* Retrive creditmemos by filters
*
* #param array $filters
* #return array
*/
public function items($filters = null)
{
//TODO: add full name logic
$collection = Mage::getResourceModel('sales/order_creditmemo_collection')
->addAttributeToSelect('increment_id')
->addAttributeToSelect('state');
$result = array();
foreach ($collection as $creditmemo) {
$result[] = $this->_getAttributes($creditmemo, 'creditmemo');
}
return $result;
}
/**
* Retrieve creditmemo information
*
* #param string $creditmemoId
* #return array
*/
public function info($creditmemoId)
{
$creditmemo = Mage::getModel('sales/order_creditmemo')->load($creditmemoId);
if (!$creditmemo->getId()) {
$this->_fault('not_exists');
}
$result = $this->_getAttributes($creditmemo, 'creditmemo');
$result['order_increment_id'] = $creditmemo->getOrderIncrementId();
$result['items'] = array();
foreach ($creditmemo->getAllItems() as $item) {
$result['items'][] = $this->_getAttributes($item, 'creditmemo_item');
}
$result['comments'] = array();
foreach ($creditmemo->getCommentsCollection() as $comment) {
$result['comments'][] = $this->_getAttributes($comment, 'creditmemo_comment');
}
return $result;
}
/**
* Create creditmemo
* We can save only new creditmemo. Existing creditmemos are not editable
*/
/**
* Create new creditmemo from order
*
* #param array $data // Built the with the same structure as the AdminHtml form used on backend.
* #param string $data[order_increment_id]
* #param integer $data[invoice_id]
* #param array $data[creditmemo][items] // for each of the items on order/invoice
* #param array $data[creditmemo][items][{item_id}] // item_id from sales_flat_order_item
* #param boolean $data[creditmemo][items][{item_id}]['back_to_stock']
* #param integer $data[creditmemo][items][{item_id}]['qty'] // Qty to return
* #param string $data[creditmemo][comment_text]
* #param string $data[creditmemo][comment_customer_notify]
* #param float $data[creditmemo][shipping_amount]
* #param float $data[creditmemo][adjustment_positive]
* #param float $data[creditmemo][adjustment_negative]
* #param booleam $data[creditmemo][do_offline]
* #param boolean $data[creditmemo][send_email]
* #return array
*/
public function create($data = array())
{
$this->tempData = $data;
try {
$creditmemo = $this->_initCreditmemo();
if ($creditmemo){
if (($creditmemo->getGrandTotal() <=0) && (!$creditmemo->getAllowZeroGrandTotal())) {
$this->_fault('credit_total', $e->getMessage());
}
$comment = '';
if (!empty($data['creditmemo']['comment_text'])) {
$creditmemo->addComment($data['creditmemo']['comment_text'], isset($data['creditmemo']['comment_customer_notify']));
if (isset($data['creditmemo']['comment_customer_notify'])) {
$comment = $data['creditmemo']['comment_text'];
}
}
if (isset($data['creditmemo']['do_refund'])) {
$creditmemo->setRefundRequested(true);
}
if (isset($data['creditmemo']['do_offline'])) {
$creditmemo->setOfflineRequested((bool)(int)$data['creditmemo']['do_offline']);
$this->tempData['message'][] = 'The credit memo was done offline';
}
$creditmemo->register();
if (!empty($data['creditmemo']['send_email'])) {
$creditmemo->setEmailSent(true);
}
$creditmemo->getOrder()->setCustomerNoteNotify(!empty($data['creditmemo']['send_email']));
$this->_saveCreditmemo($creditmemo);
$creditmemo->sendEmail(!empty($data['creditmemo']['send_email']), $comment);
$this->tempData['message'][] = 'The credit memo has been created.';
}
} catch (Mage_Core_Exception $e) {
$this->_fault('data_invalid', $e->getMessage());
}
return $this->tempData;
}
protected function _saveCreditmemo($creditmemo)
{
$transactionSave = Mage::getModel('core/resource_transaction')
->addObject($creditmemo)
->addObject($creditmemo->getOrder());
if ($creditmemo->getInvoice()) {
$transactionSave->addObject($creditmemo->getInvoice());
}
$transactionSave->save();
return;
}
/**
* Initialize creditmemo model instance
*
* #return Mage_Sales_Model_Order_Creditmemo
*/
protected function _initCreditmemo($update = false)
{
$this->tempData['message'][] = 'init credit memo.';
$creditmemo = false;
$creditmemoId = $this->tempData['creditmemo_id'];
$orderIncrementId = $this->tempData['order_increment_id'];
$invoiceId = $this->tempData['invoice_id'];
if ($creditmemoId) {
$creditmemo = Mage::getModel('sales/order_creditmemo')->load($creditmemoId);
} elseif ($orderIncrementId) {
$data = $this->tempData['creditmemo'];
$order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
if ($invoiceId) {
$invoice = Mage::getModel('sales/order_invoice')
->load($invoiceId)
->setOrder($order);
$this->tempData['message'][] = 'loaded_invoice_number: '.$invoice->getId();
}
if (!$order->canCreditmemo()) {
$this->tempData['message'][] = 'cannot create credit memo';
if(!$order->isPaymentReview())
{
$this->tempData['message'][] = 'cannot credit memo Payment is in review';
}
if(!$order->canUnhold())
{
$this->tempData['message'][] = 'cannot credit memo Order is on hold';
}
if(abs($order->getTotalPaid()-$order->getTotalRefunded())<.0001)
{
$this->tempData['message'][] = 'cannot credit memo Amount Paid is equal or less than amount refunded';
}
if($order->getActionFlag('edit') === false)
{
$this->tempData['message'][] = 'cannot credit memo Action Flag of Edit not set';
}
if ($order->hasForcedCanCreditmemo()) {
$this->tempData['message'][] = 'cannot credit memo Can Credit Memo has been forced set';
}
return false;
}
if(isset($data['items'])) {$savedData = $data['items'];} else { $savedData = array();}
$qtys = array();
$backToStock = array();
foreach ($savedData as $orderItemId =>$itemData) {
if (isset($itemData['qty'])) {
$qtys[$orderItemId] = $itemData['qty'];
}
if (isset($itemData['back_to_stock'])) {
$backToStock[$orderItemId] = true;
}
}
$data['qtys'] = $qtys;
$service = Mage::getModel('sales/service_order', $order);
if ($invoice) {
$creditmemo = $service->prepareInvoiceCreditmemo($invoice, $data);
} else {
$creditmemo = $service->prepareCreditmemo($data);
}
/**
* Process back to stock flags
*/
foreach ($creditmemo->getAllItems() as $creditmemoItem) {
$orderItem = $creditmemoItem->getOrderItem();
$parentId = $orderItem->getParentItemId();
if (isset($backToStock[$orderItem->getId()])) {
$creditmemoItem->setBackToStock(true);
} elseif ($orderItem->getParentItem() && isset($backToStock[$parentId]) && $backToStock[$parentId]) {
$creditmemoItem->setBackToStock(true);
} elseif (empty($savedData)) {
$creditmemoItem->setBackToStock(Mage::helper('cataloginventory')->isAutoReturnEnabled());
} else {
$creditmemoItem->setBackToStock(false);
}
$this->tempData['message'][] = $orderItem->getId();
}
}
return $creditmemo;
}
} // Class Mage_Sales_Model_Order_Creditmemo_Api End
You can create Credit Memo using default API of magento which is salesOrderCreditmemoCreate.
Here's a magento commerce link that may help you : LINK
public function create($orderIncrementId, $creditmemoData = null, $comment = null, $notifyCustomer = false,
$includeComment = false, $refundToStoreCreditAmount = null)
{
/** #var $order Mage_Sales_Model_Order */
$order = Mage::getModel('sales/order')->load($orderIncrementId, 'increment_id');
if (!$order->getId()) {
$this->_fault('order_not_exists');
}
if (!$order->canCreditmemo()) {
$this->_fault('cannot_create_creditmemo');
}
$creditmemoData = $this->_prepareCreateData($creditmemoData);
/** #var $service Mage_Sales_Model_Service_Order */
$service = Mage::getModel('sales/service_order', $order);
/** #var $creditmemo Mage_Sales_Model_Order_Creditmemo */
$creditmemo = $service->prepareCreditmemo($creditmemoData);
// refund to Store Credit
if ($refundToStoreCreditAmount) {
// check if refund to Store Credit is available
if ($order->getCustomerIsGuest()) {
$this->_fault('cannot_refund_to_storecredit');
}
$refundToStoreCreditAmount = max(
0,
min($creditmemo->getBaseCustomerBalanceReturnMax(), $refundToStoreCreditAmount)
);
if ($refundToStoreCreditAmount) {
$refundToStoreCreditAmount = $creditmemo->getStore()->roundPrice($refundToStoreCreditAmount);
$creditmemo->setBaseCustomerBalanceTotalRefunded($refundToStoreCreditAmount);
$refundToStoreCreditAmount = $creditmemo->getStore()->roundPrice(
$refundToStoreCreditAmount*$order->getStoreToOrderRate()
);
// this field can be used by customer balance observer
$creditmemo->setBsCustomerBalTotalRefunded($refundToStoreCreditAmount);
// setting flag to make actual refund to customer balance after credit memo save
$creditmemo->setCustomerBalanceRefundFlag(true);
}
}
$creditmemo->setPaymentRefundDisallowed(true)->register();
// add comment to creditmemo
if (!empty($comment)) {
$creditmemo->addComment($comment, $notifyCustomer);
}
try {
Mage::getModel('core/resource_transaction')
->addObject($creditmemo)
->addObject($order)
->save();
// send email notification
$creditmemo->sendEmail($notifyCustomer, ($includeComment ? $comment : ''));
} catch (Mage_Core_Exception $e) {
$this->_fault('data_invalid', $e->getMessage());
}
return $creditmemo->getIncrementId();
}