Symfony 2.2 getChild устарел

Я пытаюсь установить пакет для местоположений JulLocationBundle. И я столкнулся с некоторыми проблемами, которые мне удалось решить; потом вылезла ошибка call undefined function getChild.

Некоторые исследования показали, что это вызвано устаревшим методом (начиная с версии 2.2)...

Итак, вот часть кода, которую необходимо изменить:

            if( $locationForm->offsetExists( $locationType ) )
        {
            $topLevel = $locationType;
            $topLevelForm = $locationForm->getChild( $topLevel );

            break;
        }

полный код контроллера:

namespace Jul\LocationBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class GooglemapsController extends Controller
{
    public function placesAutocompleteAction
    (
            $locationForm,
            $zoomDefault = null,
            $zoomResolved = 17,
            $latitude = null,
            $longitude = null,
            $mapDiv = 'map_canvas',
            $mapOptions = array(),
            $acFields = null,
            $addressFallback = false,
            $maxImageWidth = 200,
            $maxImageHeight = 200
    )
    {
        /*
         * Find top level entity
         */
        $locationTypes = array( 'location', 'city', 'state', 'country' );

        foreach( $locationTypes as $locationType )
        {
            if( $locationForm->offsetExists( $locationType ) )
            {
                $topLevel = $locationType;
                $topLevelForm = $locationForm->getChild( $topLevel );

                break;
            }

            if( $locationForm->getName() == 'Jul' . ucfirst( $locationType ) . 'Field' )
            {
                $topLevel = $locationType;
                $topLevelForm = $locationForm;

                break;
            }
        }

        /*
         * Top level not found
         */
        if( ! isset( $topLevel ) ) throw new \Exception( 'There is no location field in the form sent to the controller JulLocationBundle:Googlemaps:placesAutocomplete' );

        /*
         * Default map center and zoom
         */
        if( $topLevelForm->offsetExists( 'latitude' ) && ( $latForm = $topLevelForm->getChild( 'latitude' )->get( 'value' ) ) <> 0 )
        {
            /*
             * If the form has been sent with a location
             */
            $latitude = $latForm;
            $longitude = $topLevelForm->getChild( 'longitude' )->get( 'value' );

            $zoomDefault = $zoomResolved;
        }
        else
        {
            if( ! $latitude ) $latitude = 40.4230;
            if( ! $longitude ) $longitude = -98.7372;
            if( ! $zoomDefault ) $zoomDefault = 3;
        }

        /*
         * Default map options array
         */
        $mapOptions = array_merge( array(
            'zoom' => $zoomDefault
            ), $mapOptions );

        /*
         * Default autocomplete input field
         */
        if( ! isset( $acFields[ 0 ][ 'acInput' ] ) )
        {
            $acFields[ 0 ][ 'acInput' ] = ( $topLevelForm->offsetExists( 'long_name' ) ) ? $topLevelForm->getChild( 'long_name' )->get( 'id' ) : $topLevelForm->getChild( 'name' )->get( 'id' );
        }

        /*
         * Default autocomplete Types
         */
        if( ! isset( $acFields[ 0 ][ 'acOptions' ]['types'] ) )
        {
            switch( $topLevel )
            {
                case 'location': $acFields[ 0 ][ 'acOptions' ][ 'types' ] = array( 'establishment' ); break;
                case 'city': $acFields[ 0 ][ 'acOptions' ][ 'types' ] = array( '(cities)' ); break;
                default: $acFields[ 0 ][ 'acOptions' ][ 'types' ] = array( '(regions)' );
            }
        }

        /*
         * Address autocomplete fallback
         */
        if( $addressFallback && $topLevel == 'location' && ! isset( $acFields[ 1 ][ 'acInput' ] ) && $topLevelForm->offsetExists( 'long_address' ) )
        {
            $acFields[ 1 ][ 'acInput' ] = ( $topLevelForm->offsetExists( 'long_name' ) ) ? $topLevelForm->getChild( 'long_address' )->get( 'id' ) : $topLevelForm->getChild( 'address' )->get( 'id' );
            $acFields[ 1 ][ 'acOptions' ][ 'types' ] = array( 'geocode' );
        }

        /*
         * Build javascript field IDs array using JulLocationBundle config
         */

        $jsFieldIds = array();
        $tmpLevel = $locationForm;

        foreach( $this->container->parameters[ 'jul_location.options' ] as $level => $options )
        {
            $fields = $options['fields'];

            $tmpArray = array();

            if( $tmpLevel->offsetExists( $level ) )
            {
                $tmpLevel = $tmpLevel->getChild( $level );

                foreach( $fields as $field => $fieldArray )
                {
                    /*
                     * Check if field is active in config && exists in the form
                     */
                    if( $fieldArray[ 'enabled' ] && $tmpLevel->offsetExists( $field ) ) $tmpArray[ $field ] = $tmpLevel->getChild( $field )->get( 'id' );
                }
            }

            $jsFieldIds[ $level ] = $tmpArray;
        }

        return $this->render( 'JulLocationBundle:Googlemaps:placesAutocomplete.html.twig', array(
                'mapDiv' => $mapDiv,
                'mapOptions' => json_encode( $mapOptions ),
                'acFields' => json_encode( $acFields ),
                'topLevel' => $topLevel,
                'zoomResolved' => $zoomResolved,
                'latitude' => $latitude,
                'longitude' => $longitude,
                'jsFieldIds' => json_encode( $jsFieldIds ),
                'maxImageWidth' => $maxImageWidth,
                'maxImageHeight' => $maxImageHeight
                ));
    }
}

код довольно понятен, нам нужно получить дочерний элемент объекта верхнего уровня (обычно это местоположение, если вы следуете настройке, но вопрос заключается в том, как обойти устаревание метода formview::getchild().?!

РЕДАКТИРОВАТЬ: для тех, кому нужен пакет.

через несколько дней я предоставлю запрос на исправление JulLocationBundle для 2.2.


person Hussein Nazzal    schedule 10.06.2013    source источник


Ответы (2)


Вы можете использовать get метод $form->get('...') или только $form['...'].

Узнайте больше об об устаревании.

person Alexey B.    schedule 10.06.2013
comment
извините, забыл сказать, что я уже делаю это .... но по какой-то странной причине это не работает. - person Hussein Nazzal; 10.06.2013
comment
Ну, ошибка не вызвана самой реализацией, она вызвана тем, что каким-то образом вы не можете получить правильные данные из объекта. - person Hussein Nazzal; 10.06.2013

Вместо :

$topLevelForm = $locationForm->getChild($topLevel);

Вы должны использовать:

$topLevelForm = $locationForm->children[$topLevel];

Как описано в коде (ветка 2.2) .

person j0k    schedule 10.06.2013