Разделы
Veselov CV | vvShop © 2008 – 2017
Контакты
email: igor@veselov.sumy.ua
skype: utz0r2
» » » Страница 48

Пишем загрузку изображения на php+ajax+jquery+jquery.form


Пишем загрузку изображения на php+ajax+jquery+jquery.form

Для начала делаем форму upload.html (в контейнере preview будет показываться миниатюрка):
<form id="imageform" method="post" enctype="multipart/form-data" action='ajaximage.php'>
Загрузить пикчу <input type="file" name="photoimg" id="photoimg" /><div id='preview'></div>
</form>

Моторчик который обрабатывает форму ajaximage.php:
<?php
$path = "uploads/"; // куда заливаем

$valid_formats = array("jpg", "png", "gif", "bmp","jpeg"); // допустимые форматы

if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") // пришел запрос
{
    $name = $_FILES['photoimg']['name']; // имя файла
    $size = $_FILES['photoimg']['size']; // размер файла
    if(strlen($name))
    {
        list($txt, $ext) = explode(".", $name); // разбиваем на имя и формат
        if(in_array($ext,$valid_formats))    // смотрим формат такой как мы разрешили?!
        {
            if($size<(1024*1024)) // Ограничиваем размер файла в 1 мб
             {
             $actual_image_name = time().$session_id.".".$ext; // задаем уникальное имя файлику
             $tmp = $_FILES['photoimg']['tmp_name'];
            if(move_uploaded_file($tmp, $path.$actual_image_name)) // переносим файл с tmp в наш каталог
             {
                echo "<img src='uploads/".$actual_image_name."' class='preview'>"; // показываем привьюшку
             }
            else echo "облом";
             }
            else echo "Размер файла больше одного мб";
        }
        else echo "Формат не подходит.";
    }
    else echo "Пожалуйста выбирите изображение!";
    exit;
}


А что бы это все было аяксовым подключаем jquery и jquery.form (http://jquery.malsup.com/form/)
<script type="text/javascript" src="http://ajax.googleapis.com/
ajax/libs/jquery/1.5/jquery.min.js"></script>
<script type="text/javascript" src="jquery.form.js"></script>

И последний штрих:
<script>
$(document).ready(function() //готов
{
$('#photoimg').live('change', function() //photoimg изменился?!
{
$("#preview").html(''); // чистим preview
$("#preview").html('<img src="loader.gif" alt="Uploading...."/>'); //показываем картинку загрузки
$("#imageform").ajaxForm( //отправляем аякс запрос (тут уже действует jquery.fomr
{
target: '#preview'
}).submit();
});
});
</script>

Простейшая из функций защиты от роботов, капча


Простейшая из функций защиты от роботов, капча

<?php
function generate_code () {
  srand (time());
  $num=round(rand(1,4));
  $valid=0;
  echo "$num-й код из чисел: ";
  for ($i=1; $i<5; $i++) {
   $n=round(rand(1000,9999));
   if ($i==$num) $valid=$n;
   echo "$n";
   if ($i<4) echo ", ";
   else echo '<br/>';
  }
  $valid1=md5($valid);
  echo "<input type=text name=code size=4 maxlength=4 value=\"\"><input type=hidden name=valid value=\"$valid1\">";
}

//Вызов
echo generate_code();

//Проверка
if ( empty($_POST['code']) or empty($_POST['valid']) or md5($_POST['code'])!=$_POST['valid'] )
    die('Капчу запили блеать!');
+ Не использует сессии

Скрыть ссылки


Скрыть ссылки

Скрыть ссылку при помощи JS
<a href="http://фейковая_ссылка/" mce_href="http://фейковая_ссылка/" 
target=_blank onclick="this.href='http://реальная_ссылка'">Замануха</a>
К стандартной ссылке добавляется атрибут onclick, в котором указывается настоящий адрес, по которому перейдёт пользователь при клике по ссылке. А в стандартной записи a href="" указываем адрес, который будет видеть пользователь при наведении на ссылку.

Скрыть ссылку при помощи PHP
Создаем пхп файл у себя на сервере с содержанием:
<? header ("location: http://реальная_ссылка"); ?>


Скрываем ссылку через файл .htaccess
Redirect 302 /fake_link http://реальная_ссылка/на_чего-нибудь


Скыть ссылку через сервис коротких ссылок - например bit.ly

Правильное ЧПУ для сайта


Правильное ЧПУ для сайта

Функции взяты с какой-то CMS.
<?php
    function getUri() {
        $requestURI = explode('/', $_SERVER['REQUEST_URI']);
        $scriptName = explode('/',$_SERVER['SCRIPT_NAME']);

        for($i= 0;$i < sizeof($scriptName);$i++) {
            if ($requestURI[$i] == $scriptName[$i]) {
                unset($requestURI[$i]);
            }
        }
        
        $uri = array_values($requestURI);

        if(isset($uri[0])) { $pos = strrpos($uri[0], "?"); if ($pos === false) { $uri[0] = sanitizeURL($uri[0]); } else { $uri[0] = sanitizeURL(substr($uri[0], 0, $pos)); } }
        if(isset($uri[1])) { $pos = strrpos($uri[1], "?"); if ($pos === false) { $uri[1] = sanitizeURL($uri[1]); } else { $uri[1] = sanitizeURL(substr($uri[1], 0, $pos)); } }
        if(isset($uri[2])) { $pos = strrpos($uri[2], "?"); if ($pos === false) { $uri[2] = sanitizeURL($uri[2]); } else { $uri[2] = sanitizeURL(substr($uri[2], 0, $pos)); } }
        if(isset($uri[3])) { $pos = strrpos($uri[3], "?"); if ($pos === false) { $uri[3] = sanitizeURL($uri[3]); } else { $uri[3] = sanitizeURL(substr($uri[3], 0, $pos)); } }
        if(isset($uri[4])) { $pos = strrpos($uri[4], "?"); if ($pos === false) { $uri[4] = sanitizeURL($uri[4]); } else { $uri[4] = sanitizeURL(substr($uri[4], 0, $pos)); } }
        if(isset($uri[5])) { $pos = strrpos($uri[5], "?"); if ($pos === false) { $uri[5] = sanitizeURL($uri[5]); } else { $uri[5] = sanitizeURL(substr($uri[5], 0, $pos)); } }

        return $uri;
    }
    
    function sanitizeURL($url) {
         $url = trim($url);
         $url = rawurldecode($url);
         $url = str_replace(array('--','&quot;','!','@','#','$','%','^','*','(',')','+','{','}','|',':','"','<','>',
                                  '[',']','\',';',"'",',','/','*','+','~','`','laquo','raquo',']>','&#8216;','&#8217;','&#8220;' ,'&#8221;'
,'&#8211;' ,'&#8212;'),
                            array('-','-','','','','','','','','','','','','','','','','','','','','','','','','','','','',''),
                            $url);
         $url = str_replace('--','-',$url);
         $url = rtrim($url, "-");
         return $url;
     }    
    
    print_r(getUri());

.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Скрипт разбивает ГЕТ запрос и создает массив. В данной реализации можно вводить до 6 параметров http://site/param1/param2/../param6.

Список товаров в категории ShopOS


Список товаров в категории ShopOS

Немного теории:
http://www.getinfo.ru/article610.html - крутая статья!
http://phpclub.ru/detail/article/db_tree

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

Для начало нужно было получить вот такое меню:
Список товаров в категории ShopOS

Что бы при нажатии на главную категорию выпадал список товаров. Не долго мучаясь отписал на официальном форуме . Увы ответов не получил, готовых решений нет. Понял, что придётся самому.

С ЧПУ (вставить в index.html вашего шаблона):
<ul id="my-menu">
        {php}        
        $sql = "SELECT cat.categories_id, cd.categories_name FROM vip_categories cat, vip_categories_description cd WHERE cat.categories_status = '1' AND cd.categories_id = cat.categories_id";
        $sql = osDBquery($sql);
        while ($row = os_db_fetch_array($sql)) {
                $menu[$row['categories_id']] = $row['categories_name'];
        }
        foreach ($menu as $CatId => $CatName )
        {
            echo "<li><a href=\"#\">".$CatName."</a>";
            echo "<ul>";
                $query = "SELECT * FROM
                    vip_products p,
                    vip_products_description pd,
                    vip_products_to_categories p2c,
                    vip_categories c
                WHERE
                    c.categories_status='1'
                    and p.products_status = '1'
                    and p.products_id = p2c.products_id
                    and p.products_id=pd.products_id
                    and p2c.categories_id = '".$CatId."'
                    and c.categories_id = '".$CatId."'
                ORDER by p.products_date_added";
                $query = osDBquery($query);
                while ($row1 = os_db_fetch_array($query)) {
                    echo "<li><a href=\"{$row1['products_page_url']}\">".$row1['products_name']."</a></li>";
                }
            echo "</ul></li>";
        }
        {/php}            
</ul>


На выходе:
<ul>
    <li><a href="#">Категория 1</a>
        <ul>
            <li><a href="url">Товар 1</a></li>
            <li><a href="url">Товар 2</a></li>
            <li><a href="url">Товар 3</a></li>
        </ul>
    </li>
    <li><a href="#">Категория 2</a></li>
</ul>


Оказалось что необходимость в данном меню отпадает, но появляется новая!
Список товаров в категории ShopOS

Класс! Теперь есть еще уровень вложенности.

С ЧПУ (вставить в index.html вашего шаблона):
<ul id="my-menu">
{php}
$sql = "SELECT cat.categories_id, cat.parent_id, cat.categories_url, cd.categories_name FROM vip_categories cat, vip_categories_description cd WHERE cat.categories_status = '1' AND cd.categories_id = cat.categories_id ORDER BY cat.parent_id, cat.categories_id";
$sql = osDBquery($sql);
while ($row = os_db_fetch_array($sql)) {
        $menu[$row['parent_id']][$row['categories_id']] = $row['categories_name'];
}
foreach ($menu[0] as $CatId => $CatName )
{
 echo "<li><a href=\"#\">".$CatName."</a>";
 if (isset($menu[$CatId])) {
        echo "<ul>";
         foreach ($menu[$CatId] as $ItemId => $ItemName)
         {
          echo "<li><a href=\"#\">".$ItemName."</a>";
          echo "<ul>";
                $query = "SELECT * FROM
                        vip_products p,
                        vip_products_description pd,
                        vip_products_to_categories p2c,
                        vip_categories c
                WHERE
                        c.categories_status='1'
                        and p.products_status = '1'
                        and p.products_id = p2c.products_id
                        and p.products_id=pd.products_id
                        and p2c.categories_id = '".$ItemId."'
                        and c.parent_id = '".$CatId."'
                ORDER by p.products_date_added";
                $query = osDBquery($query);
                while ($row1 = os_db_fetch_array($query)) {
                        echo "<li><a href=\"{$row1['products_page_url']}\">".$row1['products_name']."</a></li>";
                }  
           echo "</ul>";
          echo "</li>";
         }
        echo "</ul></li>";
 } else { echo "</li>";}
}
{/php}
</ul>


На выходе:
<ul>
    <li><a href="#">Категория 1</a>
        <ul>
            <li><a href="#">ПодКатегория 1</a>
                <ul>
                    <li><a href="url">Товар 1</a></li>
                    <li><a href="url">Товар 2</a></li>
                    <li><a href="url">Товар 3</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="#">Категория 2</a></li>
</ul>



Мне ЧПУ не надо - БЕЗ ЧПУ (вставить в index.html вашего шаблона):

<ul id="my-menu">
{php}
$sql = "SELECT cat.categories_id, cat.parent_id, cat.categories_url, cd.categories_name FROM vip_categories cat, vip_categories_description cd WHERE cat.categories_status = '1' AND cd.categories_id = cat.categories_id ORDER BY cat.parent_id, cat.categories_id";
$sql = osDBquery($sql);
while ($row = os_db_fetch_array($sql)) {
        $menu[$row['parent_id']][$row['categories_id']] = $row['categories_name'];
}
foreach ($menu[0] as $CatId => $CatName )
{
 echo "<li><a href=\"/index.php?cat={$CatId}\">".$CatName."</a>";
 if (isset($menu[$CatId])) {
        echo "<ul>";
         foreach ($menu[$CatId] as $ItemId => $ItemName)
         {
          echo "<li><a href=\"/index.php?cat={$ItemId}\">".$ItemName."</a>";
          echo "<ul>";
                $query = "SELECT * FROM
                        vip_products p,
                        vip_products_description pd,
                        vip_products_to_categories p2c,
                        vip_categories c
                WHERE
                        c.categories_status='1'
                        and p.products_status = '1'
                        and p.products_id = p2c.products_id
                        and p.products_id=pd.products_id
                        and p2c.categories_id = '".$ItemId."'
                        and c.parent_id = '".$CatId."'
                ORDER by p.products_date_added";
                $query = osDBquery($query);
                while ($row1 = os_db_fetch_array($query)) {
                        //echo "<pre>";
                        //print_r($row1);
                        //echo "</pre>";
                        echo "<li><a href=\"/product_info.php?products_id={$row1['products_id']}\">".$row1['products_name']."</a></li>";
                }  
           echo "</ul>";
          echo "</li>";
         }
        echo "</ul></li>";
 } else { echo "</li>";}
}
{/php}
</ul>


На выходе:
<ul>
    <li><a href="/index.php?cat=ID">Категория 1</a>
        <ul>
            <li><a href="/index.php?cat=ID">ПодКатегория 1</a>
                <ul>
                    <li><a href="/product_info.php?products_id=ID">Товар 1</a></li>
                    <li><a href="/product_info.php?products_id=ID">Товар 2</a></li>
                    <li><a href="/product_info.php?products_id=ID">Товар 3</a></li>
                </ul>
            </li>
            <li><a href="/index.php?cat=ID">ПодКатегория 2</a></li>
            <li><a href="/index.php?cat=ID">ПодКатегория 3</a></li>
        </ul>
    </li>
    <li><a href="#">Категория 2</a></li>
</ul>

Получили что хотели, на не совсем так. Теперь я не могу попасть в раздел КАТЕГОРИИ, он то не кликабельный (я использую ява меню при клике на категорию выпадает вложенный UL), а это существенно и в ТЗ прописано.

Поэтому этот вариант мне не подходит, совсем. Будем работать с {$box_CATEGORIES}.

Идем в наш_сайт\themes\наш_шаблон\source\inc\show_category.inc.php. Проверяем что бы параметр $MaxLevel равен был 1, это значит, что по умолчанию будет показываться 1 уровень вложенности.
В том же файлике находим:
if ($old_level > $level) {

и после вставляем:
                        if ( isset($GLOBALS['cPath']) ) { 
                            if ( !strpos($GLOBALS['cPath'], "_")===false ) {
                            $path = explode('_',$GLOBALS['cPath']);
                                $query = "SELECT * FROM
                                    vip_products p,
                                    vip_products_description pd,
                                    vip_products_to_categories p2c,
                                    vip_categories c
                                WHERE
                                    c.categories_status='1'
                                    and p.products_status = '1'
                                    and p.products_id = p2c.products_id
                                    and p.products_id=pd.products_id
                                    and p2c.categories_id = '".$path[1]."'
                                    and c.parent_id = '".$path[0]."'
                                ORDER by p.products_date_added";
                                $query = osDBquery($query);
                                $categories_string .= "<ul>";
                                while ($row1 = os_db_fetch_array($query)) {
                                    $categories_string .= "<li><a href=\"/product_info.php?products_id={$row1['products_id']}\">".$row1['products_name']."</a></li>";
                                }      
                                $categories_string .= "</ul>";
                            }
                        }

Итого: если есть параметр cPath (он показывает категорию текущую), то смотрим вложенная она, если да, то разбиваем и получаем айди категории и подкатегории. А дальше запрос - рисуем список.
Список товаров в категории ShopOS

Теперь, когда вы нажимаете на подкатегорию выпадает еще и список товаров. Оптимизируйте и ковыряйте -) Да и не забудьте в коде поменять префикс БД на свой.

UPD 02.09.11. для еще одного уровня + оптимизирован код.
вставить в оригинальный файл show_category.inc.php после ( $foo[$cid]['name'].$ProductsCount. ''; - 114 строчка)
                        if ($level == 3) {
                            if ( !empty($Aktiv)) {
                                //$categories_string .= $cid;
                                $query = "SELECT * FROM
                                    vip_products_to_categories p2c,
                                    vip_products p,
                                    vip_products_description pd
                                WHERE
                                    p2c.categories_id = '".$cid."'
                                    and p.products_status = '1'
                                    and p.products_id = p2c.products_id
                                    and p.products_id=pd.products_id
                                ORDER by p.products_date_added";
                                $query = osDBquery($query);
                                $categories_string .= "<ul>";
                                while ($row1 = os_db_fetch_array($query)) {
                                    $categories_string .= "<li />[url=/product_info.php?products_id={$row1[]".$row1['products_name']."[/url]";
                                }      
                                $categories_string .= "</ul>";
                            }
                        }

Запуск php в фоновом режиме


Запуск php в фоновом режиме

Столкнулся с необходимостью запустить скрипт в фоновом режиме. Гугле подсказывает, что можно:

Если есть возможность использовать set_time_limit(), то можно попробовать применить следующую конструкцию:

<?php
ignore_user_abort(1);  // Игнорировать обрыв связи с браузером
set_time_limit(0);       // Время работы скрипта неограниченно
do{
   // Что хотим, то воротим..
     if (file_exists( 'stop.txt'  ))
      break;                //Остановка скрипта, работающего в фоновом режиме
} while( true );
?>

Если же нету, то можно использовать этот метод:

<?php
$start_time = microtime();                               // Узнаем время запуска скрипта
$start_array = explode(' ',$start_time);             // Разделяем секунды и миллисекунды
$start_time = $start_array[1] + $start_array[0]; // Сумируем секунды и миллисекунды получаем стартовое время скрипта
ignore_user_abort(1);                                      // Игнорировать обрыв связи с браузером
$max_exec = ini_get( 'max_execution_time' );   // Получаем максимальное время работы скрипта
do{
   // Что хотим, то воротим..
   $now_time = microtime();                             // Узнаем текущее время
   $now_array = explode(' ',$now_time);
   $now_time = $now_array[1] + $now_array[0];
   $exec_time = $now_time - $start_time;         // Вычитаем из текущего времени начальное начальное
      if (file_exists( 'stop.txt' ))
      break;                                                     // Остановка скрипта, работающего в фоновом режиме
} while($exec_time > ($max_exec - 5));           // Проверяем время работы, если до конца работы скрипта
                                                                    // осталось менее 5 секунд, завершаем работу цикла.
$http = fsockopen('site.ru', 80);                       // Запускаем этот же скрипт новым процессом и завершаем работу текущего
fputs($http, "GET http://site.ru/script.php HTTP/1.0\r\n");
fputs($http, "Host: site.ru\r\n");
fputs($http, "\r\n");
fclose($http);
?>

Вот и реализация фонового режима работы. Безболезненно остановить работу скрипта можно удалив stop.txt.

Пример ниже демонстрирует как можно запустить PHP скрипт "в фоновом режиме". Запуск скрипта инициируется запросом скрипта по HTTP, но выполнение скрипта не заканчивается при обрыве соединения. Может использоваться для выполнения служебных действий на стороне сервера при невозможности использования для этих целей системной утилиты cron.

<?php
function doSomthing()
{
    // here we do somthing on server side
}
ignore_user_abort(false);
if (ob_get_level() == 0)
    ob_start();
// redirect lient to some site or abort connecion
header("Location: http://www.example.com/");
ob_flush();
flush();
$counter = 1;
while (true)
{
    ob_flush();
    flush();
    sleep(1);
    doSomthing();
    $counter++;
    if ($counter == 30)
        break;
}
ob_end_flush();
?>

Вот такие дела, остановился все же на CRON'e без гемморно и по моему правильней всего -)
«»
Вверх