26

Re: Редактирование полей

Закусило Александр пишет:

orm.beforewrite у Вас сработает в тех случаях если вызывался
insert() - запись объекта
или
update() - обновление объекта
Вы сами действия где производите? В каком разделе? я имею ввиду с полем Вашим.

В админке. admin/shop-orderctrl/?id=3&do=edit вот по этому адресу

Повысить оценку Понизить оценку

27

Re: Редактирование полей

Закусило Александр пишет:

Если я правильно понимаю, Вы добавили поле в заказе.

Поля я добавил в Веб сайт->Настройка модулей->Магазин->Дополнительные поля->добавить поле.

Повысить оценку Понизить оценку

Re: Редактирование полей

Вот рабочий код:

function init()
    {
        $this
            ->bind('orm.beforewrite.shop-order');
    }
    
    /**
    * Действия перед записью в БД
    * 
    * @param array $data - массив с данными
    */
    public static function ormBeforewriteShopOrder($data) 
    {
        if (isset($_REQUEST['current_val'])){
  
            $config = \RS\Config\Loader::byModule('shop'); //Получам конфиг магазина
            $config['current_val'] = \RS\Http\Request::commonInstance()->request('current_val', TYPE_STRING, ""); //Записываем значение из поста
            $config->update(); //ЗДЕСЬ есть, т.к. сохраняется другой объект
        }
    }

Re: Редактирование полей

Андрей пишет:

Александр
Да вот куда не вставлю var_dump ошибку выдает.
Вставил Ваш код, все равно не работает. Может какая то оошибка в шаблоне самом?

Какую?

30

Re: Редактирование полей

Закусило Александр пишет:

Вот рабочий код:

function init()
    {
        $this
            ->bind('orm.beforewrite.shop-order');
    }
    
    /**
    * Действия перед записью в БД
    * 
    * @param array $data - массив с данными
    */
    public static function ormBeforewriteShopOrder($data) 
    {
        if (isset($_REQUEST['current_val'])){
  
            $config = \RS\Config\Loader::byModule('shop'); //Получам конфиг магазина
            $config['current_val'] = \RS\Http\Request::commonInstance()->request('current_val', TYPE_STRING, ""); //Записываем значение из поста
            $config->update(); //ЗДЕСЬ есть, т.к. сохраняется другой объект
        }
    }

не работает, и переустановил модуль и кеш скинул. ни как

Повысить оценку Понизить оценку

31 Отредактировано Закусило Александр (24.06.2016 15:57:59)

Re: Редактирование полей

Переустановка модуля здесь вообще не причём. А current_val у Вас вообще передаётся? Вы как проверяли? var_dump прерывает сохранение заказа?

32

Re: Редактирование полей

var_dump($config['current_val']); выдает null

Повысить оценку Понизить оценку

33 Отредактировано Закусило Александр (24.06.2016 16:48:50)

Re: Редактирование полей

Андрей.
var_dump($_REQUEST['current_val']); что выдаёт? Если ничего, то выведите весь массив $_REQUEST и посмотрите что у Вас из запроса приходит.

34

Re: Редактирование полей

Закусило Александр пишет:

Андрей.
var_dump($_REQUEST['current_val']); что выдаёт? Если ничего, то выведите весь массив $_REQUEST и посмотрите что у Вас из запроса приходит.

так же ничего

Повысить оценку Понизить оценку

35 Отредактировано Закусило Александр (24.06.2016 18:11:46)

Re: Редактирование полей

Не может такого быть. Вы видимо, что-то делаете не так. Постучись к нам в онлайн консультант когда мы онлайн, я посмотрю, что Вы делаете.
100% что-то очевидное.

36 Отредактировано Закусило Александр (24.06.2016 19:07:53)

Re: Редактирование полей

Вообщем, решил повторить Ваш путь. Да действительно так не отработает, т.к. заказ это единственное место где используется в виду особенностей не update, а updateCartData. который относится к корзине в контроллере OrderCTRL. Поэтому делать надо так:

function init()
    {
        $this
            ->bind('controller.afterexec.shop-admin-orderctrl');
            
    }
    
    
    /**
    * Срабатывает после отработки контроллера сохранения заказа
    * 
    * @param string $result_html - готовый HTML, возвращаемый контроллером
    */
    public static function controllerAfterexecShopAdminOrderCtrl($result_html)
    {
        if (isset($_REQUEST['current_val'])){
  
            $config = \RS\Config\Loader::byModule('shop'); //Получам конфиг магазина
            $config['current_val'] = \RS\Http\Request::commonInstance()->request('current_val', TYPE_STRING, ""); //Записываем значение из поста
            $config->update(); //ЗДЕСЬ есть, т.к. сохраняется другой объект
        }
        return $result_html;
    }

Т.е. вешаясь на отработку контроллера.

37

Re: Редактирование полей

Вообщем видимо придется забросить эту идею. Ничего не получается.

Повысить оценку Понизить оценку

Re: Редактирование полей

Всё получится. Не бросайте идею. Вы постучитесь к нам. Я посмотрю, что Вы сделали и скажу, что не правильно. В предыдущем посте идёт полностью рабочий код. Скорее всего, у Вас в POST приходит, что-то не то. Либо Вы чего-то недопоняли.

39 Отредактировано Андрей (06.07.2016 09:13:55)

Re: Редактирование полей

Дублирую сообщение из почты.
Посмотрел  через firebag , post не передается. Заранее спасибо.

В orderview.tpl после

{assign var=products value=$cart->getProductItems()}

вставил

{assign var=shop_config value=ConfigLoader::byModule('shop')}

заменил в orderview.tpl

                         

   {foreach from=$fm->getStructure() item=item}
                                <tr class="{cycle values=$hl name="order"}">
                                    <td class="otitle">
                                        {$item.title}
                                    </td>
                                    <td>{$item.current_val}</td>
                                </tr>
                            {/foreach}

на это

                           

 {foreach from=$fm->getStructure() item=item}
                                <tr class="{cycle values=$hl name="order"}">
                                    <td class="otitle">{$item.title}</td><td><input type="text" name="current_val" value="{$item.current_val}" class="maxWidth"></td>
                                    <!--<td>{$item.current_val}</td>-->
                                </tr>
                            {/foreach}

function init()
    {
        $this
            ->bind('controller.afterexec.shop-admin-orderctrl');
            
    }
    
    
    /**
    * Срабатывает после отработки контроллера сохранения заказа
    * 
    * @param string $result_html - готовый HTML, возвращаемый контроллером
    */
    public static function controllerAfterexecShopAdminOrderCtrl($result_html)
    {
        if (isset($_REQUEST['current_val'])){
  
            $config = \RS\Config\Loader::byModule('shop'); //Получам конфиг магазина
            $config['current_val'] = \RS\Http\Request::commonInstance()->request('current_val', TYPE_STRING, ""); //Записываем значение из поста
            $config->update(); //ЗДЕСЬ есть, т.к. сохраняется другой объект
        }
        return $result_html;
    }

Повысить оценку Понизить оценку

Re: Редактирование полей

Постучитесь в онлайн консультант

41

Re: Редактирование полей

Закусило Александр пишет:

Постучитесь в онлайн консультант

Добрый день. Не могли бы Вы еще раз написать пожалуйста какие поля использовать.

$order["orm"] = не помню что тут

Повысить оценку Понизить оценку

Re: Редактирование полей

$order = $data['orm']; //Объект заказа
$order['userfields'] = serialize($myarray); //Передаём в дополнительные поля массив. Поля должны быть в сериализованном виде.

$data - это массив приходящий аргументом в хук.

43 Отредактировано Андрей (21.07.2016 11:02:39)

Re: Редактирование полей

Что то не срабатыает, не подскажите?
Ввожу данные в поле->нажимаю сохранить->идет сохранение.
Делаю var_dump($_POST['userfields']); ничего не вижу
Смотрю консоль firebag там:

-----------------------------29948320313281
Content-Disposition: form-data; name="current_val"

12

Но если обновляю страницу, записи пропадают, что не так?

    public static function ormBeforeWriteShopOrder ($data) {
        
        // @var \Shop\Model\Orm\Order
         
        $order = $data['orm'];//Получаем объект заказа
        $flag = $data['flag'];//флаг


        if (isset($_POST['userfields'])){ //Если нужное поле пришло из запроса
          $order['userfields'] = serialize($myarray);
        }

    }

Повысить оценку Понизить оценку

44 Отредактировано Закусило Александр (21.07.2016 11:22:07)

Re: Редактирование полей

А чему $myarray у Вас переменная равна? И почему, если вы отправляете переменную с именем current_val у Вас проверка на $_POST['userfields']?

45

Re: Редактирование полей

Закусило Александр пишет:

А чему $myarray у Вас переменная равна? И почему, если вы отправляете переменную с именем current_val у Вас проверка на $_POST['userfields']?

Сейчас подправил, но все же

    public static function ormBeforeWriteShopOrder ($data) {
        
        // @var \Shop\Model\Orm\Order
         
        $order = $data['orm'];//Получаем объект заказа
        $flag = $data['flag'];//флаг

        $myarray = $order['current_val'];
        if (isset($_POST['current_val'])){ //Если нужное поле пришло из запроса
          $order['userfields'] = serialize($myarray);
       
        }
    }

Повысить оценку Понизить оценку

Re: Редактирование полей

Вы меня не поняли.
Вы из POST получаете current_val, а не из заказа. У вас отправляется просто форма с полями и эти поля Вам нужно записать в заказ. Это первый момент. Т.к. у Вас поля добавлены через конфиг модуля магазин, то доп поля храняться в этом случае в сериализованном массиве. Сериализованный массив это массив с ключами в виде name полей и их значениями.

/**
* Действия перез записью заказа в БД
*/
public static function ormBeforeWriteShopOrder ($data) {
        
        /**
        * @var \Shop\Model\Orm\Order
        */ 
        $order = $data['orm'];//Получаем объект заказа
        $flag = $data['flag'];//флаг

        
        if (isset($_POST['current_val'])){ //Если нужное поле пришло из запроса
          $myarray = array(
             'current_val' => $_POST['current_val'];
          );
          $order['userfields'] = serialize($myarray);
       
        }
    }

А второй момент это момент с выводом значений. Вы просто в шаблоне у себя прописали поле. А как с выводом бы с выводом значения? Его надо самостоятельно подставлять в Вашем случае. В БД всё сохранится в поле userfields. И будет в сериализованном виде. Однако в заказе (\Shop\Model\Orm\Order т.е. если заглянуть в файл /modules/shop/model/orm/order.inc.php) есть функция afterObjectLoad, которая этот сериализованный массив, рассериализовывает при первой загрузке и в распакованном виде помещает в поле userfields_arr. Его Вы и можете использовать чтобы вывести в нужное поле значение в шаблоне. Для примера в самом шаблоне сделайте после записи

<pre>{var_dump($order.userfields_arr)}</pre>

47 Отредактировано Андрей (21.07.2016 14:33:24)

Re: Редактирование полей

вставил только я вместо $order записал $elem вывелось следующее.
Но запись происходит только из одного поля(показал на скрине). А как из разделить?
http://storage5.static.itmages.ru/i/16/0721/s_1469097212_8337718_77b7676f47.png

array(1) {
  ["current_val"]=>
  string(2) "19"
}

array(1) {
  ["current_val"]=>
  string(2) "19"
}

Повысить оценку Понизить оценку

Re: Редактирование полей

Ну у Вас в POST 2 поля приходят. Соответственно, в массиве для сохранения нужно указать 2 поля.

$myarray = array(
    'current_val' => $_POST['current_val'],
    'name второго поля' => $_POST['name второго поля']
);

Правда есть ещё один момент. $_POST просто мной был использован для примера. Получение из POST лучше сделать системными средствами:

$имяпеременной = \RS\Http\Request::commonInstance()->request('имя переменно POST', TYPE_STRING);

Надеюсь последним кодом Вас не запутаю.

49 Отредактировано Андрей (21.07.2016 15:59:02)

Re: Редактирование полей

Закусило Александр пишет:

Ну у Вас в POST 2 поля приходят. Соответственно, в массиве для сохранения нужно указать 2 поля.

$myarray = array(
    'current_val' => $_POST['current_val'],
    'name второго поля' => $_POST['name второго поля']
);

Это понятно, но name то у них одинаковый получается. Вот посмотрите на скрине
http://storage8.static.itmages.ru/i/16/0721/s_1469102240_9667939_62e22677e8.png

Повысить оценку Понизить оценку

Re: Редактирование полей

Ну так поменяйте его или объедините как

...
name="userfields_arr[моё поле]"
...
name="userfields_arr[моё поле 2]"

Тогда будете ловить переменную userfields_arr которая придёт как массив.
Это же элементарная отправка формы.