Làm thế nào để sửa đổi lập trình các lĩnh vực phân loại thuật ngữ?


7

Trong D7, làm cách nào để lập trình thêm / sửa đổi các trường thành các thuật ngữ phân loại? Chúng rõ ràng có thể thực hiện được và trong UI tôi có thể thêm và chỉnh sửa các trường trong chúng giống như tôi làm trong các nút nhưng nó được chứng minh là không có nhiệm vụ dễ dàng trong mã. Nói rằng tôi có một từ vựng tên là Fruit với các thuật ngữ như Táo và Chuối. Tôi đã thêm một trường vào tên được đặt tên main_article_id, vì vậy tất cả các thuật ngữ đều có Tên, Mô tả và Id Điều chính. Khi tôi tạo một nút có tên Táo có tham chiếu đến từ vựng Fruit ( field_fruit) và thuật ngữ Táo được chọn, mã sẽ cập nhật thuật ngữ Táo và đặt main_article_idtrường của nó thành $node->nid. Đây là mã của tôi:

//hook_node_insert fires after new node has been inserted into db
function MYMODULE_node_insert($node)
{
    $taxonomy_term_id = $node->field_FRUIT[LANGUAGE_NONE][0]['value'];
    $taxonomy_term = taxonomy_term_load($value['tid']);
    if($taxonomy_term != FALSE)
    {
        //doesn't work
        $taxonomy_term->field_main_article_id[LANGUAGE_NONE][0]['value'] = $node->nid;
        taxonomy_term_save($taxonomy_term);
    }
}

Câu trả lời:


9

Tên cột cho một trường không phải luôn luôn value; trong trường hợp tham chiếu thuật ngữ phân loại tid, và trong trường hợp tham chiếu nút / thực thể, nó phụ thuộc vào mô-đun bạn đang sử dụng.

Đối với trường được tạo bằng mô-đun Tham chiếu , tên là nidvà đối với trường được tạo bằng mô-đun Tham chiếu thực thể , thì đó là target_id.

Đoạn mã sau sẽ hoạt động tốt hơn một chút:

//hook_node_insert fires after new node has been inserted into db
function MYMODULE_node_insert($node)
{
    $taxonomy_term_id = $node->field_FRUIT[LANGUAGE_NONE][0]['tid'];

    // $value['tid'] isn't defined anywhere in this function scope so I 
    // assume you meant to use $taxonomy_term_id here
    $taxonomy_term = taxonomy_term_load($taxonomy_term_id);
    if($taxonomy_term != FALSE)
    {
        $column_name = 'nid'; // Or 'target_id' if you're using entity reference            

        $taxonomy_term->field_main_article_id[LANGUAGE_NONE][0][$column_name] = $node->nid;
        taxonomy_term_save($taxonomy_term);
    }
}

Bạn nói đúng $value['tid'], xin lỗi vì lỗi trong mã. Nhưng tôi không sử dụng bất kỳ mô-đun nào để tạo trường của mình. Tôi chỉ cần thêm nó thủ công trên trang Chỉnh sửa từ vựng. Tôi đã cố gắng nhìn vào taxonomy_term khi chỉnh sửa nó trong UI. Bên trong hook_taxonomy_term_presave ($ term) $ term nó trông như thế này trong print_r(): stdClass Object ([tid] => 20 [vid] => 6 [name] => Fruit ... [field_main_article_id] => Array ([und] => Mảng ([0] => Mảng ([giá trị] => 14)) )
Ari Linn

Gotcha, cái đó chắc chắn là 'value'sau đó. Tuy nhiên, tham chiếu thuật ngữ phân loại cũng chắc chắn sẽ có 'tid', vì vậy có lẽ bạn chỉ cần thay đổi dòng đó ( $taxonomy_term_id = $node->field_FRUIT[LANGUAGE_NONE][0]['tid'];) chứ không phải dòng khác
Clive

đã làm điều đó :-) Vẫn không hoạt động. Bằng cách tôi nhìn vào kết quả taxonomy_term_load($taxonomy_term_id)tạo ra, và nó trông như thế này: stdClass Object ( [tid]=> 1 [vid]=> 2 [name]=> Apples [description]=> [format]=> full_html [weight]=> 0 [vocabulary_machine_name]=> fruit [rdf_mapping]=> ...). Cái quý giá của tôi field_main_article_idkhông tìm thấy ở đâu (mặc dù tôi có thể thấy nó trong UI hoàn hảo). Có nên taxonomy_term_loadvận hành theo cách này?
Ari Linn

Xin lỗi lần nữa, xấu của tôi. Tôi đã ngu ngốc và nhìn nhầm chỗ, đó là lý do tại sao tôi không thấy bất kỳ thay đổi nào trong các điều khoản phân loại của mình. Mã của bạn hoạt động. Cảm ơn.
Ari Linn

taxonomy_term_saveCũng nên làm việc để cập nhật cha mẹ của một thuật ngữ? Tôi đang cố gắng sử dụng nó cho mục đích này, nhưng tôi đang gặp vấn đề với việc cập nhật dữ liệu.
Brent Connor
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.