Magnolia CMS: страница переименования создает ошибку 404 при использовании модуля Urltrans

модуль Urltrans помогает мне иметь интернационализированные URL-адреса, но единую иерархию.


В целом работает нормально, за исключением этого случая:

  1. Вернувшись в центр администрирования Magnolia CMS, в приложении страниц откройте страницу.
  2. Допустим, я визуализирую страницу на немецком языке.
  3. Откройте диалоговое окно свойств страницы
  4. Изменить (локализованное) имя
  5. Сохранять
  6. 404 error message на вкладке "Предварительный просмотр страницы". В журнале написано 2016-11-01 11:17:57,413 WARN info.magnolia.rendering.engine.RenderingFilter : Resource not found: [/<path>/<to>/<page>?mgnlPreview=false&mgnlChannel=desktop]

Это происходит просто потому, что страница, которую я сейчас пытаюсь увидеть в центре администрирования, по-прежнему имеет «прежнее имя», следовательно, «прежний URL-адрес», следовательно, страница, которой больше не существует.

Я обнаружил, что эта проблема упоминается в строка 51 файла UrltransSaveHandler.java (думаю, это то, что я имею в виду).

Любая идея, как я могу предотвратить это, например:

  • просто программно закрывать текущую вкладку Pages app при изменении имени страницы?
  • перенаправить текущую вкладку на просмотр страницы с новым URL-адресом
  • НЕ позволяйте пользователям редактировать название страницы где-либо еще, кроме Page app's browser
  • может другое решение?

person Adrien Be    schedule 02.11.2016    source источник


Ответы (1)


Объяснение

UrltransSaveHandler.java на самом деле НЕ используется.

Однако SaveDialogAction.java настраивается в Action Definition диалогового окна.

Это соответствующий диалог (если вы его не переопределили): admincentral#app:configuration:browser;/modules/standard-templating-kit/dialogs/generic/master/basePageProperties:treeview:.

SaveDialogAction.java вызывает setNodeName(node, item) в line 81.

Этот метод очень похож на то, что происходило на line 51 сайта UrltransSaveHandler.java: выполняет "if (node's "name" property has changed?){rename node itself}".


Решение: в двух словах

  1. Создайте новый Action Definition, который делает то же самое, что и SaveDialogAction, за исключением этого вызова setNodeName(node, item);, который происходит только в том случае, если родительский узел не из NodeType mgnl:variant.
  2. Назначьте этот новый Class действию Commit в соответствующей конфигурации диалога.

Класс определения действия

package com.myproject.dialog;

import info.magnolia.ui.admincentral.dialog.action.SaveDialogActionDefinition;
import info.magnolia.ui.api.action.Action;

public class MyProjectUrltransSaveActionDefinition extends SaveDialogActionDefinition {

    public MyProjectUrltransSaveActionDefinition() {
        setImplementationClass((Class<? extends Action>) MyProjectUrltransSaveAction.class);
    }

}

Класс действия

package com.myproject.dialog;

import javax.jcr.Node;
import javax.jcr.nodetype.NodeType;
import javax.jcr.Property;
import javax.jcr.RepositoryException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.vaadin.data.Item;

import info.magnolia.cms.core.Path;
import info.magnolia.jcr.util.NodeUtil;
import info.magnolia.ui.admincentral.dialog.action.SaveDialogAction;
import info.magnolia.ui.api.action.ActionExecutionException;
import info.magnolia.ui.form.EditorCallback;
import info.magnolia.ui.form.EditorValidator;
import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter;
import info.magnolia.ui.vaadin.integration.jcr.ModelConstants;


public class MyProjectUrltransSaveAction<T extends MyProjectUrltransSaveActionDefinition> extends SaveDialogAction {

    private static final Logger log = LoggerFactory.getLogger(MyProjectUrltransSaveAction.class);

    public MyProjectUrltransSaveAction(T definition, Item item, EditorValidator validator, EditorCallback callback) {
        super(definition, item, validator, callback);
    }

    public void execute() throws ActionExecutionException {
        if (validateForm()) {
            final JcrNodeAdapter item = (JcrNodeAdapter) this.item;
            try {
                final Node node = item.applyChanges();
                final Node parentNode = node.getParent();
                final String parentNodeType = parentNode.getPrimaryNodeType().getName();
                if(!parentNodeType.equals("mgnl:variant")){
                    setNodeName(node, item);
                }
                node.getSession().save();
            } catch (final RepositoryException e) {
                throw new ActionExecutionException(e);
            }
            callback.onSuccess(getDefinition().getName());
        }
    }

    /**
     * Set the node Name.
     * Node name is set to: <br>
     * the value of the property 'name' if it is present.
     */
    protected void setNodeName(Node node, JcrNodeAdapter item) throws RepositoryException {
        String propertyName = "name";
        if (node.hasProperty(propertyName) && !node.hasProperty(ModelConstants.JCR_NAME)) {
            Property property = node.getProperty(propertyName);
            String newNodeName = property.getString();
            if (!node.getName().equals(Path.getValidatedLabel(newNodeName))) {
                newNodeName = Path.getUniqueLabel(node.getSession(), node.getParent().getPath(), Path.getValidatedLabel(newNodeName));
                item.setNodeName(newNodeName);
                NodeUtil.renameNode(node, newNodeName);
            }
        }
    }

}
person Adrien Be    schedule 03.11.2016