1 Отредактировано Денис (27.11.2015 14:52:54)

Тема: Вопрос по генерации полей формы в админке getFormObject() ORM

При генерации поля формы в модуле доставки я использую метод RS::Orm::Type::AbstractObject::setList

Выглядит это так (поле service_id):

function getFormObject()
    {
        $properties = new \RS\Orm\PropertyIterator(array(
            'max_weight' => new Type\String(array(
                'description' => t('Максимальный вес, грамм'),
            )),
            'service_id' => new Type\String(array(
                'description' => t('Услуга доставки'),
                'hint' => t('Все услуги, предоставляемые IML'),
                'list' => array(array('\Shop\Model\DeliveryType\IML','staticGetServices')),
            )),
            'timeout' => new Type\Integer(array(
                'description' => t('Время ожидания ответа IML, сек'),
                'hint' => t('Иногда запросы к IML идут очень долго,<br/> чтобы не дожидатся ответа используется это значение.<br/>Рекоммендуемое значение 2 сек.'),
                'default' => 2,
            )),  
        ));
        return new \RS\Orm\FormObject($properties);
    }

Так вот, я посмотрел в других классах, и иногда первый массив, передающийся в 'list', имеет второй параметр.
Например в классе Sheepla в поле "width" это true:

'list' => array(array('\Catalog\Model\PropertyApi','staticSelectList'),true),

В классе Cdek в поле "tariffTypeCode" - false:

'List' => array(array('\Shop\Model\DeliveryType\Cdek\CdekInfo','getAllTariffs'), false),

(Кстати, а почему ключ с большой буквы? Ключи что, не регистрозависимы?)
А, например, в том же Sheepla в поле "template_id" вообще $this:

'list' => array(array('\Shop\Model\DeliveryType\Sheepla','staticGetTemplates'),$this),

Я нигде не нашел документацию по этому параметру. Объясните пожалуйста, что он делает.

P.S. И еще вопросик по debug'у (не режим отладки фронта). Как и куда правильно выводить отладочную инфу php?

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

2

Re: Вопрос по генерации полей формы в админке getFormObject() ORM

setList устанавливает callback, который будет вызван при генерации списка возможных значений,
первый аргумент - это array (callback), все последующие будут переданы аргументами в callback

соответственно объявление в formObject'е:

'list' => array(array('\Catalog\Model\PropertyApi','staticSelectList'), true),

Означает, что будет вызвано:

\Catalog\Model\PropertyApi::staticSelectList(true);

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

в .htaccess включаем display_errors on (для отображения fatal error)
в админке включаем "Подробно отображать информацию об исключениях" (это равносильно включению \Setup::$DETAILED_EXCEPTION = true) (для отображения exception'ов)

В данном случае все ошибки будут выводиться на экран.

----------------------------------------------------

Вы можете отключить все ошибки и установить логирование exception в файл:
display_errors off
\Setup::$DETAILED_EXCEPTION = false;
\Setup::$WRITE_EXCEPTIONS_TO_FILE = true; //рекомендуем включать только на период отладки

в таком случае сведения о fatal error вы можете получать в error_log файле вашего веб-сервера.
А сведения об исключениях в файле /exceptions.auto.txt в корне вашего сайта

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

3

Re: Вопрос по генерации полей формы в админке getFormObject() ORM

Спасибо, с магией массивов все ясно. Как я понял, такой принцип работает почти везде во фреймворке - и это удобно.

А вот с выводом ошибок есть уточнение:

Я поставил настройки \Setup::$DETAILED_EXCEPTION = true и display_errors on.
Далее моделирую ситуацию - передаю массив в api-функцию, принимающую только объект. Действие прописано в блочном контроллере.
Система просто прерывает рендеринг на этом самом блоке, не выводя никаких сообщений.

1. Так и должно быть?
2. Нужно ли использовать какой-нибудь print_r($this->getErrors()) или что-то подобное для вывода ошибок на экран?

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

4 Отредактировано Закусило Александр (29.11.2015 02:11:35)

Re: Вопрос по генерации полей формы в админке getFormObject() ORM

Система написала ошибку, просто она отобразилась на уровне Вашего html. Посмотрите html который получается у Вас в итоге - в то место где прерывается.

5

Re: Вопрос по генерации полей формы в админке getFormObject() ORM

Это что за уровень HTML такой?

Вобщем вот api функция:

    /**
     * Добавим желание
     * 
     * @param \Catalog\Model\Orm\Product $product
     * @param \Users\Model\Orm\User      $user
     * @return bool
     */
    public function addWish(\Catalog\Model\Orm\Product $product, \Users\Model\Orm\User $user)
    {
          $current_site = \RS\Site\Manager::getSite();
        $data = array(
            'site_id' => $current_site['id'],
            'user_id' => $user['id'],
            'user_name' => $user['name'],
            'product_id' => $product['id'],
            'product_name' => $product['title']
        );

        if (self::getElement()->checkData($data))
        {
            return self::save(null, $data);
        } 
        else 
        {
            return false;
        }
    }

Вот вызов в блочном контроллере:

if ($method == 'add') { // Если метод add - добавяем желание
                $product = array($product); // Для создания ошибки
                if ($api->addWish($product, $user)) {
                    $this->refreshPage();
                }
                else {
                    $this->view->assign('error', $api->getElement()->getLastError());
                    return false;
                }
            }

Вот HTML:
http://22.groupvm.z8.ru/pic/where_is_error.jpg
Где ошибка?

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

6

Re: Вопрос по генерации полей формы в админке getFormObject() ORM

Скорее всего у вас display_errors=on не применился, поэтому fatal error - не виден.
Выведите phpinfo(), посмотрите состояние display_errors

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

7

Re: Вопрос по генерации полей формы в админке getFormObject() ORM

Да, действительно как вы и сказали.
Спасибо, сейчас все выводится.

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