Symfony: пытаюсь использовать мой собственный метод для отображения списка в бэкэнде.Неопределенное уведомление о смещении - PullRequest
0 голосов
/ 06 декабря 2010

Я пытаюсь использовать свой собственный метод для отображения списка в бэкэнде:

класс ShopOrderPeer extends BaseShopOrderPeer {

public static function getOrdini()
{
    $con = Propel::getConnection();
    $sql = "select customers_name, value, date_purchased, orders_status from shop_orders LEFT JOIN shop_orders_total  ON shop_orders.orders_id = shop_orders_total.orders_id";
    $stmt = $con->prepare($sql);

    $result = $stmt->execute();
    $ordini = self::populateObjects($stmt);


    return $ordini;

}

}

И этомой generator.yml

generator:
  class: sfPropelGenerator
  param:
    model_class:           ShopOrder
    theme:                 admin
    non_verbose_templates: true
    with_show:             false
    singular:              ShopOrder
    plural:                ShopOrders
    route_prefix:          shop_order
    with_propel_route:     1
    actions_base_class:    sfActions

    config:
      actions: ~
      fields:  ~
      list:
        display: [customers_name, date_purchased, orders_status ]
        peer_method:  getOrdini
      filter:  ~
      form:    ~
      edit:    ~
      new:     ~

Когда я загружаю страницу списка, список показывается, но я получаю это сообщение об ошибке

Notice: Undefined offset: 4 in /home/javier/Aptana_Studio_Workspace/dev_repo/lib/model/om/BaseShopOrder.php on line 1864
Call Stack
#  Time  Memory  Function  Location
1  0.0017  324556  {main}( )  ../backend_dev.php:0
2  0.0891  4457868  sfContext->dispatch( )  ../backend_dev.php:13
3  0.0891  4457912  sfFrontWebController->dispatch( )  ../sfContext.class.php:170
4  0.0892  4464168  sfController->forward( )  ../sfFrontWebController.class.php:48
5  0.1181  5054656  sfFilterChain->execute( )  ../sfController.class.php:229
6  0.1188  5061248  sfRenderingFilter->execute( )  ../sfFilterChain.class.php:53
7  0.1188  5061248  sfFilterChain->execute( )  ../sfRenderingFilter.class.php:33
8  0.1191  5070452  sfBasicSecurityFilter->execute( )  ../sfFilterChain.class.php:53
9  0.1192  5070496  sfFilterChain->execute( )  ../sfBasicSecurityFilter.class.php:72
10  0.1196  5082256  sfExecutionFilter->execute( )  ../sfFilterChain.class.php:53
11  0.2778  11817440  sfExecutionFilter->handleView( )  ../sfExecutionFilter.class.php:47
12  0.2778  11817440  sfExecutionFilter->executeView( )  ../sfExecutionFilter.class.php:116
13  0.2815  11859256  sfPHPView->render( )  ../sfExecutionFilter.class.php:155
14  0.2815  11859632  sfPHPView->renderFile( )  ../sfPHPView.class.php:179
15  0.2855  11973804  require('/home/javier/Aptana_Studio_Workspace/dev_repo/cache/backend/dev/modules/autoOrdini/templates/indexSuccess.php')  ../sfPHPView.class.php:75
16  3.0826  115065148  include_partial( )  ../indexSuccess.php:19
17  3.0826  115065148  get_partial( )  ../PartialHelper.php:180
18  3.0831  115068964  sfPartialView->render( )  ../PartialHelper.php:218
19  3.0832  115070248  sfPHPView->renderFile( )  ../sfPartialView.class.php:110
20  3.0866  115161828  require( '/home/javier/Aptana_Studio_Workspace/dev_repo_cashgold/cache/backend/dev/modules/autoOrdini/templates/_list.php' )  ../sfPHPView.class.php:75
21  3.6215  115636256  sfPropelPager->getResults( )  ../_list.php:28
22  3.6215  115636668  call_user_func ( )  ../sfPropelPager.class.php:117
23  3.6216  115636696  ShopOrderPeer::getOrdini( )  ../sfPropelPager.class.php:0
24  3.6227  115676928  BaseShopOrderPeer::populateObjects( )  ../ShopOrderPeer.php:31
25  3.6229  115684084  BaseShopOrder->hydrate( )

И затем:

Примечание: неопределенное смещение: 5 Примечание: неопределенное смещение: 6 ....

Это файл BaseShopOrder.php

try {

            $this->orders_id = ($row[$startcol + 0] !== null) ? (int) $row[$startcol + 0] : null;
            $this->sfgu_id = ($row[$startcol + 1] !== null) ? (int) $row[$startcol + 1] : null;
            $this->utenti_email = ($row[$startcol + 2] !== null) ? (string) $row[$startcol + 2] : null;
            $this->utenti_telefono = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null;
            $this->customers_name = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null;            // line 1864
            $this->customers_company = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null;
            $this->customers_street_address = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null;
            $this->customers_suburb = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null;
            $this->customers_city = ($row[$startcol + 8] !== null) ? (string) $row[$startcol + 8] : null;
            $this->customers_postcode = ($row[$startcol + 9] !== null) ? (string) $row[$startcol + 9] : null;
            $this->customers_state = ($row[$startcol + 10] !== null) ? (string) $row[$startcol + 10] : null;
            $this->customers_country = ($row[$startcol + 11] !== null) ? (string) $row[$startcol + 11] : null;

Есть идеи?

1025 * Javi *

1 Ответ

0 голосов
/ 06 декабря 2010

SomePeer :: populateObjects () предназначен для использования с SomePeer :: doSelect ().

populateObjects () ожидает, что запрос будет содержать ВСЕ от столбцов, которые существуют в таблице, которую вы запрашиваете. Вот почему выполнение SELECT * FROM ... сработало для вас.

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

Гораздо безопаснее написать объект Criteria. Затем вы можете использовать метод peer addSelectColumns, если хотите, однако в этом нет необходимости, если вы используете doSelect ... из своего класса peer, как он вызывается для вас.

На веб-сайте Propel есть хорошая документация по критериям, просто проверьте, какая версия Propel вы установили первой.

http://www.propelorm.org/wiki/Documentation

...