# Conventions — rank24.pl

## PHP Naming

| Element | Convention | Example |
|---------|-----------|---------|
| Class files | `class.ClassName.php` | `class.GoogleRank.php` |
| Class names | PascalCase | `GoogleScraper`, `FileCache` |
| Namespaces | lowercase | `controls\`, `factory\`, `view\` |
| Public methods | camelCase | `SaveData()`, `getpagedata()` |
| Private properties | underscore + camelCase | `$_table`, `$_proxy`, `$_header` |
| Local variables | snake_case | `$db_edit_table`, `$last_id` |
| Config keys | snake_case | `$config['db']['host']` |

## File Naming

- Class files: `class.ClassName.php` in `autoload/` subdirectory matching namespace
- Templates: lowercase with hyphens — `main-layout.php`, `site-edit.php`
- Entry points: lowercase — `index.php`, `ajax.php`, `cron.php`
- Directories: lowercase — `autoload/`, `templates/`, `libraries/`

## Code Style

- **Indentation**: 2 spaces
- **Braces**: K&R — opening brace on same line for control structures; new line for methods
- **Spacing**: spaces around `->`, `=`, `=>` operators; spaces inside `( )` for function calls
- **Arrays**: mix of long `array()` in config, short `[]` in Medoo queries
- **Short PHP tags**: templates use `<?` and `<?=` (not `<?php`)
- **No type hints**: no PHP type declarations used anywhere

## Error Handling

- Global error suppression in `index.php`:
  ```php
  error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT ^ E_WARNING ^ E_DEPRECATED);
  ```
- User alerts via `\S::alert('message')` — stored in session, displayed on next render
- Very limited try/catch; exceptions only in OPD wrapper (`opd.class.php`)
- File/curl errors frequently suppressed with `@` operator

## Database Conventions

- **New code**: use Medoo (`$mdb`), array-based query syntax
- **Legacy code**: use OPD (`$db`), PDO `prepare()` + `execute()`
- Table names: `pro_` prefix (e.g., `pro_rr_clients`, `pro_proxy_servers`)
- All factory methods access DB via `global $mdb;`

## Configuration Access

- All config in `config.php` as `$config['section']['key']` array
- Classes access via `global $config;`
- No `.env` files, no constants for settings (only `OPD_DIR`, `OPD_VERSION`)

## Comments & Docs

- Comments are sparse and in **Polish**
- No docblocks on most classes/methods (exception: `RestClient3.php`)
- Inline comments explain "why" only — rare but present

## Global State

Classes depend on globals declared at bootstrap:
```php
global $db, $mdb, $lang, $sys, $user, $cache, $config, $settings;
```
No dependency injection. No service container.

## Template Conventions

- Savant3 templates receive variables as `$this->varName`
- Tpl templates receive variables as assigned properties, accessed in template scope
- HTML helper components in `templates/html/` — generated via `\Html::form_text()`, `\Html::select()`, etc.
- All UI strings use Polish language

## Language

- All user-facing text, comments, variable names, and commit messages are in **Polish**
