읽기 전용 제품 백엔드 속성


13

속성 읽기 만 만들고 싶지만 불가능합니다.

addAttribute () 'disabled' =>true또는 'readonly' => true 성공하지 않고 전달하려고했습니다 . 사용에 대한 제안을 찾았 setLockedAttributes()지만 어떤 이유로 든 작동하지 않습니다.

참고:
Varien_Data_Form_Element_Abstract::serialize($attributes = array(), $valueSeparator='=', $fieldSeparator=' ', $quote='"')



이 솔루션은 작동하지 않습니다. (setLockedAttributes)
Fra

2
그것을하지 않습니다 setLockedAttribute그것이, lockAttribute:-)
user487772

1
팀! 당신은 웃었다! :-D
benmarks

고마워 ... 스레드 업데이트를 확인합니다
Fra

답변:


11

참조 된 SO 기사에서-시도했지만 실제로 1.6CE 및 1.7CE / 1.12EE에서 작동합니다. 아직 1.8 / 1.13에 시도하지 않았습니다.

/programming/6384120/magento-read-only-and-hidden-product-attributes

좋아, 결국 할 수있는 것처럼 보입니다. catalog_product_load_after이벤트에 대한 관찰자를 추가 한 후 클래스 의 lockAttribute메소드 Mage_Catalog_Model_Abstract를 사용하여 제품 속성을 읽기 전용으로 만들 수 있습니다. 옵저버 메소드의 코드는 다음과 같습니다.

public function lockAttributes($observer) {
    $event = $observer->getEvent();
    $product = $event->getProduct();
    $product->lockAttribute('attribute_code');
}

1
나는 함께 가고 싶어 catalog_product_edit_action이벤트 대신 ( stackoverflow.com/a/7874345/394589 잠금이 OFC 편집시에만 수행해야하는 경우).
nevvermind

8

제품 관리에서 편집 할 수없는 것으로 충분 label하면 양식 입력을 일반 텍스트로 바꾸는 프론트 엔드 입력 유형을 사용하십시오 .

addAttribute($entity, $code, array(
    ...
    'input' => 'label',
    ...
));

API 또는 조작 된 POST 요청을 통한 속성 저장을 막을 수는 없습니다. 보안을 유지하려면 lockAttribute() 위에서 제안한대로 추가로 사용하십시오 .

또한 텍스트 유형 속성, 다른 유형의 경우 lockAttributes에도 "라벨"유형으로 대체되거나 확장됩니다.


이것은 속성이 텍스트 유형 인 경우에만 작동합니다. 부울의 경우 lockattribute ()
Fra

1
좋은 지적, @Fra, 감사합니다! 대답에 추가하겠습니다
Fabian Schmengler

심지어 텍스트 속성에 대한 1.9.4.1에서 작동하지 않는 것
오지

3

이 문제를 해결하기 위해 입력 렌더러를 대신 사용할 수도 있습니다. 단점은 각 입력 유형에 대해이 작업을 수행하고 각 속성에 대해 설정을 통해 설정해야한다는 것입니다.

그렇게하려면 addAttribute 속성을 사용할 때는 input_renderer 키를 , updateAttribute를 사용할 때는 frontend_input_renderer 를 사용 하십시오 . 예:

$installer->addAttribute(Mage_Catalog_Model_Product::ENTITY, 'yourattribute', array(
// ...
// won't be used actually as you use a custom renderer (constant equals to text), but I'm not sure what omitting this will have as effect..
    'input' => Mage_Catalog_Model_Product_Option::OPTION_GROUP_TEXT,
    'input_renderer' => 'yourns_yourmodule/adminhtml_product_helper_form_disabledText',
    'frontend_class' => 'disabled',
    'note' => 'This field is disabled',
// ...
));

그런 다음 Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledText클래스를 사용하여 실제로 사용할 입력 클래스를 확장하십시오. 텍스트 필드의 경우입니다 Varien_Data_Form_Element_Text. 선택을 위해 그렇게 될 것 Varien_Data_Form_Element_Select입니다.

이제 다음과 같은 코드를 추가하여 속성을 비활성화하고 getHtml메소드를 덮어 쓰고 속성을 설정하고 입력 필드에 대한 실제 HTML 코드를 리턴하십시오.

public function getHtml()
{
    // Set disabled
    $this->setReadonly(true, true);
    return parent::getHtml();
}

이 메소드는 lib / Varien / Data / Form / Abstract.php에 있으며 모든 양식 입력 요소 필드에서 상속되므로 항상 사용 가능해야합니다.

/**
 * Disable elements
 *
 * @param boolean $readonly
 * @param boolean $useDisabled
 * @return Varien_Data_Form_Abstract
 */
public function setReadonly($readonly, $useDisabled = false)
{
    if ($useDisabled) {
        $this->setDisabled($readonly);
        $this->setData('readonly_disabled', $readonly);
    } else {
        $this->setData('readonly', $readonly);
    }
    foreach ($this->getElements() as $element) {
        $element->setReadonly($readonly, $useDisabled);
    }

    return $this;
}

거부 된 입력 가능성을 시각화하기 위해 위와 같이 속성 설정에 disabled 클래스 를 포함시키는 것이 좋습니다. 아마도 $this->addClass('disabled')메소드에서 사용할 수도 있습니다 . 아직 시도하지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.