Для получения полного доступа
зарегистрируйтесь.
RSS

Все сниппеты с тэгом «codeigniter»



dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Бывают ситуации когда нет смысла использовать серверы очередей, типа Rabbitmq, German, etc. Была задача - отправка писем пользователям, проверка на поступление оплаты.

Для этого было решено написать простой класс, который считывает сообщения из таблицы, удаляет сообщения, добавлят задачу в таблицу.

На тот момент я решил задачу с помощью Doctrine 2 + CI 2. Надеюсь, что общий принцип будет понятен, и это решение вы сможете подстроить под себя.

Продолжение »

dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Давайте, сделаем удобную структуру папок. У нас будет два приложения, а также отдельная папка для общих библиотек. Сделаем мы это стандартными средствами CI, без костылей.

Структура будет следующей:

-- apps
---- backend (админка)
---- frontend
-- framework (ранее папка называлась system)
-- packages
-- backend.php
-- frontend.php

Если скачать фреймворк, в корне у нас лежит index.php, берём его за основу и дублируем два раза с названиями backend.php и frontend.php.

Заходим в backend.php, и прописываем у двух переменных следующее:

$system_path = 'framework';
$application_folder = 'apps/backend';

Тоже самое проделаем с файлом frontend.php, только указываем у переменной:

$application_folder = 'apps/frontend';

Теперь папки apps/backend и apps/frontend независимы. Теперь вы можете их наполнить. Какие папки можно туда положить? Всё что было в папке application (если скачали фреймворк, эта папка есть по-умолчанию).

Добавим в корень .htaccess:

DirectoryIndex frontend.php
RewriteEngine on
RewriteBase /
# Hide the application and system directories by redirecting the request to index.php
RewriteCond $1 !^(frontend\.php|backend\.php|images|robots\.txt)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^backend$ backend\.php [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^backend/(.*)$ backend\.php/$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ frontend\.php/$1 [L,QSA]

Теперь сделаем папку с общими библиотекам, конфигами и тд. Создаём папку packages, затем добавляем в неё папку с вашим названием пакета и прописываем в конфиге autoload. В каком приложении вам нужен пакет в том конфиге и прописываем:

$autoload['packages'] = ['packages/candy'];

Пример файла роутов для приложений:

// apps/backend/config/routes.php
$route['backend'] = "home/index";
$route['backend/sign-in'] = "user/sign_in";

$route['default_controller'] = "home";
$route['404_override'] = 'home/show404';

// apps/frontend/config/routes.php
$route['sign-in'] = "user/sign_in";

$route['default_controller'] = "home/index";
$route['404_override'] = 'home/show404';
Сниппет,  PHP

CodeIgniter named scope

samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Именованные группы условий — очень полезная штука и хорошо известна всем, кто работал с Yii. В примере выше показано как их можно реализовать в CodeIgniter.

class Post extends Model
{
    function __construct() {
        parent::__construct();
        $this->db->from('post')->order_by("created_at", "desc");
    }
 
    function limit($number) {
        $this->db->limit($number);
        return $this;
    }
 
    function all() {
        return $this->db->get()->result();        
    }
}

$posts = $this->post->limit(10)->find();
foreach($posts as $post) {
	// ..
dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Бывают моменты, когда необходимо сделать базовый запрос в вашей модели, например выводить записи с учётом языка. Данный пример показывает, как не дублировать постоянно код в каждом методе модели.

class Post extends CI_Model {
  
	protected $table = 'posts';
  
  	public function __construct() {
		$this->load->database(); 
    }
  
	/**
	 * Базовый запрос с ограничением по языку
	 */
    private function base_query() {
    	$lang = $this->session->userdata('lang') ? $this->session->userdata('lang') : 'ru';

        return $this->db->where('lang', $lang);
    }
  	
	/**
	 * Выборка всех постов
	 */
  	public function get_posts() {
		$query = $this->base_query()->get($this->table);

		return !is_null($query->row()->id) ? $query->row() : false;
    }
}
dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Этот стэш я часто использую в проектах — особенно полезно, когда в качестве загрузки файлов вы используете такой вариант: у вас множество input=file, на js можно сделать добавление этих input. После отправки формы все указанные файлы буду загружены.

Такой вариант удобен, не требует наличия flash.

$dir  = strtolower(random_string('alnum', 9));
$path = FCPATH . 'storage/' . $dir;

if (file_exists($path) === false){
    mkdir($path, 0777);
}

$config = [
    'upload_path' => $path,
    'allowed_types' => '*',
    'encrypt_name' => TRUE,
];

$this->load->library('upload', $config);

foreach ($_FILES as $key => $value) {
    if ( ! $this->upload->do_upload($key)) {
        $invalid = $this->upload->display_errors();
        print_r($invalid);
    }
}