如何将Symfony2动作嵌入到WordPress中?

我一直在研究它并试用它,但我很难过。

我想在WordPress中设置一个站点,这对另一个与我合作的人很有帮助。 该网站将宣传我们的产品并提供信息。 然后用户可以通过一系列表单注册。 我想在Symfony2中编写这个自定义部分(表单等),因为它不需要绑定到WordPress,并且它有可重用的Doctrine2实体在用户注册后显示数据(显示在WordPress之外发生)。

但是,在设计方面,我们希望整个过程不间断并具有相同的外观和感觉。 所以表单实际上应该在WordPress页面中呈现。 我们正在使用一个自定义的非自由主题,我讨厌将一堆WordPress CSS和标题复制粘贴到Symfony视图中。

理想情况下,我想在WordPress中定义可以渲染Symfony2操作的页面。 因此,这些操作本身可能会显示和处理表单(应该独立于WordPress,在http://example.com/app.php/signup上工作),但它们通常应该显示在WordPress网站中(例如, http://example.com/index.php?page_id=2或永久链接)。

我一直在研究LowPress作为一种整合方式(http://www.lowpress.com/),但它的方式远远超出我想要的,通过完全删除WordPress主题并将它们替换为Twig主题。 我试图从中借用一些想法,所以现在我在Symfony项目的web文件夹中安装了WordPress,并且在我的wp-config.php

// ...code omitted
define('WP_DEBUG', true);

define('SYMFONY_DIR', __DIR__.'/../app/');

require_once SYMFONY_DIR.'/bootstrap.php.cache';
require_once SYMFONY_DIR.'/AppKernel.php';
//require_once SYMFONY_DIR.'/AppCache.php';

use SymfonyComponentEventDispatcherEvent;
use SymfonyComponentHttpFoundationRequest;

$kernel = new AppKernel((WP_DEBUG) ? 'dev' : 'prod', WP_DEBUG);
$kernel->loadClassCache();
$kernel->boot();
$GLOBALS['sf2_kernel'] = $kernel;
// save request before WordPress messes with it
$GLOBALS['sf2_request'] = Request::createFromGlobals();

$doctrine = $kernel->getContainer()->get('doctrine');
$conn = $doctrine->getConnection($doctrine->getDefaultConnectionName());

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME',       $conn->getDatabase());

/** MySQL database username */
define('DB_USER',       $conn->getUsername());

/** MySQL database password */
define('DB_PASSWORD',   $conn->getPassword());

/** MySQL hostname */
define('DB_HOST',       $conn->getHost());

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

// ...code omitted

所以我现在所拥有的是通过Symfony中的parameters.ini共享数据库配置。 接下来,我一直在试图制作一个使用简码的简单插件,这样我就可以在WordPress页面中呈现Symfony2操作。 这是我至今有一个想法(它依赖于上面的引导和它是不完整的):

use SymfonyComponentHttpFoundationRequest;

class Symfony2Page
{
    public function render($atts)
    {
        extract(shortcode_atts(array(
            'controller' => 'CroltsMainBundle:Default:index',
        ), $atts));
        $kernel = $GLOBALS['sf2_kernel'];
        $request = $GLOBALS['sf2_request'];
        $request->headers->set('X-Php-Ob-Level', ob_get_level());
        $attributes = array();
        // @TODO fix this

        $kernel->getContainer()->enterScope('request');
        $kernel->getContainer()->set('request', $request, 'request');

        try {
            $response = $kernel->getContainer()->get('http_kernel')->render($controller, $attributes)->getContent();
        } catch (Exception $e) {
            $kernel->getContainer()->leaveScope('request');

            throw $e;
        }

        $kernel->getContainer()->leaveScope('request');

        return $response;
    }
}

add_shortcode('sf_action', array('Symfony2Page', 'render'));

我的第一个问题是我不知道如何实际渲染一些Symfony2路由,这可能有参数,当给定的$request不会有我需要的信息。 另一个问题是,如果我想要提交表单,它可能无法工作,因为它会将用户重定向到WordPress之外,实际上我可能需要一系列全部存在于WordPress页面中的表单。 同时,我希望表单独立于WordPress,以便他们自己工作。

所以我想知道这是不是一个糟糕的/黑客的想法,它不起作用,或者有什么方法让它工作。

我也想过使用AJAX在WordPress中加载Symfony2代码(假设我的所有用户都启用了Javascript)。 作为后备,该页面可以转到Symfony2专用应用程序,而不是在WordPress页面中。 这会更好/更容易吗? 我能看到的唯一缺点是我必须保持ajax代码与我的Symfony2代码同步。


Symfony 2允许在不使用整体的情况下使用框架的各个部分。

表单是可拆卸的组件,如下所示:

http://symfony.com/components

可悲的是,目前还没有太多的文件,因此你必须自己发现它...

编辑:如果您希望能够使用symfony路由来识别路径/要做的事情,那么您必须包含HttpFoundation组件,显然还包括路由。


由于您不想“只是将一堆WordPress CSS和标题复制粘贴到Symfony视图中”,我建议您以编程方式将WordPress页眉和页脚嵌入到所有Symfony视图中。

还要看看Silex,因为它的开销比Symfony低,并且可以与Symfony形式一起使用。

  • 安装Symfony2或Silex
  • 将WordPress文件放入您的网页/文件夹
  • wp-config.php可以在composer.json旁边生存一个文件夹,无论如何这对安全性来说都更好
  • 将您的Symfony或Silex前端控制器移动到一个子文件夹,可能名为signup /
  • 修复前端控制器顶部的require / include路径
  • 在前端控制器的顶部添加一行以包含来自父文件夹的wp-load.php - 该文件启动WordPress并使所有WordPress功能都可用 - 注意它必须包含在全局范围内而不是从一个函数里面
  • 调用WordPress方法get_header();get_footer(); 在Symfony之上或之下,或者在您的前端控制器中使用Silex代码。 在Silex上面和下面$app->run();
  • 你的文件结构应该如下所示:

    vendor/
      |-- Third party libraries 
    web/
      |-- WordPress files
      |-- signup/
           |-- Symfony2 or Silex front controller
    composer.json
    wp-config.php
    

    受这篇文章的启发。

    链接地址: http://www.djcxy.com/p/10819.html

    上一篇: How to embed Symfony2 actions into WordPress?

    下一篇: How to keep editor alive in Virtualtreeview?