Не могу вывести поле

Автор Огонек, 28 июня 2017, 20:28:24

« назад - далее »

Огонек

Создаю свой класс (расширение функционала ручного внесения оплат).
1. Создал таблицу
2. Описал класс
3. Делаю контроллер
Дошел до функции RenderForm и уперся в одно поле:
В новой таблице оплат есть поле id_customer (привязать к оплате Покупателя)
Для его вывода в форме добавления / редактирования в контроллере пишу по аналогии с другими контроллерами

      $this->fields_form = array(
            'tinymce' => true,
            'legend' => array(
                'title' => $this->l('Manufacturers'),
                'icon' => 'icon-certificate'
            ),
            'input' => array(
                array(
                    'type' => 'select',
                    'label' => $this->l('Плательщик'),
                    'name' => 'id_customer',
                    'required' => false,
                    'options' => array(
                        'query' => customer::getCustomers(),
                        'id' => 'id_customer',
                        'name' => 'lastname'
                    )
                ),
....

Все работает, на экране появляется дропбокс со списком всех клиентов, выбрать можно, сохранить и т.д.
НО, это очень не удобно в списке искать глазами клиента и выбирать его
Хочу вместо select вставить text, чтобы потом привязать к нему js поиск по имени (как в поиске товара или при создании заказа в ручную и выборе клиента).
Так вот - меняю
                array(
                    'type' => 'select',

на
                array(
                    'type' => 'text',

и в поле, где при select стоит Имя, теперь стоит id клиента, потому что в файле \admin\themes\default\template\helpers\form\form.tpl для $input.type == 'text' не предусмотрено

'options' => array(
.
Поэтому придется править tpl, добавляя новый вариант типа {if $input.type == 'my_text_with_search'}
Занялся этим, запутался  и мой мозг слегка треснул.
Может кто-нибудь подскажет совет как это сделать? Для удобства я убрал все "лишние" проверки и получилось следующее:

{elseif $input.type == 'my_text_with_search'}
{assign var='value_text' value=$fields_value[$input.name]}
<input type="text"
name="{$input.name}"
id="{if isset($input.id)}{$input.id}{else}{$input.name}{/if}"
value="{$value_text|escape:'html':'UTF-8'}"
/>
{/if}



Огонек

Поспешил жаловаться - сделал сам. Извините.

Огонек

#2
Рано порадовался - не все получилось.
Сделал так:
1. в классе Customer создал метод getCustomerNameById($id_customer)
2. в renderForm перед  $this->fields_form = array( добавил
$customer = new Customer();
3. в tpl форме добавил

{elseif $input.type == 'my_text_with_search'}
{assign var='value_text' value=$fields_value[$input.name]}
<input type="text"
name="cust_name"
id="cust_name"
value="{customer::getCustomerNameById($value_text)}"
/>
{/if}


В режиме правки все работает, а если нажать "Добавить" в хидере страницы - появляется белый экран.
В чем может быть причина?
Отладка включена, ошибок не выскакивает.

Забыл уточнить: контроллер и класс я не с нуля писал, а переделывал клоны контроллера и класса Производители (Manufacturers)

Огонек

Путем танцев нашел решение, но для его воплощения мне остался один шаг:
как в методе renderForm контроллера получить значения id записи в таблице БД, для строки на которой пользователь нажал "Править"?

Миколас

Никак не получить. renderForm для построения страницы.

Огонек

Тогда другой вопрос:
как вместо стандартного действия по кнопке "Добавить" в Хидере поставить свою функцию типа
INSERT INTO...

PrestaMan

Цитата: Огонек от 29 июня 2017, 19:32:18
Путем танцев нашел решение, но для его воплощения мне остался один шаг:
как в методе renderForm контроллера получить значения id записи в таблице БД, для строки на которой пользователь нажал "Править"?
Tools::getValue('id_объекта ');
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!

PrestaMan

Цитата: Огонек от 29 июня 2017, 21:07:42
Тогда другой вопрос:
как вместо стандартного действия по кнопке "Добавить" в Хидере поставить свою функцию типа
INSERT INTO...
Переопределить базовый контроллер, создать свои методы, переопределить метод initToolbar.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!

Огонек

Цитата: PrestaMan от 29 июня 2017, 21:10:10
Переопределить базовый контроллер, создать свои методы, переопределить метод initToolbar.
Маленький плюсик в Toolbar я увидел только после прочтения этого  :)
Я имел ввиду initPageHeaderToolbar().
Создал свой класс, создал для него контроллер, в классе создал метод add()
А дальше в AdminController.php чего-то потерялся... где перенаправить на мой add

Огонек

Цитата: Миколас от 29 июня 2017, 21:00:24
Никак не получить. renderForm для построения страницы.
Понял.
Из массива, созданного в renderForm в форме form.tpl создаются последовательно один за другим 2 select-а.


{foreach $field as $input}
...
       {if $input.type == 'text'}
...
       {elseif $input.type == 'select'}
        {if $fields_value[$input.name] == $option[$input.options.id]}
selected="selected"
                        ***
                {/if}
...
{/foreach}

Есть ли возможность там где звездочки поставить что-то типа

{if $input.name == 'Имя которое мне нужно'}
{$my_selected_item = $input.options.id}
{/if}

чтобы использовать значение выбранного в 1-м select-e $my_selected_item для формирования условия при построении 2-го select.

{if $my_selected_item = 2}
...
{/if}

Огонек

На одном форуме программистов я видел девиз одного программера:
"Мой кот очень хорошо разбирается в программировании. Стоит мне ему все подробно объяснить, сразу даже мне все становится понятно"
Вот также и я - пока здесь подробно писал, сам разобрался и сделал.