java - 木兰CMS : renaming page creates 404 when using Urltrans module

标签 java content-management-system magnolia

Urltrans module帮助我拥有国际化的 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 路径”,因此页面不再存在。

我发现 line 51 of UrltransSaveHandler.java 中提到了这个问题(我想这就是我的意思)。

例如,我知道如何防止这种情况发生:

  • 只需以编程方式关闭当前 Pages app页面名称更改时的选项卡?
  • 将当前选项卡重定向到具有新 URL 路径的 View 页面
  • 不允许用户从Page app's browser以外的任何地方编辑页面名称。
  • 也许还有其他解决方案?

最佳答案

说明

UrltransSaveHandler.java实际上没有使用。

但是,SaveDialogAction.java在对话框的操作定义中配置。

这是相关的对话框(如果您没有覆盖它):admincentral#app:configuration:browser;/modules/standard-templatating-kit/dialogs/generic/master/basePageProperties:treeview: .

SaveDialogAction.java第 81 行调用setNodeName(node, item)

此方法与UrltransSaveHandler.java第51行非常相似。 :它执行“if(节点的“name”属性已更改?){重命名节点本身}”。

<小时/>

解决方案:简而言之

  1. 创建一个新的 Action Definition,其功能与 SaveDialogAction 完全相同,除了对 setNodeName(node, item); 的调用仅如果父节点不是 NodeType mgnl:variant
  2. ,则会发生这种情况
  3. 将此新分配给相关对话框配置中的Commit操作
<小时/>

Action 定义类

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);
    }

}

Action 类

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);
            }
        }
    }

}

关于java - 木兰CMS : renaming page creates 404 when using Urltrans module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40385871/

相关文章:

java - 如何在输入特定字符串后停止java中的while循环?

java - 如何在 Gson 中转义斜线

java - 当可滚动的 recyclerView 仅占手机屏幕的一半时,如何让 Activity 中的整个屏幕滚动

html - 从 Freemarker 中的相对链接获取绝对链接

java - Magnolia 自定义内容类型作为属性

用于 GUI 的 Java 2D 场景图形库

javascript - 如果其他 div 的样式处于事件状态,则从一个 div 中删除样式

基于 Java 的博客网站框架 - Apache Roller?

css - Prestashop 1.6.1.4 - 将 CSS 添加到模块的 CMS 页面

java - 如何检查某个用户在根节点上是否具有{写、读}权限