Undefined property | Error when using two classes - php

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.

Related

How can i use all the data collected and by click of button have it inserted into an email template

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);
}
}
}
}

Simple PHP template class

I wanted separate my HTML from PHP so after searching I found a great little php class that just do the trick. Only issue that I try merging 2 templates together but it doesn’t work.
Here is the original class that i found from below website
http://www.broculos.net/2008/03/how-to-make-simple-html-template-engine.html#.WCsa8CTy2ng
class Template {
/**
* The filename of the template to load.
*
* #access protected
* #var string
*/
protected $file;
/**
* An array of values for replacing each tag on the template (the key for each value is its corresponding tag).
*
* #access protected
* #var array
*/
protected $values = array();
/**
* Creates a new Template object and sets its associated file.
*
* #param string $file the filename of the template to load
*/
public function __construct($file) {
$this->file = $file;
}
/**
* Sets a value for replacing a specific tag.
*
* #param string $key the name of the tag to replace
* #param string $value the value to replace
*/
public function set($key, $value) {
$this->values[$key] = $value;
}
/**
* Outputs the content of the template, replacing the keys for its respective values.
*
* #return string
*/
public function output() {
/**
* Tries to verify if the file exists.
* If it doesn't return with an error message.
* Anything else loads the file contents and loops through the array replacing every key for its value.
*/
if (!file_exists($this->file)) {
return "Error loading template file ($this->file).<br />";
}
$output = file_get_contents($this->file);
foreach ($this->values as $key => $value) {
$tagToReplace = "[#$key]";
$output = str_replace($tagToReplace, $value, $output);
}
return $output;
}
/**
* Merges the content from an array of templates and separates it with $separator.
*
* #param array $templates an array of Template objects to merge
* #param string $separator the string that is used between each Template object
* #return string
*/
static public function merge($templates, $separator = "\n") {
/**
* Loops through the array concatenating the outputs from each template, separating with $separator.
* If a type different from Template is found we provide an error message.
*/
$output = "";
foreach ($templates as $template) {
$content = (get_class($template) !== "Template")
? "Error, incorrect type - expected Template."
: $template->output();
$output .= $content . $separator;
}
return $output;
}
}
Code that work
$post = new Template("post.tpl");
$post->set("post_title", $post_title);
$post->set("post_description", $post_description);
$post->set("content", $post->output());
echo $post->output();
Even when I want to loop if I add the code it works fine. But then I try to merge two template files together
all_posts.tpl
<div class=”posts”>
<h1>[#page_title]</</h1>
[#display_posts]
</div>
display_posts.tpl
<div class=”post”>
<h2>[#display_title]</h2>
<p>[#display_description]</p>
</div>
So what I want to do now is to push display_posts.tpl to all_posts.tpl and replace the tag [#display_posts]
So in my php I did below
$post = new Template("all_posts.tpl ");
$post->set("page_title", "All Posts");
echo $post->output();
//created a array from a mysqli loop
$post_set = array();
while ($post_row = mysqli_fetch_array($posts)){
$post_title = $post_row['title'];
$post_description = $post_row['description'];
$post_set[] = array(
"display_title" => $post_title,
"display_description" => $post_description
);
}
foreach ($post_set as $posts) {
$row = new Template("list_users_row.tpl");
foreach ($posts as $key => $value) {
$row->set($key, $value);
}
$postsTemplates[] = $posts;
}
// here i try to merge template
$postsContents = Template::merge($postsTemplates);
$layout->set("content", $postsContents->output());
echo $layout->output();
But this is throwing off a error set() is not an function. Could someone help me out to figure out this? I’m still in the process of learning php classes.
The reason why $layout->set() does not work is because $layout is not a Template Object. In your code you use $post = new Template("all_posts.tpl ");. This makes $post a Template object that can use the set() function in your Template class.
So you should do: $layout = new Template(....) and than you can call $layout->set().
In the tutorial they do the same:
include("template.class.php");
$profile = new Template("user_profile.tpl");
$profile->set("username", "monk3y");
$profile->set("photoURL", "photo.jpg");
$profile->set("name", "Monkey man");
$profile->set("age", "23");
$profile->set("location", "Portugal");
$layout = new Template("layout.tpl");
$layout->set("title", "User profile");
$layout->set("content", $profile->output());
echo $layout->output();
Hope this helps.

Error on site using CI v 1.0

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 */

Conflict between the extensions SCP (Simple Configurable Products) and Firegento German Setup

I've just installed the Magento extension Firegento German Setup and it works fine. Unfortunately another extension SCP (Simple Configurable Products), shows some undesired behavior now. The field "Price from" - which is created by SCP for articles - vanishes after the installation of Firegento German Setup. When un-installing Firegento again, SCP shows the field "Price from" as before. Obviously, the SCP field "Price from" is overridden by Firegento. Both extensions have their own "price.php" and I guess the conflict is with these two files. Does anyone know a solution? Please help, thanks in advance.
Mario
Below the price.php of the extension SCP Simple Configurable Products
public function _toHtml() {
$htmlToInsertAfter = '<div class="price-box">';
if ($this->getTemplate() == 'catalog/product/price.phtml') {
$product = $this->getProduct();
if (is_object($product) && $product->isConfigurable()) {
$extraHtml = '<span class="label" id="configurable-price-from-'
. $product->getId()
. $this->getIdSuffix()
. '"><span class="configurable-price-from-label">';
if ($product->getMaxPossibleFinalPrice() != $product->getFinalPrice()) {
$extraHtml .= $this->__('Price From:');
}
$extraHtml .= '</span></span>';
$priceHtml = parent::_toHtml();
#manually insert extra html needed by the extension into the normal price html
return substr_replace($priceHtml, $extraHtml, strpos($priceHtml, $htmlToInsertAfter)+strlen($htmlToInsertAfter),0);
}
}
return parent::_toHtml();
}
And here comes the price.php of the extension Firegento_
*/
public function _toHtml()
{
$html = trim(parent::_toHtml());
if (empty($html) || !Mage::getStoreConfigFlag('catalog/price/display_block_below_price')) {
return $html;
}
if (!in_array($this->getTemplate(), $this->_tierPriceDefaultTemplates)) {
$htmlObject = new Varien_Object();
$htmlObject->setParentHtml($html);
$htmlTemplate = $this->getLayout()->createBlock('core/template')
->setTemplate('germansetup/price_info.phtml')
->setFormattedTaxRate($this->getFormattedTaxRate())
->setIsIncludingTax($this->isIncludingTax())
->setIsIncludingShippingCosts($this->isIncludingShippingCosts())
->setIsShowShippingLink($this->isShowShippingLink())
->setIsShowWeightInfo($this->getIsShowWeightInfo())
->setFormattedWeight($this->getFormattedWeight())
->toHtml();
$htmlObject->setHtml($htmlTemplate);
$this->_addDeliveryTimeHtml($htmlObject);
Mage::dispatchEvent('germansetup_after_product_price',
array(
'html_obj' => $htmlObject,
'block' => $this,
)
);
$html = $htmlObject->getPrefix();
$html .= $htmlObject->getParentHtml();
$html .= $htmlObject->getHtml();
$html .= $htmlObject->getSuffix();
}
return $html;
}
/**
* Add delivery time on category pages only
*
* #param $htmlObject
*/
protected function _addDeliveryTimeHtml($htmlObject)
{
if (!Mage::getStoreConfigFlag('catalog/price/display_delivery_time_on_categories')) {
return;
}
$pathInfo = Mage::app()->getRequest()->getPathInfo();
if (strpos($pathInfo, 'catalog/category/view') !== false
|| strpos($pathInfo, 'catalogsearch/result') !== false) {
if ($this->getProduct()->getDeliveryTime()) {
$html = '<p class="delivery-time">';
$html .= $this->__('Delivery Time') . ': ' . $this->getProduct()->getDeliveryTime();
$html .= '</p>';
$htmlObject->setSuffix($html);
}
}
}
/**
* Read tax rate from current product.
*
* #return string
*/
public function getTaxRate()
{
$taxRateKey = 'tax_rate_'.$this->getProduct()->getId();
if (!$this->getData($taxRateKey)) {
$this->setData($taxRateKey, $this->_loadTaxCalculationRate($this->getProduct()));
}
return $this->getData($taxRateKey);
}
/**
* Retrieves formatted string of tax rate for user output
*
* #return string
*/
public function getFormattedTaxRate()
{
if ($this->getTaxRate() === null
|| $this->getProduct()->getTypeId() == 'bundle'
) {
return '';
}
$locale = Mage::app()->getLocale()->getLocaleCode();
$taxRate = Zend_Locale_Format::toFloat($this->getTaxRate(), array('locale' => $locale));
return $this->__('%s%%', $taxRate);
}
/**
* Returns whether or not the price contains taxes
*
* #return bool
*/
public function isIncludingTax()
{
if (!$this->getData('is_including_tax')) {
$this->setData('is_including_tax', Mage::getStoreConfig('tax/display/type'));
}
return $this->getData('is_including_tax');
}
/**
* Returns whether or not the price contains taxes
*
* #return bool
*/
public function isIncludingShippingCosts()
{
if (!$this->getData('is_including_shipping_costs')) {
$this->setData(
'is_including_shipping_costs',
Mage::getStoreConfig('catalog/price/including_shipping_costs')
);
}
return $this->getData('is_including_shipping_costs');
}
/**
* Returns whether the shipping link needs to be shown
* on the frontend or not.
*
* #return bool
*/
public function isShowShippingLink()
{
$productTypeId = $this->getProduct()->getTypeId();
$ignoreTypeIds = array('virtual', 'downloadable');
if (in_array($productTypeId, $ignoreTypeIds)) {
return false;
}
return true;
}
/**
* Gets tax percents for current product
*
* #param Mage_Catalog_Model_Product $product
* #return string
*/
protected function _loadTaxCalculationRate(Mage_Catalog_Model_Product $product)
{
$taxPercent = $product->getTaxPercent();
if (is_null($taxPercent)) {
$taxClassId = $product->getTaxClassId();
if ($taxClassId) {
$request = Mage::getSingleton('tax/calculation')->getRateRequest(null, null, null, null);
$taxPercent = Mage::getSingleton('tax/calculation')->getRate($request->setProductClassId($taxClassId));
}
}
if ($taxPercent) {
return $taxPercent;
}
return 0;
}
/**
* Check if Shipping by Weight is active
*
* #return bool
*/
public function getIsShowWeightInfo()
{
return Mage::getStoreConfigFlag('catalog/price/display_product_weight');
}
/**
* Get formatted weight incl. unit
*
* #return string
*/
public function getFormattedWeight()
{
return floatval($this->getProduct()->getWeight()) . ' ' . Mage::getStoreConfig('catalog/price/weight_unit');
}
/**
* Translate block sentence
*
* #return string
*/
public function __()
{
$args = func_get_args();
$expr = new Mage_Core_Model_Translate_Expr(array_shift($args), 'Mage_Catalog');
array_unshift($args, $expr);
return Mage::app()->getTranslator()->translate($args);
}
}
I had the exact same problem and solved it this way:
Copy the price.php of firegento to your local folder
Add this Code below
$htmlToInsertAfter = '<div class="price-box">';
if ($this->getTemplate() == 'catalog/product/price.phtml') {
$product = $this->getProduct();
if (is_object($product) && $product->isConfigurable()) {
$extraHtml = '<span class="label" id="configurable-price-from-'
. $product->getId()
. $this->getIdSuffix()
. '"><span class="configurable-price-from-label">';
if ($product->getMaxPossibleFinalPrice() != $product->getFinalPrice()) {
$extraHtml .= $this->__('Price from:');
}
$extraHtml .= '</span></span>';
#manually insert extra html needed by the extension into the normal price html
$html = substr_replace($html, $extraHtml, strpos($html, $htmlToInsertAfter)+strlen($htmlToInsertAfter),0);
}
}
below
$html = trim(parent::_toHtml());
inside the _toHtml() method in price.php.
It is the code of the Simple Configurable Products price.php with minor adjustments.
Hope that helps

How to remember 10 last read articles with timestamp in session for a user in Codeigniter?

I would like to make a PHP if condition code that will check if the last 10 articles or 10 minutes from the article reading by the user have already elapsed.
E.g.
A user open a page with id = 235 (this id value is in the url localhost/article/235 )
and this id value will be saved in session with a current timestamp and maybe his IP address
Then he read another article and the same will happen.
I need to remember the clicked stuff for another ten clicks and then reset that only for the first row. E.g. after the 10th click the id and timestamp will not became 11th row but will replace the 1st row in the list.
The php condition in CodeIgniter will then check these values and will update the article hit counter value in the articles table and column counter like this:
$this->db->where('id', $id);
$this->db->set('counter', 'counter+1', FALSE);
$this->db->update('articles');
But before calling this code I need to make this check from the session?
How to do that?
I think storing e.g. 10 entries in the session with timestamps per user will be enough.
Just don't save the same page in the session twice.
And the condition will check the current timestamp with the saved one and if it is more than e.g. 10 minutes or the user have read/clicked another 10 articles it will allow the update counter php code.
I don't need to have this bulletproof. Just to disable the increment using browser's refresh button.
So, if he wants to increment the counter he will need to wait ten minutes or read another 10 articles ;)
You should definitely go for Sessions. It saves you bandwidth consumption and is much easier to handle. Unless, of course, you need the data on the client-side, which, by your explanation, I assume you don't. Assuming you went for sessions, all you gotta do is store an array with the data you have. The following code should do it:
$aClicks = $this->session
->userdata('article_clicks');
// Initialize the array, if it's not already initialized
if ($aClicks == false) {
$aClicks = array();
}
// Now, we clean our array for the articles that have been clicked longer than
// 10 minutes ago.
$aClicks = array_filter(
$aClicks,
function($click) {
return (time() - $click['time']) < 600; // Less than 10 minutes elapsed
}
);
// We check if the article clicked is already in the list
$found = false;
foreach ($aClicks as $click) {
if ($click['article'] === $id) { // Assuming $id holds the article id
$found = true;
break;
}
}
// If it's not, we add it
if (!$found) {
$aClicks[] = array(
'article' => $id, // Assuming $id holds the article id
'time' => time()
);
}
// Store the clicks back to the session
$this->session
->set_userdata('article_clicks', $aClicks);
// If we meet all conditions
if (count($aClicks) < 10) {
// Do something
}
I assumne that $clicks is an array with up to ten visited articles. The id is used as key and the timestamp as value. $id is the id of the new article.
$clicks = $this->session->userdata('article_clicks');
//default value
$clicks = ($clicks)? $clicks : array();
//could be loaded from config
$maxItemCount = 10;
$timwToLive= 600;
//helpers
$time = time();
$deadline = $time - $timeToLive;
//add if not in list
if(! isset($clicks[$id]) ){
$clicks[$id] = $time;
}
//remove old values
$clicks = array_filter($clicks, function($value){ $value >= $deadline;});
//sort newest to oldest
arsort($clicks);
//limit items, oldest will be removed first because we sorted the array
$clicks = array_slice($clicks, 0, $maxItemCount);
//save to session
$this->session->>set_userdata('article_clicks',$clicks)
Usage:
//print how mch time has passed since the last visit
if(isset($clicks[$id]){
echo "visited ".($time-$clicks[$id]). "seconds ago." ;
} else {
echo "first visit";
}
EDIT: you have to use arsort not rsort or the keys will be lost, sorry
Based on Raphael_ code and your question you can try this:
<?php
$aClicks = $this->session
->userdata('article_clicks');
$nextId = $this->session->userdata('nextId');
// Initialize the array, if it's not already initialized
if ($aClicks == false) {
$aClicks = array();
$nextId = 0;
}
// Now, we clean our array for the articles that have been clicked longer than
// 10 minutes ago.
$aClicks = array_filter($aClicks, function($click) {
return (time() - $click['time']) < 600; // Less than 10 minutes elapsed
}
);
// We check if the article clicked is already in the list
$found = false;
foreach ($aClicks as $click) {
if ($click['article'] === $id) { // Assuming $id holds the article id
$found = true;
break;
}
}
// If it's not, we add it
if (!$found) {
$aClicks[$nextId] = array(
'article' => $id, // Assuming $id holds the article id
'time' => time()
);
$nextId++;
$this->session->set_userdata('nextId', $nextId);
}
$this->session->set_userdata('article_clicks', $aClicks);
if (count($aClicks) > 10 && $nextId > 9) {
$this->session->set_userdata('nextId', 0);
echo "OK!";
}
?>
I hope I understood correctly what you need.
Usage:
$this->load->library('click');
$this->click->add($id, time());
The class API is very simple and the code is commented. You can also check if an item expired(), if exists() and you can get() item saved time.
Remember that:
Each item will expire after 10 minutes (see $ttl)
Only 10 items are saved in session (see $max_entries)
class Click
{
/**
* CI instance
* #var object
*/
private $CI;
/**
* Click data holder
* #var array
*/
protected $clicks = array();
/**
* Time until an entry will expire
* #var int
*/
protected $ttl = 600;
/**
* How much entries do we store ?
* #var int
*/
protected $max_entries = 10;
// -------------------------------------------------------------------------
public function __construct()
{
$this->CI =& get_instance();
if (!class_exists('CI_Session')) {
$this->CI->load->library('session');
}
// load existing data from user's session
$this->fetch();
}
// -------------------------------------------------------------------------
/**
* Add a new page
*
* #access public
* #param int $id Page ID
* #param int $time Added time (optional)
* #return bool
*/
public function add($id, $time = null)
{
// If page ID does not exist and limit has been reached, stop here
if (!$this->exist($id) AND (count($this->clicks) == $this->max_entries)) {
return false;
}
$time = !is_null($time) ? $time : time();
if ($this->expired($id)) {
$this->clicks[$id] = $time;
return true;
}
return false;
}
/**
* Get specified page ID data
*
* #access public
* #param int $id Page ID
* #return int|bool Added time or `false` on error
*/
public function get($id)
{
return ($this->exist($id)) ? $this->clicks[$id] : false;
}
/**
* Check if specified page ID exists
*
* #access public
* #param int $id Page ID
* #return bool
*/
public function exist($id)
{
return isset($this->clicks[$id]);
}
/**
* Check if specified page ID expired
*
* #access public
* #param int $id Page ID
* #return bool
*/
public function expired($id)
{
// id does not exist, return `true` so it can added
if (!$this->exist($id)) {
return true;
}
return ((time() - $this->clicks[$id]) >= $this->ttl) ? true : false;
}
/**
* Store current clicks data in session
*
* #access public
* #return object Click
*/
public function save()
{
$this->CI->session->set_userdata('article_clicks', serialize($this->clicks));
return $this;
}
/**
* Load data from user's session
*
* #access public
* #return object Click
*/
public function fetch()
{
if ($data = $this->CI->session->userdata('article_clicks')) {
$this->clicks = unserialize($data);
}
return $this;
}
public function __destruct()
{
$this->save();
}
}
You could easily wrap that into a class of it's own that serializes the information into a string and that is able to manipulate the data, e.g. to add another value while taking care to cap at the maximum of ten elements.
A potential usage could look like, let's assume the cookie last would contain 256 at start:
echo $_COOKIE['last'] = (new StringQueue($_COOKIE['last']))->add(10), "\n";
echo $_COOKIE['last'] = (new StringQueue($_COOKIE['last']))->add(20), "\n";
echo $_COOKIE['last'] = (new StringQueue($_COOKIE['last']))->add(30), "\n";
echo $_COOKIE['last'] = (new StringQueue($_COOKIE['last']))->add(40), "\n";
echo $_COOKIE['last'] = (new StringQueue($_COOKIE['last']))->add(50), "\n";
echo $_COOKIE['last'] = (new StringQueue($_COOKIE['last']))->add(60), "\n";
echo $_COOKIE['last'] = (new StringQueue($_COOKIE['last']))->add(70), "\n";
echo $_COOKIE['last'] = (new StringQueue($_COOKIE['last']))->add(80), "\n";
echo $_COOKIE['last'] = (new StringQueue($_COOKIE['last']))->add(90), "\n";
echo $_COOKIE['last'] = (new StringQueue($_COOKIE['last']))->add(100), "\n";
And the output (Demo):
10,256
20,10,256
30,20,10,256
40,30,20,10,256
50,40,30,20,10,256
60,50,40,30,20,10,256
70,60,50,40,30,20,10,256
80,70,60,50,40,30,20,10,256
90,80,70,60,50,40,30,20,10,256
100,90,80,70,60,50,40,30,20,10
A rough implementation of that:
class StringQueue implements Countable
{
private $size = 10;
private $separator = ',';
private $values;
public function __construct($string) {
$this->values = $this->parseString($string);
}
private function parseString($string) {
$values = explode($this->separator, $string, $this->size + 1);
if (isset($values[$this->size])) {
unset($values[$this->size]);
}
return $values;
}
public function add($value) {
$this->values = $this->parseString($value . $this->separator . $this);
return $this;
}
public function __toString() {
return implode(',', $this->values);
}
public function count() {
return count($this->values);
}
}
It's just some basic string operations, here with implode and explode.

Categories