hướng dẫn cập nhật để loại bỏ trường yêu cầu điện thoại khỏi thanh toán


9

Xin vui lòng ai đó có thể đăng một hướng dẫn về việc loại bỏ trường điện thoại 'bắt buộc' khi thanh toán dựa trên bố cục magento Phiên bản 1.8.0.0, phần lớn các tài nguyên được cho là hiện tại đã hết hạn và không còn hoạt động. Đây có vẻ là nơi hoàn hảo để cập nhật hướng dẫn / hướng dẫn.

Sẽ rất hữu ích nếu ai đó có thể xác nhận giải pháp hoạt động bằng cách tải xuống Magento 1.8.0.0 và cung cấp bằng chứng loại bỏ nó, các đoạn mã này đôi khi hữu ích, nhưng chúng tôi vẫn chưa tìm thấy giải pháp hoạt động theo cách dễ đọc / tài liệu.


Câu trả lời:


8

Trước khi 1.8.1tôi không biết bất kỳ cách nào để thực hiện công việc này, bạn phải ghi đè lớp lõi trừu tượng trong nhóm mã cục bộ hoặc viết lại mỗi lớp con duy nhất (xấu xí, tôi biết).

Từ đó 1.8.1, họ giới thiệu sự kiện customer_address_validation_after. Tôi đã loại bỏ xác nhận bằng cách sử dụng phản xạ, ngay cả khi tôi không quá tự hào về nó. Có thể không giải quyết vấn đề của bạn, nhưng tôi nghĩ dù sao tôi cũng sẽ đăng nó.

/**
 * Validate address ignoring phone-related errors
 *
 * Internally uses reflexion. Maybe not the most
 * efficient or clean implementation, but allows
 * this functionality to be implemented without
 * the need to rewrite 3 core classes.
 *
 * Listens to:
 * - customer_address_validation_after
 *
 * @param Varien_Event_Observer $observer Event observer
 */
public function validateAddress(Varien_Event_Observer $observer)
{
    /* @var $address Mage_Customer_Model_Address_Abstract */
    $address = $observer->getAddress();
    if (!$address) {
        return;
    }

    $prop = new ReflectionProperty('Mage_Customer_Model_Address_Abstract', '_errors');
    if (!$prop) {
        return;
    }
    $prop->setAccessible(true);
    $errors = $prop->getValue($address);
    $prop->setValue($address, array());

    $errorMessage = $this->getErrorMessage();
    foreach ($errors as $error) {
        if ($error !== $errorMessage) {
            $address->addError($error);
        }
    }
}

/**
 * Get standard error message
 *
 * @return string
 */
protected function getErrorMessage()
{
    return Mage::helper('customer')->__('Please enter the telephone number.');
}

Tôi cũng đã viết một kịch bản cập nhật để xác định tệp không cần thiết và chỉnh sửa tất cả các biểu mẫu để xóa xác thực giao diện. Như tôi đã nói, nó có thể không phải là giải pháp tốt nhất, nhưng tốt hơn là viết lại 3-4 lớp IMHO.

CẬP NHẬT Đội lõi bọc các sự kiện customer_address_validation_aftertrong một khởi đầu có điều kiện từ 1.9.0thông qua 1.9.1.1(Tôi thực sự tự hỏi tại sao, làm cho không có ý nghĩa với tôi ...) vì vậy giải pháp của tôi sẽ không làm việc cho các phiên bản này, không may. Các điều kiện đã may mắn được gỡ bỏ trong 1.9.2.


Cảm ơn! Chỉ cần đặt cái này vào một mô-đun: github.com/sreichel/magento-StackExchange_RequiredTelPhone
sv3n

6

Bạn sẽ cần sửa đổi Mage_Customer_Model_Address_Abstractlớp * trên dòng 375-377 nhận xét Xác thực Zend của số điện thoại.

//if (!Zend_Validate::is($this->getTelephone(), 'NotEmpty')) {
//   $errors[] = Mage::helper('customer')->__('Please enter the telephone number.');
//}

cũng như chính thuộc tính điện thoại trong cơ sở dữ liệu loại bỏ lớp yêu cầu. Điều này có thể được thực hiện với truy vấn sau đây

UPDATE `eav_attribute` SET `is_required` = 0 WHERE `attribute_code` = 'telephone';

Điều này sẽ đảm nhiệm việc xác thực frontend (Javascript) của các trường điện thoại.

** Đảm bảo sao chép tệp lớp vào localthư mục mã của bạn *


Lưu ý rằng bạn không thể mở rộng (viết lại) một lớp trừu tượng từ một phần mở rộng tùy chỉnh. Bạn chỉ có thể sao chép toàn bộ tệp vào ứng dụng / mã / cục bộ và tùy chỉnh nó ở đó. Cũng lưu ý rằng câu trả lời này cũng hoạt động cho các phiên bản Magento thấp hơn 1.8.
Mark van der Sanden

Bạn hoàn toàn đúng. Tôi sẽ chỉnh sửa ngay
Sander Mangel

Như các câu trả lời được đề xuất cho thấy tôi đã sao chép Abstract.php từ / public_html / app / code / core / Mage / Customer / Model / Địa chỉ sang public_html / app / code / local / Mage / Customer / Model / Địa chỉ nhận xét các dòng liên quan đến số điện thoại và chạy CẬP NHẬT eav_attribution SET is_Vquired = 0 WHERE property_code = 'phone' LIMIT 1; 1 hàng bị ảnh hưởng. (Truy vấn mất 0,0506 giây) Đã xóa tất cả bộ nhớ cache (trình biên dịch magento của tôi luôn bị tắt) Tuy nhiên, khách hàng vẫn phải cung cấp một số trước khi họ có thể thanh toán. Ai đó có thể vui lòng xác nhận giải pháp này hoạt động trên 1.8.0.0 không, vì nó không hoạt động với tôi.
Alistair

2
Có một lỗi nhỏ trong truy vấn của Sander: bỏ qua GIỚI HẠN 1 trong truy vấn. Trong bản cài đặt CE 1.8 mặc định, có 4 mục nhập eav_attributevới mã 'điện thoại', vì vậy bạn không thể biết mục nào đã được cập nhật. Sau đó, mã nên hoạt động (vừa kiểm tra nó). Đối với phần trực quan, sau đó bạn vẫn cần xóa <em>*</em>trong nhãn của trường trong tất cả các biểu mẫu (thanh toán / chỉnh sửa địa chỉ). Tất nhiên, nếu bạn đã cài đặt một bước kiểm tra một bước, nó có thể ghi đè một số chức năng Magento mặc định và câu trả lời này có thể không hoạt động.
Mark van der Sanden

1
Xin chào Mark: Cảm ơn bình luận của bạn, tôi đã kiểm tra xem đó có phải là trường hợp trên cửa hàng của tôi không, nhưng tôi chỉ có một eav_atribution với code'telPhone '"CHỌN * TỪ eav_attribution WHERE property_code =' phone '" Hiển thị các hàng 0 - 0 (Tổng cộng 1, Truy vấn mất 0,0005 giây), vì vậy cửa hàng của tôi chỉ có một trong số đó, không giống như của bạn .. và hiện tại nó được đặt thành "is_Vquired = 0"
Alistair

5

Tôi sẽ đề nghị thay đổi mẫu địa chỉ cho chủ đề trang web và biến điện thoại thành trường ẩn với giá trị mặc định là dấu cách hoặc dấu gạch ngang. Điều này sẽ không yêu cầu viết lại / ghi đè.


2

Bạn có thể không chỉ đơn giản viết lại các lớp sử dụng bản tóm tắt bằng cách sử dụng phần mở rộng tùy chỉnh và viết lại cấu hình.

  • Mage_Sales_Model_Quote_Address,
  • Mage_Customer_Model_Address,
  • Mage_Sales_Model_Order_Address,

Sau đó, bạn có thể thực hiện validatechức năng của riêng mình sẽ loại trừ kiểm tra điện thoại hoặc tốt hơn là kiểm tra tất cả các thuộc tính bắt buộc và xác thực rằng chúng được đặt.


1
Đúng, nhưng thật không may, mỗi mô-đun thanh toán hoặc vận chuyển thứ hai đang cố gắng viết lại các lớp đó (tôi có thể kể tên một vài). Thường thì nó không phải là một lựa chọn, hoặc cuối cùng nó rất lộn xộn.
fmrng

nhưng bạn đã giải quyết được nhiều lần viết lại? vì vậy sau đó bạn có thể sử dụng giải pháp đó và đưa xác nhận của bạn vào đó.
David Manners

Tất nhiên bạn có thể làm điều đó, nhưng bạn phải làm điều đó cho mọi dự án, vì bạn không biết ai sẽ viết lại các lớp đó. Thật không may, khách hàng luôn yêu cầu loại bỏ xác nhận điện thoại. Giải pháp duy nhất và "sạch" mà tôi nghĩ ra là giải pháp tôi đã mô tả trong câu trả lời của mình và thậm chí nó không hoạt động cho tất cả các phiên bản Magento. Nếu điều đó không thể được áp dụng, cách dễ nhất là sao chép lớp trừu tượng vào nhóm mã cục bộ và nhận xét xác nhận ... không phải là tốt nhất, nhưng sẽ tốt nếu bạn không lạm dụng nó.
fmrng

2

Tôi vừa gặp một phần mở rộng nhỏ "Webguys_Telefonkeinpflicht" của Tobi, về cơ bản theo cách tiếp cận của David. Nó viết lại các lớp con tương ứng. Điều tôi thích khá nhiều là thực tế là nó chỉ gửi một sự kiện trong các lớp viết lại và tất cả các tùy chỉnh tiếp theo được thực hiện trong một trình quan sát sự kiện. Nó cũng quan sát core_block_abstract_to_html_aftersự kiện để loại bỏ ngôi sao và lớp được yêu cầu khỏi trường đầu vào với một số ma thuật đen regex. Và tất nhiên nó đi kèm với một tập lệnh thiết lập, làm cho thuộc tính điện thoại không bắt buộc trong eav_attributebảng. Bạn có thể kiểm tra tiện ích mở rộng trên GitHub .

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.