2012-06-01 3 views
7

私はそれをたくさん研究して試してきましたが、私は困惑しています。Symfony2のアクションをWordPressに埋め込む方法は?

私はWordPressでサイトを設定したいと思っています。これは私と一緒に働く別の人に役立ちます。サイトは当社の製品を宣伝し、情報を提供します。その後、ユーザーは一連のフォームを通じてサインアップできます。私はWordPressに結びつける必要がなく、ユーザがサインアップした後にデータを表示するためにDoctrine2エンティティを再利用できるようにしています(WordPressの外でも表示されます) )。

しかし、設計上は、すべてのプロセスを中断せずに同じ外観と感じるようにしたいと思います。したがって、フォームは実際にはWordPressページでレンダリングする必要があります。私たちはカスタムの非フリーテーマを使用しています。私は、WordPressのCSSとヘッダーの束をSymfonyのビューにコピー&ペーストするだけでは大丈夫です。

理想的には、WordPressでSymfony2の動作を実現できるページを定義するのが理想です。したがって、アクション自体はフォームを表示して処理するかもしれませんが(ワードプレスとは独立してWordPressで動作するはずはhttp://example.com/app.php/signup)、通常WordPressサイト(例えばhttp://example.com/index.php?page_id=2やパーマリンクのようなページ内)に表示​​する必要があります。

私は(http://www.lowpress.com/)を統合する方法としてLowPressを研究してきましたが、WordPressのテーマをすべて削除し、Twigのテーマに置き換えることで、私が望む以上に多くのことができます。私wp-config.phpに私は、そこからいくつかのアイデアを借りてみましたので、今、私はsymfonyプロジェクトのwebフォルダ内のワードプレスを持っており、この:

// ...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 

だから私は今持っているすべての共有DBの設定ですparameters.ini経由Symfonyで。次に、ショートコードを使用する単純なプラグインを作成しようとしていますので、WordPressページでSymfony2アクションをレンダリングできます。ここで私は(それが上記のブートストラップに依存し、それは不完全だ)これまでのアイデアとして持っているものです。

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

私の最初の問題は、私が実際に持っているかもしれないいくつかのSymfony2のルートを、レンダリングする方法がわからないですパラメータ、与えられた$requestに必要な情報がない場合。もう一つの問題は、私がフォームを提出したいのであれば、ワードプレスの外にユーザーをリダイレクトするため、おそらくうまくいかず、WordPressページにすべてが存在する一連のフォームが必要な場合があります。同時に、私はフォームをWordPressに依存しないようにして、自分たちで作業します。

私は、これがうまくいかない悪い/ハッキーなアイデアか、それを動作させる方法があるかどうかを知りたいと思います。

私は、WordPressでSymfony2コードを読み込むためにAJAXを使用することも考えていました(すべてのユーザーがJavascriptを有効にしていることを前提としています)。フォールバックとして、ページはWordPressページ内にあるのではなく、単にSymfony2専用アプリに行くことができます。それはより良い/簡単だろうか?私が見ることができる唯一の欠点は、Symfony2コードと同期してajaxコードを保持する必要があることです。

+0

あなたはwordpressの中にsymfony2アプリケーションを含めるためにiframeの使用を検討しましたか?それはちょうど束のフォームから、あなたはおそらくそれを行うことができますか? –

+0

私はちょうどそのルートに行く必要があると思っていた – Matt

答えて

0

symfony 2では、フレームワークの一部を、全体を使わずに使用することができます。あなたがここに見つけることができるよう

フォームは、着脱可能なコンポーネントです:

http://symfony.com/components

は、悲しいことに、まだ多くのドキュメントがない、したがって、あなたは自分でそれを発見する必要があるだろう...など 同じルーティングと一緒に行く、 あなたが行うにはパス/物事を認識するためにsymfonyのルーティングを使用することができるようにしたい場合は、あなたがHttpFoundationコンポーネントを含める必要があるだろう、と明らかに:

編集ルーティング。

+0

これを受け入れることはおそらく最高の解決策です。とにかくそれをやる必要があるとは思わないので、私は上記のアイデアをあきらめました。私が本当に必要とするのは、WordPressの着陸/情報ページで、ユーザがリンクをクリックしてSymfonyの電源投入プロセスを開始したり、Symfonyユーザダッシュボードにアクセスすることです。 – Matt

+0

とにかく余裕があれば、sf2コンポーネントをチェックしてみてください。そのほとんどは理解しやすいです(明らかにマスターしないでください)。非常に強力な開発ツールを提供しています – Stormsson

+0

私はSf2をフレームワーク、しかし、ええ、コンポーネントは素晴らしいです(私はかなりクールだったSilexで小さなクラスのプロジェクトをやったことがあります)。 – Matt

3

WordPressのCSSとヘッダーを「コピー&ペースト」してSymfonyのビューに貼り付けるのではなく、WordPressヘッダーとフッターをすべてのSymfonyビューにプログラムで埋め込むことをお勧めします。

また、を見てください。これは、Symfonyよりもオーバーヘッドが低く、Symfonyフォームで動作するためです。あなたのSymfonyを移動

  1. は、あなたのWeb /フォルダ内のWordPressのファイルが
  2. のwp-config.phpを次のcomposer.jsonまで1つのフォルダを生きることができ入れwhich is better for security anyway
  3. をSymfony2の、またはサイレックス
  4. をインストールします。またはサイレックスあなたのケースでは、サブフォルダに、フロントコントローラ/ sの、おそらく名前のサインアップ/インクルードが/あなたのフロントコントローラの上部にパスを含める必要が
  5. 修正/ sが
  6. あなたの正面の上部に行を追加します。コントローラにwp-親フォルダのload.php - このファイルはWordPressを起動して、すべてのWordPress関数を利用できるようにします。関数内からではなく、グローバルスコープからインクルードする必要があります。
  7. WordPressメソッドget_header();およびget_footer();をsymfony、またはSilexの下で、あなたのフロントコントローラーのコードです。このpostに触発さ

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

    :サイレックスでは、それはあなたのファイル構造は次のようになります。ただ$app->run();

の上方と下方のです。

関連する問題