2011-01-26 26 views
7

Tôi có một mô-đun tùy chỉnh triển khai móc nodeapi để thực thi một số mã khi nút được tạo hoặc cập nhật.Drupal: Làm cách nào để tạo một bí danh URL có lập trình cho một nút đã có bí danh khi lưu nút?

Về cơ bản tôi muốn tạo bí danh dựa trên bí danh được tạo tự động trên nút lưu hoặc cập nhật.

Hiện tại tôi đang sử dụng lệnh gọi path_set_alias và tôi chỉ muốn thực hiện việc này với một loại nội dung cụ thể, "sản phẩm".

Đây là cuộc gọi nodeapi của tôi để cho tôi bắt đầu

function product_url_helper_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 

if($node->type == 'product'){ 
    switch($op){ 

    case 'insert': 
     _create_alternate_url($node); 

    break; 

    case 'update': 
     _create_alternate_url($node); 
    break; 

    case 'view': 
     //do nothing 
    break; 

    default: 
    break; 

    } 
} 

return; 
} 

Sau đó, tôi có chức năng này, là tôi đang cố gắng để có được lưu bí danh URL thứ hai của tôi đối với tôi.

function _create_alternate_url($node){ 
$aliasExists = db_fetch_object(db_query("SELECT count(dst) as total FROM {url_alias} WHERE dst = 'alternate/".$node->path."'")); 
if($aliasExists->total == 0){ 

    $product_url = $node->path; 
$alternate_url = "alt/" . $node->path; 
$default_node_path = "node/" . $node->nid; 

    path_set_alias($default_node_path, $alternate_url, 0, ''); 

    drupal_set_message("Created Alternate path for Product: " . $node->title . " <br/> Path <a href='/" . $default_node_path ."'>" . $default_node_path . "</a> is now aliased by <a href='/" . $alternate_url . "'>". $alternate_url ."</a>"); 
} 

Điều này không đặt bí danh mặc dù nó chỉ tạo một bản sao của bí danh ban đầu của sản phẩm. Vì vậy, nếu tôi bắt đầu với sản phẩm của tôi là "Green Fern". Tôi sẽ lưu nó, và nó sẽ sử dụng pathauto để tạo ra sản phẩm/green-fern sau đó sau khi gọi mã mô-đun của tôi và tạo bí danh "alt/products/green-fern" và vẫn làm cho nó trở lại đường dẫn "node/nid" .

Tuy nhiên, khi tôi chạy mã này, một bản sao trong cơ sở dữ liệu được tạo. Vì vậy, tôi lưu Green Fern một lần và đột nhiên tôi thấy hai bản ghi trùng lặp ở cuối url_alias trong cơ sở dữ liệu. "products/green-fern" và "products/green-fern"

Tôi cảm thấy như tôi đang nghĩ về điều này theo một cách quá phức tạp. Khách hàng của tôi là nhận thức của SEO hit họ nhận được khi thực hiện nhiều hơn một điểm bí danh cho cùng một nút, họ chỉ muốn nó để làm điều này. Halp!

Trả lời

0

Bạn đang đặt pid thành 0 trong mã. Tôi sẽ tưởng tượng rằng nút thứ hai mà mã này chạy cho sẽ trả về một lỗi. Hãy thử thay đổi 0 thành NULL trong cuộc gọi path_set_alias() của bạn.

1

Khó khăn để biết mức độ phức tạp của các bí danh, nhưng mô-đun pathauto có vẻ như là giải pháp đơn giản cho vấn đề của bạn. Nó cho phép bạn tạo các bí danh tự động dựa trên các thẻ.

Là phần thưởng, nó phù hợp với mô-đun path_redirect, sẽ đặt 303 chuyển hướng (hoặc bất kỳ chuyển hướng nào bạn muốn) trên các bí danh trùng lặp. Điều này sẽ giảm thiểu mối quan tâm SEO của bạn một chút.

Edit:

Bạn có siêu Duper chắc chắn rằng mã unredacted của bạn đang kêu gọi các chức năng một cách chính xác? Các phần liên quan của path_set_alias là:

if ($pid) { 
    // An existing alias. 
    // *** You set pid to 0, so this doesn't fire *** 
    } 
    else if ($path && $alias) { 
    // Check for existing aliases. 
    if ($alias == drupal_get_path_alias($path, $language)) { 
     // There is already such an alias, neutral or in this language. 
     // Update the alias based on alias; setting the language if not yet done. 
     db_query("UPDATE {url_alias} SET src = '%s', dst = '%s', language = '%s' WHERE dst = '%s'", $path, $alias, $language, $alias); 
    } 
    else { 
     // A new alias. Add it to the database. 
     // *** If your code is correct, this is the part that should fire. *** 
     db_query("INSERT INTO {url_alias} (src, dst, language) VALUES ('%s', '%s', '%s')", $path, $alias, $language); 
    } 
    } 

Nếu bạn đang làm việc trên một trang web thử nghiệm, bạn cũng có thể thử thả một số dpm() s ngay trước khi db_query s trong node.module để tìm ra những đoạn mã thực sự kích hoạt và dữ liệu nào sẽ đi vào chúng.

+0

Err, chỉ cần nhận thấy rằng bạn đã sử dụng pathauto - chỉnh sửa phản hồi của tôi ... – anschauung

5

JR, cải thiện mã của bạn trong Drupal7, db_querys rất tốn kém.Cách tốt hơn có thể được sử dụng chức năng lookup_path drupal:

$urlAlias = drupal_lookup_path('alias',"node/".$node->nid . '/prices'); 

nếu urlAlias ​​không có giá trị, thì không có bí danh cho url này, vì vậy chúng ta có thể an toàn tạo ra nó:

if(urlAlias == '') 
path_set_alias($default_node_path, $alternate_url, 0, ''); 
+7

bằng cách này, trong drupal7 chúng ta nên thay đổi path_set_alias bằng path_save ($ args = array ("source" => $ non_alias_path, " bí danh "=> $ new_aliased_url);) –

2

Pathauto là phát hiện các bí danh trùng lặp cho nút và ghi đè tùy chỉnh với mẫu kiểu nội dung mặc định. Theo mặc định, pathauto sẽ tạo một bí danh mới và xóa một bí danh cũ khi thực hiện hành động cập nhật.

Nếu bạn chuyển tùy chọn Cập nhật hành động thành "Tạo bí danh mới. Để lại bí danh hiện tại hoạt động" trên màn hình quản trị, /admin/config/search/path/settings, nó sẽ không ghi đè bí danh tùy chỉnh.

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