it-swarm-vi.com

Làm cách nào để phát hiện URL hiện tại?

Tôi muốn thêm một lớp cơ thể trong D6 nếu bạn đang ở (các) trang cụ thể hiện tại trong template.php Tôi có:

if url('the/path') {
 add the body class...
}

nhưng chức năng đó dường như không hoạt động đối với tôi.

10
hollywood3224

Bạn nên sử dụng đoạn mã sau, vì url() trả về URL cho đường dẫn được truyền dưới dạng đối số; do đó, nó trả về một giá trị mà câu lệnh IF sẽ xem xét tương đương với TRUE (trừ trường hợp chuỗi là "0" hoặc là một chuỗi rỗng).

if ($_GET['q'] == 'the/internal/Drupal/path') {
  // Do stuff
}
6
Dave Reid

Bí danh của Drupal là những gì bạn đang tìm kiếm

<?php
$path = drupal_get_path_alias($_GET['q']);
if ($path == 'the/path') {
  // do stuff
}
?>

Những người khác dưới đây:

URL đầy đủ

<?php
global $base_root;
$base_root . request_uri()
?>

URL "Nội bộ" của Drupal

<?php
$arg = arg();
// Path of 'node/234' -> $arg[0] == 'node' && $arg[1] == 234
?>
12
mikeytown2

Drupal 7

// Retrieve an array which contains the path pieces.
$path_args = arg();

// Check if the current page is admin.
if (arg(0) == 'admin') {
  // This is wrong even in D7. path_is_admin() should be used instead.
}

// Conditionally add css or js in certain page.
function mymodule_page_build(&$page) {
  if (arg(0) == 'sth' && arg(1) == 'else') {
    drupal_add_css(drupal_get_path('module', 'mymodule') . '/css/my.css');
  }
}

// Load the current node.
if (arg(0) == 'node' && is_numeric(arg(1))) {
  // This is wrong even in D7. menu_get_object() should be used instead.
}

Drupal 8 (thủ tục)

// Retrieve an array which contains the path pieces.
$path_args = explode('/', current_path());

// Check if the current page is admin.
if (\Drupal::service('router.admin_context')->isAdminRoute(\Drupal::routeMatch()->getRouteObject())) {
}

// Conditionally add css or js in certain page.
function mymodule_page_build(&$page) {
  if (\Drupal::routeMatch()->getRouteName() == 'my.route') {
    $page['#attached']['css'][] = drupal_get_path('module', 'mymodule') . '/css/my.css';
  }
}

// Load the current node.
$node = \Drupal::routeMatch()->getParameter('node');
if ($node) {
}

Drupal 8 (OOP)

use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\Routing\AdminContext;
use Drupal\Core\Routing\RouteMatchInterface;
class myClass {
  public function __construct(Request $request, AdminContext $admin_context, RouteMatchInterface $route_match) {
    $this->request = $request;
    $this->adminContext = $admin_context;
    $this->routeMatch = $route_match;
  }

  public function test() {
    // This might change in https://drupal.org/node/2239009
    $current_path = $this->request->attributes->get('_system_path');
    // Retrieve an array which contains the path pieces.
    $path_args = explode('/', $current_path);

    // Check if the current page is admin.
    if ($this->adminContext->isAdminRoute($this->routeMatch->getRouteObject())) {
    }

    // Load the current node.
    $node = $this->routeMatch->getParameter('node');
    if ($node) {
    }
  }
}

Nguồn: arg () không được dùng nữa và sẽ bị xóa tại Drupal.org

4
kenorb
2
Kevin

Bạn sẽ muốn sử dụng hàm arg (). Bạn có thể sử dụng nó theo một trong hai cách,

$args = arg();

Về cơ bản sẽ cung cấp cho bạn một mảng với mỗi đối số url là một giá trị khác hoặc bạn có thể kiểm tra các đối số cụ thể như vậy:

$arg = arg(0);

Vì vậy, ví dụ của bạn, bạn có thể làm:

if(!is_null(arg(1)) && arg(0) == 'the' && arg(1) == 'path') { Do something  }

hoặc tôi muốn giới thiệu điều này:

$args = arg();
if(!empty($args[1]) && $args[0] == 'the' && $args[1] == 'path') { Do something  }
2
Mike L.

Nếu bạn không muốn có một mẫu trang khác cho các trang có URL cụ thể, bạn có thể kiểm tra URL hiện tại bằng mã sau.

if (arg(0) == 'the' && arg(1) == 'path') {
  // Add the extra CSS class.
}

rl () không phải là hàm trả về URL của trang hiện tại; nếu bạn gọi url() mà không cung cấp bất kỳ tham số nào, bạn sẽ nhận được (ít nhất là trên Drupal 7 và không có bất kỳ mô-đun nào triển khai hook_ulr_outbound_alter()) URL cơ sở của cài đặt Drupal.
[.__.] Gọi url('the/path') sẽ trả về cho bạn "the/path", nếu không có mô-đun nào thay đổi giá trị được trả về từ hàm; điều đó có nghĩa là mã bạn đã hiển thị sẽ luôn được thực thi và lớp CSS luôn được thêm vào.

1
kiamlaluno

Drupal 8:

arg () thay thế vì nó không còn hoạt động:

$path_args = explode('/', current_path());
print $path_args[1];

Đọc thêm: https://www.drupal.org/node/2274705

0
Pouya Sanooei

Nếu bạn đang tìm kiếm đường dẫn chính tắc mà Drupal đang phục vụ yêu cầu, bạn có thể nhấn $ _GET ['q'], dịch này sẽ dịch ngay cả khi Drupal sử dụng URL sạch.

0
user556