2012-06-01 12 views
7

我一直在研究它,並試用它,但我有點難住。如何將Symfony2動作嵌入WordPress?

我想在WordPress中設置一個站點,這對另一個和我一起工作的人很有幫助。該網站將宣傳我們的產品並提供信息。然後用戶可以通過一系列表單註冊。我想在Symfony2中編寫這個自定義部分(表單等),因爲它不需要綁定到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或固定鏈接等頁面中)。

我一直在研究LowPress作爲一種集成方式(http://www.lowpress.com/),但它的方式比我想要的要多,完全刪除WordPress主題並用Twig主題替換它們。我試圖從它借用一些想法,所以我現在的WordPress的Symfony的項目web文件夾,這在我的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.ini共享DB配置在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,以便他們自己工作。

所以我想知道這是否只是一個不好的/哈希的想法,這將無法正常工作,或者如果有一些方法來使它工作。

我也想過只是使用AJAX加載WordPress中的Symfony2代碼(假設我的所有用戶都啓用了Javascript)。作爲後備,該頁面可以轉到Symfony2專用應用程序,而不是在WordPress頁面中。這會更好/更容易嗎?我能看到的唯一缺點是我必須保持ajax代碼與我的Symfony2代碼同步。

+0

您是否考慮過使用iframe將symfony2應用程序包含在wordpress中?因爲它只是一堆形式,你可以這樣做嗎? –

+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視圖中。

另請參閱Silex,因爲它的開銷比Symfony低,並且可以與Symfony格式一起使用。

  1. 安裝Symfony2中,或Silex的
  2. 將在您的網頁/文件夾中的文件WordPress的
  3. 的wp-config.php文件最多可以住一個文件夾旁邊composer.json,which is better for security anyway
  4. 移動你的Symfony,或Silex,前控制器/ s到子文件夾,可能命名爲註冊/在您的情況下
  5. 修復要求/包括路徑在您的前控制器的頂部
  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 

post啓發。