Làm cách nào để cung cấp các đối số URL dưới dạng mã thông báo trong phần Viết lại kết quả của một trường trong Chế độ xem?


7

Có thể tạo các đối số URL, vd

http://mysite.com/arg1/arg2/arg3

có sẵn dưới dạng mã thông báo trong cài đặt kết quả viết lại cho một trường trong chế độ xem, ví dụ như ở trên, các mã này sẽ có sẵn để sử dụng (trong số các mã thông báo hiện có khác) như:

[arg1] [arg2] [arg3]

Lý lịch

Tôi đang phát triển Chế độ xem bằng cách sử dụng bản đồ OpenLayers với các mục được lọc đặt trong lớp phủ trên chúng. Khi người dùng tương tác với bản đồ để xóa các mục, tôi muốn giữ lại vị trí của bản đồ (không được hoàn nguyên về thu phóng và vị trí mặc định) khi trang tải lại. Bằng cách có thể truy cập các đối số URL tức là kinh độ và vĩ độ, sau đó tôi có thể viết lại URL bộ lọc để chúng được gửi trở lại trang.

Nhưng tôi chắc chắn có những kịch bản khác không sử dụng bản đồ mà mọi người sẽ tìm thấy câu trả lời cho câu hỏi hữu ích cho.

Câu trả lời:


6

Nếu bạn không thực sự muốn sử dụng bộ lọc theo ngữ cảnh, bạn có thể sử dụng bộ lọc theo ngữ cảnh "Toàn cầu: Không", sử dụng các tùy chọn Bộ lọc theo ngữ cảnh để gán giá trị từ vị trí đối số mà bạn quan tâm và sau đó sẽ có sẵn dưới dạng% 1 /! 1 mã thông báo thay thế mà không thực sự ảnh hưởng đến truy vấn.


4

Nếu arg2arg3là, hoặc có thể là các đối số / bộ lọc theo ngữ cảnh trong Chế độ xem trong câu hỏi, bạn sẽ có thể sử dụng !1!2viết lại.

Tôi đang bỏ qua arg1vì điều đó thực sự không thể dễ dàng năng động.

THÊM VÀO:

Đây có thể là một trường hợp khác giả sử D7 của tôi đã không loại bỏ các tính năng D6, nhưng lấy màn hình nhanh ở đây (tôi không có tiện ích kiểm tra D7 ngay lúc này, xin lỗi) cho thấy đây là một phần của việc viết lại khi đối số là hiện tại:

nhập mô tả hình ảnh ở đây

Đây là một Chế độ xem nhanh với hai đối số, một nút nid và loại và khi tôi viết lại trường này (tiêu đề), tôi có thể đặt vào Hello [title] where nid is !1 and type is !2và nó hoạt động.

BỔ SUNG 2ND:

Mặc dù câu trả lời này không còn có giá trị đối với vấn đề hiện tại (xem các bình luận đầy đủ về cả hai câu trả lời), @Molot đã xác nhận rằng các mẫu thay thế này có sẵn trong D7:

nhập mô tả hình ảnh ở đây

Vì vậy, có lẽ điều này và câu trả lời của anh ấy sẽ giúp người khác nhìn ra ngoài đó.


Jimajamma, ví dụ, tôi sẽ đặt! 2 hoặc [! 2] trực tiếp vào hộp văn bản để 'viết lại trường này' - như trong: i44.tinypic.com/4rrgy0.png - điều này dường như không hoạt động, như ảnh chụp màn hình này hiển thị -! 2 hoặc [! 2] là đầu ra. Nhân tiện, tôi (nhất thiết) đang sử dụng tổng hợp nên không biết điều này có gây nhiễu hay không - xem ảnh chụp màn hình: i44.tinypic.com/2vmc84m.png Lý do tổng hợp tại đây: drupal.stackexchange.com/a/79064/1082 (cảm ơn cho đầu vào của bạn cho đến nay Jimajamma)
trị liệu

Tôi chưa bao giờ thấy ký hiệu! 2 hoặc! 3 trước đây như là các thẻ trong kết quả viết lại cho một lượt xem, tôi phải thừa nhận mặc dù tôi hy vọng nó hoạt động với một số lời khuyên về việc tôi sẽ sai khi sử dụng nó như bình luận cuối cùng.
trị liệu

3
i.stack.imgur.com/e5X2y.png - ảnh chụp màn hình từ D7 - hoạt động. NID là bộ lọc theo ngữ cảnh ở đó
Mołot

Cảm ơn Mołot (+1) và Jimajamma - điều này hiện đã bắt đầu xuất hiện và tôi sẽ thử nghiệm thêm để xác nhận - Tôi nghĩ rằng một cái gì đó hơi 'flakey' với thiết lập của tôi vì những điều này không hiển thị trước đây. Nếu mọi thứ đều ổn, tôi muốn chấp nhận câu trả lời của Jimajamma (cảm ơn Mołot - Tôi sẽ nâng cấp tất cả các bài đăng của bạn, khi tôi quay lại để xác nhận ...)
trị liệu

1
Ah. Vâng cho tất cả chúng ta biết nếu chúng ta có thể có một cú đánh khác vào nó. Nếu nó là một cái gì đó giống như www.yourhost.com/some/path#latlongsự #latlonglà trong thực tế được gửi đến phụ trợ, đó là một thẻ neo, nó sẽ chỉ được về cơ bản bỏ qua nếu nó không tồn tại trên máy chủ (nhưng chắc chắn nó có thể được nhìn thấy bằng drupal). Chúc mừng!
Jimajamma

3

Giả sử các đối số bạn muốn sử dụng không phải là đối số xem hoặc bộ lọc theo ngữ cảnh, nếu bạn muốn làm mã thông báo, về cơ bản bạn cần tạo một mô-đun thực hiện hook_tokens ()hook_token_info () , như được mô tả trong API . Tôi không nghĩ ai đã làm điều đó cả.

Đây là cách tôi làm:

function yourmodule_token_info() {
  $type = array(
    'name' => t('GET'),
    'description' => t('Tokens related to $_GET superglobal.'),
  );
  $tokens = array();
  foreach($_GET as $key => $val) { //discard $val now
    $tokens[$key] = array(
      'name' => $key,
      'description' => "\$_GET['$key']",
    );
  }
  return array(
    'types' => array('get' => $type),
    'tokens' => array('get' => $tokens),
  );
}

function yourmodule_tokens($type, $tokens, array $data = array(), array $options = array()) {
  if($type == 'get') {
    $replacements = array();
    foreach ($tokens as $name => $original) {
        $replacements[$original] = (string)$_GET[$name];
    }
    return $replacements;
  }
}

Tất nhiên mã ở trên không sẵn sàng sản xuất , nó bỏ qua xử lý loại thích hợp, các vấn đề bảo mật và như vậy. Điều này có nghĩa là giúp bạn đi đúng hướng, nhưng bạn cần phải áp dụng sự tỉnh táo của mình trước khi triển khai nó. Tôi không chịu trách nhiệm cho việc lạm dụng. Đọc về lý do nó đã bị xóa ngay từ đầu trước khi bạn quyết định thêm lại và cẩn thận chỉ khôi phục những gì bạn thực sự cần.

Nếu bạn muốn các tham số có thể arg()thay thế bằng thay vì $ _GET, tất nhiên trong hook_tokens lặp lại chúng với while:

function yourmodule_tokens($type, $tokens, array $data = array(), array $options = array()) {
  if($type == 'arg') {
    $replacements = array();
    $i = 0;
    while ( NULL !== ($arg = arg($i))) {
        $replacements["arg:$i"] = (string)$arg;
    }
    return $replacements;
  }
}

Thay đổi cho yourmodule_token_info()phù hợp.


+1 cảm ơn bạn rất nhiều @ Mołot Vì vậy, tính năng này đã được xem xét cho lượt xem bởi các nhà phát triển có liên quan, trong quá khứ và quyết định chống lại? Có khả năng tôi sẽ chấp nhận câu trả lời của bạn, tôi sẽ cung cấp mã bạn đã thử.
trị liệu

@therobyoukn token từ $ _GET rất tốn kém và gây rối với bộ nhớ cache, afaik. Và xem câu trả lời cập nhật của tôi trước khi bạn thử.
Mołot

1
nếu arg2 và arg3 thực sự là đối số hoặc bộ lọc theo ngữ cảnh cho Chế độ xem trong câu hỏi, bạn sẽ có thể chỉ sử dụng !2, !3trong phần viết lại (Tôi bỏ qua arg1 vì điều đó thực sự không thể dễ dàng động)
Jimajamma

1
@therobyouledge i.stack.imgur.com/e5X2y.png D7 cũng hỗ trợ điều này, chỉ cần thử nghiệm nó. Tại sao nó không làm việc cho bạn. Câu trả lời của Jimajamma là OK nếu các đối số nằm trong các bộ lọc theo ngữ cảnh. Ít nhất là làm việc cho tôi. (LOL đang chiến đấu chống lại câu trả lời của tôi được chấp nhận)
Mołot

1
@therobyouledge KHÔNG SERIAL UPVOTE ME! Và thành thật mà nói, upvote trên bài đăng này kiếm được gấp 2 lần so với chấp nhận, vì vậy không cần phải lo lắng;) Sau tất cả, tôi đã yêu cầu Jimajamma đăng bình luận của mình như một câu trả lời, phải không? Và tôi đã chiến đấu để chứng minh cách của anh ấy dễ dàng hơn: P Vì vậy, rõ ràng tôi không ngại bài đăng của anh ấy được chấp nhận.
Mołot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.