Vladimir Alekhin

Vladimir Alekhin

С нами с 10 июля 2014; Место в рейтинге пользователей: #732
Vladimir Alekhin
07 августа 2021, 23:41
+1
Это уже другой источник файлов, проблема в том, что контроль доступа туда работает только в админке MODX. Файлы загруженные в эту папку доступны по прямой ссылке любому пользователю (в том числе анонимному), либо я настроил не правильно.

Сделал временное решение, но мне оно не очень нравится. описываю решение:
в папку которая указана в basePath положил файл .htaccsess т.к. сервер на apache2 со строкой
deny from all
Что запретило доступ к файлам по прямой ссылке всегда, но php имеет к ним доступ.

Поэтому создал сниппет с кодом:
<?php
$file_url = $modx->getOption('assets_path') . 'components/dbd/files/' . $filename;

if (!is_file($file_url)) { return false; }

header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
ob_clean();
flush();
readfile($file_url); 
exit();
Тут мы обращаемся к имени файла переданного в сниппет и выдаем его в буфер вывода с соответствующими заголовками.

Вызвал сниппет [[!file_download?&filename=`[[!#GET.fn]]`]] передал ему get параметр содержащий имя файла. Сниппет вызван на странице которая принадлежит группе ресурсов на которую настроен доступ только для авторизованных.

Вроде работает, но уверен есть решение лучше. Оставлю это тут, если кто-то будет искать подобное решение, и надеюсь что более опытные пользователи посмотрят решение и предложат лучшую альтернативу.
Vladimir Alekhin
21 декабря 2020, 13:54
0
Было бы здорово иметь информацию по созданию CMP, в одном месте, работа с собственными пакетами. Но это огромный раздел затрагивающий и ExtJS. Я бы очень хотел когда-то такое увидеть.

Плюсом в эту сторону было бы здорово и по CMPGenerator PRO более подробную документашку, помимо видео.
Vladimir Alekhin
14 декабря 2020, 22:18
0
Кто-то решил? может отписаться?
@Константин Ильин Есть решение?
Vladimir Alekhin
09 декабря 2020, 19:07
0
Добрый вечер, честно уже не помню как решал тогда, но сейчас решил бы так:

Своя таблица:
CREATE TABLE `modx_tvvaluehistory` (
	`id` INT NOT NULL AUTO_INCREMENT,
	`tv_id` INT,
	`tv_value` BLOB,
	`timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
	`user_id` INT,
	PRIMARY KEY (`id`)
);
и бесплатным CMPgenerator (из дефолтного репозитория) сделал бы обвязку для компонента.

Далее плагин на OnTemplateVarBeforeSave скорее всего (надо читать, что где доступно, что бы отловить изменения нужных tv) и создаем новый объект класса таблицы modx_tvvaluehistory и заполняем поля.

Пример работы с событием тут.

А выводить это на фронтенд уже можно чем угодно. Хоть вызвать pdoResources из пакета pdoTools. Такое решение, на мой взгляд будет оптимальным по трудозатраты/результат.

Более опытные члены комьюнити может подскажут решение получше.
Vladimir Alekhin
02 декабря 2020, 16:34
0
А когда объект свой, но в нем есть поле — линк по ID на объект modResource?
Как вы такую задачу решаете?

на текущем плейграунде не было никаких чужих компонентов с подобной связкой, что бы подсмотреть.
Vladimir Alekhin
02 декабря 2020, 13:40
0
напишу решение, вдруг кому будет полезно.
xtype для combobox (путь: assets/components/МОЙКОМПОНЕНТ/js/mgr/widgets/МОЙГРИД.grid.js)

//Custom ProjectResources combobox
МОЕПРИЛОЖЕНИЕ.utils.DbrProjectRes = function(config) {
    config = config || {};
    Ext.applyIf(config,{
        
        name: 'project_id'
        ,hiddenName: 'project_id'
        ,displayField: 'pagetitle'
        ,valueField: 'id'
        ,fields: ['id','pagetitle']
        ,pageSize: 20
        ,url: МОЕПРИЛОЖЕНИЕ.config.connectorUrl
        ,baseParams: {
            action: 'mgr/МОЙКОМПОНЕНТ/getList'
            ,parent: '21948'     //передаем parent id для выборки потомков по этому родителю
        }
        ,typeAhead: true
        ,editable: true
        

    });
    МОЕПРИЛОЖЕНИЕ.utils.DbrProjectRes.superclass.constructor.call(this,config);
};
Ext.extend(МОЕПРИЛОЖЕНИЕ.utils.DbrProjectRes,MODx.combo.ComboBox);
Ext.reg('dbr-project-combo',МОЕПРИЛОЖЕНИЕ.utils.DbrProjectRes);
Код процессора (путь: core/components/МОЙКОМПОНЕНТ/processors/mgr/dbrresource/getlist.class.php):

<?php
class DbrResourceCreateProcessor extends modObjectGetListProcessor {
   
    public $classKey = 'modResource';
    public $defaultSortField = 'id';
    public $defaultSortDirection = 'ASC';
    public $checkListPermission = true;
    public function prepareQueryBeforeCount(xPDOQuery $c) {
        $parent = $this->getProperty('parent');
        if (!empty($parent)) {
            $c->where(array('parent' => $parent));
        }
        return $c;
    }
}
return 'DbrResourceCreateProcessor';
Спасибо Наумову Алексею за столь ценную подсказку!
Vladimir Alekhin
02 декабря 2020, 13:05
0
Спасибо большое, стало чуть понятнее.

Я на другой комментарий задал вопрос. А как правильнее с точки зрения modx наследоваться от
modObjectGetListProcessor
или
modResourceGetListProcessor
Vladimir Alekhin
02 декабря 2020, 13:03
0
Понял, похоже стандартный процессор getlist не может выбрать по родителю.

А как будет правильно, наследовать новый процессор от
class modResourceMyGetListProcessor extends modResourceGetListProcessor
или создать новый процессор что-то вроде:

<?php
class DbrIdeatankReourceGetListProcessor extends modObjectGetListProcessor {
    public $languageTopics = array('debureaucratization:dbrideatank');
    public $classKey = 'ModReource';
    public $defaultSortField = 'id';
    public $defaultSortDirection = 'ASC';
    public $checkListPermission = true;
    public function prepareQueryBeforeCount(xPDOQuery $c) {
        $parent = $this->getProperty('parent');
        if (!empty($parent)) {
            $c->where(array('parent:IS' => $parent));
        }
        return $c;
    }
}
return 'DbrIdeatankResourceGetListProcessor';
Vladimir Alekhin
16 апреля 2019, 10:24
0
Итак задача. У нас есть набор ресурсов с общим родителем, в которых есть галерея реализованная при помощи TV MIGX.

Сниппет который мы назовем: allgallery

<?php
//$tpl              - template chunk
//$parentid         - id of container resource
//$tvid             - id of TV
//limit             - image limit

/*
CALL EXAMPLE

                    [[allgallery?
                        &parentid=`15`
                        &tpl=`all_gallery_line_tpl`
                        &tvid=`2`
                        &limit=`12`
                    ]]
*/


$q = $modx->newQuery('modResource', array('parent' => $parentid));
$count = 0;
$resources = $modx->getIterator("modResource",$q);                                                  //получаем перечисление дочерних ресурсов по отношению к ID ресурса, переданного в параметрах.
$output="";                                                                                         //обнуляем переменную вывода
    foreach($resources as $resource) {
            if (($count < $limit) && (is_object($resource))) {
                $resid = $resource->get("id");                                                      //получаем поле самого ресурса, что бы использовать в шаблоне.
                $cpt =   $resource->get("pagetitle");                                               //получаем поле самого ресурса, что бы использовать в шаблоне.
                $migxs = $resource->getMany('TemplateVarResources',array("tmplvarid"=>$tvid));      //получаем TV указанного в параметрах ID.
                if ($count < $limit) {
                    foreach ($migxs as $migx) 
                    {
                        $migxobj = json_decode($migx->get("value"));                                //получаем json из TV и парсим в массив объектов.
                        foreach($migxobj as $migxentry) {
                            if ($count < $limit) {
                                $image = array();                                                   //временная переменная-массив для сборки всех необходимых полей.
                                $image["image"] = $migxentry->image;                                //из MIGX получаем нужные поля изображение и тайтл
                                $image["title"] = $migxentry->title;                                //из MIGX получаем нужные поля изображение и тайтл
                                $image["resid"] = $resid;                                           //получаем нужные поля из ресурса ID
                                $image["cpt"] = $cpt;                                               //получаем нужные поля из ресурса pagetitle
                                
                                                                                                    //В этой секции Вам нужно организовать сбор необходимых данных, для передачи в чанк
                                
                                $output .= $modx->getChunk($tpl, $image);                           //рендерим в чанк, что указан в параметрах, добавляем к выводу
                                $count++;                                                           //костыль с лимитом. увеличиваем счетчик отрендеренных картинок.
                            }
                            else {
                                    break;                                                          //break для прерывание циклов, при достижении количества фотографий по лимиту
                                }
                        }
                    }
                } else {
                break;                                                                              //break для прерывание циклов, при достижении количества фотографий по лимиту
                }
            } else {
                break;                                                                              //break для прерывание циклов, при достижении количества фотографий по лимиту
            }
    }
    
return $output;                                                                                     //вывод накопленного рендера

Очень сильно сомневаюсь в грамотности решения с break; буду очень рад, если кто сможет подсказать, как лучше организовывать подобное.

p.s. Сниппет писал вчера, нужно было решение на скорую руку, сегодня смотрю на него, а у нас тут сложная операция по удалению гланд через ректальное отверстие.
Правильнее было бы получать итератор TemplateVarResources а по нему через getOne() получать ресурс. Тогда и костылей с break; не было бы, можно было использовать limit в newQuery. Хотя в этом случае столкнулся с проблемой выборки по parentid, скорее всего нужен сложный query с джойнами. сейчас попробуем.
Перепишу сниппет, выложу код, вдруг кому мои искания пригодятся.
Vladimir Alekhin
09 апреля 2019, 11:58
0
Понятно, спасибо большое за оперативную помощь!
Vladimir Alekhin
09 апреля 2019, 11:40
0
Спасибо за ответ.

Создал решение на скорую руку, где в таблицах (справочник статусов и справочник категорий) создал записи «Без категории» и «Без статуса», и назначил их ID как дефолтные.

Я правильно понимаю, что это нормальное решение, и вся моя ошибка в данном случае в неверном понимании принципа проектирования БД?
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 а мой комментарий предлагает решение не через данный инструмент. Просто мне все еще трудно понимать. где лучше использовать готовые сниппеты, а где лучше писать свой. а комментарий с самописным сниппетом, для тех, кто вдруг будет потом искать решение подобной задачи. А то я знаю, как обидно найти в интернете то, как кто-то спросил пару лет назад как решить то, что тебе надо решить и последний комментарий в обсуждении:

Все решил.
Vladimir Alekhin
29 марта 2019, 10:21
0
Как вариант использовать <select> в котором перечислять все невидимые в основной пагинации страницы. и при выборе допустим страницы 30 переадресовать на эту же страницу но с $_GET параметром ?page=4.
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%.

Буду очень рад, если кто выскажет комментарии по такому решению, и поправит, если что не так.
Vladimir Alekhin
28 сентября 2018, 09:42
0
Да, Вы правы. Спасибо большое.
Vladimir Alekhin
10 сентября 2018, 13:32
0
Пока нет других предложений было использовано:
Плагин:
$modx->mail->mailer->SMTPAutoTLS = false;
На событие OnMODXInit. Решение работает, письма о регистрации. смене пароля стали приходить.
Vladimir Alekhin
14 марта 2018, 15:02
0
Было решено делать выборку на стороне СУБД при помощи подобного запроса.
$result = $modx->query("

SELECT 
		t.id,
		t.pagetitle,
		t.createdon,
		t.content,
		GROUP_CONCAT(t.idea_date_tech) AS idea_date_tech,
		GROUP_CONCAT(t.idea_status) AS idea_status,
		GROUP_CONCAT(t.idea_status_info) AS idea_status_info,
		GROUP_CONCAT(t.idea_type) AS idea_type,
		GROUP_CONCAT(t.idea_internal_status) AS idea_internal_status,
		GROUP_CONCAT(t.idea_category) AS idea_category,
		GROUP_CONCAT(t.idea_need_money) AS idea_need_money,
		GROUP_CONCAT(t.idea_start_date_plan) AS idea_start_date_plan,
		GROUP_CONCAT(t.idea_end_date_plan) AS idea_end_date_plan,
		GROUP_CONCAT(t.idea_start_date_fact) AS idea_start_date_fact,
		GROUP_CONCAT(t.idea_end_date_fact) AS idea_end_date_fact,
		GROUP_CONCAT(t.idea_geteconom_IQ) AS idea_geteconom_IQ,
		GROUP_CONCAT(t.idea_geteconom_IIQ) AS idea_geteconom_IIQ,
		GROUP_CONCAT(t.idea_geteconom_IIIQ) AS idea_geteconom_IIIQ,
		GROUP_CONCAT(t.idea_geteconom_IVQ) AS idea_geteconom_IVQ,
		GROUP_CONCAT(t.idea_geteconom_total) AS idea_geteconom_total,
		GROUP_CONCAT(t.idea_cureeconom_IQ) AS idea_cureeconom_IQ,
		GROUP_CONCAT(t.idea_cureeconom_IIQ) AS idea_cureeconom_IIQ,
		GROUP_CONCAT(t.idea_cureeconom_IIIQ) AS idea_cureeconom_IIIQ,
		GROUP_CONCAT(t.idea_cureeconom_IVQ) AS idea_cureeconom_IVQ,
		GROUP_CONCAT(t.idea_cureeconom_total) AS idea_cureeconom_total,
		GROUP_CONCAT(t.idea_in_concurs) AS idea_in_concurs,
		GROUP_CONCAT(t.idea_concurs_date) AS idea_concurs_date,
		GROUP_CONCAT(t.idea_concurs_result) AS idea_concurs_result,
		GROUP_CONCAT(t.idea_prem_IQ) AS idea_prem_IQ,
		GROUP_CONCAT(t.idea_prem_IIQ) AS idea_prem_IIQ,
		GROUP_CONCAT(t.idea_prem_IIIQ) AS idea_prem_IIIQ,
		GROUP_CONCAT(t.idea_prem_IVQ) AS idea_prem_IVQ,
		GROUP_CONCAT(t.idea_prem_total) AS idea_prem_total,		
		GROUP_CONCAT(t.departament) AS departament,
		t.longtitle,
		
		GROUP_CONCAT(t.function) AS function,
		GROUP_CONCAT(t.phone) AS phone ,
		t.published
	FROM (
			SELECT c.id, c.pagetitle, c.createdon, c.content,

			CASE cv.tmplvarid
			 WHEN 18 THEN cv.value 
			END
			AS idea_date_tech,

			CASE cv.tmplvarid
			 WHEN 15 THEN cv.value 
			END
			AS idea_status,
			
			CASE cv.tmplvarid
			 WHEN 19 THEN cv.value 
			END
			AS idea_status_info,
			
			CASE cv.tmplvarid
			 WHEN 20 THEN cv.value 
			END
			AS idea_type,
			
			CASE cv.tmplvarid
			 WHEN 46 THEN cv.value 
			END
			AS idea_internal_status,
			
			CASE cv.tmplvarid
			 WHEN 45 THEN cv.value 
			END
			AS idea_category,
			
			CASE cv.tmplvarid
			 WHEN 47 THEN cv.value 
			END
			AS idea_need_money,

			CASE cv.tmplvarid
			 WHEN 21 THEN cv.value 
			END
			AS idea_start_date_plan,
			
			CASE cv.tmplvarid
			 WHEN 22 THEN cv.value 
			END
			AS idea_end_date_plan,
			
			CASE cv.tmplvarid
			 WHEN 23 THEN cv.value 
			END
			AS idea_start_date_fact,
			
			CASE cv.tmplvarid
			 WHEN 24 THEN cv.value 
			END
			AS idea_end_date_fact,
			
			CASE cv.tmplvarid
			 WHEN 25 THEN cv.value 
			END
			AS idea_geteconom_IQ,
			
			CASE cv.tmplvarid
			 WHEN 26 THEN cv.value 
			END
			AS idea_geteconom_IIQ,
			
			CASE cv.tmplvarid
			 WHEN 27 THEN cv.value 
			END
			AS idea_geteconom_IIIQ,
			
			CASE cv.tmplvarid
			 WHEN 28 THEN cv.value 
			END
			AS idea_geteconom_IVQ,
			
			CASE cv.tmplvarid
			 WHEN 29 THEN cv.value 
			END
			AS idea_geteconom_total,
			
			CASE cv.tmplvarid
			 WHEN 31 THEN cv.value 
			END
			AS idea_cureeconom_IQ,
			
			CASE cv.tmplvarid
			 WHEN 32 THEN cv.value 
			END
			AS idea_cureeconom_IIQ,
			
			CASE cv.tmplvarid
			 WHEN 33 THEN cv.value 
			END
			AS idea_cureeconom_IIIQ,
			
			CASE cv.tmplvarid
			 WHEN 34 THEN cv.value 
			END
			AS idea_cureeconom_IVQ,
			
			CASE cv.tmplvarid
			 WHEN 35 THEN cv.value 
			END
			AS idea_cureeconom_total,
			
			CASE cv.tmplvarid
			 WHEN 36 THEN cv.value 
			END
			AS idea_in_concurs,
			
			CASE cv.tmplvarid
			 WHEN 38 THEN cv.value 
			END
			AS idea_concurs_date,
			
			CASE cv.tmplvarid
			 WHEN 39 THEN cv.value 
			END
			AS idea_concurs_result,
			
			CASE cv.tmplvarid
			 WHEN 40 THEN cv.value 
			END
			AS idea_prem_IQ,
			
			CASE cv.tmplvarid
			 WHEN 41 THEN cv.value 
			END
			AS idea_prem_IIQ,
			
			CASE cv.tmplvarid
			 WHEN 42 THEN cv.value 
			END
			AS idea_prem_IIIQ,
			
			CASE cv.tmplvarid
			 WHEN 43 THEN cv.value 
			END
			AS idea_prem_IVQ,
			
			CASE cv.tmplvarid
			 WHEN 44 THEN cv.value 
			END
			AS idea_prem_total,
			
			
			CASE cv.tmplvarid
			 WHEN 14 THEN cv.value 
			END
			AS departament,
			
			c.longtitle,
			
			CASE cv.tmplvarid
			 WHEN 16 THEN cv.value 
			END
			AS function, 
			
			CASE cv.tmplvarid
			 WHEN 17 THEN cv.value 
			END
			AS phone, 

			c.published

			FROM modx_site_content c 
			left join modx_site_tmplvar_contentvalues cv on c.id = cv.contentid 
			inner join modx_site_tmplvars tv on cv.tmplvarid = tv.id 
			where c.parent = 30
		) t 
GROUP BY t.id
order by t.pagetitle;

");

    
   $resources = $result->fetchall(PDO::FETCH_ASSOC);
Не знаю на сколько решение элегантное, но так мы не тянем те поля ресурса, что нам не нужны в память. работает быстро.
Vladimir Alekhin
05 марта 2018, 15:08
0
Вопрос в другом, даже с лимитом в 1
$c->limit(100);

У меня не получается достучаться до значения, имени и ид всех ТВ ресурса.
Если мы добавим после вызова Графа

foreach ($resources as $resource) {
    $count++;
    if ($resource->TemplateVarResources) {
        foreach ($resource->getMany('TemplateVarResources') as $tvs) {
		print_r($tvs);
		}
Я не получаю Объект содержащий все привязанные к данному ресурсу ТВшки.

Дабы память не сошла с ума — дергайте их по 1-му в цикле.
Выполнить сначала GetCount что бы посчитать их количество и идти циклом?
Vladimir Alekhin
01 февраля 2018, 17:18
0
Спасибо, попробуем.
Vladimir Alekhin
01 февраля 2018, 14:26
0
<?php
// Сниппет будет получать данные из формы методом POST
$longtitle   =  $_POST['name'];
$title       =  $_POST['idea-tag'];
$name        =  $_POST['pagetitle'];
$content     =  $_POST['description'];
$date        =  $_POST['date'];
$departament =  $_POST['departament'];// Это значение будем заносить
                                      // в TV-параметр color
$function    =  $_POST['function'];// Это значение будем заносить
                                      // в TV-параметр color
$phone       =  $_POST['phone'];// Это значение будем заносить
                                      // в TV-параметр color
$template    =  $_POST['template']; 

// Если некоторые значения не будут указаны,
// они будут установлены по умолчанию
$parent = 30;
if (!$template)    $template = 4;

// Логинимся в админку
$response = $modx->runProcessor('security/login', array('username' => 'frontend', 'password' => 'C6rRpPQm'));
if ($response->isError()) {
    $modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
    return 0;
}
$modx->initialize('mgr');


// Создаем ресурс
$response = $modx->runProcessor('resource/create', array(
        'pagetitle' => $title,
        'longtitle' => $longtitle,
        'introtext' => $name,
        'content' => nl2br($content),
        'template' => $template,
        'publishedon' => DateTime::createFromFormat('Y-m-d', $date),
	'published' => 0,
	'parent' => $parent));
if ($response->isError()) {
    $modx->log(xPDO::LOG_LEVEL_ERROR, 'There was a problem to create resource...');
    $modx->log(xPDO::LOG_LEVEL_ERROR, $modx->error->failure($response->getMessage()));
    $modx->log(xPDO::LOG_LEVEL_ERROR, $response->getMessage());
    return $modx->error->failure($response->getMessage());
}
Тогда что может генерировать ошибку permission.

[2018-02-01 10:00:51] (ERROR @ /var/www/html/core/cache/includes/elements/modsnippet/60.include.cache.php : 35) There was a problem to create resource...
[2018-02-01 10:00:51] (ERROR @ /var/www/html/core/cache/includes/elements/modsnippet/60.include.cache.php : 36) Array
[2018-02-01 10:00:51] (ERROR @ /var/www/html/core/cache/includes/elements/modsnippet/60.include.cache.php : 37) permission_denied