[info]i_am_the_world


Я - весь мир, весь мир - я

Я делаю сайты - здесь все из http://ulv8888.in


Кириллица, mysql и php
[info]i_am_the_world
21:49 23.05.2012
Кириллица, mysql и php
Банально, но иногда забываю про эти мелочи; удивляюсь выводу скрипта (знакам вопроса) и вспоминаю как сделать чтобы вернуть порядок с кодировкой.
SET character_set_client = utf8
SET character_set_connection = utf8
SET character_set_results = utf8
PS Если в базе кодировка windows-1251 - соответственно cp-1251

read more at Записная книжка web-девелопера


Joomla ошибка Infinite loop detected in JError
[info]i_am_the_world
00:38 23.05.2012
Joomla ошибка Infinite loop detected in JError
Если при переносе joomla на другой хост возникает ошибка Infinite loop detected in JError - проблема на 95% с конфигурацией БД. Если данные доступа к базе правильные, значит в панели хостинга нужно дважды проверить создана ли база и существует ли пользователь с нужными правами для доступа к ней.

Прочие варианты решения данной проблемы (оставшиеся 5%):


Вариант №1. В  libraries/joomla/filesystem/folder.php вместо $obd = ini_get(’open_basedir’) написать $obd = NULL

Вариант №2. Изменить в configuration.php  $dbtype = 'mysqli' на $dbtype = 'mysql'


Вариант №3. Изменить в configuration.php пути для log  и tmp ($log_path, $tmp_path)



read more at Записная книжка web-девелопера


Синхронизация данных в 2 интернет-магазинах ч.1 - Добавление товаров
[info]i_am_the_world
14:18 15.05.2012
Синхронизация данных в 2 интернет-магазинах ч.1 - Добавление товаров
Итак, у нас есть 2 принципиально разных по структуре и реализации интернет-магазина:

  1. старый - написан 5-6-7 лет назад на perl (совсем нигде не MVC, а также все радости  функционального программирования на перле); база mySQL, но это не важно;
  2. новый - на движке opencart 1.5.1.3, база также mySQL

Есть сверхзадача - нужно сделать чтобы товары добавлялись одновременно в оба магазина через админку opencart.

Один из вариантов решения этой задачи (первый, который пришел в голову, имхо самый пролетарский) такой:

 - на принимающей стороне (старый магазин) скрипт (на перле), который:

  1. будет получать данные методом POST;
  2. в зависимости от переданных параметров он будет (естественно, после всяческих проверок): добавлять полученные данные в базу, изменять существующие или удалять;
  3. в случае добавления - на выходе он будет отдавать ключ добавленной записи;

- на передающей стороне (новый магазин):

  1. нам нужно модифицировать модели opencart (а именно фунции добавления/удаления/редактирования в админских ModelCatalogProduct и ModelCatalogCategory) так, чтобы при добавлении/удалении/редактировании товара или категории скрипт curl'ом посылал необходимые данные методом POST нашему скрипту на принимающей стороне;
  2. в базу opencart в таблицы продуктов/категорий добавить еще по одному полю - ключ соответствующей записи в старой базе;
  3. для добавлении записи - он посылает принимающему скрипту данные, введенные пользователем в админке opencart;
  4. для удаления - посылает только ключ
  5. для редактирования - и данные и ключ
Также необходимо предусмотреть элементарный механизм защиты при любом изменении данных. Хотя-бы просто передавать и проверять (при приеме) какой-нибудь пасскей. Ну, думаю, идея ясна.

Перейдем к реализации. Здесь реализовано добавление товара. Остальные операции будут в следующих постах. Замечу, что здесь приведено решение для моей конкретной задачи (т.е. для достижения гибкости и универсальности нужно часть кода переписать).

1. admin/model/catalog/product.php, функция addProduct.
class ModelCatalogProduct extends Model {
    public function addProduct($data) {
     
        // приведем в пригодный для передачи вид массив с добавляемым товаром
        // разбираем опции
        foreach ($data['product_option'][0]['product_option_value'] as $key => $value) {
            $option_value_description_query = $this->db->query("SELECT * FROM option_value_description WHERE option_value_id = " . $value['option_value_id']);
            foreach ($option_value_description_query->rows as $option_value_description) {
                $optn = $option_value_description['name'];
            }
            $options[] = array('name' => urlencode($optn), 'price' => urlencode($value['price']));
        }
        // меняем размер картинки
        $this->load->model('tool/image');
        $thumb = $this->model_tool_image->resize($data['image'], 100, 100);
       
        // наш массив
        $prd_info = array(
            'secret_key' => '1ae5f76b2234c3a0',
            'name' => urlencode($this->db->escape($data['product_description'][1]['name'])),
            'model' => urlencode($this->db->escape($data['model'])),
            'sex' => urlencode($data['manufacturer_id']), // 1 = women, 2=men, 3=unisex
            'description' => urlencode($this->db->escape($data['product_description'][1]['description'])),
            'image_full' => urlencode($data['image']),
            'image_thumb' => urlencode($thumb),
            'options' => serialize($options)
        );
        // делаем из него строку
        $fields_string = '';
        foreach ($prd_info as $key => $value) {
            $fields_string .= $key . '=' . $value . '&';
        }
        rtrim($fields_string, '&');
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, 'http://site.com/receiver.php');
        curl_setopt($curl, CURLOPT_USERAGENT, 'Opera 10.00');
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, count($prd_info));
        curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
        $res = curl_exec($curl);
        if (!$res) {
            // если ошибка
            $error = curl_error($curl) . '(' . curl_errno($curl) . ')';
            echo $error;
        } else {
            // в переменной $res у нас ключ свеже-добавленного товара
             if (is_numeric($res)) {} // ... проверяем и прочие preg_replac'ы

        }
..........
дальше идет оригинальный код функции
2. Принимающий скрипт в силу его линейности и неинтересности приводить не буду. Хотя perl люблю и уважаю.

read more at Записная книжка web-девелопера

  • Leave a comment
  • Add to Memories

linux shell - преобразовать все имена файлов в нижний регистр
[info]i_am_the_world
20:26 08.05.2012
linux shell - преобразовать все имена файлов в нижний регистр
Все имена файлов в нижний регистр преобразовываются так:
for f in `find`; do mv -v $f `echo $f | tr '[A-Z]' '[a-z]'`; done

read more at Записная книжка web-девелопера

  • Leave a comment
  • Add to Memories

opencart - похожие товары автоматически
[info]i_am_the_world
13:24 08.05.2012
opencart - похожие товары автоматически
Функция для автоматического выбора похожих по атрибутам товаров с учетом производителя для opencart 1.5.1.3.

Что здесь имеется в виду покажу на примере:
  1. У нас есть 4 товара - А, Б, В и Г.

  2. Товары А, Б и В - от производителя 1, товар Г - от производителя 2.

  3. Атрибуты товаров:
А - красный   круглый           диаметр 30мм    шершавый
Б -  красный   квадратный     диаметр 30мм    гладкий
В - синий       треугольный    диаметр 10мм    шершавый
Г - красный    круглый           диаметр 30мм    шершавый

Нужно определить похожие на А товары (например, более чем на 40%).
Имеем:
Б похож на А на 50%
В похож на А на 25%
Г похож на А на 100% (но у него другой производитель)

Итого, более чем на 40% на А похож только товар Б от производителя 1 (также похож и Г, но его мы отбрасываем). Вот систему определения похожести и реализуем.

Пойду "задом-наперед" :)
Использование функции в контроллере:
$results = $this->model_catalog_product->getProductRelated($this->request->get['product_id']); 
...
$this->data['products'][] = array(
'product_id' => $result['product_id'],
'name'     => $result['name'],
'price'   => $price,
... 
и т.п.
Ну и в view проход по массиву.
Ничего военного, в общем.

Функцию пишем в catalog/model/catalog/product.php. Сама функция:

Read more... )

read more at Записная книжка web-девелопера

  • Leave a comment
  • Add to Memories

Нормальный запуск java приложений на dwm
[info]i_am_the_world
18:35 04.05.2012
Нормальный запуск java приложений на dwm
На тайловом wm dwm у меня не работало нормально ни одно java приложение. После запуска пустое окно. Лечится это так (wmname берется с suckless.org):
wmname LG3D
unset AWT_TOOLKIT
./app

read more at Записная книжка web-девелопера

  • Leave a comment
  • Add to Memories

Быстрый поиск по массиву в php
[info]i_am_the_world
13:03 28.04.2012
Быстрый поиск по массиву в php
Есть массив в 1100 элементов. Нужно определить, есть-ли в нем элемент со значением X. Можно попробовать сделать так:

if (in_array('X',$d)) {
        $res1 = true;
    } else {
        $res1 = false;
}
Это самый простой способ поиска, время выполнения данного кода - 6.0081481.
Вот более приемлемый вариант, который работает в разы быстрее:
function fast_srch($arr,$el){
    if (!is_array($el)) {
        $e = array($el);
    } else {
        $e = $el;
    }
   
    $a1 = array_merge($arr,$e);
    $a2 = array_diff($a1,$arr);
    if (count($a2)) {
        return false;
    } else {
        return true;
    }
}
$res = fast_srch($d,'X');
И время выполнения - 0.0011916!!!

read more at Записная книжка web-девелопера


sed и преобразование строк в верхний регистр
[info]i_am_the_world
12:03 28.04.2012
sed и преобразование строк в верхний регистр
Преобразование строк в верхний регистр делается так:
echo 'slovo слово' | sed 's/[[:lower:]]/\u&/g'
Будет
SLOVO СЛОВО 
Более приближенный к жизни пример:

Read more... )

read more at Записная книжка web-девелопера

  • Leave a comment
  • Add to Memories

Формируем из строки на русском seo url в транслите на php
[info]i_am_the_world
11:03 28.04.2012
Формируем из строки на русском seo url в транслите на php
Есть: название товара "очень классный товар brand l'amour".
Нужно: сделать из строки сео урл вида ochen_klassnyiy_tovar_brand_lamour на php
Делается так:

function get_seo_keyword($str) {
    $tr = array(
        "А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
        "Д"=>"d","Е"=>"e","Ж"=>"j","З"=>"z","И"=>"i",
        "Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
        "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
        "У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch",
        "Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
        "Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
        "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
        "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
        "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
        " "=> "_", "."=> "", "/"=> "_"
    );
   
    $res = strtr($str,$tr);
   
    if (preg_match('/[^A-Za-z0-9_\-]/', $res)) $res = preg_replace('/[^A-Za-z0-9_\-]/', '', $res);

    return strtolower($res);
}



read more at Записная книжка web-девелопера

  • Leave a comment
  • Add to Memories

Преобразование даты в формат mysql
[info]i_am_the_world
19:40 26.04.2012
Преобразование даты в формат mysql

Есть дата в человеческом виде: 26.04.2012. В mysql DATE преобразовывается так:
$date = preg_replace('#(\d{2})\.(\d{2})\.(\d{2})#', '$3-$2-$1', $date);
На выходе получаем 2012-04-26

read more at Записная книжка web-девелопера

  • Leave a comment
  • Add to Memories

You are viewing [info]i_am_the_world's journal