Magento - Загрузить файл во время регистрации

Я хочу, чтобы каждый пользователь, который регистрируется в моем экземпляре Magento, загружал сертификат, который показывает мне, что он зарегистрировал бизнес.

Я уже добавил поля в шаблон. Но как я могу получить файл и сохранить имя файла/содержимое в записи клиента?

Есть ли способ расширить функциональность в контроллерах?


person Sebastian Hoitz    schedule 27.09.2011    source источник
comment
издание сообщества я так понимаю? В версиях Pro и Enterprise эта функция встроена в атрибуты клиента.   -  person B00MER    schedule 27.09.2011
comment
Да, это Community Edition.   -  person Sebastian Hoitz    schedule 28.09.2011


Ответы (3)


На самом деле это еще проще:

Просто убедитесь, что вы установили эти параметры в файле config.xml:

            'attributes' => array(
                'prooffile' => array(
                    'type'          => 'text',
                    'input'         => 'file',
                    'label'         => 'Proof file',
                    'visible'       => true,
                    'required'      => false,
                    'position'      => 100,
                    "user_defined" => false,
                ),

Это добавляет хороший редактор в админку.

person Sebastian Hoitz    schedule 13.10.2011

Как я это сделал:

Я добавил поле файла в регистрационную форму:

<li class="fields">
                <div class="field">
                                <div class="input-box">
                                                <label for="prooffile"><?php echo $this->__('Proof of business registration') ?><span class="required">*</span></label><br />
                                                <input type="file" name="prooffile" id="prooffile" title="<?php echo $this->__('Proof of business registration') ?>" class="required-entry input-text" />
                                </div>
                </div>
</li>

Кроме того, убедитесь, что для enctype формы установлено значение «multipart/form-data».

После этого я создал класс, который подписывается на событие «user-register-success». Magento имеет очень надежный встроенный механизм Event/Observer.

Для этого у вас должен быть собственный модуль. В модулях etc/config.xml добавьте эти строки для прослушивателя событий:

    <events>
            <customer_register_success> <!-- The name of the Event -->
                    <observers>
                            <customfields> <!-- Your module name -->
                                    <type>singleton</type>
                                    <class>customfields/observer</class> <!-- The class name, that holds your callback function -->
                                    <method>handle_file_upload</method>
                            </customfields>
                    </observers>
            </customer_register_success>
    </events>

Это регистрирует обработчик событий для события customer_register_success. Убедитесь, что вы создали файл Observer.php в папке модели вашего модуля:

Модель/наблюдатель.php:

<?php

class Komola_Customfields_Model_Observer
{
        public function __construct()
        {

        }

        public function handle_file_upload($observer)
        {
                $customer = $observer->getCustomer();
                if (isset($_FILES['prooffile']['name']) && $_FILES['prooffile']['name'] != "") {
                                $uploader = new Varien_File_Uploader("prooffile");
                                $uploader->setAllowedExtensions(array('jpg', 'jpeg', 'gif', 'png', 'pdf'));
                                $uploader->setAllowRenameFiles(false);
                                $uploader->setFilesDispersion(false);
                                $path = Mage::getBaseDir("media") . DS . "customer" . DS;
                                $logoName = $customer->getId() . "." . pathinfo($_FILES['prooffile']['name'], PATHINFO_EXTENSION);
                                $uploader->save($path, $logoName);
                                $customer->setProoffile($logoName);
                                $customer->save();
                }
        }
}

Это берет загруженный файл и сохраняет его в папке media/customer (обязательно создайте эту папку и сделайте ее доступной для записи!). Он также сохраняет имя файла в пользовательском атрибуте клиента.

person Sebastian Hoitz    schedule 30.09.2011
comment
Я сделал точно такой же метод и сохранил файл в атрибуте клиента. но он не загружает файл, он дал мне исключение в строке: - $uploader = new Varien_File_Uploader(prooffile); сообщение «Файл не был загружен». - person Hassan Ali Shahzad; 04.03.2016

В файле установщика модуля создайте такой атрибут, и он появится в бэкенде клиента.

Дополнительная часть необходима для более новой версии Magento (не уверен, когда именно, но это верно для Magento Community Edition 1.6 и выше).

Ключ "used_in_forms" не может быть в массиве, переданном в вызов addAttribute напрямую (не будет работать). Вероятно, он содержит имена форм, из которых модель клиента будет принимать значения, а не игнорировать их при сохранении.

Известные значения находятся в ответах на этот вопрос: Больше нельзя добавлять регистрационные поля в Magento 1.4.2.0 (ответ Фолкера Шелленберга)

Я думаю, что это имя контроллера и действия, которое отобразило форму. Это имя также является основным именем дескриптора макета страницы (например, customer_account_edit).

Следует отметить, что форма клиента во внешнем интерфейсе основана на HTML. Он не обрабатывает входные данные из атрибутов динамически, как бэкэнд-формы. Это означает, что если эти атрибуты должны быть введены пользователем, шаблон необходимо изменить, чтобы он также содержал правильные входные теги (и правильное значение, добавленное в массив used_in_forms).

$attributeCode = "uploaded_file";
$attributeLabel = "Uploaded file";

$installer->addAttribute('customer', $attributeCode, array(
    'type' => 'text',
    'input' => 'file',
    'label' => $attributeLabel,
    'global' => true,
    'visible' => true,
    'required' => false,
    'user_defined' => false
));

// For newer versions of Magento, otherwise won't show up.
$eavConfig = Mage::getSingleton('eav/config');
$attribute = $eavConfig->getAttribute('customer', $attributeCode);
$attribute->setData('used_in_forms', array('customer_account_create', 'adminhtml_customer'));
$attribute->setData('sort_order', 200);
$attribute->save();

Другим возможным типом является «изображение», которое отображается точно так же, как «файл», за исключением того, что оно показывает изображение в окне предварительного просмотра (маленьком). Может быть, хорошо для фото клиента?

Кроме того, следует отметить, что это специфично для формы клиента (класс, который обрабатывает этот тип атрибута: Mage_Adminhtml_Block_Customer_Form_Element_File и Mage_Adminhtml_Block_Customer_Form_Element_Image), поэтому это не будет работать в атрибуте продукта без специальной работы.

Надеюсь это поможет !

person Raif Atef    schedule 17.05.2012