Как встроить действия Symfony2 в WordPress?

Я много исследовал его и пробовал, но я в тупике.

Я хочу настроить сайт в WordPress, что полезно для другого парня, работающего со мной. Сайт будет рекламировать наш продукт и предоставлять информацию. Затем пользователи могут зарегистрироваться через ряд форм. Я хочу написать эту пользовательскую часть (формы и т. д.) в Symfony2, потому что он не должен быть привязан к WordPress, и у него были бы многоразовые сущности Doctrine2 для отображения данных после того, как пользователь подписал вверх (отображение происходит вне WordPress в любом случае).

но, дизайн-мудрый, мы хотели бы, чтобы весь процесс был непрерывным и иметь тот же внешний вид. Таким образом, формы должны быть представлены на страницах WordPress. Мы используем пользовательскую, несвободную тему, и я бы не хотел просто копировать-вставлять кучу CSS и заголовков WordPress в представления Symfony.

В идеале я хочу просто определить страницы в WordPress, которые могут отображать действия Symfony2. Так что сами действия могут отображение и обработка форм (которые должны работать независимо от WordPress, скажем, вhttp://example.com/app.php/signup), но они обычно должны отображаться на сайте WordPress (например, на такой странице, как http://example.com/index.php?page_id=2 или permalink).

Я исследовал LowPress как способ интеграции (http://www.lowpress.com/), но это намного больше, чем я хочу, удалив темы WordPress и заменив их с веточкой темы. Я попытался позаимствовать у него несколько идей, поэтому теперь у меня есть WordPress в web папка проекта Symfony и это в моем 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

Итак, все, что у меня есть сейчас, это общая конфигурация DB через parameters.ini в Symfony. Затем я пытался сделать простой плагин, который использует шорткод, чтобы я мог отобразить действие Symfony2 на странице WordPress. Вот что у меня есть до сих пор как идея (это зависит от вышеупомянутой загрузки, и это неполный):

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 для загрузки кода Symfony2 в WordPress (предполагая, что у всех моих пользователей включен Javascript). В качестве запасного варианта страница может просто перейти на приложение Symfony2, а не на страницу WordPress. Будет ли это лучше / проще? Единственный недостаток, который я вижу, заключается в том, что я должен синхронизировать код ajax с моим кодом Symfony2.

2 ответов


Symfony 2 позволяет использовать части фреймворка без использования целого.

форма является компонентом, который является съемным, как вы можете найти здесь:

http://symfony.com/components

к сожалению, пока нет много документации, поэтому вам придется открыть ее самостоятельно...

изменить: то же самое происходит с маршрутизацией и т. д. если вы хотите использовать маршрутизацию symfony для распознавания путей/действий , вам нужно будет включить компонент HttpFoundation и, очевидно, маршрутизацию.


как вы не хотите "..просто скопируйте-вставьте кучу WordPress CSS и заголовков в Symfony views", я предлагаю вам встроить верхний и Нижний колонтитулы WordPress во все ваши Symfony views программно.

посмотрите Силекс поскольку это имеет более низкие накладные расходы, чем Symfony, и работает с формами Symfony.

  1. установить Symfony2, или Silex
  2. поместите файлы WordPress в свой веб/ папку
  3. wp-config.PHP может жить один папка рядом с композитором.в JSON, что лучше для безопасности в любом случае
  4. переместите Symfony или Silex, front controller/s в подпапку, возможно, с именем signup / в вашем случае
  5. исправьте пути require / include в верхней части вашего переднего контроллера / s
  6. добавьте строку в верхней части переднего контроллера / с, чтобы включить wp-load.php из родительской папки-этот файл запускает WordPress и делает все функции WordPress доступными для вас - обратите внимание, что он должен быть включен из глобальной области, а не из функции
  7. вызовите методы WordPress get_header(); и get_footer(); над и под кодом Symfony или Silex в вашем переднем контроллере/s. В Silex это чуть выше и ниже $app->run();

ваша файловая структура должна выглядеть следующим образом:

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

вдохновленный этим в должности.