Архивы: php

Губка Боб квадратные превьюхи! История про K2, джумлу, превьюшки и адаптивный дизайн…

Потребовалось сделать один вроде бы несложный модуль для jooml’ы, чтобы выводил случайные материалы (они же товары) из k2 в стиле опенкарта. Причем желательно, чтоб эти материалы были в <div class=»span2″>  бутстраповский обернуты.

Как-то так:

thu

Ничего особо сложного. Переопределил в шаблоне default.php из mod_k2_content/Default все что надо было — ок, все збс. Кроме одного. Картинки small images кадвашные ресайзятся по-умолчанию только по  ширине. И в итоге получаем не красивую строку из карточек товаров одинаковой высоты, а ад и погибель: все карточки разной высоты. Строка плывет.  Отсюда мораль — надо ресайзить картинки, чтоб они стали квадратными. Подключаем в нашем родном шаблоне default.php свою либу, дописываем

                       <?php
                            $image=  thResize($item->image);
                        ?>


                            <a class="moduleItemImage" href="<?php echo $item->link; ?>" title="<?php echo JText::_('K2_CONTINUE_READING'); ?> &quot;<?php echo K2HelperUtilities::cleanHtml($item->title); ?>&quot;">
                                <img src="<?php echo $image; ?>" alt="<?php echo K2HelperUtilities::cleanHtml($item->title); ?>"/>
                            </a>

А в нашу либу добавляем следующий хак:

function get_file_extension($path ) {
    return pathinfo($path, PATHINFO_EXTENSION);

}

function makeThumb($source, $destination, $square_size = 167, $quality = 90) {

    $status = false;
    list($width, $height, $type, $attr) = getimagesize($source);

    if ($width > $height) {
        $width_t = $square_size;
        $height_t = round($height / $width * $square_size);
        $off_y = ceil(($width_t - $height_t) / 2);
        $off_x = 0;
    } elseif ($height > $width) {

        $height_t = $square_size;
        $width_t = round($width / $height * $square_size);
        $off_x = ceil(($height_t - $width_t) / 2);
        $off_y = 0;
    } else {

        $width_t = $height_t = $square_size;
        $off_x = $off_y = 0;
    }

    $thumb_p = imagecreatetruecolor($square_size, $square_size);

    $extension =get_file_extension($source);

    if ($extension == "gif" or $extension == "png") {

        imagecolortransparent($thumb_p, imagecolorallocatealpha($thumb_p, 0, 0, 0, 127));
        imagealphablending($thumb_p, false);
        imagesavealpha($thumb_p, true);
    }

    if ($extension == 'jpg' || $extension == 'jpeg')
        $thumb = imagecreatefromjpeg($source);
    if ($extension == 'gif')
        $thumb = imagecreatefromgif($source);
    if ($extension == 'png')
        $thumb = imagecreatefrompng($source);

    $bg = imagecolorallocate($thumb_p, 255, 255, 255);
    imagefill($thumb_p, 0, 0, $bg);

    imagecopyresampled($thumb_p, $thumb, $off_x, $off_y, 0, 0, $width_t, $height_t, $width, $height);

    if ($extension == 'jpg' || $extension == 'jpeg')
        $status = @imagejpeg($thumb_p, $destination, $quality);
    if ($extension == 'gif')
        $status = @imagegif($thumb_p, $destination, $quality);
    if ($extension == 'png')
        $status = @imagepng($thumb_p, $destination, 9);

    imagedestroy($thumb);
    imagedestroy($thumb_p);

    return $status;
}

function thResize($image) {
    $path_parts = pathinfo($image);
    $image_new = $path_parts['dirname'] . '/t200_' . basename($image);

    if (makeThumb(JPATH_ROOT .$image, JPATH_ROOT .$image_new, $square_size = 200, $quality = 100)) {
        return $image_new;
    }
}

На выходе имеем квадратные thumbnailы 200×200, с белой окантовкой если до нужного размера не дотянули.  (потом  параметры можно из настроек потягать, но пока это не актуально, все равно img в бутстраповском divе на 100% по ширине растягивается.)

Решение найдено тут: http://stackoverflow.com/questions/16664744/square-thumbnail-advance

DATE(NOW())) != date(‘Y-m-d’)

PHP и mysql могут показывать разное время (ну и даты соответственно)
php:

<?php
echo date('Y-m-d');
?>

Результат: 2014-03-02

и mysql

SELECT DATE(NOW());

Результат: 2014-03-03

Что-то с часовыми поясами походу.

Не стоит больше использовать такое сравнение =\

php, float: запятая, точка и opencart

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

В инсертах мускулевых эти переменные выглядят так: (float)$price.

Ок, проблема локализована, что-то не так с флоатом. Смотрим:

<?php
echo (float)'1.22'; // 1,22
?>

Зашибись!

Правится так: из консоли никсовой

php -r 'setlocale("LC_NUMERIC", "C");'

или если у вас шаред, то

setlocale(LC_NUMERIC, "C");

В опенкарте это можно запихать в config.php

opencart «Новые поступления» и «Лидеры продаж» — показывать товары только из категории

Есть такие дефолтные модули в opencart’е — latest и bestseller, так вот — разместив их на лайаут Category мы видим фигню: в категории «Гробы» — врезка «Новинки», а в ней показываются товары типа «Презерватив светящийся», «Нос клоунский» и т.д. Короче показывает новинки из других категорий. Это не есть гуд. Лезем на myopencart и наблюдаем печальную картину — нужные нам модули продают за денежку :((
Мы пойдем другим путем.

1. Лезем в catalog/controller/module/latest.php
перед

protected function index($setting) {<

добавляем:

private function _endc( $array ) { return end( $array ); }

2. потом, перед

$results = $this->model_catalog_product->getProducts($data);

вставляем:

if ((isset($this->request->get['route'])) AND ($this->request->get['route'] == 'product/category'))
        {
            $category_id = $this->_endc(explode('_', (string)$this->request->get['path']));        
            $data['filter_category_id'] = $category_id;
            $data['filter_sub_category'] = TRUE;
        }
        
        
        if ((isset($this->request->get['route'])) AND (isset($this->request->get['manufacturer_id'])) AND ($this->request->get['route'] == 'product/manufacturer/product'))
        {
            $manufacturer_id = $this->request->get['manufacturer_id'];        
            $data['filter_manufacturer_id'] = $manufacturer_id;            
        }

И теперь на странице категории — новинки только из нее. А бонусом та же песня и со страничкой производителей.

За модуль спасибо aduakasoft.com, кажется только они решились выложить своё решение бесплатно на opencart.com

миграция ocstore 0.2.0 -> 1.0.1

Как произвести миграцию на новый (сочни, мжвячни!) оцсторе можно прочитать тут.

От себя могу добавить, что после этой миграции некоторые старые модули с диким воплем крашатся:
PHP Fatal error: Cannot access private property Document::$title in блаблабла.php

Лечится сие просто.
Заходим в папку с нашим магазином и делаем там:

find . -type f -name '*.php' -print | xargs egrep -i 'document->title'

в найденных файлах правим:

вместо:
$this->document->title = $this->language->get('heading_title');

пишем:
$this->document->setTitle($this->language->get('heading_title'));

после этого фиксим еще один вредный баг.
после мигарции в админке везде в заказах показывает цены «итого» и «цена за единицу» — 0.00р
лезем пыхпыхмайадмин (ну или как вам будет удобно) и делаем там следующее:

UPDATE `ВАША_ТАБЛИЦА`.`order` SET `currency_code` = 'rub',`currency_value` = '1' WHERE `order`.`currency_value` = 0.00000000;

1C выгрузка + обработка php = xynta какая-то

При выгрузке из 1С-ки (в xml, для последующей вгрузки в php скриптик) индус-програмизд набыдлокодил цены в формате «12 636″. Т.е. пробел в цифру засунул.
Молодец.
Вгружаю — xynta какая-то вгружается. Не удаляется пробел этот.
Полез в код. Попробовал разные методы и str_replace (» «, «») и preg_replace на \s и \t натравливал и т.д. и т.п. хрен-то-там!
Не удаляются пробелы и всё!

Лечится только одним способом:

	function tonumericstr($str) {
	    $str = trim($str);
		    for($i=0;$i<=strlen($str);$i++) { if(is_numeric($str[$i]) || $str[$i]==".") { $new_str.=$str[$i]; } } 
	    return $new_str;
        }

ну или так для удобства можно сделать:

        //$dec_delim - отделяет целую часть от дробной
	function tonumericstr($str,$dec_delim='.') {
	    $str = trim($str);
		    for($i=0;$i<=strlen($str);$i++) { if(is_numeric($str[$i]) || $str[$i]==$dec_delim) { $new_str.=$str[$i]; } } 
	    return $new_str;
        }

Установка лампы в debian одной строкой

# apt-get install mysql-server mysql-client apache2 php5 php5-mysql libapache2-mod-php5 php-pear

ну и может пригодиццо:

# /usr/bin/mysqladmin -u root password ‘enter-your-good-new-password-here’

sams2 и syncfromad

Итак, есть известная проблема в самсе2 со скритпом syncfromad:
после отработки скрипта вместо синхронизации просходит внезапное удаление всех юзеров синхронизируемой группы. Несколько неожиданное поведение.
На форуме и в баг-трекере разрабы молчат-помалкивают, а оказывается баг то этот уже исправлен!
Итак, лезем в svn и дергаем оттуда свежую версию скрипта syncfromad:

wget http://svn.nixdev.net/svn/sams/trunk/php/bin/syncfromad

как мы видим этот скрипт рушится с ошибкой о том, что не найдена функция adldap::group_members. Пичалька :((
Снова лезем в свн:

wget http://svn.nixdev.net/svn/sams/trunk/php/src/adldap.php
mcedit adldap.php

ищем в нем нужную нам функцию

/**
* Return a list of members in a group
*
* @param string $group The group to query
* @param bool $recursive Recursively get group members
* @return array
*/
public function group_members($group, $recursive = NULL){

ctrl+c её родимую и ctrl+v в файл /var/www/sams2/src/adldap.php

Скрипт работает. Синхра идет. Аллилуйа!
(Если вы не забудете прописать скрипт в крон, разумеется)

wordpress кавычки косячит

Пока писал предыдущие посты заметил, что wordpress при отображении косячит кавычки. Это не есть гуд.
Лекарство подсмотрено тут.

Открываем файл wp-includes/formatting.php и ищем 40 строку, она выглядит следующим образом:

  1. $opening_quote = _x(‘&#8220;’‘opening curly quote’);  
  2. /* translators: closing curly quote */  
  3. $closing_quote = _x(‘&#8221;’‘closing curly quote’);  

и заменяем эти строки на такие:

  1. $opening_quote = _x(‘&quot;’‘opening curly quote’);  
  2. /* translators: closing curly quote */  
  3. $closing_quote = _x(‘&quot;’‘closing curly quote’);