Данные пользовательской вкладки клиента не могут быть сохранены в администраторе


У меня есть пользовательский модуль, который используется для добавления пользовательского модуля в раздел "Клиент" в разделе "Администратор". Я успешно добавил эту вкладку и теперь пытаюсь сохранить пользовательские данные, полученные с помощью пользовательской вкладки, в пользовательской таблице. Для этого я использую метод наблюдателя, который показан ниже

<config>
-----------------
<global>
    <events>
      <adminhtml_customer_prepare_save>
          <observers>
              <save_customnewtab_data>
                  <type>singleton</type>
                  <class>customernewtab/observer</class>
                  <method>saveCustomerNewTabData</method>
              </save_customnewtab_data>
          </observers>
      </adminhtml_customer_prepare_save>
    </events>   
    --------------
 </global>
 ---------
 </config>

И мой наблюдатель показан ниже

<?php

class Mysite_Customernewtab_Model_Observer
{
    public function saveCustomerNewTabData($observer){

        if (isset($observer['customer'])) 
        {
            $customer = $observer['customer']->getData();
            echo "<pre>";
            print_r($customer);
            die();

        } 
        else 
        {
            //Do something with the customer
        }
    }
}

Это извлечение файла phtml, который я использую для отображения содержимого моей пользовательской вкладки

<!-- some contents here -->
<tr>
<td>
    <table class="form-list" cellspacing="0">
    <tbody>
        <tr>
                    <td class="value">
            <input id="customer_nick_name" class=" required-entry input-text required-entry" type="text" value="" name="customernewtab[customer_nick_name]" />
        </td>
        </tr>
    </tbody>
    </table>
</td>
</tr>
<?php /*profile pic section*/ ?>
 <tr>
<td>
    <table class="form-list" cellspacing="0">
    <tbody>
        <tr>
        <td>
            <div id="customernewtab-prof-pic" style=" margin-left: 250px;margin-top: 30px;">                
                <input id="customernewtab_file_name" type="hidden" name="customernewtab[customer_photo]" value=""  />
            <input id="customnewtab_file" type="file" name="customer_prof_pic" value="" />

            </div>
        </td>
        </tr>
             </tbody>
         </table>
     </td>
 </tr>

Теперь смотрите мой вывод наблюдателя при редактировании существующих данных клиента с помощью моих пользовательских данных был установлен вместе с ними.

Array
(
[entity_id] => 3
[entity_type_id] => 1
[attribute_set_id] => 0
[website_id] => 1
[email] => [email protected]
[group_id] => 1
[increment_id] => 
[store_id] => 1
[created_at] => 2014-03-10T04:23:00-07:00
[updated_at] => 2014-03-12 07:22:00
[is_active] => 1
[disable_auto_group_change] => 0
[firstname] => test
[lastname] => test
[password_hash] => 4de63e833f14934a3c5fd4213496a13c:n0seA0z1a135nmY3rtbTkUAmkTpiomzw
[created_in] => English
[prefix] => 
[middlename] => 
[suffix] => 
[taxvat] => 
[dob] => 
[gender] => 
[is_subscribed] => 
)

Как вы можете видеть, мои пользовательские данные отсутствуют в выходных данных. Мой вопрос

1) Почему мои пользовательские данные customer_nick_name и customer_photo не отображаются в выходных данных? 2) Что не так в моем коде? 3) Это правильный способ сохранения пользовательских данных вкладки?

Author: Rajeev K Tomy, 2014-03-13

1 answers

Почему мои пользовательские данные customer_nick_name и customer_photo не отображаются в выходных данных?

Поскольку они не обрабатываются, это происходит здесь:

\Mage_Adminhtml_CustomerController::saveAction
/** @var $customerForm Mage_Customer_Model_Form */
$customerForm = Mage::getModel('customer/form');
$customerForm->setEntity($customer)
    ->setFormCode('adminhtml_customer')
    ->ignoreInvisible(false)
;

$formData = $customerForm->extractData($this->getRequest(), 'account');

Вам нужно добавить атрибуты, которые должны быть проанализированы, в таблицу customer_form_attribute, если вы не используете логику magento.

Что не так в моем коде? Это правильный способ сохранения пользовательских данных вкладки?

Но почему бы вам просто не добавить новый атрибут и не позволить magento сделать все остальное? Magento должен отобразить атрибуты и показать их вам... и, конечно, спасти их.

В блоге есть много статей о том, как добавить атрибут клиента, например эта из elsondesigns.

$this->addAttribute($entity, 'some_attribute', array(
    'type' => 'text',               /* input type */
    'label' => 'Some Attribute',    /* Label for the user to read */
    'input' => 'text',              /* input type */
    'visible' => TRUE,              /* users can see it */
    'required' => FALSE,            /* is it required, self-explanatory */
    'default_value' => 'default',   /* default value */
    'adminhtml_only' => '1'         /* use in admin html only */
));

Добавление поля изображения возможно, часть с enctype немного сложнее (хороший улов!), И я думаю, что для этого вам нужен наблюдатель... и я ОШИБАЮСЬ. Все в порядке:

\Mage_Adminhtml_Block_Customer_Edit_Form
protected function _prepareForm()
{
    $form = new Varien_Data_Form(array(
        'id'        => 'edit_form',
        'action'    => $this->getData('action'),
        'method'    => 'post',
        'enctype'   => 'multipart/form-data'
    ));
 1
Author: Fabian Blechschmidt, 2014-03-13 05:57:17