Version Notes
v1.1.0
* Totally new design (Uses a tab instead of 3rd column now)
* Accuracy improved even more in data tracking (in case of cart merges)
* Tracking exclusion feature (admin side logins exclude your checkouts to be tracked and doesn't pollute real data of the customers)
Download this release
Release Info
Developer | Anatta Design |
Extension | AnattaDesign_AbandonedCarts |
Version | 1.1.0 |
Comparing to | |
See all releases |
Code changes from version 1.0.1 to 1.1.0
- app/code/local/AnattaDesign/AbandonedCarts/Helper/Data.php +10 -1
- app/code/local/AnattaDesign/AbandonedCarts/Model/Checkout/Onepage/Observer.php +11 -0
- app/code/local/AnattaDesign/AbandonedCarts/Model/Observer.php +16 -11
- app/code/local/AnattaDesign/AbandonedCarts/Model/Statistics.php +37 -12
- app/code/local/AnattaDesign/AbandonedCarts/etc/config.xml +10 -1
- app/code/local/AnattaDesign/AbandonedCarts/sql/anattadesign_abandonedcarts_setup/mysql4-upgrade-1.0.1-1.1.0.php +3 -0
- app/design/adminhtml/default/default/template/anattadesign/abandonedcarts/widget.phtml +95 -86
- js/anattadesign/abandonedcarts/adminhack.js +18 -24
- package.xml +10 -6
- skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/ar-lt.jpg +0 -0
- skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/ar-rt.jpg +0 -0
- skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/logo.jpg +0 -0
- skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/notifications-btm.gif +0 -0
- skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/notifications.gif +0 -0
- skin/adminhtml/default/default/anattadesign/abandonedcarts/css/style.css +136 -46
- skin/adminhtml/default/default/anattadesign/abandonedcarts/images/bt-rep.gif +0 -0
- skin/adminhtml/default/default/anattadesign/abandonedcarts/images/powerdby.jpg +0 -0
- skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img-arrow.jpg +0 -0
- skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img-last-arrow.jpg +0 -0
- skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img.jpg +0 -0
app/code/local/AnattaDesign/AbandonedCarts/Helper/Data.php
CHANGED
@@ -85,7 +85,7 @@ class AnattaDesign_AbandonedCarts_Helper_Data extends Mage_Core_Helper_Abstract
|
|
85 |
$ping = array(
|
86 |
'version' => $version,
|
87 |
'site_name' => Mage::getStoreConfig( 'general/store_information/name' ),
|
88 |
-
'url' => 'http://' . str_replace( array( 'http://', '/index.php/', '/index.php' ), '', Mage::getUrl() ) // making sure the url is in format - http://domain.com/
|
89 |
);
|
90 |
|
91 |
$ping['url'] = Mage::helper( 'anattadesign_abandonedcarts' )->trailingslashit( $ping['url'] );
|
@@ -124,4 +124,13 @@ class AnattaDesign_AbandonedCarts_Helper_Data extends Mage_Core_Helper_Abstract
|
|
124 |
}
|
125 |
}
|
126 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
}
|
85 |
$ping = array(
|
86 |
'version' => $version,
|
87 |
'site_name' => Mage::getStoreConfig( 'general/store_information/name' ),
|
88 |
+
'url' => 'http://' . str_replace( array( 'http://', 'https://', '/index.php/', '/index.php' ), '', Mage::getUrl() ) // making sure the url is in format - http://domain.com/
|
89 |
);
|
90 |
|
91 |
$ping['url'] = Mage::helper( 'anattadesign_abandonedcarts' )->trailingslashit( $ping['url'] );
|
124 |
}
|
125 |
}
|
126 |
|
127 |
+
public function getCookieName() {
|
128 |
+
return 'anatta_abcart_track';
|
129 |
+
}
|
130 |
+
|
131 |
+
public function canTrackUser() {
|
132 |
+
$cookie = Mage::getModel( 'core/cookie' )->get( $this->getCookieName() );
|
133 |
+
return !( 'no' === trim( $cookie ) );
|
134 |
+
}
|
135 |
+
|
136 |
}
|
app/code/local/AnattaDesign/AbandonedCarts/Model/Checkout/Onepage/Observer.php
CHANGED
@@ -34,6 +34,17 @@ class AnattaDesign_AbandonedCarts_Model_Checkout_Onepage_Observer {
|
|
34 |
}
|
35 |
}
|
36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
public function saveMethod( $observer ) {
|
38 |
$statistics = $this->getModel();
|
39 |
$statistics->saveStepMoved( 'login', $this->getQuoteId() );
|
34 |
}
|
35 |
}
|
36 |
|
37 |
+
public function merge( $observer ) {
|
38 |
+
try {
|
39 |
+
$this->getModel()->deleteByQuoteId( $observer->getSource()->getID() );
|
40 |
+
} catch ( Exception $e ) {
|
41 |
+
if ( Mage::getIsDeveloperMode() ) {
|
42 |
+
echo $e->getMessage();
|
43 |
+
}
|
44 |
+
Mage::logException( $e );
|
45 |
+
}
|
46 |
+
}
|
47 |
+
|
48 |
public function saveMethod( $observer ) {
|
49 |
$statistics = $this->getModel();
|
50 |
$statistics->saveStepMoved( 'login', $this->getQuoteId() );
|
app/code/local/AnattaDesign/AbandonedCarts/Model/Observer.php
CHANGED
@@ -5,6 +5,7 @@ class AnattaDesign_AbandonedCarts_Model_Observer {
|
|
5 |
public function uponAdminLogin() {
|
6 |
$this->ping();
|
7 |
$this->checkLatestVersion();
|
|
|
8 |
}
|
9 |
|
10 |
public function ping() {
|
@@ -34,17 +35,23 @@ class AnattaDesign_AbandonedCarts_Model_Observer {
|
|
34 |
|
35 |
if ( $latest->latestVersion != $version ) {
|
36 |
Mage::getModel( 'adminnotification/inbox' )
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
}
|
45 |
}
|
46 |
}
|
47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
public function addJavascriptBlock( $observer ) {
|
49 |
|
50 |
$controller = $observer->getAction();
|
@@ -54,13 +61,11 @@ class AnattaDesign_AbandonedCarts_Model_Observer {
|
|
54 |
|
55 |
$layout = $controller->getLayout();
|
56 |
$block = $layout->createBlock( 'core/text' );
|
57 |
-
$block->setText(
|
58 |
-
'<script type="text/javascript">
|
59 |
var anattadesign_abandonedcarts = {
|
60 |
url: "' . Mage::helper( 'adminhtml' )->getUrl( 'abandonedcarts/widget/render/' ) . '"
|
61 |
};
|
62 |
-
</script>'
|
63 |
-
);
|
64 |
|
65 |
$layout->getBlock( 'js' )->append( $block );
|
66 |
}
|
5 |
public function uponAdminLogin() {
|
6 |
$this->ping();
|
7 |
$this->checkLatestVersion();
|
8 |
+
$this->stopTrackingUser();
|
9 |
}
|
10 |
|
11 |
public function ping() {
|
35 |
|
36 |
if ( $latest->latestVersion != $version ) {
|
37 |
Mage::getModel( 'adminnotification/inbox' )
|
38 |
+
->setSeverity( Mage_AdminNotification_Model_Inbox::SEVERITY_NOTICE )
|
39 |
+
->setTitle( "My Abandoned Cart {$latest->latestVersion} is now available" )
|
40 |
+
->setDateAdded( gmdate( 'Y-m-d H:i:s' ) )->setUrl( 'http://www.myabandonedcarts.com/' )
|
41 |
+
->setDescription( 'Your version of My Abandoned Cart is currently not up-to-date. Please <a href="http://www.myabandonedcarts.com/">click here</a> to get the latest version.' )
|
42 |
+
->save();
|
43 |
+
Mage::getModel( 'core/config' )
|
44 |
+
->saveConfig( 'anattadesign_abandonedcart_latest_checked_version', $latest->latestVersion );
|
45 |
}
|
46 |
}
|
47 |
}
|
48 |
|
49 |
+
public function stopTrackingUser() {
|
50 |
+
$time = 60 * 60 * 24 * 7; // set a cookie for one week
|
51 |
+
$name = Mage::helper( 'anattadesign_abandonedcarts' )->getCookieName();
|
52 |
+
Mage::getModel( 'core/cookie' )->set( $name, 'no', $time, '/', null, null, true );
|
53 |
+
}
|
54 |
+
|
55 |
public function addJavascriptBlock( $observer ) {
|
56 |
|
57 |
$controller = $observer->getAction();
|
61 |
|
62 |
$layout = $controller->getLayout();
|
63 |
$block = $layout->createBlock( 'core/text' );
|
64 |
+
$block->setText( '<script type="text/javascript">
|
|
|
65 |
var anattadesign_abandonedcarts = {
|
66 |
url: "' . Mage::helper( 'adminhtml' )->getUrl( 'abandonedcarts/widget/render/' ) . '"
|
67 |
};
|
68 |
+
</script>' );
|
|
|
69 |
|
70 |
$layout->getBlock( 'js' )->append( $block );
|
71 |
}
|
app/code/local/AnattaDesign/AbandonedCarts/Model/Statistics.php
CHANGED
@@ -11,6 +11,7 @@ class AnattaDesign_AbandonedCarts_Model_Statistics extends Mage_Core_Model_Abstr
|
|
11 |
*
|
12 |
* @param string $step
|
13 |
* @param int $quoteId
|
|
|
14 |
* @return AnattaDesign_AbandonedCarts_Model_Statistics
|
15 |
*/
|
16 |
public function saveStepMoved( $step, $quoteId ) {
|
@@ -22,38 +23,62 @@ class AnattaDesign_AbandonedCarts_Model_Statistics extends Mage_Core_Model_Abstr
|
|
22 |
*
|
23 |
* @param string $step
|
24 |
* @param int $quoteId
|
|
|
25 |
* @return AnattaDesign_AbandonedCarts_Model_Statistics
|
26 |
*/
|
27 |
public function saveStepReached( $step, $quoteId ) {
|
28 |
-
$data = array(
|
29 |
-
'step' => $step,
|
30 |
-
'quoteId' => $quoteId,
|
31 |
-
'reached' => 1,
|
32 |
-
'year' => date( 'Y' ),
|
33 |
-
'month' => date( 'n' ),
|
34 |
-
'date' => date( 'Y-m-d h:i:s' )
|
35 |
-
);
|
36 |
return $this->_saveStepData( $data );
|
37 |
}
|
38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
/**
|
40 |
* Save step data.
|
41 |
* Step and quote id are required.
|
42 |
*
|
43 |
* @param array $data
|
|
|
44 |
* @throws Exception
|
45 |
* @return AnattaDesign_AbandonedCarts_Model_Statistics
|
46 |
*/
|
47 |
protected function _saveStepData( array $data ) {
|
|
|
|
|
|
|
|
|
48 |
if ( !array_key_exists( 'step', $data ) ) {
|
49 |
throw new Exception( 'Step key is required' );
|
50 |
}
|
51 |
|
52 |
// Prepare data
|
53 |
-
$data = array_merge( $data, array(
|
54 |
-
'sales_flat_quote_id' => $data['quoteId']
|
55 |
-
)
|
56 |
-
);
|
57 |
|
58 |
// Get existing statistics for this quote and step
|
59 |
$collection = $this->getCollection();
|
11 |
*
|
12 |
* @param string $step
|
13 |
* @param int $quoteId
|
14 |
+
*
|
15 |
* @return AnattaDesign_AbandonedCarts_Model_Statistics
|
16 |
*/
|
17 |
public function saveStepMoved( $step, $quoteId ) {
|
23 |
*
|
24 |
* @param string $step
|
25 |
* @param int $quoteId
|
26 |
+
*
|
27 |
* @return AnattaDesign_AbandonedCarts_Model_Statistics
|
28 |
*/
|
29 |
public function saveStepReached( $step, $quoteId ) {
|
30 |
+
$data = array( 'step' => $step, 'quoteId' => $quoteId, 'reached' => 1, 'year' => date( 'Y' ), 'month' => date( 'n' ), 'date' => date( 'Y-m-d h:i:s' ) );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
return $this->_saveStepData( $data );
|
32 |
}
|
33 |
|
34 |
+
/**
|
35 |
+
* delete all records of a particular quote ID
|
36 |
+
*
|
37 |
+
* @param int $quoteId
|
38 |
+
*
|
39 |
+
* @throws Exception
|
40 |
+
* @return AnattaDesign_AbandonedCarts_Model_Statistics
|
41 |
+
*/
|
42 |
+
public function deleteByQuoteId( $quoteId ) {
|
43 |
+
$quoteId = abs( intval( $quoteId ) );
|
44 |
+
if ( !$quoteId )
|
45 |
+
throw new Exception( 'Quote ID is required & should be greater than 0' );
|
46 |
+
|
47 |
+
$collection = $this->getCollection();
|
48 |
+
$collection->addFieldToFilter( 'sales_flat_quote_id', $quoteId );
|
49 |
+
$collection->load();
|
50 |
+
|
51 |
+
if ( count( $collection ) ) {
|
52 |
+
foreach ( $collection as $model ) {
|
53 |
+
$model->delete();
|
54 |
+
}
|
55 |
+
} else {
|
56 |
+
return $this->delete();
|
57 |
+
}
|
58 |
+
|
59 |
+
return $this;
|
60 |
+
}
|
61 |
+
|
62 |
/**
|
63 |
* Save step data.
|
64 |
* Step and quote id are required.
|
65 |
*
|
66 |
* @param array $data
|
67 |
+
*
|
68 |
* @throws Exception
|
69 |
* @return AnattaDesign_AbandonedCarts_Model_Statistics
|
70 |
*/
|
71 |
protected function _saveStepData( array $data ) {
|
72 |
+
if ( !Mage::helper( 'anattadesign_abandonedcarts' )->canTrackUser() ) {
|
73 |
+
return false;
|
74 |
+
}
|
75 |
+
|
76 |
if ( !array_key_exists( 'step', $data ) ) {
|
77 |
throw new Exception( 'Step key is required' );
|
78 |
}
|
79 |
|
80 |
// Prepare data
|
81 |
+
$data = array_merge( $data, array( 'sales_flat_quote_id' => $data['quoteId'] ) );
|
|
|
|
|
|
|
82 |
|
83 |
// Get existing statistics for this quote and step
|
84 |
$collection = $this->getCollection();
|
app/code/local/AnattaDesign/AbandonedCarts/etc/config.xml
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
<config>
|
3 |
<modules>
|
4 |
<AnattaDesign_AbandonedCarts>
|
5 |
-
<version>1.0
|
6 |
</AnattaDesign_AbandonedCarts>
|
7 |
</modules>
|
8 |
<global>
|
@@ -80,6 +80,15 @@
|
|
80 |
</anattadesign_abandonedcarts_checkout_observer>
|
81 |
</observers>
|
82 |
</controller_action_postdispatch_checkout_onepage_index>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
<controller_action_postdispatch_checkout_onepage_saveMethod>
|
84 |
<observers>
|
85 |
<anattadesign_abandonedcarts_checkout_observer>
|
2 |
<config>
|
3 |
<modules>
|
4 |
<AnattaDesign_AbandonedCarts>
|
5 |
+
<version>1.1.0</version>
|
6 |
</AnattaDesign_AbandonedCarts>
|
7 |
</modules>
|
8 |
<global>
|
80 |
</anattadesign_abandonedcarts_checkout_observer>
|
81 |
</observers>
|
82 |
</controller_action_postdispatch_checkout_onepage_index>
|
83 |
+
<sales_quote_merge_before>
|
84 |
+
<observers>
|
85 |
+
<anattadesign_abandonedcarts_checkout_observer>
|
86 |
+
<type>singleton</type>
|
87 |
+
<class>AnattaDesign_AbandonedCarts_Model_Checkout_Onepage_Observer</class>
|
88 |
+
<method>merge</method>
|
89 |
+
</anattadesign_abandonedcarts_checkout_observer>
|
90 |
+
</observers>
|
91 |
+
</sales_quote_merge_before>
|
92 |
<controller_action_postdispatch_checkout_onepage_saveMethod>
|
93 |
<observers>
|
94 |
<anattadesign_abandonedcarts_checkout_observer>
|
app/code/local/AnattaDesign/AbandonedCarts/sql/anattadesign_abandonedcarts_setup/mysql4-upgrade-1.0.1-1.1.0.php
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
Mage::helper( 'anattadesign_abandonedcarts' )->ping();
|
app/design/adminhtml/default/default/template/anattadesign/abandonedcarts/widget.phtml
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
<?php
|
2 |
-
if (
|
3 |
die();
|
4 |
}
|
5 |
?>
|
@@ -25,22 +25,33 @@ $display_month = array(
|
|
25 |
12 => 'December'
|
26 |
);
|
27 |
|
28 |
-
$
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
}
|
41 |
|
42 |
// Select table name where data is stored
|
43 |
-
if (
|
44 |
|
45 |
$steps = array(
|
46 |
0 => array(
|
@@ -56,6 +67,7 @@ if ( Mage::helper( 'anattadesign_abandonedcarts' )->isAwesomeCheckoutActive() )
|
|
56 |
'step' => 'review'
|
57 |
)
|
58 |
);
|
|
|
59 |
$table = 'anattadesign_abandonedcarts_statistics';
|
60 |
} else {
|
61 |
|
@@ -84,16 +96,16 @@ if ( Mage::helper( 'anattadesign_abandonedcarts' )->isAwesomeCheckoutActive() )
|
|
84 |
}
|
85 |
|
86 |
// Add reached & moved values in array
|
87 |
-
$connection = Mage::getSingleton(
|
88 |
-
foreach (
|
89 |
-
$query = "SELECT
|
90 |
-
$resource = $connection->query(
|
91 |
$fetched_data = $resource->fetch();
|
92 |
-
$step['reached'] = intval(
|
93 |
-
$step['moved'] = intval(
|
94 |
-
$step['loss'] = $step['reached'] == $step['moved'] ? 0 : (
|
95 |
-
unset( $step );
|
96 |
}
|
|
|
97 |
|
98 |
$step_no = 1;
|
99 |
$step_names = array(
|
@@ -106,83 +118,80 @@ $step_names = array(
|
|
106 |
);
|
107 |
|
108 |
// adjustments to data
|
109 |
-
if (
|
110 |
|
111 |
} else {
|
112 |
-
//
|
113 |
-
|
|
|
|
|
|
|
114 |
// make sure shipping step which is optional only depicts the loss, so add padding here (for the sake of funnel)
|
115 |
$diff = $steps[1]['moved'] - $steps[2]['reached'];
|
116 |
-
$steps[2]['reached']+= $diff;
|
117 |
-
$steps[2]['moved']+= $diff;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
118 |
}
|
119 |
|
120 |
// calculate abandonment rate & loss for the queried month-year
|
121 |
-
$abandonedment_rate = $steps[0]['reached'] == $steps[count(
|
122 |
-
$approx_loss = ( Mage::helper( 'anattadesign_abandonedcarts' )->getSalesVolume( $queried_year, $queried_month ) * ( $abandonedment_rate / 100 ) ) / ( 1 - ( $abandonedment_rate / 100 ) );
|
123 |
-
$approx_loss = Mage::helper( 'core' )->currency( $approx_loss, true, false );
|
124 |
|
125 |
// Get message to display user
|
126 |
-
$message = Mage::helper(
|
|
|
127 |
?>
|
128 |
|
129 |
<div id="ac-wrapper">
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
<
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
<?php } ?>
|
170 |
-
<!--sidebar-->
|
171 |
-
<div id="ac-sidebar">
|
172 |
-
<div class="ac-notif">
|
173 |
-
<div>
|
174 |
-
<big>NOTIFICATION!</big>
|
175 |
-
<?php echo $message; ?>
|
176 |
-
</div>
|
177 |
-
</div>
|
178 |
-
<div class="ac-side-content">
|
179 |
-
<span>>APPX. LOSS</span>
|
180 |
-
<p>*based on total monthly sales</p>
|
181 |
-
<big><?php echo $approx_loss; ?></big>
|
182 |
-
<p class="btm">TOTAL PERCENTAGE <br/>OF ABANDONMENT</p>
|
183 |
-
<big class="btm"><?php echo $abandonedment_rate; ?>%</big>
|
184 |
</div>
|
185 |
</div>
|
186 |
-
<!--sidebar-->
|
187 |
</div>
|
188 |
</div>
|
1 |
<?php
|
2 |
+
if (!Mage::helper('core')->isModuleEnabled('AnattaDesign_AbandonedCarts')) {
|
3 |
die();
|
4 |
}
|
5 |
?>
|
25 |
12 => 'December'
|
26 |
);
|
27 |
|
28 |
+
$period = isset($_GET['period']) ? $_GET['period'] : '';
|
29 |
+
|
30 |
+
switch ($period) {
|
31 |
+
case '12h':
|
32 |
+
$queried_date = date('Y-m-d', strtotime('-12 hours'));
|
33 |
+
break;
|
34 |
+
case '24h':
|
35 |
+
$queried_date = date('Y-m-d', strtotime('-24 hours'));
|
36 |
+
break;
|
37 |
+
case '7d':
|
38 |
+
$queried_date = date('Y-m-d', strtotime('-7 days'));
|
39 |
+
break;
|
40 |
+
case '1m':
|
41 |
+
$queried_date = date('Y-m-d', strtotime('-1 month'));
|
42 |
+
break;
|
43 |
+
case '1y':
|
44 |
+
$queried_date = date('Y-m-d', strtotime('-1 year'));
|
45 |
+
break;
|
46 |
+
case '2y':
|
47 |
+
$queried_date = date('Y-m-d', strtotime('-2 years'));
|
48 |
+
break;
|
49 |
+
default:
|
50 |
+
$queried_date = date('Y-m-d', strtotime('-24 hours'));
|
51 |
}
|
52 |
|
53 |
// Select table name where data is stored
|
54 |
+
if (Mage::helper('anattadesign_abandonedcarts')->isAwesomeCheckoutActive()) {
|
55 |
|
56 |
$steps = array(
|
57 |
0 => array(
|
67 |
'step' => 'review'
|
68 |
)
|
69 |
);
|
70 |
+
|
71 |
$table = 'anattadesign_abandonedcarts_statistics';
|
72 |
} else {
|
73 |
|
96 |
}
|
97 |
|
98 |
// Add reached & moved values in array
|
99 |
+
$connection = Mage::getSingleton('core/resource')->getConnection('core_read');
|
100 |
+
foreach ($steps as &$step) {
|
101 |
+
$query = "SELECT SUM(reached) as `reached`, SUM(moved) as `moved` FROM `$table` WHERE DATE(date) > '$queried_date' AND `step` = '{$step['step']}';";
|
102 |
+
$resource = $connection->query($query);
|
103 |
$fetched_data = $resource->fetch();
|
104 |
+
$step['reached'] = intval($fetched_data['reached']);
|
105 |
+
$step['moved'] = intval($fetched_data['moved']);
|
106 |
+
$step['loss'] = $step['reached'] == $step['moved'] ? 0 : ($step['reached'] - $step['moved']) * 100 / $step['reached'];
|
|
|
107 |
}
|
108 |
+
unset($step);
|
109 |
|
110 |
$step_no = 1;
|
111 |
$step_names = array(
|
118 |
);
|
119 |
|
120 |
// adjustments to data
|
121 |
+
if (Mage::helper('anattadesign_abandonedcarts')->isAwesomeCheckoutActive()) {
|
122 |
|
123 |
} else {
|
124 |
+
// This is needed as a user already logged in will never reach the login step
|
125 |
+
// Here we add the appropriate padding (for the sake of the funnel)
|
126 |
+
$diff = $steps[1]['reached'] - $steps[0]['moved'];
|
127 |
+
$steps[0]['reached'] += $diff;
|
128 |
+
$steps[0]['moved'] += $diff;
|
129 |
// make sure shipping step which is optional only depicts the loss, so add padding here (for the sake of funnel)
|
130 |
$diff = $steps[1]['moved'] - $steps[2]['reached'];
|
131 |
+
$steps[2]['reached'] += $diff;
|
132 |
+
$steps[2]['moved'] += $diff;
|
133 |
+
}
|
134 |
+
|
135 |
+
// let's match the moved of each step to the reached of next step, this will show decent output even in case of
|
136 |
+
// manual data changes via phpmyadmin. This won't affect anything if this module doesn't have any conflicts
|
137 |
+
for($i = count($steps) - 1; $i >= 0; $i--) {
|
138 |
+
// making sure that moved is never higher than reached
|
139 |
+
if($steps[$i]['moved'] > $steps[$i]['reached'])
|
140 |
+
$steps[$i]['reached'] = $steps[$i]['moved'];
|
141 |
+
|
142 |
+
if($i)
|
143 |
+
$steps[$i-1]['moved'] = $steps[$i]['reached'] = max($steps[$i-1]['moved'], $steps[$i]['reached']);
|
144 |
}
|
145 |
|
146 |
// calculate abandonment rate & loss for the queried month-year
|
147 |
+
$abandonedment_rate = $steps[0]['reached'] == $steps[count($steps) - 1]['moved'] ? 0 : round(($steps[0]['reached'] - $steps[count($steps) - 1]['moved']) * 100 / $steps[0]['reached'], 2);
|
|
|
|
|
148 |
|
149 |
// Get message to display user
|
150 |
+
$message = Mage::helper('anattadesign_abandonedcarts')->getMessage();
|
151 |
+
$message = is_string($message) ? $message : '';
|
152 |
?>
|
153 |
|
154 |
<div id="ac-wrapper">
|
155 |
+
<div class="abwidget">
|
156 |
+
<h2 class="widget-title">
|
157 |
+
<strong>TIPS!:</strong> <?php echo $message; ?>
|
158 |
+
<a href="http://myabandonedcarts.com/?kme=Clicked%20Link&km_Referrer=Widget" class="myab"></a>
|
159 |
+
</h2>
|
160 |
+
|
161 |
+
<div class="widget-content">
|
162 |
+
<span class="checkout-info item-1">ENTERED CHECKOUT<small><?php echo $steps[0]['reached'] ?></small></span>
|
163 |
+
<span class="checkout-info item-2">COMPLETED CHECKOUT<small><?php echo $steps[count($steps) - 1]['moved'] ?></small></span>
|
164 |
+
<span class="checkout-info item-3">ABANDONMENT RATE<big><?php echo $abandonedment_rate; ?>%</big></span>
|
165 |
+
|
166 |
+
<div class="graph-table">
|
167 |
+
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
168 |
+
<tr>
|
169 |
+
<?php foreach ($steps as $step) : ?>
|
170 |
+
<td><span class="number"><?php echo $step['reached']; ?></span></td>
|
171 |
+
<?php $total_height = $steps[0]['reached'] ? (($step['reached'] * 100)) / $steps[0]['reached'] : 0; ?>
|
172 |
+
<?php $lost_height = $step['reached'] ? (($step['reached'] - $step['moved']) * 100) / $step['reached'] : 0; ?>
|
173 |
+
<td>
|
174 |
+
<div class="graph" style="height:<?php echo $total_height; ?>%;">
|
175 |
+
<span class="color" style="height: <?php echo $lost_height; ?>%;">
|
176 |
+
<span class="value"><?php echo round($lost_height, 2); ?>%</span>
|
177 |
+
</span>
|
178 |
+
</div>
|
179 |
+
</td>
|
180 |
+
<?php endforeach; ?>
|
181 |
+
<?php $last_step = end($steps); ?>
|
182 |
+
<td><span class="number"><?php echo $last_step['moved']; ?></span></td>
|
183 |
+
</tr>
|
184 |
+
<tr class="steps">
|
185 |
+
<?php $count = 0; ?>
|
186 |
+
<?php foreach ($steps as $index => $step) : ?>
|
187 |
+
<td<?php if ($count) echo ' class="arrow"'; ?>> </td>
|
188 |
+
<?php $count++; ?>
|
189 |
+
<td><span><?php echo $count . '. ' . $step_names[$step['step']]; ?></span></td>
|
190 |
+
<?php endforeach; ?>
|
191 |
+
<td class="last-child"> </td>
|
192 |
+
</tr>
|
193 |
+
</table>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
194 |
</div>
|
195 |
</div>
|
|
|
196 |
</div>
|
197 |
</div>
|
js/anattadesign/abandonedcarts/adminhack.js
CHANGED
@@ -1,40 +1,34 @@
|
|
1 |
Zepto(function($){
|
2 |
// load widget initially
|
3 |
$.get(anattadesign_abandonedcarts.url, function(data){
|
4 |
-
if ( $.trim(data) != '' )
|
5 |
-
$('
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
});
|
7 |
|
8 |
// bind click for browsing previous/next months
|
9 |
-
$(
|
10 |
-
|
11 |
-
var month = $(this).parent().attr('data-month');
|
12 |
-
var year = $(this).parent().attr('data-year');
|
13 |
-
|
14 |
-
if ($(this).hasClass('previous-month')) {
|
15 |
-
month--;
|
16 |
-
if (month == 0) {
|
17 |
-
month = 12;
|
18 |
-
year--;
|
19 |
-
}
|
20 |
-
} else {
|
21 |
-
month++;
|
22 |
-
if (month == 13) {
|
23 |
-
month = 1;
|
24 |
-
year++;
|
25 |
-
}
|
26 |
-
}
|
27 |
|
28 |
// fill up widget with the requested month-year stats
|
29 |
-
$.get(anattadesign_abandonedcarts.url+'?
|
30 |
if ( $.trim(data) != '' ) {
|
31 |
-
$('#ac-wrapper').parent().remove();
|
32 |
-
$('
|
33 |
}
|
34 |
});
|
35 |
|
36 |
return false;
|
37 |
-
|
38 |
});
|
39 |
|
40 |
});
|
1 |
Zepto(function($){
|
2 |
// load widget initially
|
3 |
$.get(anattadesign_abandonedcarts.url, function(data){
|
4 |
+
if ( $.trim(data) != '' ) {
|
5 |
+
$('#diagram_tab').append('<li><a class="tab-item-link" title="Abandoned Carts" id="diagram_tab_abandoned_carts" href="#"><span><span title="The information in this tab has been changed." class="changed"></span><span title="This tab contains invalid data. Please solve the problem before saving." class="error"></span>Abandoned Carts</span></a></li>');
|
6 |
+
$('#diagram_tab_content').append('<div style="display: none;" id="diagram_tab_abandoned_carts_content"><div style="margin:20px;"><p style="padding:5px 10px;" class="switcher a-right">Select Range:<select id="order_abandoned_carts_period" name="period"><option value="24h">Last 24 Hours</option><option value="7d">Last 7 Days</option><option value="1m">Current Month</option><option value="1y">YTD</option><option value="2y">2YTD</option></select></p></div>'+data+'</div>');
|
7 |
+
|
8 |
+
// activate the abandoned carts widget tab
|
9 |
+
$('#diagram_tab > li > a').on('click', function(e){
|
10 |
+
e.preventDefault();
|
11 |
+
$('#diagram_tab > li > a.active').removeClass('active');
|
12 |
+
$(this).addClass('active');
|
13 |
+
$('#diagram_tab_content').children().hide();
|
14 |
+
$('#' + this.id + '_content').show();
|
15 |
+
});
|
16 |
+
}
|
17 |
});
|
18 |
|
19 |
// bind click for browsing previous/next months
|
20 |
+
$('#diagram_tab_content').on('change','#order_abandoned_carts_period', function(){
|
21 |
+
var value = $(this).val();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
// fill up widget with the requested month-year stats
|
24 |
+
$.get(anattadesign_abandonedcarts.url+'?period='+value, function(data){
|
25 |
if ( $.trim(data) != '' ) {
|
26 |
+
$('#ac-wrapper').parent().children().slice(1).remove();
|
27 |
+
$('#diagram_tab_abandoned_carts_content').append(data);
|
28 |
}
|
29 |
});
|
30 |
|
31 |
return false;
|
|
|
32 |
});
|
33 |
|
34 |
});
|
package.xml
CHANGED
@@ -1,18 +1,22 @@
|
|
1 |
<?xml version="1.0"?>
|
2 |
<package>
|
3 |
<name>AnattaDesign_AbandonedCarts</name>
|
4 |
-
<version>1.0
|
5 |
<stability>stable</stability>
|
6 |
<license>GPL</license>
|
7 |
<channel>community</channel>
|
8 |
<extends/>
|
9 |
<summary>Track abandoned carts & show a funnel report to show statistics</summary>
|
10 |
<description>Track abandoned carts & show a funnel report to show statistics</description>
|
11 |
-
<notes>v1.0
|
|
|
|
|
|
|
|
|
12 |
<authors><author><name>Anatta Design</name><user>anattadesign</user><email>nirav@anattadesign.com</email></author></authors>
|
13 |
-
<date>2013-
|
14 |
-
<time>
|
15 |
-
<contents><target name="magelocal"><dir name="AnattaDesign"><dir name="AbandonedCarts"><dir><dir name="Block"><file name="Widget.php" hash="c6baf4dc8dc25ed7c62e3b89cc78c413"/></dir><dir name="Helper"><file name="Data.php" hash="
|
16 |
<compatible/>
|
17 |
-
<dependencies><required><php><min>5.2.0</min><max>
|
18 |
</package>
|
1 |
<?xml version="1.0"?>
|
2 |
<package>
|
3 |
<name>AnattaDesign_AbandonedCarts</name>
|
4 |
+
<version>1.1.0</version>
|
5 |
<stability>stable</stability>
|
6 |
<license>GPL</license>
|
7 |
<channel>community</channel>
|
8 |
<extends/>
|
9 |
<summary>Track abandoned carts & show a funnel report to show statistics</summary>
|
10 |
<description>Track abandoned carts & show a funnel report to show statistics</description>
|
11 |
+
<notes>v1.1.0
|
12 |
+

|
13 |
+
* Totally new design (Uses a tab instead of 3rd column now)
|
14 |
+
* Accuracy improved even more in data tracking (in case of cart merges)
|
15 |
+
* Tracking exclusion feature (admin side logins exclude your checkouts to be tracked and doesn't pollute real data of the customers)</notes>
|
16 |
<authors><author><name>Anatta Design</name><user>anattadesign</user><email>nirav@anattadesign.com</email></author></authors>
|
17 |
+
<date>2013-04-15</date>
|
18 |
+
<time>06:00:46</time>
|
19 |
+
<contents><target name="magelocal"><dir name="AnattaDesign"><dir name="AbandonedCarts"><dir><dir name="Block"><file name="Widget.php" hash="c6baf4dc8dc25ed7c62e3b89cc78c413"/></dir><dir name="Helper"><file name="Data.php" hash="f7006d4e1b800435e8a2e78df3f3786c"/></dir><dir name="Model"><dir name="Checkout"><dir name="Onepage"><file name="Observer.php" hash="6745ab11e82cf6370e04d251d1010637"/></dir></dir><dir name="Mysql4"><dir name="Opstatistics"><file name="Collection.php" hash="66b29da439c196f325c9faec4b171f30"/></dir><file name="Opstatistics.php" hash="9ccaa740ddbfa607204bde0222fceafc"/><dir name="Statistics"><file name="Collection.php" hash="c92997470a39016001c196fa4bf17861"/></dir><file name="Statistics.php" hash="88d17295de3fc05637ac55e71c52a3a3"/></dir><file name="Observer.php" hash="65c9278ea5b84f14ff30b82a9d5780ca"/><file name="Opstatistics.php" hash="f3bfe7b7e44ef33e15877332a767b25a"/><file name="Statistics.php" hash="85f8bf8090484826dc0e43bb39324557"/></dir><dir name="controllers"><file name="WidgetController.php" hash="ca23d690e09435f5f4df54c539dea74b"/></dir><dir name="etc"><file name="config.xml" hash="47b67abbe18e357dfd7f1f3c78937f8b"/></dir><dir name="sql"><dir name="anattadesign_abandonedcarts_setup"><file name="mysql4-install-1.0.0.php" hash="b235486189e6609d4f9abc82ffae76c7"/><file name="mysql4-upgrade-1.0.0-1.0.1.php" hash="f9f7cbb6845f014f74c294692189c369"/><file name="mysql4-upgrade-1.0.1-1.1.0.php" hash="f9f7cbb6845f014f74c294692189c369"/></dir></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="anattadesign_abandonedcarts.xml" hash="c14481626a0c367d974a5660ed930482"/></dir><dir name="template"><dir name="anattadesign"><dir name="abandonedcarts"><file name="widget.phtml" hash="ce297c658f6c8edeb8b7f1ff609d28f9"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="AnattaDesign_AbandonedCarts.xml" hash="fba54c1c1c7b2abd323a56bcdd56be20"/></dir></target><target name="mage"><dir name="js"><dir name="anattadesign"><dir name="abandonedcarts"><file name="adminhack.js" hash="d8d1b081040d1dbbe87296e4ed064a91"/><file name="zepto.js" hash="61e66962daedd0943adc35a97b0eaa27"/></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="anattadesign"><dir name="abandonedcarts"><dir><dir name="css"><file name="style.css" hash="91b410a9fc1a5ff1e20e7c321fd64e23"/></dir><dir name="images"><file name="bt-rep.gif" hash="f2054c34f7d04f81082ef2d686464c5f"/><file name="powerdby.jpg" hash="82777ae659f9316a27dbf7e14e23a5e2"/><file name="table-step-img-arrow.jpg" hash="ea678306e6a71818565e09c771bec7a5"/><file name="table-step-img-last-arrow.jpg" hash="88b14ae05fd2105ba317025925a39880"/><file name="table-step-img.jpg" hash="4bcb56e9e828981d0c1654925848791e"/></dir></dir></dir></dir></dir></dir></dir></target></contents>
|
20 |
<compatible/>
|
21 |
+
<dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
|
22 |
</package>
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/ar-lt.jpg
DELETED
Binary file
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/ar-rt.jpg
DELETED
Binary file
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/logo.jpg
DELETED
Binary file
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/notifications-btm.gif
DELETED
Binary file
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/notifications.gif
DELETED
Binary file
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/style.css
CHANGED
@@ -1,46 +1,136 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
.
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
.
|
35 |
-
.
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
.
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@charset "utf-8";
|
2 |
+
/* CSS Document */
|
3 |
+
|
4 |
+
@font-face {
|
5 |
+
font-family: 'Conv_Helvetica';
|
6 |
+
src: url('../fonts/Helvetica.eot');
|
7 |
+
src: local('☺'), url('../fonts/Helvetica.woff') format('woff'), url('../fonts/Helvetica.ttf') format('truetype'), url('../fonts/Helvetica.svg') format('svg');
|
8 |
+
font-weight: normal;
|
9 |
+
font-style: normal;
|
10 |
+
}
|
11 |
+
.abwidget {
|
12 |
+
width:98%;
|
13 |
+
margin:20px auto;
|
14 |
+
font-family: 'Helvetica', arial;
|
15 |
+
}
|
16 |
+
.abwidget .widget-title {
|
17 |
+
background:#cf7e3e;
|
18 |
+
border:2px solid #c36449;
|
19 |
+
padding:8px 10px;
|
20 |
+
font-size:12px;
|
21 |
+
font-weight:normal;
|
22 |
+
color:#fff;
|
23 |
+
margin:0px;
|
24 |
+
position:relative;
|
25 |
+
}
|
26 |
+
.abwidget .widget-title a {
|
27 |
+
color:#fff;
|
28 |
+
text-decoration:underline;
|
29 |
+
display:inline-block !important;
|
30 |
+
}
|
31 |
+
.abwidget .widget-title a:hover {
|
32 |
+
text-decoration:none;
|
33 |
+
}
|
34 |
+
.abwidget .widget-title a.myab {
|
35 |
+
background:url(../images/powerdby.jpg) no-repeat 0 0;
|
36 |
+
position:absolute;
|
37 |
+
width:151px;
|
38 |
+
height:15px;
|
39 |
+
right:2px;
|
40 |
+
top:9px;
|
41 |
+
}
|
42 |
+
.abwidget .widget-content {
|
43 |
+
position:relative;
|
44 |
+
border:1px solid #343434;
|
45 |
+
border-top:none;
|
46 |
+
padding-top:75px;
|
47 |
+
}
|
48 |
+
.widget-content .checkout-info {
|
49 |
+
position:absolute;
|
50 |
+
width:70px;
|
51 |
+
text-transform:uppercase;
|
52 |
+
font-size:11px;
|
53 |
+
font-weight:bold;
|
54 |
+
color:#000;
|
55 |
+
text-align:center;
|
56 |
+
top:16px;
|
57 |
+
}
|
58 |
+
.widget-content .checkout-info small {
|
59 |
+
color:#cf7e3e;
|
60 |
+
display:block;
|
61 |
+
font-size:11px;
|
62 |
+
font-weight:bold;
|
63 |
+
}
|
64 |
+
.widget-content .item-1 {
|
65 |
+
right:290px;
|
66 |
+
}
|
67 |
+
.widget-content .item-2 {
|
68 |
+
right:190px;
|
69 |
+
}
|
70 |
+
.widget-content .item-3 {
|
71 |
+
right:30px;
|
72 |
+
width:130px;
|
73 |
+
text-align:left;
|
74 |
+
}
|
75 |
+
.widget-content .item-3 big {
|
76 |
+
font-size:36px;
|
77 |
+
font-weight:bold;
|
78 |
+
display:block;
|
79 |
+
line-height:30px;
|
80 |
+
}
|
81 |
+
.widget-content .graph-table {
|
82 |
+
vertical-align:bottom;
|
83 |
+
margin-top:20px;
|
84 |
+
}
|
85 |
+
.widget-content .graph-table table {
|
86 |
+
vertical-align:baseline;
|
87 |
+
}
|
88 |
+
.graph-table table td {
|
89 |
+
height:150px;
|
90 |
+
text-align:center;
|
91 |
+
vertical-align:bottom;
|
92 |
+
padding:0 5px;
|
93 |
+
width:1%;
|
94 |
+
}
|
95 |
+
.graph-table .number {
|
96 |
+
font-size:13px;
|
97 |
+
color:#cf7e3e;
|
98 |
+
}
|
99 |
+
.graph-table .graph {
|
100 |
+
background:#ebd5b7;
|
101 |
+
border:2px solid #c36449;
|
102 |
+
border-bottom:none;
|
103 |
+
margin:-2px 0 0 0
|
104 |
+
}
|
105 |
+
.graph-table .graph span.color {
|
106 |
+
background:#333;
|
107 |
+
display:block;
|
108 |
+
color:#fff;
|
109 |
+
text-align:center;
|
110 |
+
font-size:12px;
|
111 |
+
position:relative;
|
112 |
+
}
|
113 |
+
.graph-table .graph .value{ position:relative; display:block; color:#000; margin:0; text-align:center; top:-20px; font-size:12px;}
|
114 |
+
|
115 |
+
.graph-table .steps {
|
116 |
+
padding-right:4%;
|
117 |
+
border-right:1px solid #343434;
|
118 |
+
}
|
119 |
+
.graph-table .steps td {
|
120 |
+
background:#eaefef;
|
121 |
+
vertical-align:middle;
|
122 |
+
height:48px;
|
123 |
+
border-top:1px solid #343434;
|
124 |
+
text-align:center;
|
125 |
+
}
|
126 |
+
.graph-table .steps td.arrow {
|
127 |
+
background:url(../images/table-step-img-arrow.jpg) no-repeat center 0 #eaefef;
|
128 |
+
padding: 0;
|
129 |
+
}
|
130 |
+
.graph-table .steps span {
|
131 |
+
padding:0px 0 0 2px;
|
132 |
+
font-size:10px;
|
133 |
+
}
|
134 |
+
.graph-table .steps td.last-child {
|
135 |
+
background:url(../images/table-step-img-last-arrow.jpg) no-repeat left 0 #fff;
|
136 |
+
}
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/images/bt-rep.gif
ADDED
Binary file
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/images/powerdby.jpg
ADDED
Binary file
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img-arrow.jpg
ADDED
Binary file
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img-last-arrow.jpg
ADDED
Binary file
|
skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img.jpg
ADDED
Binary file
|