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.
¿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? –
Estaba pensando que solo tendría que seguir esa ruta – Matt