Pregunta

¿Cómo puedo cambiar el orden de caída predeterminado País abajo orden en Magento. Al igual que Estados Unidos debe ser el primero en la lista de opciones de selección en lugar de la clasificación alfabética.

No podía encontrar ya sea en base de datos o en XML, CSV, archivos php, donde lista almacenada estos países. Por favor me ayude a salir de esto.

¿Fue útil?

Solución

No he hecho esto, aunque yo he pensado en ello. Supongo que podría anular el controlador del bloque que tirones que los datos de la base de datos. Seleccione las casillas son sólo matrices de valores, por lo que tal vez podría llamar a la función que obtiene la matriz de valores del país, reordenarlos "manualmente" con php y luego asignar la matriz recién ordenado al objeto "campo".

Otros consejos

Yo estaba buscando la misma, y, finalmente, lo hizo por mí. Decidió publicar aquí, espero que esto ayude a alguien más.

Crea tu propio módulo (si no existe todavía). clase reescritura Mage_Directory_Model_Resource_Country_Collection:

<config>
    <modules>
        <Your_Module>
            <version>0.0.0.1</version>
        </Your_Module>
    </modules>
    <global>
        <models>
            <directory_resource>
                <rewrite>
                    <country_collection>Your_Module_Model_Resource_Directory_Country_Collection</country_collection>
                </rewrite>
            </directory_resource>
        </models>
    </global>
</config>

Cree el siguiente archivo en el directorio raíz de Magento:

/app/code/local/Your/Module/Model/Resource/Directory/Country/Collection.php

con el siguiente contenido:

<?php

class Your_Module_Model_Resource_Directory_Country_Collection
    extends Mage_Directory_Model_Resource_Country_Collection
{

    protected function _initSelect()
    {
        parent::_initSelect();

        $this
            ->addOrder('country_id="US"','desc')
            ->addOrder('country_id', 'asc');

        return $this;
    }

}

Después de eso, todas las listas de países se tira de Estados Unidos primero, y luego todos los demás países por orden alfabético.

Creo solución que Alex B ya no funciona después de SUPEE-6788 parche para abordar una posible inyección de SQL APPSEC-1063 cotizaciones de escape .

Mohammad Faisal sobreescritura causaron algunos países a desaparecer después de habilitar Tablerates en nuestra tienda.

que terminó con el establecimiento de orden de cobro con Zend_Db_Expr y la eliminación de Mage :: helper ( 'core / cadena') -.> KsortMultibyte ($ tipo) en el método protegido

Probado en Magento 1.9.3.2.

<?php

class Your_Module_Model_Resource_Directory_Country_Collection extends Mage_Directory_Model_Resource_Country_Collection {

/**
 * Convert items array to array for select options pushing most important countries to the top
 *
 * return items array
 * array(
 *      $index => array(
 *          'value' => mixed
 *          'label' => mixed
 *      )
 * )
 *
 * @param   string $valueField
 * @param   string $labelField
 * @return  array
 */
protected function _toOptionArray($valueField = 'id', $labelField = 'name', $additional = array())
{
    $res = array();
    $additional['value'] = $valueField;
    $additional['label'] = $labelField;

    $this->getSelect()->order(new Zend_Db_Expr('country_id = "NL" DESC'));
    $this->getSelect()->order(new Zend_Db_Expr('country_id = "BE" DESC'));
    $this->getSelect()->order(new Zend_Db_Expr('country_id = "DE" DESC'));
    $this->getSelect()->order(new Zend_Db_Expr('country_id = "FR" DESC'));
    $this->getSelect()->order('country_id', 'DESC');

    foreach ($this as $item) {
        foreach ($additional as $code => $field) {
            $data[$code] = $item->getData($field);
        }
        $res[] = $data;
    }

    return $res;
}

/**
 * Convert collection items to select options array
 *
 * @param string $emptyLabel
 * @return array
 */
public function toOptionArray($emptyLabel = ' ')
{
    $options = $this->_toOptionArray('country_id', 'name', array('title' => 'iso2_code'));

    $sort = array();
    foreach ($options as $data) {
        $name = Mage::app()->getLocale()->getCountryTranslation($data['value']);
        if (!empty($name)) {
            $sort[$name] = $data['value'];
        }
    }

    // Mage::helper('core/string')->ksortMultibyte($sort);
    $options = array();
    foreach ($sort as $label => $value) {
        $options[] = array(
            'value' => $value,
            'label' => $label
        );
    }

    if (count($options) > 0 && $emptyLabel !== false) {
        array_unshift($options, array('value' => '', 'label' => $emptyLabel));
    }

    return $options;
    }

}

También estaba buscando el mismo y el otro respuesta por Alex B no funcionaba en mi caso. También el código

$this->addOrder('country_id="US"','desc')
     ->addOrder('country_id', 'asc');

no hacer ningún cambio en la lista de países. Así que en lugar de anular el _initSelect() elijo toOptionArray() de anulación. y aquí está mi código

public function toOptionArray($emptyLabel = '') {
    $options = parent::toOptionArray($emptyLabel);
    foreach ($options as $key => $option) {
        if ($option['value'] == 'IN') {  //check current country code
            unset($options[$key]);
            $options = addCountryToIndex($options, $option, 1);  
        }
    }
    return $options;
}

protected function addCountryToIndex($countries, $country, $index){
    $options = array_slice($countries, 0, $index, true) +
        array($index => $country) +
        array_slice($countries, $index, count($countries) - 1, true);
    return $options;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top