Atrybut zaplecza produktu tylko do odczytu

13

Chciałbym utworzyć atrybut tylko do odczytu, ale wygląda na to, że nie jest to możliwe.

Próbowałem przejść do metody addAttribute () 'disabled' =>truelub 'readonly' => true bez powodzenia. Znalazłem pewne sugestie dotyczące używania, setLockedAttributes()ale z jakiegoś powodu nie działa

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

Fra
źródło
2
Na pytanie odpowiedziano na stackoverflow: stackoverflow.com/questions/6384120/...
Fabian Blechschmidt
To rozwiązanie nie działa. (setLockedAttributes)
Fra
2
tak nie jest setLockedAttribute, to jest lockAttribute:-)
user487772
1
Tim! Uśmiechnąłeś się! :-D
benmarks
dzięki chłopaki ... Sprawdzę aktualizację wątku
Fra

Odpowiedzi:

11

Z przywołanego artykułu SO - próbowałem i to rzeczywiście działa na 1.6CE i 1.7CE / 1.12EE. Do tej pory nie próbowałem 1.8 / 1.13.

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

OK, wygląda na to, że w końcu można to zrobić. Po dodaniu obserwatora catalog_product_load_afterzdarzenia można użyć lockAttributemetody Mage_Catalog_Model_Abstractklasy, aby atrybut produktu był tylko do odczytu. Oto kod metody obserwatora:

public function lockAttributes($observer) {
    $event = $observer->getEvent();
    $product = $event->getProduct();
    $product->lockAttribute('attribute_code');
}
philwinkle
źródło
1
Pójdę z catalog_product_edit_actionimprezy zamiast ( stackoverflow.com/a/7874345/394589 ), jeżeli zamek należy zrobić tylko podczas edycji ofc.
nevvermind
8

Jeśli wystarczy, aby uniemożliwić edytowanie w zarządzaniu produktem, użyj typu danych wejściowych nakładki label, który zastępuje wprowadzanie formularza zwykłym tekstem:

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

Pamiętaj, że nie zapobiegnie to zapisaniu atrybutu przez interfejs API lub zmanipulowane żądanie POST. Aby zapewnić bezpieczeństwo, użyj dodatkowo lockAttribute() zgodnie z powyższym opisem .

Wygląda również dobrze tylko dla atrybutów typu tekstu, w przypadku innych typów ponownie cofnij się lockAttributeslub rozszerz typ „etykiety”.

Fabian Schmengler
źródło
działa to tylko wtedy, gdy atrybut ma typ tekstowy, dla wartości logicznej potrzebujesz lockattribute ()
Fra
1
Dobra uwaga, @Fra, dzięki! Dodam to do odpowiedzi
Fabian Schmengler
Wydaje się, że nie działa w 1.9.4.1 nawet w przypadku atrybutów tekstowych
OZZIE,
3

Aby to naprawić, możesz do tego celu użyć renderera wejściowego. Minusem jest to, że musiałbyś to zrobić dla każdego typu danych wejściowych i ustawić to za pomocą setup dla każdego atrybutu.

Aby to zrobić, użyj klucza input_renderer podczas korzystania z atrybutu addAttribute lub frontend_input_renderer podczas korzystania z updateAttribute . Przykład:

$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',
// ...
));

Następnie wraz z klasą Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledTextrozszerz klasę wejściową, której faktycznie użyjesz. Byłoby to dla pola tekstowego Varien_Data_Form_Element_Text. Dla wybranych byłoby Varien_Data_Form_Element_Selecti tak dalej.

Teraz dodaj swój kod w ten sposób, aby wyłączyć atrybut, nadpisując getHtmlmetodę, ustawiając atrybut i zwracając rzeczywisty kod HTML dla pola wejściowego:

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

Metodę można znaleźć w lib / Varien / Data / Form / Abstract.php, która zostanie odziedziczona przez wszystkie pola elementów formularza, więc powinna być zawsze dostępna.

/**
 * 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;
}

Prawdopodobnie sensowne jest włączenie wyłączonej klasy do konfiguracji atrybutów, jak pokazano powyżej, aby wizualizować możliwość odmowy wprowadzania danych. Prawdopodobnie można również użyć $this->addClass('disabled')w metodzie, jeszcze tego nie próbowałem.

Nico Siebler
źródło