Magento сохранить мультиселект в контроллере? - PullRequest
2 голосов
/ 17 августа 2010
$fieldset->addField('brand_id', 'multiselect', array(
    'label'     => Mage::helper('expertbrand')->__('Merk:'),
    'name'      => 'brand_id[]',   
    'values'    => $aOptionsMerk,
));

У меня есть этот мультиселектор с 600 опциями. Я хотел бы знать, как сохранить это в контроллере?

Я все перепробовал и работал над этой проблемой уже 3 дня. Также в Интернете я не могу найти правильный ответ на эту проблему. Надеюсь, что кто-то здесь может помочь мне, потому что я действительно хотел бы знать!

Код моего контроллера:

public function saveAction() {
    if ($data = $this->getRequest()->getPost()) {

        if(isset($_FILES['filename']['name']) && $_FILES['filename']['name'] != '') {
            try { 
                /* Starting upload */ 
                $uploader = new Varien_File_Uploader('filename');

                // Any extention would work
                $uploader->setAllowedExtensions(array('jpg','jpeg','gif','png'));
                $uploader->setAllowRenameFiles(false);

                // Set the file upload mode 
                // false -> get the file directly in the specified folder
                // true -> get the file in the product like folders 
                // (file.jpg will go in something like /media/f/i/file.jpg)
                $uploader->setFilesDispersion(false);

                // We set media as the upload dir
                $path = Mage::getBaseDir('media') . DS ;
                $uploader->save($path, $_FILES['filename']['name'] );     
            } catch (Exception $e) {

            }

            //this way the name is saved in DB
            $data['filename'] = $_FILES['filename']['name'];
        }

        /*
        $brands=$data['brand_id'];
        $t=count($brands);
        $inhoud="";
        $i=1;
        foreach ($brands as $brand){
            if ($t == $i){
                $inhoud.=$brand; 
            } else {
                $inhoud.=$brand." , ";
            }
            $i++;
        }
        //echo $inhoud;
        // $br=array('brand_id');
        $br=$inhoud;
        $data['brand_id']=$br;
        */
        //hier moet de loop komen

        $id= $data['expert_id'];
        $db1 = Mage::getSingleton('core/resource')->getConnection('core_write'); 
        $result = $db1->query("SELECT name FROM expert where expert_id=$id");
        $rows = $result->fetch(PDO::FETCH_ASSOC);
        $data['name']=$rows['name'];
        //$data['brand_id']=$_POST['brand_id']; 
        $model = Mage::getModel('expertbrand/expertbrand');  
        $model->setData($data)
            ->setId($this->getRequest()->getParam('id'));

        try {
            if ($model->getCreatedTime == NULL || $model->getUpdateTime() == NULL) {
                $model->setCreatedTime(now())
                ->setUpdateTime(now());
            } else {
                $model->setUpdateTime(now());
            } 

            $model->save();



            //hier is het einde van de loop..
            Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('expertbrand')->__('Item was successfully saved'));
            Mage::getSingleton('adminhtml/session')->setFormData(false);

            if ($this->getRequest()->getParam('back')) {
                $this->_redirect('*/*/edit', array('id' => $model->getId()));
                return;
            }

            $this->_redirect('*/*/');
            return;
        } catch (Exception $e) {
            Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
            Mage::getSingleton('adminhtml/session')->setFormData($data);
            $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
            return;
        }
    }

    Mage::getSingleton('adminhtml/session')->addError(Mage::helper('expertbrand')->__('Unable to find item to save'));
    $this->_redirect('*/*/');
}

Как мне сохранить optionsArray, отправленный через $_POST? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 27 декабря 2012

Добавьте это к вашему действию saveAction в вашем контроллере, чтобы преобразовать данные в строку:

foreach ($data as $key => $value)
    {
        if (is_array($value))
        {
            $data[$key] = implode(',',$this->getRequest()->getParam($key)); 
        }
    }  
0 голосов
/ 17 августа 2010

мне ясно, что данные отправляются в массиве.Чтобы исправить это, я создал функцию, которая переписывает массив.

 $brands=$data['brand_id'];
     $t=count($brands);
    $inhoud="";
            $i=1;
            foreach ($brands as $brand){
                if ($t == $i){
                  $inhoud.=$brand;  
                }
                else {
                $inhoud.=$brand." , ";
                }
                $i++;
            }
            //echo $inhoud;
           // $br=array('brand_id');
            $br=$inhoud;
            $data['brand_id']=$br;

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

104 , 106 , 107 , 108 

я делаю это, потому что где-то читаючто это было необходимо для этого.

Как бы то ни было, когда я открываю свое поле редактирования, единственное, что показывает:

selected = "selected" - это бренд со значением 108 (последний)

это проблема, потому что мне нужно, чтобы все 4 из них были показаны как выбранные.

Имеет ли это какое-то отношение к тому, как я сохраняю эти данные ... не уверен, должны ли данные быть сохранены в виде массива, чтобы показать все выбранные = "выбранные" поля в редактировании

кстати, expert_id - это что-то еще, и здесь не проблема, я знаю, что sql должен быть где-то еще, но так как я все еще изучаю magento, это был быстрый грязный метод, чтобы исправить проблему, которая у меня была раньше ...

все, что я хочу знать, это как сохранить массив для отображения всех значений в виде поля selected = "selected" в форме редактирования ... Txs ....

Хорошо, я исправил проблему с даннымидолжен быть сохранен как

106,108,114,99

Теперь все выбрано в поле редактирования. Странно, что ничего такого нет в интернете, надеюсь, это поможет другим людям, имеющим дело ста же проблема

0 голосов
/ 17 августа 2010

Для начала:

  • Вы объявили вход как "brand_id []", поэтому вы ищете $data['brand_id'], который должен быть массивом.В закомментированном коде вы, похоже, используете эти данные, но ваш текущий код ищет только $data['expert_id'], что не похоже на то же самое.

  • Даже если вы изменитев этой строке к $data['brand_id'], имейте в виду, что это массив , поэтому вам нужно знать об этом в запросах.

  • Выесть куча логики в контроллере, которой там не место.В приложении MVC (из которых Magento является каноническим примером) большая часть этой логики SQL (а также материал созданного / обновленного времени) принадлежит модели (вероятно, expertbrand/expertbrand).

  • Непонятно, как вы определили expertbrand/expertbrand.Это модель EAV?Каково его определение?Скорее всего, это корень вашей проблемы, так как вы должны сообщить Magento о вашей модели EAV, чтобы она сохранялась таким образом.

Пожалуйста, исправьте эти вещи (и уточните код модели) и мы можем продолжить отладку при необходимости.

Спасибо, Джо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...