首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Magnolia CMS:重命名页面在使用Urltrans模块时创建404

Magnolia CMS:重命名页面在使用Urltrans模块时创建404
EN

Stack Overflow用户
提问于 2016-11-02 17:13:42
回答 1查看 425关注 0票数 1

Urltrans模帮助我拥有国际化的URL,但是只有一个层次结构。

总的来说,它运行良好,但在这种情况下除外:

  1. 回到Magnolia CMS管理中心,在pages应用程序中打开一个页面
  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路径”,因此页面已经不存在了。

我在UrltransSaveHandler.java第51行上发现了这个问题(我想这就是我的意思)。

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

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

回答 1

Stack Overflow用户

发布于 2016-11-03 16:03:27

解释

实际上没有使用UrltransSaveHandler.java

但是,SaveDialogAction.java是在对话框的Action Definition中配置的。

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

SaveDialogAction.javaline 81setNodeName(node, item)打电话。

这个方法非常类似于在line 51 of UrltransSaveHandler.java上发生的事情:它做一个"if (node's "name" property has changed?){rename node itself}“。

解决方案:简而言之

  1. 创建一个与SaveDialogAction完全相同的新SaveDialogAction,但对setNodeName(node, item);的调用仅在父节点不属于NodeType mgnl:variant时发生
  2. 将这个新的Class分配给相关对话框配置中的Commit操作

动作定义类

代码语言:javascript
运行
复制
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);
    }

}

行动类

代码语言:javascript
运行
复制
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);
            }
        }
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40385871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档