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

7

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

Я хочу настроить сайт в 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. Я попытался заимствовать у него несколько идей, поэтому теперь у меня есть 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 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

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

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

Моя первая проблема заключается в том, что я не знаю, как реально отобразить некоторый маршрут Symfony2, который может иметь параметры, когда данный $request не будет иметь необходимой мне информации. Другая проблема заключается в том, что если я хочу, чтобы формы отправлялись, это, вероятно, не сработало бы, потому что это перенаправило бы пользователя за пределы WordPress, когда действительно мне может понадобиться серия форм, которые все существуют на странице WordPress. В то же время я хочу, чтобы формы не зависели от WordPress, поэтому они работают самостоятельно.

Итак, я хочу знать, является ли это просто плохой/взломанной идеей, которая не сработает, или если есть какой-то способ заставить ее работать.

Я также думал о том, что просто использовал AJAX для загрузки кода Symfony2 в WordPress (при условии, что у всех моих пользователей включен Javascript). В качестве резервной копии страница могла просто перейти на приложение Symfony2, а не находиться на странице WordPress. Было бы лучше/проще? Единственный недостаток, который я вижу, заключается в том, что мне нужно сохранить код ajax в синхронизации с кодом Symfony2.

  • 0
    Вы рассматривали возможность использования iframe для включения приложения symfony2 в WordPress? так как это просто куча форм, вы можете сделать это, возможно?
  • 0
    Я думал, что мне просто нужно идти по этому пути
Теги:

2 ответа

0
Лучший ответ

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

Форма - это компонент, который можно отсоединить, как вы можете найти здесь:

http://symfony.com/components

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

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

  • 0
    Принятие этого, поскольку это, вероятно, лучшее решение. Я в значительной степени разочаровался в вышеприведенной идее, так как не думаю, что мне все равно придется так поступать. Все, что мне действительно нужно, это целевая / информационная страница WordPress, на которой пользователи нажимают на ссылку, чтобы запустить процесс регистрации в Symfony или получить доступ к панели пользователя Symfony.
  • 0
    спасибо, в любом случае, если у вас есть свободное время, попробуйте проверить компоненты sf2, большинство из них довольно просты для понимания (очевидно, не для освоения) и могут предоставить очень мощные инструменты разработки
Показать ещё 1 комментарий
3

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

Также посмотрите Silex, так как это имеет меньшие накладные расходы, чем Symfony, и работает с формами Symfony.

  • Установите Symfony2 или Silex
  • Поместите файлы WordPress в ваш веб-каталог
  • wp-config.php может жить в одной папке рядом с composer.json, что лучше для безопасности в любом случае
  • Переместите ваш Symfony или Silex, передний контроллер /s в подпапку, возможно, названную регистрацию/в вашем случае
  • Исправьте пути require/include в верхней части вашего фронтального контроллера /s
  • Добавьте строку вверху вашего фронтального контроллера /s, чтобы включить 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

Вдохновленный этим post.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню