Генерация 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».
На тесте всё корректно отрабатывает.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.