pdoResources поля в отдельные плейсхолдеры.

Возможно ли все поля, что вернул нам pdoResources по собственному классу вывести в отдельные плейсхолдеры?

Пример: есть поля id, uid, name, base как можно значения этих полей разместить в плейсхолдерах вида [[+smstring.id]] [[+smstring.uid]] [[+smstring.name]] [[+smstring.base]]

[[!pdoResources?
                                            &class=`A3pfrp`
                                            &loadModels = `bstpfrp`
                                            &leftJoin=`{
                                                "Status": {
                                                    "class" : "A3pfrpStatus",
                                                    "on"    : "A3pfrp.status_id = Status.id"
                                                },
                                                "Theme" : {
                                                    "class" : "A3pfrpThemeCategory",
                                                    "on"    : "A3pfrp.theme_category_id = Theme.id"
                                                }
                                            }`
                                            &select=`{
                                                "A3pfrp": "*",
                                                "Status": "name",
                                                "Theme" : "category_name"
                                            }`
                                            &showLog=`1`
                                            &sortby=`A3pfrp.id`
                                            &sortdir=`ASC`
                                            &limit=`0`
                                            &showUnpublished=`0`
                                            &where=`{"A3pfrp.id":[[!#get.docid:stripTags]]}`
                                        ]]

Я понимаю, что необходимо копать в сторону &toPlaceholder и &toSeparatePlaceholders но их применение вообще убирает какой либо вывод. Даже лог.

p.s. Почему не использовать tpl? Это страница с формой редактирования элемента кастомного класса во фронтенде. Форма редактирования работает на Formit и в ней есть плейсхолдеры Formit.
Vladimir Alekhin
28 марта 2019, 14:57
modx.pro
680
0

Комментарии: 4

Павел Гвоздь
29 марта 2019, 08:53
0
Переделать вывод на Fenom. Грубо говоря:
{var $resource = ('!pdoResources' | snippet : [
    ...
    'return' => 'json',
]) | fromJSON}
{var $resource = $resource[0] ?: []}
    Vladimir Alekhin
    29 марта 2019, 10:16
    0
    Предложенное решение @Павел Гвоздь еще не тестировал, но если вдруг кто будет искать решение такому вопросу, вот мое решение.

    Т.к. у нас готовый компонент с моделью, то для вывода всех полей в отдельные чанки можно обойтись без сниппета pdoResources/getResources.
    Мой сниппет.
    <?php
    $package_path = $modx->getOption('core_path').'components/bstpfrp/model/';
    $modx->addPackage('bstpfrp', $package_path); //Подключаем наш пакет
    
    $id = $_GET["docid"]; //страница редактирования будет иметь параметр id.
    
    $a3pfrp = $modx->getObject('A3pfrp',array("id" => $id));
    if (is_object ($a3pfrp)) { //проверяем получили ли мы объект по нашему критерию
        $objectA3PFRP = $a3pfrp->toArray(); // а зачем я это делаю? кто сможет мне объяснить? ведь setPlaceholders работает и с объектами. Или я не прав?
    
        $maxstep = array(
           $objectA3PFRP["step1"],
           $objectA3PFRP["step2"],
           $objectA3PFRP["step3"],
           $objectA3PFRP["step4"],
           $objectA3PFRP["step5"],
           $objectA3PFRP["step6"],
           $objectA3PFRP["step7"],
           $objectA3PFRP["step8"],
           $objectA3PFRP["step9"],
           $objectA3PFRP["step10"],
        ); //объект имеет шаги, которые хранятся в отдельных полях бд
        $objectA3PFRP["current_step_value"] = max(array_keys ($maxstep,1))+1; //определяем максимальный шаг статус которого TRUE
        $modx->setPlaceholders($objectA3PFRP,'a3.'); //выводим все в плейсхолдеры вида [[+a3.%fieldname%]]
    }
    Хотелось бы понять какое решении более правильное? Консоль говорит что на выполнение данного сниппет ушло:
    SQL time: 0,0005 s
    SQL queries: 1
    PHP time: 0,0009 s
    Total time: 0,0014 s
    Memory: 0 MB
    а подключение pdoTools конечно скушает немного памяти. Но я не уверен, что эта инфа из дополнения Console верна на 100%.

    Буду очень рад, если кто выскажет комментарии по такому решению, и поправит, если что не так.
      Павел Гвоздь
      29 марта 2019, 10:25
      0
      а подключение pdoTools конечно скушает немного памяти
      Если pdoTools установлен, то он уже подключается. Разве нет?

      можно обойтись без сниппета pdoResources/getResources
      Вы спросили про pdoResources, поэтому и получили ответ завязанный на него. А свой сниппет — это даже правильнее в данном случае (не берусь судить о качестве кода в нём).
        Vladimir Alekhin
        29 марта 2019, 10:39
        0
        Если pdoTools установлен, то он уже подключается. Разве нет?
        Я сделал такой вывод по логам pdoResources.
        0.0000510: Loaded model "bstpfrp" from "/core/components/bstpfrp/model/"
        0.0001271: pdoTools loaded
        0.0000160: xPDO query object created
        0.0001531: leftJoined A3pfrpStatus as Status
        0.0001121: leftJoined A3pfrpThemeCategory as Theme
        0.0001481: Added selection of A3pfrp: `id`, `uid`, `bs_tool`, `dep_name`, `dep_engineers`, `theme_name`, `theme_source`, `theme_problem`, `theme_category_id`, `nav_surname`, `nav_name`, `nav_patronymic`, `nav_phone`, `nav_headquarters`, `lead_surname`, `lead_name`, `lead_headquarters`, `lead_number`, `lead_post`, `lead_phone`, `group_fio`, `group_numbers`, `date_start`, `date_fact`, `step1`, `step2`, `step3`, `step4`, `step5`, `step6`, `step7`, `step8`, `step9`, `step10`, `status_id`, `createdon`, `createdby`, `editedon`, `editedby`, `published`
        0.0000939: Added selection of A3pfrpStatus: `name`
        0.0000949: Added selection of A3pfrpThemeCategory: `category_name`
        0.0001550: Added where condition: 0=
        0.0000420: Sorted by A3pfrp.id, ASC
        0.0001631: SQL prepared "SELECT `A3pfrp`.`id`, `A3pfrp`.`uid`, `A3pfrp`.`bs_tool`, `A3pfrp`.`dep_name`, `A3pfrp`.`dep_engineers`, `A3pfrp`.`theme_name`, `A3pfrp`.`theme_source`, `A3pfrp`.`theme_problem`, `A3pfrp`.`theme_category_id`, `A3pfrp`.`nav_surname`, `A3pfrp`.`nav_name`, `A3pfrp`.`nav_patronymic`, `A3pfrp`.`nav_phone`, `A3pfrp`.`nav_headquarters`, `A3pfrp`.`lead_surname`, `A3pfrp`.`lead_name`, `A3pfrp`.`lead_headquarters`, `A3pfrp`.`lead_number`, `A3pfrp`.`lead_post`, `A3pfrp`.`lead_phone`, `A3pfrp`.`group_fio`, `A3pfrp`.`group_numbers`, `A3pfrp`.`date_start`, `A3pfrp`.`date_fact`, `A3pfrp`.`step1`, `A3pfrp`.`step2`, `A3pfrp`.`step3`, `A3pfrp`.`step4`, `A3pfrp`.`step5`, `A3pfrp`.`step6`, `A3pfrp`.`step7`, `A3pfrp`.`step8`, `A3pfrp`.`step9`, `A3pfrp`.`step10`, `A3pfrp`.`status_id`, `A3pfrp`.`createdon`, `A3pfrp`.`createdby`, `A3pfrp`.`editedon`, `A3pfrp`.`editedby`, `A3pfrp`.`published`, `Status`.`name`, `Theme`.`category_name` FROM `modx_a3pfrp` AS `A3pfrp` LEFT JOIN `modx_a3pfrp_status` `Status` ON A3pfrp.status_id = Status.id LEFT JOIN `modx_a3pfrp_theme_category` `Theme` ON A3pfrp.theme_category_id = Theme.id ORDER BY A3pfrp.id ASC "
        0.0013390: SQL executed
        0.0000181: Rows fetched
        0.0001810: Returning processed chunks
        0.0028090: Total time
        12 582 912: Memory usage
        Это лог при вызове pdoResources.

        А это при работе Console и запуска в нем кода из моего сниппета.
        SQL time: 0,0005 s
        SQL queries: 1
        PHP time: 0,0009 s
        Total time: 0,0014 s
        Memory: 0 MB

        Если я правильно понимаю, то в первом случае мы подгружаем pdoTools и он уже создает xPDO запрос. А во втором случае мы используем стандартный механизм взаимодействия с xPDO modx через метод $modx->getObject()

        Вы спросили про pdoResources, поэтому и получили ответ завязанный на него. А свой сниппет — это даже правильнее в данном случае (не берусь судить о качестве кода в нём).

        Да, простите, я понимаю что вопрос был про решение через pdoTools а мой комментарий предлагает решение не через данный инструмент. Просто мне все еще трудно понимать. где лучше использовать готовые сниппеты, а где лучше писать свой. а комментарий с самописным сниппетом, для тех, кто вдруг будет потом искать решение подобной задачи. А то я знаю, как обидно найти в интернете то, как кто-то спросил пару лет назад как решить то, что тебе надо решить и последний комментарий в обсуждении:

        Все решил.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4