1 Отредактировано Ба Ань (12.12.2016 14:35:59)

Тема: Возврат тип данных список в ORM

Добрый вечер

Разрабатываю модуль, и мне в ORM нужно получить тип данных список из другой таблицы. Похожая реализация работает в \Article\Model\Catapi

static function getInstance()
    {
        if (!isset(self::$instance)) self::$instance = new self();
        return self::$instance;
    }

    static function selectList($include_root = true)
    {
        $_this = self::getInstance();
        $list = $_this -> getSelectList(0);
        return $include_root ? array('' => t('Верхний уровень')) + $list : $list;
    }

Но этот код работает, только если в моем модуле будут добавлены поля родительская папка (parent) и alias. Как мне заставить работать эту функцию, только без parent и alias?

UPD:
Судя по отладчику getInstance() возвращает данные, а вот getSelectList() не срабатывает.

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

Re: Возврат тип данных список в ORM

getInstance() реализует паттерн Singletone. И предназначен для возвращения одной копии объекта всегда(Singletone). Что касается selectList, то она использует родительскую функцию getSelectList(0) и действительно запрашивает доп. поля. Это всё можно использовать, но не понятно. Какую задачу Вы хотите решить и что получить? Какая структура данных?
Кстати на всякий случай у нас есть видеоуроки по программированию

3

Re: Возврат тип данных список в ORM

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

getInstance() реализует паттерн Singletone. И предназначен для возвращения одной копии объекта всегда(Singletone). Что касается selectList, то она использует родительскую функцию getSelectList(0) и действительно запрашивает доп. поля. Это всё можно использовать, но не понятно. Какую задачу Вы хотите решить и что получить? Какая структура данных?
Кстати на всякий случай у нас есть видеоуроки по программированию

Я хочу получить 2 связанные таблицы: категории и устройства.

ORM категории:

'site_id' => new Type\CurrentSite(),
                'title' => new Type\Varchar(array(
                    'maxLength' => '150',
                    'description' => t('Название'),
                    'Checker' => array('chkEmpty',t('Необходимо заполнить поле название')),
                    'attr' => array(array(
                        'data-autotranslit' => 'alias'
                    ))
                )),
                'alias' => new Type\Varchar(array(
                    'maxLength' => '150',
                    'description' => t('Псевдоним(Ан.яз)'),
                )),
                'image' => new Type\Image(array(
                    'maxLength' => '255',
                    'max_file_size' => 10000000,
                    'allow_file_types' => array('image/pjpeg', 'image/jpeg', 'image/png', 'image/gif'),
                    'description' => t('Картинка'),
                )),
                'public' => new Type\Integer(array(
                    'description' => t('Показывать категорию'),
                    'maxLength' => 1,
                    'default' => 1,
                    'checkboxView' => array(1,0)
                )),
                'sortn' => new Type\Integer(array(
                    'description' => t('Сортировочный индекс'),
                    'maxLength' => '11',
                    'visible' => false,
                )),

API категории:

<?php
namespace Service\Model;

class DeviceDirApi extends \RS\Module\AbstractModel\TreeCookieList
{
    protected
        static $instance;

    function __construct()
    {
        parent::__construct(new \Service\Model\Orm\DeviceDir,
            array(
                'multisite' => true,
                'idField' => 'id',
                'aliasField' => 'alias',
                'nameField' => 'title',
                'sortField' => 'sortn',
                'defaultOrder' => 'sortn',
            ));
    }

    static function getInstance()
    {
        if (!isset(self::$instance)) self::$instance = new self();
        return self::$instance;
    }

    static function selectList($include_root = true)
    {
        $_this = self::getInstance();
        $list = $_this -> getSelectList(0);
        return $include_root ? array('' => t('Верхний уровень')) + $list : $list;
    }

    function listWithAll()
    {
        $tree = $this->getTreeList();
        array_unshift($tree, array('fields' => array(
            'noOtherColumns' => true,
            'noCheckbox' => true,
            'noDraggable' => true,
            'noFullValue' => true,
            'title' => t('Все'),
            'id' => 0,
            'alias' => ''
        ),
            'child' => array()
        ));
        return $tree;
    }

}

ORM устройств:

'site_id' => new Type\CurrentSite(),
                'title' => new Type\Varchar(array(
                    'maxLength' => '255',
                    'description' => t('Название'),
                    'Checker' => array('chkEmpty', t('Укажите название устройства')),
                    'attr' => array(array(
                        'data-autotranslit' => 'alias'
                    ))
                )),
                'alias' => new Type\Varchar(array(
                    'maxLength' => '150',
                    'description' => t('URL имя'),
                    'hint' => t('Могут использоваться только английские буквы, цифры, знак подчеркивания, запятая, точка и минус'),
                    'meVisible' => false,
                    'Checker' => array('chkalias', null),
                )),
                'parent' => new Type\Integer(array(
                    'index' => true,
                    'description' => t('Категория'),
                    'List' => array(array(new \Service\Model\DeviceDirApi(), 'selectList')),
                    'Attr' => array(array('size' => 0)),
                )),
                'image' => new Type\Image(array(
                    'maxLength' => '255',
                    'max_file_size' => 10000000,
                    'allow_file_types' => array('image/pjpeg', 'image/jpeg', 'image/png', 'image/gif'),
                    'description' => t('Картинка'),
                )),
                'sortn' => new Type\Integer(array(
                    'description' => t('Сортировочный индекс'),
                    'maxLength' => '11',
                    'visible' => false,
                )),
                'public' => new Type\Integer(array(
                    'maxLength' => '1',
                    'index' => true,
                    'description' => t('Показывать устройство'),
                    'default' => 1,
                    'CheckboxView' => array(1, 0),
                )),

Собственно вопрос по этому полю

'parent' => new Type\Integer(array(
                    'index' => true,
                    'description' => t('Категория'),
                    'List' => array(array(new \Service\Model\DeviceDirApi(), 'selectList')),
                    'Attr' => array(array('size' => 0)),
                )),

Как мне вернуть SelectList из DeviceDir?

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

4 Отредактировано Закусило Александр (12.12.2016 17:00:57)

Re: Возврат тип данных список в ORM

statiсList вернёт ORM объекты которые привязаны к вызываемому api, т.е \Service\Model\Orm\DeviceDir. Т.е. для получения объектов устройств должно быть своё АПИ, у которого будет объект устройств. Я так понимаю Вы реализуете свой контроллер для админ панели. Если посмотрите в контроллер статей, то там видно, что используется два апи. И ловится GET параметр dir который применяет parent к списку устройств.

$this->dir = $this->url->request('dir', TYPE_STRING);     

Проследите цепочку $this->dir
Сначала идёт helperIndex(), а потом actionIndex()
Я подробно рассматриваю вопрос создания контроллеров в этом видео.
Если же Вам просто нужна выборка для parent, то можно как вариант либо сделать это через АПИ устройств, либо через ORM Request

$devices = \RS\Orm\Request::make()
   ->from(new Класс устройст)
   ->where(array(
        'parent' => id родителя
   ))->objects();

5

Re: Возврат тип данных список в ORM

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

statiсList вернёт ORM объекты которые привязаны к вызываемому api, т.е \Service\Model\Orm\DeviceDir. Т.е. для получения объектов устройств должно быть своё АПИ, у которого будет объект устройств. Я так понимаю Вы реализуете свой контроллер для админ панели. Если посмотрите в контроллер статей, то там видно, что используется два апи. И ловится GET параметр dir который применяет parent к списку устройств.

$this->dir = $this->url->request('dir', TYPE_STRING);     

Проследите цепочку $this->dir
Сначала идёт helperIndex(), а потом actionIndex()
Я подробно рассматриваю вопрос создания контроллеров в этом видео.

Контроллер у меня вроде бы работает, по крайней мере в другом, созданном мною, модуле. Там даже работает getInstance и getSelectList. Различия между модулями лишь в наличии поля 'parent'.

Часть кода админ контроллера:

function __construct()
    {
        parent::__construct(new \Service\Model\DeviceApi());
        $this->dirapi = new \Service\Model\DeviceDirApi();
    }

    function actionIndex()
    {
        //Если категории не существует, то выбираем пункт "Все"
        if ($this->dir > 0 && !$this->dirapi->getById($this->dir)) $this->dir = 0;

        // если выбрана категория
        if ($this->dir > 0) $this->api->setFilter('parent', $this->dir);

        return parent::actionIndex();
    }

    function helperIndex()
    {
        $helper = parent::helperIndex();
        $this->dir = $this->url->request('dir', TYPE_STRING);
        ....

Насколько я понимаю $this->dir = $this->url->request('dir', TYPE_STRING); влияет на выборку устройств при выборе категории. Выборка работает, и категории и устройства создаются. У меня проблема совсем в другом, при добавлении/редактировании устройства, в списке категории выводится лишь Верхний уровень

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

Если же Вам просто нужна выборка для parent, то можно как вариант либо сделать это через АПИ устройств, либо через ORM Request

$devices = \RS\Orm\Request::make()
   ->from(new Класс устройст)
   ->where(array(
        'parent' => id родителя
   ))->objects();

Спасибо, разобрался)
Глупо вышло, нужно было вернуть простейший массив [id] => [title]

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

6 Отредактировано Закусило Александр (13.12.2016 12:20:27)

Re: Возврат тип данных список в ORM

Насколько я понимаю $this->dir = $this->url->request('dir', TYPE_STRING); влияет на выборку устройств при выборе категории. Выборка работает, и категории и устройства создаются. У меня проблема совсем в другом, при добавлении/редактировании устройства, в списке категории выводится лишь Верхний уровень

Ааа. Ну тут всё просто. Нужно вызвать статический метод из Вашего Апи категорий. У каждого апи, которое Вы создаёте, есть метод selectSelectList, который вернёт то что нужно.

'parent' => new Type\Integer(array(
         'index' => true,
         'description' => t('Категория'),
         'List' => array(array('\Service\Model\DeviceDirApi', 'staticSelectList')),
         'Attr' => array(array('size' => 0)),
)),