在Magento中从后端编辑客户时获取错误

时间:2011-12-14 13:07:47

标签: php zend-framework magento e-commerce

我突然开始在任何地方遇到这个错误,需要一些帮助。

在我的“管理客户”部分中,当我添加新客户时,它显示正常,所有值都正确。但每当我尝试编辑新添加的客户时,我都会在Magento中收到错误页面。

  

处理您的请求时出错。

稍后当我返回“管理客户”网格时,该客户记录的“客户自”列更改为此值“30 Nov -1 01:00:00”

那么有人知道那边可能出了什么问题吗?

这是var / report文件夹中的错误,

a:5:{i:0;s:25:"No date part in '' found.";i:1;s:4432:"#0 /home/wpfsl/public_html/lib/Zend/Date.php(1078): Zend_Date->_calculate('set', false, NULL, 'en_GB')
#1 /home/wpfsl/public_html/lib/Zend/Date.php(197): Zend_Date->set(false, NULL, 'en_GB')
#2 /home/wpfsl/public_html/app/code/core/Mage/Core/Model/Locale.php(478): Zend_Date->__construct(false, NULL, Object(Zend_Locale))
#3 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View.php(76): Mage_Core_Model_Locale->date(false)
#4 /home/wpfsl/public_html/app/design/adminhtml/default/default/template/customer/tab/view.phtml(36): Mage_Adminhtml_Block_Customer_Edit_Tab_View->getCreateDate()
#5 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(241): include('/home/wpfsl/pub...')
#6 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
#7 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#8 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
#9 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Template->_toHtml()
#10 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/Block/Widget/Tabs.php(303): Mage_Core_Block_Abstract->toHtml()
#11 /home/wpfsl/public_html/app/design/adminhtml/default/default/template/widget/tabs.phtml(38): Mage_Adminhtml_Block_Widget_Tabs->getTabContent(Object(Mage_Adminhtml_Block_Customer_Edit_Tab_View))
#12 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(241): include('/home/wpfsl/pub...')
#13 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
#14 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#15 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
#16 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Template->_toHtml()
#17 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml()
#18 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Text_List->_toHtml()
#19 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#20 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('left', true)
#21 /home/wpfsl/public_html/app/design/adminhtml/default/default/template/page.phtml(58): Mage_Core_Block_Abstract->getChildHtml('left')
#22 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(241): include('/home/wpfsl/pub...')
#23 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
#24 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#25 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
#26 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Template->_toHtml()
#27 /home/wpfsl/public_html/app/code/core/Mage/Core/Model/Layout.php(529): Mage_Core_Block_Abstract->toHtml()
#28 /home/wpfsl/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(391): Mage_Core_Model_Layout->getOutput()
#29 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/controllers/CustomerController.php(151): Mage_Core_Controller_Varien_Action->renderLayout()
#30 /home/wpfsl/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(420): Mage_Adminhtml_CustomerController->editAction()
#31 /home/wpfsl/public_html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('edit')
#32 /home/wpfsl/public_html/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#33 /home/wpfsl/public_html/app/code/core/Mage/Core/Model/App.php(347): Mage_Core_Controller_Varien_Front->dispatch()
#34 /home/wpfsl/public_html/app/Mage.php(640): Mage_Core_Model_App->run(Array)
#35 /home/wpfsl/public_html/index.php(80): Mage::run('', 'store')
#36 {main}";s:3:"url";s:80:"/index.php/wpfsl_admin/customer/edit/id/11/key/4e2ec034dd470035e31f5f55242e0811/";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:5:"admin";}

对不起我也意识到虽然我写的atleast代码让我编辑我的记录没有任何错误,但仍然将客户更改为随机日期值,如30 No -01 01:00:00。

但是,如果我尝试从后端为使用magento后端创建的客户创建订单,我会收到以下错误

a:5:{i:0;s:825:"Invalid method Mage_Adminhtml_Block_Sales_Order_View_Tab_History::isCustomerNotificationNotApplicable(Array ( [0] => Array ( [title] => Pending [notified] => 0 [comment] => [created_at] => Zend_Date Object ( [_locale:Zend_Date:private] => en_GB [_fractional:Zend_Date:private] => 0 [_precision:Zend_Date:private] => 3 [_unixTimestamp:Zend_Date_DateObject:private] => 1323946274 [_timezone:Zend_Date_DateObject:private] => Europe/London [_offset:Zend_Date_DateObject:private] => -3600 [_syncronised:Zend_Date_DateObject:private] => 0 [_dst:protected] => 1 )

    )

) ) )";i:1;s:4197:"#0 /home/wpfsl/public_html/app/design/adminhtml/default/default/template/sales/order/view/tab/history.phtml(38): Varien_Object->__call('isCustomerNotif...', Array)

我再次猜测这个错误也与Date因素有关?

8 个答案:

答案 0 :(得分:4)

似乎这是Magento中与不同语言环境中的日期格式相关的错误。编辑客户时,created_at字段可编辑并显示在当前区域设置中。对于我在英国,这是DD / MM / YYYY。单击“保存”时,它会尝试将此值直接放入数据库并因为不是可接受的数据库格式而失败。

我已通过将以下函数添加到Mage_Customer_Model_Form来修复此问题。一个更好的解决方案是创建一个类重写。一个更好的解决方案是让Magento通过任何使用locale转换的字段,然后在尝试将它们插回数据库之前将它们转换回iso格式。如果没有这个功能(也许我已经知道了),就我所见,这个问题很可能会再次发生。

public function compactData(array $data)
{
    if (array_key_exists('created_at', $data))
    {
        $data['created_at'] = Mage::app()->getLocale()->date($data['created_at'])->getIso();
    }

    return parent::compactData($data);
}

编辑:

做了一些挖掘。我注意到dob字段工作正常。这是因为字段本身设置了所有正确的位,以告诉datepicker以MM / DD / YYYY格式发回日期。

似乎Magento已经成立,可以通过多种方式解决这个问题。 CustomerController中有一个未使用的函数_filterPostData()调用_filterDates(),它比我上面的解决方案做得更好(我假设)。

我已经更改了我的修复程序以使用此功能,但必须从控制器范围调用它。同样,我不建议更改核心代码,但我的新修复是在Mage_Adminhtml_CustomerController :: saveAction()中。我添加了第二行:

$formData   = $customerForm->extractData($this->getRequest(), 'account');
$formData   = $this->_filterDates($formData, array('created_at')); /// added this line

答案 1 :(得分:2)

根据上面的Oscar Reales帖子,更改created_at表中的backend_model属性eav_attribute解决了我的问题,但是我使用的值与dob one相同

eav/entity_attribute_backend_datetime

这对我有用并且输入31/10/2012显示正确,eav/entity_attribute_backend_time_created导致了上面的随机日期。我通过编辑在日期创建的现有帐户,在后端创建了一个帐户并在前端创建了一个帐户来测试了这一点。一切正常。顺便说一句,我的地方是英国。

答案 2 :(得分:1)

在这里遇到同样的问题。 所以我在Magento 1.6.1.0的干净安装上试过它,发生以下情况。

  1. 在前端创建客户
  2. 表格中的
  3. 记录“客户实体”包含列created_at,值为 2011-12-15 10:14:45
  4. 在管理员中>客户>管理客户>编辑客户并单击“保存”
  5. 记录表*“customer_ity”值* created_at *已更改为 2015-12-11 00:00:00

答案 3 :(得分:1)

正如我之前所说,您可以使用自定义模块执行此属性backend_model update,并将此行添加到安装脚本中:

Mage::getSingleton('customer/customer')->getAttribute('created_at')
  ->setBackendModel('eav/entity_attribute_backend_time_created')
  ->setAttributeModel(new Zend_Db_Expr('NULL'))
  ->setInputFilter('date')
  ->save();

答案 4 :(得分:1)

我也有这个问题,但我找到了改变它的方法而没有任何编码 首先,如果您收到此错误,则由日期设置引起,Magento 1.6和EE1.11开始更新其数据库模型,以便能够使用Oracle和其他SQL DB。这就是为什么他们需要将数据库表类型从datetime更改为timestamp,因为它可以简单地由数据库本身进行解析。以下是解决方案:

  1. 首先,如果您有此错误,则需要转到数据库以更新customer_entity表。搜索created_at字段,如果该字段为空,则为其提供有效值,我很震惊Magento现在允许您在管理员中编辑created_at日期,不知道它有多大用处。< / LI>
  2. 之后,您将获得正确的日期,您可以查看管理员客户编辑表单。由于我的网站建立在EE1.11上,它应该与1.6.0或1.6.1相同。我使用AU作为默认语言环境,因此错误来自何处 您必须转到Configuration - &gt; Catalog - &gt; Date & Time Custom Options并确保它使用的是AU格式DD/MM/YYY,如果在您的网站上线之前完成,则应该没问题。
  3. 希望这个帮助,因为大多数开发人员在开始编码之前不会完成所有设置。干杯!

    Ben Zhang

答案 5 :(得分:0)

假设您正在使用Magento 1.6.x(您没有提及版本),报告的第3行和第4行

#3 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View.php(76): Mage_Core_Model_Locale->date(false)
#4 /home/wpfsl/public_html/app/design/adminhtml/default/default/template/customer/tab/view.phtml(36): Mage_Adminhtml_Block_Customer_Edit_Tab_View->getCreateDate()

表示您的客户created_at字段 * 包含有效的日期时间/时间戳:

public function getCreateDate()
{
    $date = Mage::app()->getLocale()->date($this->getCustomer()->getCreatedAtTimestamp());
    return $this->formatDate($date, Mage_Core_Model_Locale::FORMAT_TYPE_MEDIUM, true);
}

请注意,Mage_Adminhtml_Block_Customer_Edit_Tab_View无法格式化created_at字段的已存在(但无效)值。

您的真正的问题出现在记录生命周期的早期。

我开始检查添加新客户是否确实产生了有效的created_at条目。


* customer_since只是created_at 的虚拟映射。

答案 6 :(得分:0)

我正在使用Magento ve 1.6.1。我的getCreateDate()函数与您提到的完全一样。我没有看到问题,因为在创建新客户时,日期会得到正确保存。它只在我编辑记录时才会改变。

找到了部分解决方案。使用此代码更改lib / Zend / Date.php可以让我编辑并保存我的记录,而不会出现任何错误。

isset($parsed['year']) ? (1970 + $parsed['year']) : 1970,
                        false), $this->getUnixTimestamp(), false);

                } catch (Zend_Locale_Exception $e) {

/*-- fix BEGIN --*/Zend_Locale_Format::getDate( ) failed --*/

                    if( !is_numeric( $date ) ) {

                            $parsed = date_parse( $date . ( $locale != "" ? " " . $locale : "" ) );
                            if( $parsed === FALSE ) {
                                    $parsed = array( 'year' => 1970, 'month' => 1, 'day' => 1, 'hour' => 0, 'minute' => 0, 'second' => 0 );
                            }

                            return $this->_assign( $calc, $this->mktime(
                                            $parsed['hour'],
                                            $parsed['minute'],
                                            $parsed['second'],
                                            $parsed['month'],
                                            $parsed['day'],
                                            $parsed['year'], false ),
                                            $this->getUnixTimestamp( ), false );

                    } else {

                            #require_once 'Zend/Date/Exception.php';
                            throw new Zend_Date_Exception( $e->getMessage( ) , 0, $e, $date );
                    }
/*-- fix END --*/

                }

            }

            return $this->_assign($calc, $date, $this->getUnixTimestamp(), false);
            break; 

但是,当我编辑任何新添加的客户记录时,客户自从更改回到11月1日-1 01:00:00。那么这是一个已知的bug还是什么?有没有人围绕这个问题做过什么工作?

答案 7 :(得分:0)

这是此属性使用的backend_model的问题。 dob使用“eav / entity_attribute_backend_datetime”backend_model,产品使用的是“eav / entity_attribute_backend_time_created”,但customer_at却没有使用它。这个backend_model正在处理所有转换和过滤日期,因此,它就像更改“eav_attribute”表一样简单。搜索attribute_code ='created_at'和entity_type_id = 1并将backend_model的值从NULL更新为“eav / entity_attribute_backend_time_created”,即。不需要更改核心文件。

如果您愿意,可以使用资源设置从您自己模块的安装程序更新此属性。