Автор Тема: Не могу вывести поле  (Прочитано 473 раз)

28 Июнь 2017, 20:28:24
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Создаю свой класс (расширение функционала ручного внесения оплат).
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}

28 Июнь 2017, 20:54:32
Ответ #1
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Поспешил жаловаться - сделал сам. Извините.
29 Июнь 2017, 00:01:24
Ответ #2
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Рано порадовался - не все получилось.
Сделал так:
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)
29 Июнь 2017, 19:32:18
Ответ #3
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Путем танцев нашел решение, но для его воплощения мне остался один шаг:
как в методе renderForm контроллера получить значения id записи в таблице БД, для строки на которой пользователь нажал "Править"?
29 Июнь 2017, 21:00:24
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 3419
  • Репутация: +79/-6
  • Сообщество PrestaShop
    • Просмотр профиля
Никак не получить. renderForm для построения страницы.
29 Июнь 2017, 21:07:42
Ответ #5
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Тогда другой вопрос:
как вместо стандартного действия по кнопке "Добавить" в Хидере поставить свою функцию типа
INSERT INTO...
29 Июнь 2017, 21:08:40
Ответ #6
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Путем танцев нашел решение, но для его воплощения мне остался один шаг:
как в методе renderForm контроллера получить значения id записи в таблице БД, для строки на которой пользователь нажал "Править"?
Tools::getValue('id_объекта ');
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
29 Июнь 2017, 21:10:10
Ответ #7
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Тогда другой вопрос:
как вместо стандартного действия по кнопке "Добавить" в Хидере поставить свою функцию типа
INSERT INTO...
Переопределить базовый контроллер, создать свои методы, переопределить метод initToolbar.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
29 Июнь 2017, 21:27:13
Ответ #8
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Переопределить базовый контроллер, создать свои методы, переопределить метод initToolbar.
Маленький плюсик в Toolbar я увидел только после прочтения этого  :)
Я имел ввиду initPageHeaderToolbar().
Создал свой класс, создал для него контроллер, в классе создал метод add()
А дальше в AdminController.php чего-то потерялся... где перенаправить на мой add
01 Июль 2017, 20:55:19
Ответ #9
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Никак не получить. 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}
01 Июль 2017, 21:54:19
Ответ #10
  • Старожил
  • ****
  • Сообщений: 259
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
На одном форуме программистов я видел девиз одного программера:
"Мой кот очень хорошо разбирается в программировании. Стоит мне ему все подробно объяснить, сразу даже мне все становится понятно"
Вот также и я - пока здесь подробно писал, сам разобрался и сделал.