2012-06-01 12 views
7

Lo he estado investigando mucho y lo estoy intentando, pero estoy algo perplejo.¿Cómo incrustar acciones de Symfony2 en WordPress?

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 pueden representar acciones de Symfony2. Por lo tanto, las acciones mismas pueden mostrar y procesar formularios (que deben funcionar independientemente de WordPress, por ejemplo, http://example.com/app.php/signup), pero normalmente deberían mostrarse en el sitio de WordPress (por ejemplo, en 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 lo hace mucho más de lo que deseo eliminando los temas de WordPress por completo y reemplazándolos con los temas de Twig. Traté de tomar prestadas algunas ideas de él, por lo 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 DB global 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. Aquí es lo que tengo hasta ahora como una idea (que depende de la bootstrapping arriba y es incompleta):

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 representar en realidad una ruta de Symfony2, que puede tener parámetros, cuando el $request dado no tendrá 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 de 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.

+0

¿ha considerado usar iframe para incluir la aplicación symfony2 dentro de wordpress? dado que es solo un montón de formas, ¿puedes hacer eso quizás? –

+0

Estaba pensando que solo tendría que seguir esa ruta – Matt

Respuesta

0

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

La forma es un componente que es desmontable, como se puede encontrar aquí:

http://symfony.com/components

por desgracia, todavía no existe mucha documentación, por lo tanto, que lo tienes que descubrirlo por ti mismo ...

edición: lo mismo pasa junto con el enrutamiento, etc. si usted quiere ser capaz de utilizar el enrutamiento de Symfony para reconocer trayectorias/cosas que hacer, que tendría que incluir el componente HttpFoundation, y obviamente el enrutamiento

+0

Aceptando esto ya que probablemente sea la mejor solución. He renunciado bastante a la idea anterior ya que no creo que de todos modos tenga que hacerlo de esa manera. Todo lo que realmente necesito es una página de aterrizaje/información de WordPress en la que los usuarios hagan clic en un enlace para iniciar un proceso de registro con Symfony o acceder a un panel de usuario de Symfony. – Matt

+0

gracias, de todos modos, si tiene algo de tiempo libre, intente comprobar los componentes sf2, la mayoría son bastante fáciles de entender (obviamente no dominar) y pueden proporcionar herramientas de desarrollo muy potentes. – Stormsson

+0

Estoy usando Sf2 como marco, pero sí, los componentes son agradables (hice un pequeño proyecto de clase en Silex, que fue genial). – Matt

3

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

También consulte Silex ya que tiene una sobrecarga menor que Symfony y funciona con formularios de Symfony.

  1. Instalar Symfony2, o Silex
  2. poner los archivos de WordPress en tu web/carpeta
  3. wp-config.php pueden vivir una carpeta al lado de composer.json, which is better for security anyway
  4. Mueva su Symfony, o Silex, controlador/es delantero/s en una subcarpeta, probablemente llamado registro/en su caso
  5. Corrija las rutas require/include en la parte superior de sus controladores delanteros
  6. Agregue una línea en la parte superior de su frente controlador/es para incluir wp- load.php de 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 alcance global no desde una función
  7. Llame a los métodos de WordPress get_header(); y get_footer(); arriba del y debajo del código de Symfony, o Silex, en sus controladores frontales. En Silex que está justo por encima y por debajo $app->run();

Su estructura de archivos debe tener este aspecto:

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

inspirado en este post.