Criei uma extensão personalizada de localizador de loja com sua própria grade e edite as páginas no Adminhtml e tudo funciona muito bem. Para o horário de funcionamento das lojas, gostaria de implementar uma grade dinâmica como para as opções de atributos.
Agora encontrei uma solução, mas espero que exista uma maneira melhor ou pelo menos mais limpa. O que tenho até agora é adicionar um renderizador ao campo no formuláriofieldset
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);
[...]
}
}
E uma classe de bloco para renderizar
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;
}
}
O que me dá o seguinte resultado
Agora isso basicamente funciona, mas a obtenção dos valores atuais será bastante confusa e, apesar de tudo, não tenho muito orgulho do código que escrevi (como você pode imaginar).
Pesquisei no Google várias soluções, mas todas geralmente adotam essa abordagem. Alguém sabe uma maneira mais limpa de fazer isso?
fonte
Respostas:
Demorei muito para perceber que os preços da Camada têm a aparência que eu quero. Então, depois de analisar como o Magento faz isso com os preços de camada, acabei fazendo o seguinte. Desculpe antecipadamente os enormes blocos de código, mas achei que poderia ser interessante para referência futura.
Na minha classe de formulário
Redkiwi_Rkstorelocator_Block_Adminhtml_Rkstorelocator_Edit_Tab_General
Agora, para a aula de bloqueio de horário comercial
Redkiwi_Rkstorelocator_Block_Adminhtml_Rkstorelocator_Edit_Renderer_Officehours
.E o arquivo .phtml do modelo
adminhtml/default/default/template/rkstorelocator/officehours.phtml
E o resultado:
Caros futuros googlers, Quando você ler este Magento 2.x, será lançado. Vamos torcer para que o Magento tenha facilitado um pouco esse tipo de coisa. :)
fonte
Dou alguns dos meus códigos escritos com base nos modelos Magento. Talvez seja útil.
Alguma interface de guia:
E template Pregnancy / list / options.phtml:
fonte