【问题标题】:Get error while editing Customers from back end in Magento在 Magento 中从后端编辑客户时出错
【发布时间】:2011-12-14 13:07:47
【问题描述】:

我突然开始遇到这个错误,需要一些帮助。

在我的“管理客户”部分,每当我添加新客户时,它都会显示所有值都正确无误。但是每当我尝试编辑新添加的客户时,我都会在 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";}

对不起,我也意识到,尽管我编写的代码至少可以让我编辑我的记录而不会出现任何错误,但仍然会将 Customer since 更改为随机日期值,例如 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...', 数组) #1 /home/wpfsl/public_html/app/design/adminhtml/default/default/template/sales/order/view/tab/history.phtml(38): Mage_Adminhtml_Block_Sales_Order_View_Tab_History->isCustomerNotificationNotApplicable(Array) #2 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(241): include('/home/wpfsl/pub...') #3 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...') #4 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView() #5 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() #6 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Template->_toHtml() #7 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/Block/Widget/Tabs.php(303): Mage_Core_Block_Abstract->toHtml() #8 /home/wpfsl/public_html/app/design/adminhtml/default/default/template/widget/tabs.phtml(38): Mage_Adminhtml_Block_Widget_Tabs->getTabContent(Object(Mage_Adminhtml_Block_Sales_Order_View_Tab_History)) #9 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(241): include('/home/wpfsl/pub...') #10 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...') #11 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView() #12 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() #13 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Template->_toHtml() #14 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml() #15 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Text_List->_toHtml() #16 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml() #17 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('left', true) #18 /home/wpfsl/public_html/app/design/adminhtml/default/default/template/page.phtml(58): Mage_Core_Block_Abstract->getChildHtml('left') #19 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(241): include('/home/wpfsl/pub...') #20 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...') #21 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView() #22 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() #23 /home/wpfsl/public_html/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Template->_toHtml() #24 /home/wpfsl/public_html/app/code/core/Mage/Core/Model/Layout.php(529): Mage_Core_Block_Abstract->toHtml() #25 /home/wpfsl/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(391): Mage_Core_Model_Layout->getOutput() #26 /home/wpfsl/public_html/app/code/core/Mage/Adminhtml/controllers/Sales/OrderController.php(119): Mage_Core_Controller_Varien_Action->renderLayout() #27 /home/wpfsl/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(420): Mage_Adminhtml_Sales_OrderController->viewAction() #28 /home/wpfsl/public_html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('view') #29 /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)) #30 /home/wpfsl/public_html/app/code/core/Mage/Core/Model/App.php(347): Mage_Core_Controller_Varien_Front->dispatch() #31 /home/wpfsl/public_html/app/Mage.php(640): Mage_Core_Model_App->run(Array) #32 /home/wpfsl/public_html/index.php(80): Mage::run('', 'store') #33 {main}";s:3:"url";s:88:"/index.php/wpfsl_admin/sales_order/view/order_id/3/key/148f59cc3e6d14da7c22a004114985cf/";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:5:"admin";}

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

【问题讨论】:

  • 哦,我刚刚意识到,我今天之前的客户编辑得很好。只有我从今天开始使用后端的“添加新客户”或使用前端界面添加的客户。一旦我尝试编辑它们,我就无法编辑它们,因为它们的“客户自”更改为“30 Nov -1 01:00:00”。
  • 请发布相应的错误信息(shouldve been dumped to your var/report` 文件夹)。
  • 我已使用错误消息表单 var/report 编辑了问题。

标签: php zend-framework magento e-commerce


【解决方案1】:

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

我已通过将以下函数添加到 Mage_Customer_Model_Form 来解决此问题。一个更好的解决方案是创建一个类重写。一个更好的解决方案是 Magento 传递使用语言环境转换的任何字段,然后将它们转换回 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 字段工作正常。这是因为字段本身设置了所有正确的位,以告诉日期选择器以 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

【讨论】:

    【解决方案2】:

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

    eav/entity_attribute_backend_datetime
    

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

    【讨论】:

      【解决方案3】:

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

      1. 首先,如果你有这个错误,你需要去数据库更新customer_entity表。搜索created_at字段,如果它是空的,给它一个有效值,我很震惊Magento现在允许你在管理员中编辑created_at日期,不知道它会有多大用处。
      2. 之后,您将获得正确的日期并可以查看管理员客户编辑表单。由于我的站点是基于 EE1.11 构建的,所以它应该与 1.6.0 或 1.6.1 相同。我使用 AU 作为默认语言环境,这就是错误的来源。
        您必须转到 Configuration -> Catalog -> Date & Time Custom Options 并确保它使用 AU 格式 DD/MM/YYY,如果在您的网站上线之前完成此操作,应该没问题。

      希望对您有所帮助,因为大多数开发人员在开始编码之前不会完成所有设置。干杯!

      张本

      【讨论】:

        【解决方案4】:

        在这里遇到同样的问题。 所以我在 Magento 1.6.1.0 的全新安装上进行了尝试,并发生了以下情况。

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 您好,您想指定哪个文件需要进行此编辑?仅此编辑是否会以正确的格式保存日期并避免出现任何错误?
          • 如果有人能过来回复一下需要在哪里进行上述更改(即哪个文件)并且这个编辑是否解决了问题,那就太好了?
          • 如果您能详细解释您的解决方案,我将不胜感激,这样我也可以尝试为我的代码解决这个问题。现在它对我来说太模糊了,以至于什么文件需要什么编辑等等。谢谢。
          【解决方案6】:

          假设您使用的是 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的虚拟映射

          【讨论】:

          • 是的,它确实在首次创建客户时创建了正确的条目。除非我们编辑记录,否则日期值保持正常。一旦我们编辑记录,数据库中的值就会更改为随机日期和 0000:00:00 00:00:00。同样在创建订单时,它会引发我在下面提到的错误,并且从未真正继续前进。
          • 当你编辑记录时,究竟调用了哪个动作来保存编辑后的数据(请使用class::method())?并请显示请求保存操作的表单提交的日期。
          • 我不确定这一点,但它的布局正在 app/code/core/Mage/Adminhtml/Block/Customer/Edit.php 中创建,实际的保存和编辑操作正在发生在 app/code/core/Mage/Adminhtml/controllers/CustomerController.php::saveAction(),我猜。但我不确定。
          • 很抱歉,当您说“请显示请求保存操作的表单提交时传递的日期”时,我没有听懂您的意思。
          • 我仍然面临同样的问题,我所有的商店都使用 Magento 1.6.0 n 1.6.1 请帮助并让我知道是否有解决此问题的方法。
          【解决方案7】:

          我正在使用 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; 
          

          但是,当我编辑任何新添加的客户记录时,客户自更改回 30 Nov -1 01:00:00。那么这是一个已知的错误还是什么?有没有人可以解决这个问题?

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 2013-11-17
              • 1970-01-01
              • 2016-02-18
              • 1970-01-01
              • 2023-03-24
              • 1970-01-01
              • 1970-01-01
              • 2016-12-15
              • 1970-01-01
              相关资源
              最近更新 更多