Закрыть
Скидки в Webasyst 25–29 ноября 2021

Получение полей покупателя в бэкенде Есть решение

Как в бэкенде в любом месте (на любой странице) получить массив полей покупателя зная order.id? Имею ввиду те поля, которые находятся в Настройки->Оформление заказа->Контактная информация.

{shipping_address} выводится без проблем. А вот {$customer.name} и другие поля - пустые.

9 ответов

  • 2
    Михаил Ушенин Webasyst 14 августа 2015 07:46 #
    $order_model = new shopOrderModel();
    $order = $order_model->getById($order_id);
    $customer = new waContact($order['contact_id']);
    $customer_name = $customer->get('name');

    Также см. waContact.

    • +1
      Константин Егоров Константин Егоров 14 августа 2015 08:10 #

      Спасибо, Михаил.

      Если я правильно понял, нужно сделать хелпер из Вашего кода:

      <?php

      class shopCustom

      {

      public static function getCusromerFileds()

      {

      $order_model = new shopOrderModel();

      $order = $order_model->getById($order_id);

      $customer = new waContact($order['contact_id']);

      $customer_name = $customer->get('name');

      }

      }


      И получать поля, например, так: {$fields = shopCustom::getCustomerFields($order.id)}? {$fields} будет содержать массив полей?

      Сделал так, обновил кеш, но ничего не выводится...


      • +2

        Я бы сделал так, например:

        $this->Order = new shopOrderModel();
        $order = $this->Order->getOrder($order_id, true, false);
        shopHelper::workupOrders($order, true);


        • +1
          Константин Егоров Константин Егоров 14 августа 2015 08:35 #

          Спасибо, Сергей. Но я к сожалению нуб в php. Не знаю как ваш и Михаила коды притулить, чтобы работало...

          • +1
            Константин Егоров Константин Егоров 14 августа 2015 09:40 #

            Дополню свой вопрос.

            У меня есть страница. На ней с помощью $order.id я могу получить айди заказа.

            Мне нужно получить поля покупателя (ИНН, КПП и прочие, которые созданы в Настройки->Оформление заказа->Контактная информация).

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

            • +1

              Не на 100% уверен, но попробуйте так. Поля заполненные при оформлении должны быть

              shopCustom.class.php

              class shopCustom
              {
              public static function getOrder($order_id)
              {
              $OrderModel = new shopOrderModel();
              $order = $OrderModel->getOrder($order_id, true, false);
              shopHelper::workupOrders($order, true);

              return $order;
              }
              }

              Шаблон:

              {$my_order = shopCustom::getOrder($order.id)}
              <pre> {$my_order.contact|var_dump} </pre>



              • +1
                Константин Егоров Константин Егоров 14 августа 2015 10:18 #

                Спасибо, Сергей!

                Сделал, но такой код выводит только стандартные поля (и прочую полную информацию о заказе), которые есть по умолчанию (имя, фамилия, телефон, почта и т.п.).

                А вот вновь созданных (ИНН, КПП, ОГРН) почему-то нет. Однако, эти поля существуют и заполнены при редактировании заказа.

                Также эти поля есть в личном кабинете пользователя в разделе "Мой профиль" и могут быть отредактированы.

                • +1

                  А так это не поля заказа. Я-то увидел, что они заполняются при оформлении заказа...

                  Тогда да, надо контакт искать и его поля выдергивать.

                  Просто то, что посетитель в своих контактах наредактирует, к заказу оформленному уже не относится — мало-ли на какую фирму он оформил заказ, сегодня одна, завтра другая...

                  "При редактировании заказа" имеете в виду "редактирование контакта" или именно "редактирование заказа" ? :)

  • 3
    Константин Егоров 14 августа 2015 13:12 # Решение

    В общем, немного почитал про php...

    Для реализации моей задачи нужно сделать следующее:

    1. Сделать пользовательский хелпер. Для этого в папке /wa-apps/shop/lib/classes создаем свой класс. Например, я создал "shopCustomerFields.class.php".

    2. Теперь редактируем этот файл:

    <?php

    class shopCustomerFields

    {

    public static function getCustomer($order_id)

    {

    $order_model = new shopOrderModel();

    $order = $order_model->getById($order_id);

    $customer = new waContact($order['contact_id']);


    $fields = array(

    "firstname" => $name = $customer->get('firstname'),

    "lastname" => $name = $customer->get('lastname'),

    "phone" => $name = $customer->get('phone'),

    "email" => $name = $customer->get('email', value),

    "company" => $name = $customer->get('company'),

    "ogrn" => $name = $customer->get('ogrn'),

    "inn" => $name = $customer->get('inn'),

    "kpp" => $name = $customer->get('kpp'),

    );


    return $fields;

    }

    }

    Нам нужно заранее знать id полей, которые мы хотим получить. id полей - это 'firstname', 'lastname', 'inn' и т.п. в строчках вида "$customer->get('firstname')".

    Чтобы узнать эти id придется вывести их в корзину и с помощью просмотра кода выяснить их http://joxi.ru/J2bN5ezF64xB26. Другого способа узнать id полей я не нашел...

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

    3. Выводим код на странице, где работает {$order.id}. У меня в данном случае это страница печати счета. Сам код такой:

    {$fields = shopCustomerFields::getCustomer($order.id)}

    4. Далее включаем вардамп и смотрим значения полей:

    <pre>{var_dump($fields)}</pre>

    Получаем что-то вроде такого - http://joxi.ru/DmB1EXYHLNdRrP

    5. Ну и дальше все просто. Вставляем нужные поля в нужные места. Например, значение поля ИНН будет выглядеть так:

    {$fields.inn}

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

    Спасибо огромное Михаилу Ушенину и Сергею Родовниченко!

Добавить ответ

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