pdoResources поля в отдельные плейсхолдеры.
Возможно ли все поля, что вернул нам pdoResources по собственному классу вывести в отдельные плейсхолдеры?
Пример: есть поля id, uid, name, base как можно значения этих полей разместить в плейсхолдерах вида [[+smstring.id]] [[+smstring.uid]] [[+smstring.name]] [[+smstring.base]]
Я понимаю, что необходимо копать в сторону &toPlaceholder и &toSeparatePlaceholders но их применение вообще убирает какой либо вывод. Даже лог.
p.s. Почему не использовать tpl? Это страница с формой редактирования элемента кастомного класса во фронтенде. Форма редактирования работает на Formit и в ней есть плейсхолдеры Formit.
Пример: есть поля 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.
Комментарии: 4
Переделать вывод на Fenom. Грубо говоря:
{var $resource = ('!pdoResources' | snippet : [
...
'return' => 'json',
]) | fromJSON}
{var $resource = $resource[0] ?: []}
Предложенное решение @Павел Гвоздь еще не тестировал, но если вдруг кто будет искать решение такому вопросу, вот мое решение.
Т.к. у нас готовый компонент с моделью, то для вывода всех полей в отдельные чанки можно обойтись без сниппета pdoResources/getResources.
Мой сниппет.
Буду очень рад, если кто выскажет комментарии по такому решению, и поправит, если что не так.
Т.к. у нас готовый компонент с моделью, то для вывода всех полей в отдельные чанки можно обойтись без сниппета 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%.Буду очень рад, если кто выскажет комментарии по такому решению, и поправит, если что не так.
а подключение pdoTools конечно скушает немного памятиЕсли pdoTools установлен, то он уже подключается. Разве нет?
можно обойтись без сниппета pdoResources/getResourcesВы спросили про pdoResources, поэтому и получили ответ завязанный на него. А свой сниппет — это даже правильнее в данном случае (не берусь судить о качестве кода в нём).
Если 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 а мой комментарий предлагает решение не через данный инструмент. Просто мне все еще трудно понимать. где лучше использовать готовые сниппеты, а где лучше писать свой. а комментарий с самописным сниппетом, для тех, кто вдруг будет потом искать решение подобной задачи. А то я знаю, как обидно найти в интернете то, как кто-то спросил пару лет назад как решить то, что тебе надо решить и последний комментарий в обсуждении:
Все решил.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.