¿Cómo incrustar acciones de Symfony2 en WordPress?

Lo he estado investigando mucho y lo estoy intentando, pero estoy algo perplejo.

Quiero configurar un sitio en WordPress, que es útil para otro chico que trabaja conmigo. El sitio anunciará nuestro producto y proporcionará información. Entonces los usuarios pueden registrarse a través de una serie de formularios. Quiero escribir esta parte personalizada (formularios, etc.) en Symfony2 porque no tiene que estar vinculada a WordPress, y tendría entidades Doctrine2 reutilizables para mostrar los datos después de que un usuario se haya registrado (la visualización ocurre fuera de WordPress de todos modos )

Pero, desde el punto de vista del diseño, nos gustaría que todo el proceso no se interrumpa y tenga la misma apariencia. Entonces los formularios deberían ser renderizados en páginas de WordPress. Estamos usando un tema personalizado, no libre y me gustaría simplemente copiar y pegar un montón de encabezados y encabezados de WordPress en vistas de Symfony.

Idealmente, quiero definir páginas en WordPress que puedan representar acciones de Symfony2. Por lo tanto, las acciones mismas podrían mostrar y procesar formularios (que deberían funcionar independientemente de WordPress, por ejemplo, en http://example.com/app.php/signup ), pero normalmente deberían mostrarse en el sitio de WordPress (por ejemplo, dentro de una página como http://example.com/index.php?page_id=2 o un enlace permanente).

He estado investigando LowPress como una forma de integración (http://www.lowpress.com/), pero hace mucho más de lo que quiero al eliminar los temas de WordPress por completo y reemplazarlos con temas de Twig. Traté de tomar prestadas algunas ideas, así que ahora tengo WordPress en la carpeta web del proyecto Symfony y esto en mi 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 

Así que todo lo que tengo ahora es una configuración de base de datos compartida a través de parameters.ini en Symfony. A continuación, he intentado crear un complemento simple que utiliza un código abreviado para poder representar una acción de Symfony2 en una página de WordPress. Esto es lo que tengo hasta ahora como una idea (depende del bootstrapping anterior y está incompleto):

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

Mi primer problema es que no sé cómo renderizar realmente alguna ruta Symfony2, que puede tener parámetros, cuando la $request dada no tenga la información que necesito. El otro problema es que, si quiero que los formularios se envíen, probablemente no funcionaría porque redirigiría al usuario fuera de WordPress, cuando realmente quiero una serie de formularios que todos existen en la página de WordPress. Al mismo tiempo, quiero que los formularios sean independientes de WordPress para que funcionen por sí mismos.

Así que quiero saber si esta es solo una idea mala / hacky que no funcionará, o si hay alguna forma de hacerlo funcionar.

También estaba pensando en usar AJAX para cargar el código Symfony2 en WordPress (suponiendo que todos mis usuarios tengan Javascript habilitado). Como alternativa, la página solo podría ir a una aplicación Symfony2 en lugar de estar dentro de una página de WordPress. ¿Sería eso mejor / más fácil? El único inconveniente que puedo ver es que tengo que mantener el código ajax sincronizado con mi código Symfony2.

Symfony 2 permite el uso de partes del marco sin usar el todo.

El formulario es un componente que es separable, como puede ver aquí:

http://symfony.com/components

lamentablemente, todavía no hay mucha documentación, por lo tanto, tendrías que descubrirlo por ti mismo …

editar: lo mismo ocurre con el enrutamiento, etc. si desea poder usar el enrutamiento de Symfony para reconocer rutas / cosas que hacer, debe incluir el componente HttpFoundation y, obviamente, el enrutamiento.

Como no desea “simplemente copiar y pegar un montón de encabezados y encabezados de WordPress en vistas de Symfony”, le sugiero que inserte el encabezado y el pie de página de WordPress en todas las vistas de Symfony mediante progtwigción.

También eche un vistazo a Silex ya que tiene una sobrecarga menor que Symfony y funciona con formularios de Symfony.

  1. Instalar Symfony2 o Silex
  2. Pon los archivos de WordPress en tu web / carpeta
  3. wp-config.php puede vivir una carpeta al lado de composer.json, que es mejor para la seguridad de todos modos
  4. Mueva su Symfony, o Silex, los controladores frontales a una subcarpeta, probablemente llamada registro / en su caso
  5. Arregle las rutas require / include en la parte superior de su (s) controlador (es) frontal (es)
  6. Agregue una línea en la parte superior de sus controladores frontales para incluir wp-load.php desde la carpeta principal – este archivo activa WordPress y pone a su disposición todas las funciones de WordPress – tenga en cuenta que debe incluirse desde el scope global no desde dentro de una función
  7. Llame a los métodos de WordPress get_header(); y get_footer(); encima y debajo del código de Symfony, o Silex, en los controladores frontales. En Silex está justo encima y debajo de $app->run();

La estructura de tu archivo debería verse así:

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

Inspirado por esta publicación .