草庐IT

php - 如何将 Symfony2 Action 嵌入到 WordPress 中?

coder 2024-01-03 原文

我一直在研究它并尝试它,但我有点难过。

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

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

理想情况下,我只想在 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 Symfony\Component\EventDispatcher\Event;
use Symfony\Component\HttpFoundation\Request;

$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 操作。到目前为止,这是我的一个想法(它取决于上述 Bootstrap 并且不完整):

use Symfony\Component\HttpFoundation\Request;

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

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

所以我想知道这是否只是一个行不通的糟糕/骇人听闻的想法,或者是否有某种方法可以让它发挥作用。

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

最佳答案

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

另请查看 Silex因为这比 Symfony 的开销更低,并且适用于 Symfony 表单。

  1. 安装 Symfony2 或 Silex
  2. 将 WordPress 文件放在您的 web/文件夹中
  3. wp-config.php 可以放在composer.json 旁边的一个文件夹中,which is better for security anyway
  4. 将您的 Symfony 或 Silex 前端 Controller 移动到一个子文件夹,在您的情况下可能名为 signup/
  5. 修复前端 Controller 顶部的 require/include 路径
  6. 在前端 Controller 的顶部添加一行以包含父文件夹中的 wp-load.php - 此文件启动 WordPress 并使所有 WordPress 功能可供您使用 - 注意它必须包含在不是来自函数内部的全局范围
  7. 在前端 Controller 中的 Symfony 或 Silex 代码之上和之下调用 WordPress 方法 get_header();get_footer();。在 Silex 中,它位于 $app->run();
  8. 的上方和下方

你的文件结构应该是这样的:

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

受此启发post .

关于php - 如何将 Symfony2 Action 嵌入到 WordPress 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10843410/

有关php - 如何将 Symfony2 Action 嵌入到 WordPress 中?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

随机推荐