# IvyForms Developer Documentation

This document provides technical information for developers who want to contribute to or understand the IvyForms WordPress plugin.

## Project Overview

IvyForms is a modern form builder for WordPress built with PHP 7.4+ on the backend and Vue.js/TypeScript on the frontend. The plugin uses a component-based architecture and dependency injection to maintain clean code.

## Project Structure

```
ivyforms/
└── backend/
    └── src/
        ├── Config/
        ├── Common/
        │   ├── Exceptions/
        │   └── Sanitizer/
        ├── Controllers/
        ├── Entity/
        ├── Factory/
        ├── Repository/
        ├── Routes/
        ├── Services/
        └── ValueObjects/
    ├── vendor/
    ├── composer.json 
    ├── composer.lock
    ├── phpcs.xml
    ├── phpmd-ruleset.xml 
    ├── phpstan.neon 
└── frontend/ 
    ├── src/ 
    ├── dist/
    ├── node_modules/ 
├── languages/
├── view/
    ├── backend/
    └── frontend/
```

### Directories Explanation

- **backend/**: Contains the PHP backend code and dependencies.
    - **src/**: Source code for the backend.
        - **Config/**: Contains configuration files for the application
        - **Common/**: Contains common files such as exceptions and helper classes
            - **Exceptions/**: Custom exception classes.
            - **Sanitizer/**: Contains class for sanitizing data.
        - **Controllers/**: Handle HTTP requests and responses. They use services to process the business logic
        - **Entity/**: Represent the core data structures of the application.
        - **Factory/**: Responsible for creating instances of entities or other objects.
        - **Repository/**: Handle data persistence and retrieval, typically interacting with a database.
        - **Routes/**: Define the application's routes and map them to controller actions.
        - **Services/**: Contain the business logic of the application.
        - **ValueObjects/**: Represent immutable values that describe certain aspects of the domain.

- **frontend/**: Contains the frontend code and dependencies.
    - **src/**: Source code for the frontend.
    - **dist/**: Compiled and bundled frontend assets.
    - **node_modules/**: npm dependencies.
    - Various configuration files for TypeScript, ESLint, and build tools.

- **view/**: Contains view templates.
    - **backend/**: Backend view files.
    - **frontend/**: Frontend view files.
- **languages/**: Contains language files for localization.

## Development Environment Setup

### Requirements

- PHP 7.4 or higher
- WordPress 5.0 or higher
- Node.js 14.0 or higher
- Composer 2.0 or higher
- npm 6.0 or higher

### Backend Setup
1. Navigate to the backend directory:
```bash
cd backend
```

2. Install PHP dependencies:
```bash
composer install
```

3. Run PHP code quality tools:
```bash
# Run PHP Code Sniffer
backend/vendor/bin/phpcs --standard=PSR12 backend/src

# Run PHPStan (Level 6)
backend/vendor/bin/phpstan analyse -c backend/phpstan.neon -l 6 backend/src --memory-limit=-1

# Run PHP Mess Detector:
backend/vendor/bin/phpmd backend/src ansi backend/phpmd-ruleset.xml
```

### Frontend Setup

1. Navigate to the frontend directory:
```bash
cd frontend
```

2. Install NPM dependencies:
```bash
npm install --force
```

3. Start development server:
```bash
npm run dev
```

4. Build for production:
```bash
npm run build
```

5. Run code quality tools:
```bash
# Run ESLint
npm run lint

# Run TypeScript type checking
npm run type-check

# Run formatting checks
npm run format
```

## Build Process

The plugin uses modern build tools to optimize the production code:

### Frontend Build Process

- **Development**: During development, Vite provides a fast development server with Hot Module Replacement (HMR).
- **Production**: For production, frontend assets are compiled and minified using Vite's build process.

The frontend is built using:
- **Vue.js 3**: Progressive JavaScript framework
- **TypeScript**: Typed JavaScript for better development experience
- **Vite**: Build tool for modern web projects
- **Pinia/Vuex**: State management
- **ESLint**: JavaScript/TypeScript linting

### Backend Build Process

The backend is managed using:
- **Composer**: PHP dependency management
- **PHP_CodeSniffer**: Code style checking
- **PHPStan**: Static analysis tool
- **PHP Mess Detector**: Code quality tool
- **PHP Dependency Injection (DI)** for managing dependencies

## External Libraries & Services

### JavaScript Libraries

The compiled files in `frontend/dist/` are built from source code in the `frontend/src/` directory. The build process uses npm and Vite to compile Vue.js components, TypeScript files, and other assets.

### External Services

The plugin uses the following external services:

1. **ipwho.is API**: Used to auto-detect user's country code for phone number input fields.
    - Implementation: Used in the phone number component to improve UX by pre-selecting the user's country code.

## Coding Standards

### PHP Coding Standards

We follow the WordPress PHP Coding Standards with some modifications:
- PSR-4 autoloading
- PSR-12 code style
- Type hints and return types

### JavaScript/TypeScript Coding Standards

- Vue.js Style Guide (Priority A & B rules)
- AirBnB JavaScript Style Guide with TypeScript extensions
- Component names in PascalCase
- Props in camelCase

## Debugging

### PHP Debugging

The plugin uses WordPress's built-in debugging tools:
- Set `WP_DEBUG` to `true` in your `wp-config.php` file
- Use `error_log()` for logging
- update IVYFORMS_DEV constant to `true` in `ivyforms.php` for development mode

### JavaScript Debugging

- Vue.js DevTools browser extension for Vue component debugging
- Console logging with `console.log()`, `console.error()`, etc.

## Source Code & Compilation

The minified JavaScript and CSS files in `frontend/dist/` directory are compiled from source code in the `frontend/src/` directory. The full source code is available in the plugin repository.

To modify the frontend code, edit the files in `frontend/src/` and run the build process to update the compiled assets.

## License

This project is licensed under the GPL v2 or later.
