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.
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ẽ? –
Tôi đã nghĩ rằng tôi sẽ phải đi theo con đường đó – Matt