Архивы по Категориям: php

Микрофреймворки

Два полезных микрофрейма для всяких быстропроектов.

https://www.slimframework.com/docs/tutorial/first-app.html

и

https://lumen.laravel.com/docs/5.5

Еще одна полезная либа

Микролиба мейлер на php

https://github.com/anton-pribora/ApMailer

На всяких быстро-лендингах и прочей мелочевке очень пригодится.
Особенно удобно, что умеет копию письма схоронять локально.
Ну и html с аттачами — прям изи.

Вы также любите регекспы, как люблю их я?

Обожаю писать регулярки. Помнить все типы, модификаторы и операторы, что нужно экранировать, а что нет. Писец короч.
Так вот оказывается есть чудесная либа:
https://github.com/gherkins/regexpbuilderphp

и она умеет так:

$regExp = $builder
->startOfInput()
->exactly(4)->digits()
->then("_")
->exactly(2)->digits()
->then("_")
->min(3)->max(10)->letters()
->then(".")
->anyOf(array("png", "jpg", "gif"))
->endOfInput()
->getRegExp();

//true
$regExp->matches("2020_10_hund.jpg");
$regExp->matches("2030_11_katze.png");
$regExp->matches("4000_99_maus.gif");

//false
$regExp->matches("123_00_nein.gif");
$regExp->matches("4000_0_nein.pdf");
$regExp->matches("201505_nein.jpg");

Как же это охуенно!

yii переводы

Вот что значит по верхам читать маны:

Сидел ручками заполнятл messages/*.php  файлики. Копипаст, перевод, копипаст…

А оказывается:

yyic message /path/to/messageconfig.php

и всё — файлы перевода генерятся автоматически. Yiiшка и это тоже умеет.

Формат конфига:

return array(
    'sourceLanguage'=>'ru',
        'sourcePath'=>dirname(__FILE__).'/../',
        'messagePath'=>dirname(__FILE__).'/../messages',
        'languages'=>array('ru','en'),
        'fileTypes'=>array('php'),
        'overwrite'=>true,
        'exclude'=>array(
                '.svn',
                '.gitignore',
                'yiilite.php',
                'yiit.php',
                '/i18n/data',
                '/messages',
                '/vendors',
                '/web/js',
                '/yii',
                '/extensions',
                '/migrations',
        ),
        'removeOld' => true,
        'sort' => true,
);

Заставить opencart работать быстрее

Полезные материал по оптимизации опенкарта  (проверено,  реально существенно ускоряют oc):

Серверная оптимизация (файлики тут)   (на новых версиях не работает)

Клиентская оптимизация

Ну и полезный хак (багфикс) на закуску: тут

 

 

«Чем так плох OpenCart» и как сделать его лучше

Есть такая замечательная статья «Чем так плох opencart«, рекомендую к прочтению всем, кто занимается разработкой под него родимого. Все правильно говорит автор.

Теперь о выводах. Выводы просты: кодите под opencart? Не повторяйте ошибок его производителей)

Итак, пишем модуль доставки. Погнали.

Подгружаем языки (речь тут идет об админке):
в контроллере:

$this->data['lang'] = $this->load->language('shipping/myshipping');

в шаблоне

<td><?php echo $lang['entry_name']; ?></td>

Просто? Просто! А экономит процентов 40 экранного пространства и читать код проще и новые переменные вводить. Окда.

Дальше:
в контроллере:

 $vars = array('my_shippingvar','my_status', 'my_sort_order',);

и перечисляем имена переменных настроек, которые юзер вводит в форме (шаблоне)

                        <tr>
                            <td><?php echo $lang['entry_sort_order']; ?></td>
                            <td><input type="text" name="my_sort_order" value="<?php if (isset($my_sort_order)) echo $my_sort_order; ?>" /></td>
                        </tr>

чуть ниже перечисления имен переменных в контроллере заюзаем их:

        foreach ($vars as $var) {
            if (isset($this->request->post[$var])) {
                $this->data[$var] = $this->request->post[$var];
            } else {
                $this->data[$var] = $this->config->get($var);
            }
        }

А весь код типа

  if (isset($this->request->post['my_sort_order'])) {
 $this->data['my_sort_order'] = $this->request->post['my_sort_order'];
 } else {
 $this->data['my_sort_order'] = $this->config->get('my_sort_order');
 }

можно смело грохнуть к чертовой бабушке.

Опа-опа-опа-па! Еще процентов 40 спагетти ушло,  наш контроллер похудел почти в три раза. Дальше приводим в чувства витринную часть,  модель и тд.

Хочешь что-то изменить — начни с себя. А там глядишь и до глав.разрабов дойдет.

Губка Боб квадратные превьюхи! История про 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

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

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

yii gridview row click

Потребовалось в гриде (view/admin.php) сделать переход на редактирование записи по клику в любом месте строки.

Решение с yii форума — простое и красивое:

widget('zii.widgets.grid.CGridView', array(
    ...
    'htmlOptions'=>array(style=>'cursor: pointer;'),
    'selectionChanged'=>"function(id){window.location='" . Yii::app()->urlManager->createUrl('controller/action', array('id'=>'')) . "' + $.fn.yiiGridView.getSelection(id);}",
    ...
)); ?>

(c) форум

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

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

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

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

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

Зашибись!

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

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

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

setlocale(LC_NUMERIC, "C");

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