Zbudowałem niestandardowe rozszerzenie lokalizatora sklepu z jego własną siatką i edytuję strony w Adminhtml i wszystko działa świetnie. W przypadku godzin otwarcia sklepów chciałbym wdrożyć dynamiczną siatkę, tak jak w przypadku opcji atrybutów.
Teraz znalazłem rozwiązanie, ale mam nadzieję, że istnieje lepszy, a przynajmniej czystszy sposób. Do tej pory dodałem renderer do pola w formularzufieldset
class Redkiwi_Rkstorelocator_Block_Adminhtml_Rkstorelocator_Edit_Tab_General extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
$form = new Varien_Data_Form();
$this->setForm($form);
$fieldset = $form->addFieldset('rkstorelocator_form', array('legend'=>Mage::helper('rkstorelocator')->__('Store information')));
[...]
$officehours_field = $fieldset->addField('office_hours', 'editor', array(
'name' => 'office_hours',
'label' => Mage::helper('rkstorelocator')->__('Office hours'),
'required' => false,
));
$officehours_block = $this->getLayout()
->createBlock('rkstorelocator/adminhtml_rkstorelocator_edit_renderer_officehours')
->setData(array(
'name' => 'office_hours',
'label' => Mage::helper('rkstorelocator')->__('Office hours'),
'required' => false,
));
$officehours_field->setRenderer($officehours_block);
[...]
}
}
I klasa bloków do renderowania
class Redkiwi_Rkstorelocator_Block_Adminhtml_Rkstorelocator_Edit_Renderer_Officehours
extends Mage_Adminhtml_Block_Abstract
implements Varien_Data_Form_Element_Renderer_Interface
{
public function render(Varien_Data_Form_Element_Abstract $element)
{
$required_indicator = $this->getData('required') ? '<span class="required">*</span>' : '' ;
$html = '
<table id="attribute-options-table" class="dynamic-grid rkstorelocator-officehours" cellspacing="0" cellpadding="0"><tbody>
<tr>
<th>Day indicator</th>
<th>Opening hour</th>
<th>Closing hour</th>
<th>
<button id="add_new_option_button" title="Add Option" type="button" class="scalable add"><span><span><span>Add Option</span></span></span></button>
</th>
</tr>
</tbody></table>
<script type="text/javascript">//<![CDATA[
var _form_html_row = \'<tr class="option-row rkstorelocator-officehours-dayrow" id="hour-row-{{id}}"><td><input name="'.$this->getData('name').'[value][option_{{id}}][0]" value="" class="input-text required-option" type="text"></td><td><input name="'.$this->getData('name').'[value][option_{{id}}][2]" value="" class="input-text required-option" type="text"></td><td><input name="'.$this->getData('name').'[value][option_{{id}}][2]" value="" class="input-text required-option" type="text"></td><td class="a-left" id="delete_button_container_option_{{id}}"><input type="hidden" class="delete-flag" name="'.$this->getData('name').'[delete][option_{{id}}]" value=""/><button onclick="$(\\\'hour-row-{{id}}\\\').remove();" title="Delete" type="button" class="scalable delete delete-option"><span><span><span>Delete</span></span></span></button></td></tr>\';
var _rkstorelocator_counter = 0;
$(\'add_new_option_button\').on(\'click\', \'button\', function(){
$(\'attribute-options-table\').insert(_form_html_row.replace(/\{\{id\}\}/ig, _rkstorelocator_counter));
_rkstorelocator_counter++;
});
//]]></script>
';
return $html;
}
}
Co daje mi następujący wynik
Teraz to w zasadzie działa, ale uzyskanie obecnych wartości będzie dość niechlujne i w sumie nie jestem zbyt dumny z kodu, który napisałem (jak można sobie wyobrazić).
Poszukałem kilku rozwiązań, ale ogólnie wszystkie przyjmują takie podejście. Czy ktoś zna czystszy sposób to zrobić?
magento-1.7
adminhtml
extensions
Sander Mangel
źródło
źródło
Odpowiedzi:
Długo mi zajęło uświadomienie sobie, że ceny Tier wyglądają tak, jak chcę. Więc po sprawdzeniu, jak Magento robi to z wyceną Tier, skończyłem, wykonując następujące czynności. Z góry przepraszam za ogromne bloki kodu, ale pomyślałem, że może być interesujący w przyszłości.
W mojej formie klasy
Redkiwi_Rkstorelocator_Block_Adminhtml_Rkstorelocator_Edit_Tab_General
Teraz klasa godzin blokowych Office
Redkiwi_Rkstorelocator_Block_Adminhtml_Rkstorelocator_Edit_Renderer_Officehours
.I szablon pliku .phtml
adminhtml/default/default/template/rkstorelocator/officehours.phtml
A wynik:
Drodzy przyszli pracownicy Google, do czasu przeczytania tego Magento 2.x zostanie wydane. Miejmy nadzieję, że Magento sprawił, że tego rodzaju rzeczy są trochę łatwiejsze. :)
źródło
Podaję niektóre z moich kodów napisanych na podstawie szablonów Magento. Może się przyda.
Niektóre interfejsy kart:
I szablon ciąża / lista / opcje.phtml:
źródło