Re: myDEBUG-adm log files - question
Re: myDEBUG-adm log files - question
I've traced this down to the following conditions:
- The currently signed-in admin is not a superuser.
- The admin profile associated with that admin has one or more of the 'Product Types' enabled.
For that set of conditions, the check_page function in admin_access.php is choking on the (non-existent) constant associated with the enabled Product Type. In that case, the main_page value returned for the enabled product type by the SQL query at line 29 of /ADMIN/includes/functions/admin_access.php is empty because there's no such key (e.g. _productTypes_product_music) to associate.
With the changes in red, the debug logs no longer are created ... but I'm not sure if (a) it's an appropriate change and (b) if it's a complete change.
Code:
$sql = "SELECT ap.main_page, ap.page_params
FROM " . TABLE_ADMIN . " a
LEFT JOIN " . TABLE_ADMIN_PAGES_TO_PROFILES . " ap2p ON ap2p.profile_id = a.admin_profile
LEFT JOIN " . TABLE_ADMIN_PAGES . " ap ON ap.page_key = ap2p.page_key
WHERE admin_id = :adminId:";
$sql = $db->bindVars($sql, ':adminId:', $_SESSION['admin_id'], 'integer');
$result = $db->Execute($sql);
$retVal = FALSE;
while (!$result->EOF) {
$pageName = zen_not_null($result->fields['main_page']) ? constant($result->fields['main_page']) : '';
if (($pageName == $page || basename($pageName, '.php') == $page) && $result->fields['page_params'] == $page_params) {
$retVal = TRUE;
}
$result->MoveNext();
}
I also noticed during my "playing" with this that it's not possible to check 'Product Types', 'Product - Free Shipping' in an admin profile and have it remain checked after clicking the Update button.
Re: myDEBUG-adm log files - question
Quote:
Originally Posted by
lat9
I also noticed during my "playing" with this that it's not possible to check 'Product Types', 'Product - Free Shipping' in an admin profile and have it remain checked after clicking the Update button.
The issue here is that the page_key value created in the admin_pages_to_profiles table (_productTypes_product_free_shipping) is 35 characters long and doesn't quite fit into the field that's defined as varchar(32).:(
Re: myDEBUG-adm log files - question
Quote:
Originally Posted by
lat9
With the changes in
red, the debug logs no longer are created ... but I'm not sure if (a) it's an appropriate change and (b) if it's a complete change.
Code:
$sql = "SELECT ap.main_page, ap.page_params
FROM " . TABLE_ADMIN . " a
LEFT JOIN " . TABLE_ADMIN_PAGES_TO_PROFILES . " ap2p ON ap2p.profile_id = a.admin_profile
LEFT JOIN " . TABLE_ADMIN_PAGES . " ap ON ap.page_key = ap2p.page_key
WHERE admin_id = :adminId:";
$sql = $db->bindVars($sql, ':adminId:', $_SESSION['admin_id'], 'integer');
$result = $db->Execute($sql);
$retVal = FALSE;
while (!$result->EOF) {
$pageName = zen_not_null($result->fields['main_page']) ? constant($result->fields['main_page']) : '';
if (($pageName == $page || basename($pageName, '.php') == $page) && $result->fields['page_params'] == $page_params) {
$retVal = TRUE;
}
$result->MoveNext();
}
A better solution is to improve the query to 'weed out' the erroneous selection in the first place:
Code:
$sql = "SELECT ap.main_page, ap.page_params
FROM " . TABLE_ADMIN . " a
LEFT JOIN " . TABLE_ADMIN_PAGES_TO_PROFILES . " ap2p ON ap2p.profile_id = a.admin_profile
LEFT JOIN " . TABLE_ADMIN_PAGES . " ap ON ap.page_key = ap2p.page_key
WHERE admin_id = :adminId:
AND ap2p.page_key NOT LIKE '_productTypes_%'";
$sql = $db->bindVars($sql, ':adminId:', $_SESSION['admin_id'], 'integer');
$result = $db->Execute($sql);
$retVal = FALSE;
while (!$result->EOF) {
$pageName = constant($result->fields['main_page']);
if (($pageName == $page || basename($pageName, '.php') == $page) && $result->fields['page_params'] == $page_params) {
$retVal = TRUE;
}
$result->MoveNext();
}
Re: myDEBUG-adm log files - question
Quote:
Originally Posted by
EdsGoodStuff
[30-Nov-2012 21:41:11] PHP Warning: constant() [function.constant]: Couldn't find constant in /home/content/html/admin/includes/functions/admin_access.php on line 38
I checked in /admin/includes/functions/admin_access.php and this is what it says on line 38:
if (constant($result->fields['main_page']) == $page && $result->fields['page_params'] == $page_params) {
Quote:
Originally Posted by
EdsGoodStuff
Seem to have found a solution.
I went to Admin Access Management> Admin Profiles and clicked on Edit for the Administrator User Profile. The BOX_HEADING_PRODUCT_TYPES category at the bottom of the page has four check-boxes of which three were checked by default- Product-Music, Document-General, and Document-Product. When I uncheck these boxes and update the profile I can log in as Administrator and not get any myDebug errors.
Quote:
Originally Posted by
lat9
I've traced this down to the following conditions:
- The currently signed-in admin is not a superuser.
- The admin profile associated with that admin has one or more of the 'Product Types' enabled.
For that set of conditions, the check_page function in admin_access.php is choking on the (non-existent) constant associated with the enabled Product Type. In that case, the main_page value returned for the enabled product type by the SQL query at line 29 of /ADMIN/includes/functions/admin_access.php is empty because there's no such key (e.g. _productTypes_product_music) to associate.
With the changes in
red, the debug logs no longer are created ... but I'm not sure if (a) it's an appropriate change and (b) if it's a complete change.
Code:
$sql = "SELECT ap.main_page, ap.page_params
FROM " . TABLE_ADMIN . " a
LEFT JOIN " . TABLE_ADMIN_PAGES_TO_PROFILES . " ap2p ON ap2p.profile_id = a.admin_profile
LEFT JOIN " . TABLE_ADMIN_PAGES . " ap ON ap.page_key = ap2p.page_key
WHERE admin_id = :adminId:";
$sql = $db->bindVars($sql, ':adminId:', $_SESSION['admin_id'], 'integer');
$result = $db->Execute($sql);
$retVal = FALSE;
while (!$result->EOF) {
/// FIX: add the zen_not_null() check here
$pageName = zen_not_null($result->fields['main_page']) ? constant($result->fields['main_page']) : '';
if (($pageName == $page || basename($pageName, '.php') == $page) && $result->fields['page_params'] == $page_params) {
$retVal = TRUE;
}
$result->MoveNext();
}
I also noticed during my "playing" with this that it's not possible to check 'Product Types', 'Product - Free Shipping' in an admin profile and have it remain checked after clicking the Update button.
Quote:
Originally Posted by
lat9
The issue here is that the page_key value created in the admin_pages_to_profiles table (_productTypes_product_free_shipping) is 35 characters long and doesn't quite fit into the field that's defined as varchar(32).:(
Quote:
Originally Posted by
lat9
A better solution is to improve the query to 'weed out' the erroneous selection in the first place:
Code:
$sql = "SELECT ap.main_page, ap.page_params
FROM " . TABLE_ADMIN . " a
LEFT JOIN " . TABLE_ADMIN_PAGES_TO_PROFILES . " ap2p ON ap2p.profile_id = a.admin_profile
LEFT JOIN " . TABLE_ADMIN_PAGES . " ap ON ap.page_key = ap2p.page_key
WHERE admin_id = :adminId:
AND ap2p.page_key NOT LIKE '_productTypes_%'";
/// FIX: added the AND line above
$sql = $db->bindVars($sql, ':adminId:', $_SESSION['admin_id'], 'integer');
$result = $db->Execute($sql);
$retVal = FALSE;
while (!$result->EOF) {
$pageName = constant($result->fields['main_page']);
if (($pageName == $page || basename($pageName, '.php') == $page) && $result->fields['page_params'] == $page_params) {
$retVal = TRUE;
}
$result->MoveNext();
}
Moved to Bug Reports area for further investigation.
Re: myDEBUG-adm log files - question
I just wanted to report that I experienced this bug as well. Mine is a heavily modified zen cart that has been updated from 1.3.8 to it's current 1.5.1. Some plugins that might have triggered this? Perhaps SSU or the fact that I had previously installed admin profiles, but then removed it once I upgraded to 1.5.1.
Once I went in and set up profiles for everyone the error seemed to disappear and hasn't come back. So I'm just hoping it was temporary and ignoring it for now.
Re: myDEBUG-adm log files - question
Same problem here in fresh install of 1.5.1 No mods or edits its stock u Get the following message: PHP Warning: constant(): Couldn't find constant in /..includes/functions/admin_access.php on line 38, referer: http://.../categories.php?cPath=11&c...=edit_category
An 8mb error log file has been growing and growing because of this error. Is there a fix? I tried the above and i get an "Error please refresh this page" when trying to edit categories.
The problem also does not occur on superuser profile. Only occurs on custom profiles.
Re: myDEBUG-adm log files - question
I've got this issue with other than super user profiles AFTER installing Image Handler 4, but people in the IH thread concluded that it would not be an IH problem. So, the problem really persists and an administrator can't update the product info anymore due to this permission issue:
http://www.zen-cart.com/showthread.p...36#post1189336
The error log tells about the same CONSTANT issues than in this thread.
Re: myDEBUG-adm log files - question
Quote:
Originally Posted by
lat9
A better solution is to improve the query to 'weed out' the erroneous selection in the first place:
Code:
$sql = "SELECT ap.main_page, ap.page_params
FROM " . TABLE_ADMIN . " a
LEFT JOIN " . TABLE_ADMIN_PAGES_TO_PROFILES . " ap2p ON ap2p.profile_id = a.admin_profile
LEFT JOIN " . TABLE_ADMIN_PAGES . " ap ON ap.page_key = ap2p.page_key
WHERE admin_id = :adminId:
AND ap2p.page_key NOT LIKE '_productTypes_%'";
$sql = $db->bindVars($sql, ':adminId:', $_SESSION['admin_id'], 'integer');
$result = $db->Execute($sql);
$retVal = FALSE;
while (!$result->EOF) {
$pageName = constant($result->fields['main_page']);
if (($pageName == $page || basename($pageName, '.php') == $page) && $result->fields['page_params'] == $page_params) {
$retVal = TRUE;
}
$result->MoveNext();
}
I've been using this fix on a couple of my 1.5.1 installations since January 2013 and it appears to work well. Thanks lat9!