2012-06-01 9 views
7

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.

+0

Czy rozważałeś użycie iframe do włączenia aplikacji symfony2 do wordpress? skoro jest to tylko garść formularzy, możesz to zrobić? –

+0

Myślałem, że będę musiał jechać tą trasą – Matt

Odpowiedz

0

Symfony 2 umożliwia korzystanie z części szkieletu bez użycia całości.

Formularz jest elementem, który jest zdejmowany, jak można znaleźć tutaj:

http://symfony.com/components

niestety, nie ma jeszcze dużo dokumentacji, więc trzeba by odkryć to sam ...

edit: to samo wraz z routingu itp jeśli chcesz być w stanie korzystać z routing symfony rozpoznać ścieżki/rzeczy do zrobienia, że ​​musi zawierać komponent HttpFoundation i oczywiście routing.

+0

Zaakceptowanie tego jako prawdopodobnie najlepszego rozwiązania. Zupełnie zrezygnowałem z powyższego pomysłu, ponieważ nie sądzę, że i tak będę musiał to zrobić. Jedyne, czego potrzebuję, to strona docelowa/informacyjna WordPress, w której użytkownicy klikają łącze, aby rozpocząć proces rejestracji zasilany przez Symfony lub uzyskać dostęp do panelu użytkownika Symfony. – Matt

+0

dziękuję, w każdym razie, jeśli masz trochę wolnego czasu, spróbuj sprawdzić komponenty sf2, większość z nich jest dość łatwa do zrozumienia (oczywiście nie do opanowania) i może dostarczyć bardzo potężnych narzędzi rozwijających się – Stormsson

+0

Używam Sf2 jako ramy, ale tak, komponenty są ładne (zrobiłem mały projekt klasy w Silex, który był całkiem fajny). – Matt

3

Ponieważ nie chcesz "... po prostu skopiuj i wklej kilka CSS WordPress i nagłówków w widoki Symfony", proponuję programowo nagłówek i stopkę WordPressa do wszystkich widoków Symfony.

Zobacz także Silex, ponieważ ma mniejszy narzut niż Symfony i współpracuje z formularzami Symfony.

  1. Install Symfony2 lub Silex
  2. umieścić pliki WordPress w swojej internetowej/folderu
  3. wp-config.php mogą żyć jeden folder w górę obok composer.json, which is better for security anyway
  4. Najedź Symfony, lub Silex, kontrolery frontowe/s do podfolderu, prawdopodobnie nazwane rejestracją/w twoim przypadku
  5. Napraw ścieżki wymagające/dołączane u góry kontrolera frontowego/s
  6. Dodaj linię u góry przedniego kontroler/s do włączenia wp- load.php z folderu nadrzędnego - ten plik uruchamia program WordPress i udostępnia wszystkie funkcje WordPressa - należy pamiętać, że musi on być dołączony do globalnego zasięgu, a nie od wewnątrz funkcji. Wywołaj metody WordPress: get_header(); i get_footer(); i poniżej Symfony lub Silex, kod w twoim kontrolerze/frontach. W Silex to tuż powyżej i poniżej $app->run();

strukturę pliku powinna wyglądać tak:

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

Zainspirowany tym post.