2012-06-01 20 views
7

Tôi đã nghiên cứu nó rất nhiều và thử nó ra nhưng tôi là loại stumped.Làm thế nào để nhúng các hành động Symfony2 vào WordPress?

Tôi muốn thiết lập trang web trong WordPress, điều này rất hữu ích cho một người khác làm việc với tôi. Trang web sẽ quảng cáo sản phẩm của chúng tôi và cung cấp thông tin. Sau đó, người dùng có thể đăng ký thông qua một loạt các biểu mẫu. Tôi muốn viết phần tùy chỉnh này (các biểu mẫu, vv) trong Symfony2 vì nó không cần phải gắn với WordPress, và nó sẽ có các thực thể Doctrine2 có thể tái sử dụng để hiển thị dữ liệu sau khi người dùng đã đăng ký (hiển thị xảy ra bên ngoài WordPress anyway).

Tuy nhiên, thiết kế khôn ngoan, chúng tôi muốn toàn bộ quá trình không bị gián đoạn và có cùng giao diện. Vì vậy, các biểu mẫu sẽ thực sự được hiển thị trong các trang WordPress. Chúng tôi đang sử dụng một chủ đề tùy chỉnh, không miễn phí và tôi ghét phải sao chép một loạt các WordPress CSS và các tiêu đề vào các khung nhìn Symfony.

Lý tưởng nhất, tôi muốn chỉ xác định các trang trong WordPress có thể hiển thị các hành động của Symfony2. Vì vậy, các hành động có thể hiển thị và xử lý biểu mẫu (hoạt động độc lập với WordPress theo số http://example.com/app.php/signup), nhưng chúng thường được hiển thị trong trang WordPress (ví dụ: trong một trang như http://example.com/index.php?page_id=2 hoặc liên kết cố định).

Tôi đã nghiên cứu LowPress như một cách để tích hợp (http://www.lowpress.com/), nhưng nó có nhiều cách hơn tôi muốn bằng cách xóa các chủ đề WordPress hoàn toàn và thay thế chúng bằng các chủ đề Twig. Tôi cố gắng để mượn một vài ý tưởng từ nó, vì vậy bây giờ tôi có WordPress trong thư mục web của dự án Symfony và điều này trong tôi 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 

Vì vậy, tất cả những gì đã có bây giờ là một DB cấu ​​hình chia sẻ qua parameters.ini trong Symfony. Tiếp theo, tôi đã cố gắng tạo một plugin đơn giản, sử dụng một shortcode để tôi có thể render một hành động Symfony2 trong một trang WordPress. Dưới đây là những gì tôi có cho đến nay là một ý tưởng (đó là phụ thuộc vào bootstrapping trên và nó không đầy đủ):

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

vấn đề đầu tiên của tôi là tôi không biết làm thế nào để thực sự làm cho một số tuyến đường Symfony2, có thể có các thông số, khi $request nhất định sẽ không có thông tin tôi cần. Vấn đề khác là, nếu tôi muốn các biểu mẫu để gửi, nó có thể sẽ không hoạt động vì nó sẽ chuyển hướng người dùng bên ngoài WordPress, khi thực sự tôi có thể muốn một loạt các hình thức mà tất cả tồn tại trong trang WordPress. Đồng thời, tôi muốn các biểu mẫu độc lập với WordPress để họ tự làm việc.

Vì vậy, tôi muốn biết nếu điều này chỉ là một ý tưởng xấu/hacky sẽ không hoạt động, hoặc nếu có một số cách để làm cho nó hoạt động.

Tôi cũng đã nghĩ đến việc chỉ sử dụng AJAX để tải mã Symfony2 trong WordPress (giả sử rằng tất cả người dùng của tôi đã bật Javascript). Là một dự phòng, trang chỉ có thể đi đến một ứng dụng Symfony2 chỉ thay vì nằm trong một trang WordPress. Điều đó có tốt hơn/dễ hơn không? Nhược điểm duy nhất tôi có thể thấy là tôi phải giữ mã ajax đồng bộ với mã Symfony2 của mình.

+0

bạn có cân nhắc sử dụng khung nội tuyến để bao gồm ứng dụng symfony2 bên trong wordpress không? kể từ khi nó chỉ là một loạt các hình thức, bạn có thể làm điều đó có lẽ? –

+0

Tôi đã nghĩ rằng tôi sẽ phải đi theo con đường đó – Matt

Trả lời

0

Symfony 2 cho phép sử dụng các phần của khung mà không cần sử dụng toàn bộ khung.

Các hình thức là một thành phần có thể tháo rời LÀ, như bạn có thể tìm thấy ở đây:

http://symfony.com/components

buồn thay, không có nhiều tài liệu nào, do đó bạn sẽ phải khám phá nó bằng chính mình ...

chỉnh sửa: cùng với định tuyến, v.v. nếu bạn muốn sử dụng định tuyến symfony để nhận biết đường dẫn/điều cần làm, bạn phải bao gồm thành phần HttpFoundation, và rõ ràng là định tuyến.

+0

Chấp nhận điều này vì đây có lẽ là giải pháp tốt nhất. Tôi đã từ bỏ khá nhiều ý tưởng ở trên vì tôi không nghĩ rằng tôi sẽ cần phải làm theo cách đó. Tất cả những gì tôi thực sự cần là trang đích/thông tin WordPress trong đó người dùng nhấp vào liên kết để bắt đầu quá trình đăng ký được hỗ trợ Symfony hoặc truy cập vào bảng điều khiển người dùng Symfony. – Matt

+0

cảm ơn bạn, dù sao, nếu bạn có thời gian rảnh, hãy thử kiểm tra các thành phần sf2, hầu hết trong số chúng khá dễ hiểu (rõ ràng là không thành thạo) và có thể cung cấp các công cụ phát triển rất mạnh – Stormsson

+0

Tôi đang sử dụng Sf2 như một khuôn khổ, nhưng yeah, các thành phần được tốt đẹp (Tôi đã thực hiện một dự án lớp nhỏ trong Silex mà là khá mát mẻ). – Matt

3

Vì bạn không muốn ".. sao chép-dán một loạt các CSS và tiêu đề vào giao diện Symfony", tôi đề nghị bạn nhúng đầu trang và chân trang WordPress cho tất cả các chế độ xem Symfony theo chương trình.

Ngoài ra, hãy xem Silex vì điều này có chi phí thấp hơn Symfony và làm việc với các biểu mẫu Symfony.

  1. Install Symfony2, hoặc silex
  2. Đặt các tập tin WordPress trong web của bạn/thư mục
  3. wp-config.php có thể sống một thư mục lên bên cạnh composer.json, which is better for security anyway
  4. Di chuyển Symfony bạn, hoặc Silex, bộ điều khiển mặt trước/s vào thư mục con, có thể có tên là đăng ký/trong trường hợp của bạn
  5. Khắc phục đường dẫn yêu cầu/bao gồm ở đầu bộ điều khiển phía trước của bạn/s
  6. Thêm dòng ở đầu mặt trước của bạn bộ điều khiển/s để bao gồm wp- load.php từ thư mục mẹ - tệp này kích hoạt WordPress và làm cho tất cả các chức năng WordPress có sẵn cho bạn - lưu ý rằng nó phải được bao gồm trong phạm vi toàn cục không phải từ bên trong hàm
  7. Gọi các phương thức WordPress get_header();get_footer(); phía trên và bên dưới Symfony, hoặc Silex, mã trong bộ điều khiển phía trước của bạn. Trong silex đó chỉ là trên và dưới $app->run();

cấu trúc tập tin của bạn sẽ trông như thế này:

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

Lấy cảm hứng từ post này.

Các vấn đề liên quan