我在Symfony2中使用Prismic.io
在Prismic中,您必须按ID查询文档。例如,我在我的树枝模板中有这个:
<h3><a href="{{ path('postDetail', {'id': post.getId, 'slug': post.slug, 'ref': ctx.maybeRef}) }}">{{ title }}</a></h3>
生成此网址:
/U3zRuQEAADoAGg7D/slug-of-document
我在控制器中获取十六进制ID,可以成功查询页面。但是,使用ID并不是非常友好。我想生成一个可以在请求中传递id变量的url,但在url中不可见。这可能吗?
为了澄清,这里是整个过程的代码。我有一个页面按标题列出所有博客文章:
<article class="blogEntry">
{% if date is defined %}
<small>{{ date|date("m/d/Y") }}</small>
{% endif %}
{% if title is defined %}
<h3><a href="{{ path('postDetail', {'id': post.getId, 'slug': post.slug, 'ref': ctx.maybeRef}) }}">{{ title }}</a></h3>
{% endif %}
{% if author is defined %}
<small class="blogAuthor">{{ author }}</small>
{% endif %}
{% if excerpt is defined %}
{{ excerpt|raw }}… <a href="{{ path('postDetail', {'id': post.getId, 'slug': post.slug, 'ref': ctx.maybeRef}) }}">Continue Reading »</a>
{% endif %}
</article>
单击标题后,它将转到pageDetail Action:
/**
* @Route("/blog/{id}/{slug}", name="postDetail")
* @Template()
*/
public function postDetailAction($id, $slug)
{
$ctx = $this->get('prismic.context');
$post = $ctx->getApi()->forms()->everything->ref($ctx->getRef())->query('[[:d = at(document.id, "'.$id.'")]]')->submit();
$post = $post->getResults();
if ($post) {
return array(
'ctx' => $ctx,
'bgImages' => $backgroundImages,
'siteInfos' => $siteInfos,
'post' => $post
);
}
throw $this->createNotFoundException('Document not found');
}
我想要更像这样的东西,所以id在请求中并可用于查询,但不可见:
/**
* @Route("/blog/{slug}", name="postDetail")
* @Template()
*/
public function postDetailAction($slug)
{
$request = $this->getRequest();
$request->query->get('id');
$ctx = $this->get('prismic.context');
$post = $ctx->getApi()->forms()->everything->ref($ctx->getRef())->query('[[:d = at(document.id, "'.$id.'")]]')->submit();
$post = $post->getResults();
if ($post) {
return array(
'ctx' => $ctx,
'post' => $post
);
}
throw $this->createNotFoundException('Document not found');
}
我试过这个,但是我得到一个未定义的变量异常,让我觉得我没有在请求中正确发送ID。
我认为这甚至不可能,因为ID需要以某种方式表示,即使不是来自这个特定的页面。只是想抛出问题,看看是否可能。
答案 0 :(得分:1)
为什么不使用简单的js提交隐藏的表单?
像这个jquery-code
<span class="link">{{ title }}</span>
<form class="fooForm" method="POST" action="{{ path('postDetail', {'slug': post.slug, 'ref': ctx.maybeRef}) }}" style="display:none">
<input name="id" type="hidden" value="{{post.getId}}">
</form>
<script>
$(document).on("click",".link",function(){
$('.fooForm').submit();
})
</script>
并在控制器中执行:
$request = $this->getRequest();
$id=$request->get('id');
但是你的网址只能处理后期请求并不太酷,所以它只能通过表单访问,这不是太用户友好但似乎这就是你想要的
答案 1 :(得分:0)
我认为不可能,因为HTTP方法是GET,你应该通过url传递变量。
如果您使用POST方法执行请求,可能有一个解决方案。您可以设置表单,或者如果用户单击链接,则使用jQuery创建POST请求。有了这个,您可以将变量传递给控制器。但是如果所有链接都需要这个id变量,那就不是太舒服了。也许如果您为链接生成编写全局JavaScript函数,并使用该函数而不是{{ path('path_name') }}
。
如果在触发控制器操作后立即重定向用户,则可以使用另一种方法。您使用GET方法传递变量,id
位于网址中。在已触发的操作中,您将此变量保存到会话并将用户重定向到另一个操作,其中该URL中不需要该变量。然后,您可以通过获取会话变量来使用新控制器中的id
。它也不是一个好的解决方案,因为你必须创建大量的冗余动作。
如果仅在某些页面中需要,我会推荐JavaScript版本,或者您应该考虑不隐藏ID。也许这样做不值得。