Dużo się nad tym zastanawiałem i próbowałem, ale jestem trochę zakłopotany.Jak osadzić działania Symfony2 w WordPress?
Chcę ustawić witrynę w WordPressie, która jest pomocna dla innego faceta pracującego ze mną. Witryna będzie reklamować nasz produkt i dostarczać informacje. Następnie użytkownicy mogą zarejestrować się za pomocą szeregu formularzy. Chcę napisać tę niestandardową część (formularze itp.) W Symfony2, ponieważ nie ma potrzeby być powiązana z WordPressem, a byłoby to ponowne użycie jednostek Doctrine2 w celu wyświetlania danych po zarejestrowaniu się użytkownika (mimo to wyświetlanie odbywa się poza WordPress)).
Ale pod względem projektowym chcielibyśmy, aby cały proces był nieprzerwany i miał taki sam wygląd. Tak więc formularze powinny być renderowane na stronach WordPress. Używamy niestandardowego, niewolnego motywu i nie chciałbym po prostu kopiować i wklejać wiązki CSS WordPressa i nagłówków do widoków Symfony.
Idealnie, chcę po prostu zdefiniować strony w WordPress, które mogą wyświetlać akcje Symfony2. Zatem same działania mogą wyświetlać i przetwarzać formularze (które powinny działać niezależnie od WordPressa pod adresem http://example.com/app.php/signup), ale powinny być zwykle wyświetlane w witrynie WordPress (na przykład na stronie takiej jak http://example.com/index.php?page_id=2 lub permalink).
Badałem LowPress jako sposób na integrację (http://www.lowpress.com/), ale robi to znacznie więcej niż chcę, usuwając całkowicie motywy WordPress i zastępując je motywami Twig. Próbowałem pożyczyć kilka pomysłów od niego, więc teraz mam WordPress w folderze web
projektu Symfony i to w moim 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
Więc wszystko co mam teraz jest wspólną config DB poprzez parameters.ini
w Symfony. Następnie próbuję stworzyć prostą wtyczkę, która używa shortcode, dzięki czemu mogę renderować akcję Symfony2 na stronie WordPress. Oto co mam do tej pory jako idea (jest to zależne od powyższego ładowania początkowego i jest niekompletna):
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'));
Mój pierwszy problem jest nie wiem jak faktycznie czynią niektóre trasy Symfony2, które mogą mieć parametry, gdy podane $request
nie będą mieć potrzebnych informacji. Innym problemem jest to, że jeśli chcę formularze do przesłania, prawdopodobnie nie będzie działać, ponieważ przekieruje użytkownika poza WordPress, gdy naprawdę mogę potrzebować serii formularzy, które wszystkie istnieją na stronie WordPress. Jednocześnie chcę, aby formularze były niezależne od WordPress, aby działały same.
Więc chcę wiedzieć, czy to po prostu zły/hacky pomysł, który nie zadziała, lub jeśli jest jakiś sposób, aby to działało.
Myślałem także o użyciu AJAX do załadowania kodu Symfony2 w WordPress (zakładając, że wszyscy moi użytkownicy mają włączoną obsługę Javascript). W przypadku awarii strona mogłaby po prostu przejść do aplikacji tylko dla Symfony2, a nie do strony WordPress. Czy byłoby lepiej/łatwiej? Jedyną wadą, jaką widzę, jest to, że muszę przechowywać kod ajax zsynchronizowany z moim kodem Symfony2.
Czy rozważałeś użycie iframe do włączenia aplikacji symfony2 do wordpress? skoro jest to tylko garść formularzy, możesz to zrobić? –
Myślałem, że będę musiał jechać tą trasą – Matt