# Integração com Módulo GlobalLists (Endereços) Todos os módulos que utilizam formulários com campos de endereço (País, Estado, Cidade) DEVEM obrigatoriamente utilizar as funcionalidades do módulo `globallists` para padronização e consistência dos dados. Esta regra visa eliminar a duplicação de tabelas de localidades e garantir uma experiência unificada de seleção de endereços em todo o sistema. ## 1. Banco de Dados ### Migração As tabelas do módulo devem possuir as colunas `_country_id`, `_state_id` e `_city_id` (prefixadas com o identificador da tabela do módulo) configuradas como `unsignedInteger` e `nullable`. É **obrigatório** o uso de chaves estrangeiras (Foreign Keys) apontando para as tabelas `lists_countries`, `lists_states` e `lists_cities`. Exemplo (supondo um módulo com prefixo `events`): ```php // Adição das colunas $table->unsignedInteger('events_country_id')->nullable(); $table->unsignedInteger('events_state_id')->nullable(); $table->unsignedInteger('events_city_id')->nullable(); // Definição das Foreign Keys $table->foreign('events_country_id')->references('countries_id')->on('lists_countries')->onDelete('set null'); $table->foreign('events_state_id')->references('states_id')->on('lists_states')->onDelete('set null'); $table->foreign('events_city_id')->references('cities_id')->on('lists_cities')->onDelete('set null'); ``` ## 2. Model No Model do seu módulo, adicione os relacionamentos `belongsTo` e inclua as novas colunas no array `$fillable`. ```php use Modules\GlobalLists\Models\Country; use Modules\GlobalLists\Models\State; use Modules\GlobalLists\Models\City; class Event extends Model { protected $fillable = [ // ... outros campos 'events_country_id', 'events_state_id', 'events_city_id', ]; public function country() { return $this->belongsTo(Country::class, 'events_country_id', 'countries_id'); } public function state() { return $this->belongsTo(State::class, 'events_state_id', 'states_id'); } public function city() { return $this->belongsTo(City::class, 'events_city_id', 'cities_id'); } } ``` ## 3. Controller Nos métodos responsáveis por exibir o formulário (`create`, `edit`), busque a lista completa de países. **IMPORTANTE**: Use o método `sortBy` com o acessor `name` para garantir que os países sejam listados em ordem alfabética de acordo com o idioma do sistema (o campo `countries_name` é um JSON). ```php use Modules\GlobalLists\Models\Country; use Modules\GlobalLists\Models\State; use Modules\GlobalLists\Models\City; public function create(): Response { // Ordenação correta por idioma $countries = Country::all()->sortBy(function ($country) { return $country->name; }); return $this->renderAdminView('@seumodulo/form.twig', [ 'countries' => $countries, // ... outros dados ]); } public function edit($id): Response { $item = SeuModelo::find($id); $countries = Country::all()->sortBy(function ($country) { return $country->name; }); // Pre-carregar estados e cidades se já houver seleção $states = []; $cities = []; if ($item->prefixo_country_id) { $states = State::where('states_country_id', $item->prefixo_country_id)->orderBy('states_name')->get(); } if ($item->prefixo_state_id) { $cities = City::where('cities_state_id', $item->prefixo_state_id)->orderBy('cities_name')->get(); } return $this->renderAdminView('@seumodulo/form.twig', [ 'item' => $item, 'countries' => $countries, 'states' => $states, 'cities' => $cities ]); } ``` ## 4. View (Twig) Utilize a estrutura HTML abaixo para os selects. Substitua os IDs e Names conforme o seu módulo. Observe o uso de `country.name` para obter o nome traduzido. ```twig