Генерация URI с помощью плагина
        Всем доброго времени суток!
Написал простой плагин для генерации URI и повесил его на события OnDocFormSave и OnDocFormPrerender, но при сохранении ресурса сгенерированный URI обновляется только после обновления страницы с редактируемым ресурсом. Как это исправить?
    
    
                                                                                
            Написал простой плагин для генерации URI и повесил его на события OnDocFormSave и OnDocFormPrerender, но при сохранении ресурса сгенерированный URI обновляется только после обновления страницы с редактируемым ресурсом. Как это исправить?
Комментарии: 24
                Привет! Повесь плагин на OnBeforeDocFormSave вместо OnDocFormSave            
                    
                Безрезультатно.            
                    
                Код плагина в студию            
                    <?php
$resource = $modx->getObject('modResource', $id);
$resourceAlias = $resource->get('alias');
$resourceParent = $modx->getObject('modResource', $resource->get('parent'));
if ($resourceParent) {
    $resourceParentAlias = $resourceParent->get('alias');
    
    $resourceParentIsTabsContainer = $resourceParent->getTVValue('resourceTabsContainer');
    
    if ($resourceParentIsTabsContainer) {
        $resource->set('uri_override', true);
        $resource->set('uri', $resourceParentAlias.'#'.$resourceAlias);
        
        $resource->save();
    }
}            
                А для чего повешено на событие OnDocFormPrerender?            
                    
                Уже убрал это событие. Думал, что поможет в решении проблемы.            
                    <?php
$eventName = $modx->event->name;
switch($eventName) {
    case 'OnBeforeDocFormSave':
        //$resource = $modx->getObject('modResource', $id);
        $resourceAlias = $resource->get('alias');
        $resourceParent = $modx->getObject('modResource', $resource->get('parent'));
        if ($resourceParent) {
            $resourceParentAlias = $resourceParent->get('alias');
            
            $resourceParentIsTabsContainer = $resourceParent->getTVValue('resourceTabsContainer');
            
            if ($resourceParentIsTabsContainer) {
                $resource->set('uri_override', true);
                $resource->set('uri', $resourceParentAlias.'#'.$resourceAlias);
                
                //$resource->save();
            }
        }
        break;
}Плагин меняет URI, делает его замороженным, если tv-поле родителя ресурса равно true.
Едиственный момент: в этом плагине я закомментил первую и последнюю сроки — они по факту не нужны
Вот такой код корректно всё отрабатывает: URI меняет сразу. У тебя не так? Где не так? На фронте или в админке? Прошу конкретики
                Ничего не изменилось. В админке. Содержимое поля меняется фактически, но новое значение отображается только после обновления страницы.            
                    
                Спецом открывал вкладку «настройки» ресурса, все на лету меняется при сохранении. MODX 2.8.1            
                    
                А на каких событиях плагин висит?            
                    
                OnBeforeDocFormSave            
                    
                В коде это событие я вижу, галочка на вкладке «Системные события» тоже стоит?            
                    
                Всё заработало внезапно! Спасибо большое)            
                    
                Немного оффтоп-вопрос — есть ли способ внутри сниппета узнать, есть ли у ресурса TV-поле?            
                    
                То есть, нужна проверка, прикреплено ли в принципе tv к этому ресурсу? Не важно, пустая она или нет?            
                    
                Именно!            
                    $template_id = 2; //id шаблона ресурса
$tv_id = 5; //id tv-поля
$q = $modx->newQuery('modTemplateVarTemplate');
$q->where([
    'tmplvarid' => $tv_id,
    'templateid' => $template_id
]);
$q->limit(1);
return $modx->getCount('modTemplateVarTemplate', $q);Как известно, tv-поля прикрепляются не к самим ресурсам, а к шаблонам.
Вот сниппет, который возвращает 0 если tv не прикреплен к указанному шаблону и 1, если прикреплен.
                Уже разобрался, но решил задачу немного иным путём.
                    $parentIsTabsContainerTV = $modx->getObject('modTemplateVarResource', array(
    'contentid' => $parentID,
    'tmplvarid' => $resourceIsTabsContainerTVID
));            
                В этом случае, если tv-поле не заполнено, но прикреплено к ресурсу, результат все равно будет отрицательный            
                    
                У меня там чекбокс, который нельзя снять, поэтому норм.            
                    
                Но в любом случае спасибо за помощь. Возможно, воспользуюсь вашим вариантом в будущем.            
                    
                Нет, код всё-таки неверно отрабатывает. Теперь у меня URI меняется вообще у любого ресурса, у которого есть родитель, даже если у него нет TV «resourceTabsContainer».            
                    
                На тесте всё корректно отрабатывает.            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.