Получение функциональности batch_action в Symfony 1.0

В настоящее время я работаю над веб-приложением, написанным на Symfony. Я должен добавить функцию «экспорт в CSV» в бэкэнд/административную часть приложения для некоторых модулей. В представлении списка должна быть кнопка «Экспорт», которая должна предоставить пользователю CSV-файл отображаемых элементов (с учетом критериев фильтрации).

Я создал метод в классе действий модуля, который принимает список идентификаторов, разделенных запятыми, и генерирует CSV, но я не совсем уверен, как добавить ссылку на него в представлении. Проблема в том, что представления нигде нет, оно генерируется на лету из данных в конфигурационном файле generator.yml. Я разместил соответствующую часть файла ниже.

Я новичок в Symfony, поэтому буду признателен за любую помощь :).

Спасибо,
Алекс

Обновлять


list:
  display: [id, =name, indemn, _status, _participants, _approved_, created_at]
  title: Lista acţiuni
  object_actions:
    _edit: ~
    _delete: ~
  actions:
    _create: ~
    export_csv:
      name: Export to CSV
      action: CSVExport
      params: id=csvActionSubmit
  filters: [name, county_id, _status_filter, activity_id]
  fields:
    id:
      name: Nr. crt.
  ...

Благодаря вашему совету мне удалось добавить кнопку, связанную с моим действием. Проблема в том, что мне также нужно отправить некоторые параметры в действие, потому что я могу не захотеть все элементы - возможно, были использованы фильтры. К сожалению, проект использует Symfony 1.0, который не поддерживает batch_actions.

В настоящее время я работаю над этим с помощью Javascript (я анализирую DOM, чтобы получить числовые идентификаторы (из таблицы отображения), а затем создаю ссылку для кнопки. Я действительно думаю, что для этого может быть лучший способ.


person Alex Ciminian    schedule 19.03.2010    source источник
comment
Я ценю твою решимость, но я действительно не думаю, что у тебя есть другой выбор. Если вас беспокоит использование JS с точки зрения доступности, учтите, что это интерфейс администратора, и вы можете предъявлять к нему более строгие требования, чем к веб-сайту с выходом в Интернет. Подобные ограничения устранены в более новых версиях symfony, и нельзя винить фреймворк (особенно v1.0), если вы не можете обновиться. Я без проблем обновил несколько проектов с версии 1.0 до версии 1.3 — я настоятельно рекомендую изучить этот процесс.   -  person Raise    schedule 21.03.2010
comment
Я не винил фреймворк, я понимаю, что то, что я делаю, можно решить более элегантным способом. Проблема в том, что я не могу позволить себе обновление, потому что я действительно не хочу рисковать каким-либо образом сломать сайт. Я был только на контракте, чтобы добавить некоторые функции, поэтому перспектива потерять пару дней с обновлением и последующим тестированием и отладкой меня не очень радует :). Я согласен, что люди, которые поддерживают (d?) Сайт, должны были поддерживать структуру в актуальном состоянии.   -  person Alex Ciminian    schedule 21.03.2010


Ответы (3)


Если вы хотите сохранить его в генераторе администратора, вам нужно «пакетное действие» (см. документы Symfony для получения подробной информации). По сути, это появится в раскрывающемся меню (если вы используете тему администратора по умолчанию) и позволит вам отметить интересующие вас строки, выбрать параметр в раскрывающемся меню и нажать «Перейти».

Ваш генератор.yml будет выглядеть примерно так:

list:
  display: [=name, indemn, _status, _participants, _approved_, created_at]
  title: Lista acţiuni
  object_actions:
    _edit: ~
    _delete: ~
  batch_actions:
    exportcsv:
      label: "Export to CSV
...

и это будет искать метод executeBatchExportcsv() в вашем action.class.php. Он передает вашему методу массив идентификаторов в объекте sfWebRequest, поэтому вы сможете довольно легко вставить его в свой существующий код.

person richsage    schedule 19.03.2010
comment
Я не могу использовать batch_actions, потому что проект написан на Symfony 1.0 и они недоступны. Я попробую использовать action и посмотрю, смогу ли я заставить его работать. - person Alex Ciminian; 19.03.2010
comment
Ааа, не повезло :-( и я полагаю, что никаких изменений в обновлении нет :-) Я подумаю/посмотрю, но я начал с 1.2, так что я могу быть некоторое время ;-) - person richsage; 19.03.2010

Как вы уже упоминали, добавьте это в свои параметры list:

  actions:
    exportToCsv:
      name: Export to CSV
      action: exportToCsv

создайте действие executeExportToCsv() в action.class.php file модуля, и все готово. Если вы хотите красивую иконку для кнопки, вы можете добавить:

      icon: /images/icons/page_excel.png

или что-то подобное в параметрах действия.

person Raise    schedule 19.03.2010
comment
Да, я сделал это, но это все еще не совсем то, что мне нужно. Проблема в том, что мне нужно отправить отфильтрованный список в действие экспорта, и я не нашел способа отправить параметры (идентификаторы), используя только .yml. В настоящее время я работаю над этим, используя javascript, но мне жаль, что я этого не делал :). - person Alex Ciminian; 19.03.2010
comment
Ах, я пропустил критерии фильтра. Да, боюсь, без JS в sf1.0 этого не сделать. - person Raise; 19.03.2010

В итоге мне удалось добиться того, чего я хотел.

Проблема с решением Javascript заключалась в том, что я мог экспортировать только отображаемые результаты на странице. Если нужна была нумерация страниц, экспортировались только отображаемые результаты (текущая страница).

В шаблон макета я добавил следующее:

<?php 
if (isset($filters['csv-export-link'])) {
    echo '<a href="'$filters['csv-export-link']).'">Export to CSV</a>';
}
?>

И я изменил уже переопределенный addFiltersCriteria:

public function addFiltersCriteria($c) {
    // [...]
    parent::addFiltersCriteria($c);

    if (isset($this->filters['csv-export'])) {
        $idList = array();
        $results = ActionnPeer::doSelect($c);
        foreach ($results as $result) {
            $idList[] = $result->getId();
        }
        $this->filters['csv-export-link'] = '[...]/CSVExport/idList/'.implode(',', $idList);
    }
}

И последнее, но не менее важное :), я удалил действие "общее", так как оно больше не нужно, и добавил в генератор.yml "фильтр" csv-export.

filters: [..., _csv_export_filter]

Шаблон фильтра имел следующее содержимое:

<input type="hidden" name="filters[csv-export]" value="true" /> Active

Это решение почти можно использовать повторно :), не говоря уже о том, что оно действительно работает так, как задумано. Его адаптация для других модулей требует небольших накладных расходов.

Спасибо за вашу помощь.

Ура!
Алекс

person Alex Ciminian    schedule 21.03.2010
comment
Привет, Алекс, я сделал это и работает, когда результат фильтра меньше 400, когда URL-адрес имеет более 400 идентификаторов, я получаю эту ошибку: Запрещено. У вас нет разрешения на доступ к /backend.php/Inscription/export/1569. на этом сервере - person Marc Morales Valldepérez; 12.04.2013