7

いろいろ調べて試してみたのですが、ちょっと困っています。

WordPress でサイトをセットアップしたいのですが、これは私と一緒に働いている別の人に役立ちます。このサイトは、当社の製品を宣伝し、情報を提供します。その後、ユーザーは一連のフォームからサインアップできます。このカスタム パーツ (フォームなど) を Symfony2 で記述したいのは、WordPress に関連付ける必要がなく、ユーザーがサインアップした後にデータを表示するための再利用可能な Doctrine2 エンティティがあるためです (表示はとにかく WordPress の外部で行われます)。 )。

しかし、デザインに関しては、プロセス全体が中断されず、同じルック アンド フィールを持つことを望んでいます。そのため、フォームは実際には WordPress ページでレンダリングする必要があります。私たちはカスタムの非フリー テーマを使用しており、大量の WordPress CSS とヘッダーを Symfony ビューにコピー アンド ペーストするのは嫌いです。

理想的には、Symfony2 アクションをレンダリングできる WordPress のページを定義したいだけです。したがって、アクション自体がフォームを表示および処理する可能性があります (WordPress とは独立して動作する必要があります)。http://example.com/index.php?page_id=2またはパーマリンク)。

私は統合する方法として LowPress を研究してきました (http://www.lowpress.com/) が、WordPress テーマを完全に削除して Twig テーマに置き換えることで、私が望む以上のことができます。私はそれからいくつかのアイデアを借りようとしたので、今webでは Symfony プロジェクトのフォルダーに WordPress があり、これは私の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

だから私が今持っているのは、parameters.iniSymfony を介した共有 DB 構成だけです。次に、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'));

$request私の最初の問題は、与えられたものが必要な情報を持っていない場合に、パラメーターを持つ可能性のある Symfony2 ルートを実際にレンダリングする方法がわからないことです。もう1つの問題は、フォームを送信したい場合、WordPressページにすべて存在する一連のフォームが本当に必要な場合に、WordPressの外部にユーザーをリダイレクトするため、おそらく機能しないことです. 同時に、フォームを WordPress から独立させて、単独で動作するようにしたいと考えています。

だから私は、これがうまくいかない悪い/ハッキーなアイデアなのか、それともうまくいく方法があるのか​​ 知りたい.

また、AJAX を使用して WordPress に Symfony2 コードをロードすることも考えていました (すべてのユーザーが Javascript を有効にしていると仮定します)。フォールバックとして、ページは WordPress ページ内ではなく、Symfony2 専用アプリに移動することができます。それはより良い/より簡単でしょうか?私が見ることができる唯一の欠点は、ajax コードを Symfony2 コードと同期させなければならないことです。

4

2 に答える 2

3

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

また、Silexを見てください。これは、Symfonyよりもオーバーヘッドが低く、Symfonyフォームで機能します。

  1. Symfony2またはSilexをインストールします
  2. WordPressファイルをweb/フォルダーに配置します
  3. wp-config.phpは、composer.jsonの隣に1つのフォルダーを配置できます。これは、とにかくセキュリティに優れています。
  4. SymfonyまたはSilexのフロントコントローラーをサブフォルダー(おそらくsignup /という名前の場合)に移動します
  5. フロントコントローラーの上部にあるrequire/includeパスを修正します
  6. フロントコントローラーの上部に行を追加して、親フォルダーからwp-load.phpを含めます-このファイルはWordPressを起動し、すべてのWordPress機能を利用できるようにします-グローバルスコープから含める必要があることに注意してください関数の中から
  7. WordPressメソッドget_header();を呼び出し、get_footer();フロントコントローラーのSymfonyまたはSilexコードの上と下を呼び出します。Silexではそれは真上と真下です$app->run();

ファイル構造は次のようになります。

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

この投稿に触発されました。

于 2013-01-24T12:24:59.293 に答える
0

Symfony 2 では、フレームワーク全体を使用せずに、フレームワークの一部を使用できます。

ここにあるように、フォームは取り外し可能なコンポーネントです。

http://symfony.com/components

悲しいことに、まだ多くのドキュメントがないため、自分で発見する必要があります...

編集: 同じことがルーティングなどにも当てはまります。symfony ルーティングを使用してパス/実行することを認識できるようにしたい場合は、HttpFoundation コンポーネントと、明らかにルーティングを含める必要があります。

于 2012-08-22T07:25:24.597 に答える