• Как проще реализовать эту идею?

    kimono
    @kimono
    Web developer
    class Order {
      const SECRET_KEY = 'not-log-secret-key-2213123123';
    }

    $token = Yii::$app->security->hashData($order->id, Order::SECRET_KEY);

    В письме:
    Для подтверждения пройдите по <a href="http://site.domain/order/confirm?token=<?= $token ?>">ссылке</a>

    Для подтверждения:
    class OrderController extends Controller {
      public function actionConfirm($token){
        if ($id = \Yii::$app->security->validateData($token, Order::SECRET_KEY)){
          if (($order = Order::findOne($id)) && $order->updateAttributes(['confirmed' => true])){
            Yii::$app->session->addFlash('success', 'Талон подтвержден');
            return $this->redirect('orders');
          }
        }
    
        throw new NotFoundHttpException();
      }
    }
    Ответ написан
    9 комментариев
  • PHP обрезка текста с учетом кода HTML?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    /**
    * Truncates text.
    *
    * Cuts a string to the length of $length and replaces the last characters
    * with the ending if the text is longer than length.
    *
    * ### Options:
    *
    * - `ending` Will be used as Ending and appended to the trimmed string
    * - `exact` If false, $text will not be cut mid-word
    * - `html` If true, HTML tags would be handled correctly
    *
    * @param string  $text String to truncate.
    * @param integer $length Length of returned string, including ellipsis.
    * @param array $options An array of html attributes and options.
    * @return string Trimmed string.
    * @access public
    * @link http://book.cakephp.org/view/1469/Text#truncate-1625
    */
    function truncate($text, $length = 100, $options = array()) {
        $default = array(
            'ending' => '...', 'exact' => true, 'html' => false
        );
        $options = array_merge($default, $options);
        extract($options);
    
        if ($html) {
            if (mb_strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
                return $text;
            }
            $totalLength = mb_strlen(strip_tags($ending));
            $openTags = array();
            $truncate = '';
    
            preg_match_all('/(<\/?([\w+]+)[^>]*>)?([^<>]*)/', $text, $tags, PREG_SET_ORDER);
            foreach ($tags as $tag) {
                if (!preg_match('/img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param/s', $tag[2])) {
                    if (preg_match('/<[\w]+[^>]*>/s', $tag[0])) {
                        array_unshift($openTags, $tag[2]);
                    } else if (preg_match('/<\/([\w]+)[^>]*>/s', $tag[0], $closeTag)) {
                        $pos = array_search($closeTag[1], $openTags);
                        if ($pos !== false) {
                            array_splice($openTags, $pos, 1);
                        }
                    }
                }
                $truncate .= $tag[1];
    
                $contentLength = mb_strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $tag[3]));
                if ($contentLength + $totalLength > $length) {
                    $left = $length - $totalLength;
                    $entitiesLength = 0;
                    if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $tag[3], $entities, PREG_OFFSET_CAPTURE)) {
                        foreach ($entities[0] as $entity) {
                            if ($entity[1] + 1 - $entitiesLength <= $left) {
                                $left--;
                                $entitiesLength += mb_strlen($entity[0]);
                            } else {
                                break;
                            }
                        }
                    }
    
                    $truncate .= mb_substr($tag[3], 0 , $left + $entitiesLength);
                    break;
                } else {
                    $truncate .= $tag[3];
                    $totalLength += $contentLength;
                }
                if ($totalLength >= $length) {
                    break;
                }
            }
        } else {
            if (mb_strlen($text) <= $length) {
                return $text;
            } else {
                $truncate = mb_substr($text, 0, $length - mb_strlen($ending));
            }
        }
        if (!$exact) {
            $spacepos = mb_strrpos($truncate, ' ');
            if (isset($spacepos)) {
                if ($html) {
                    $bits = mb_substr($truncate, $spacepos);
                    preg_match_all('/<\/([a-z]+)>/', $bits, $droppedTags, PREG_SET_ORDER);
                    if (!empty($droppedTags)) {
                        foreach ($droppedTags as $closingTag) {
                            if (!in_array($closingTag[1], $openTags)) {
                                array_unshift($openTags, $closingTag[1]);
                            }
                        }
                    }
                }
                $truncate = mb_substr($truncate, 0, $spacepos);
            }
        }
        $truncate .= $ending;
    
        if ($html) {
            foreach ($openTags as $tag) {
                $truncate .= '</'.$tag.'>';
            }
        }
    
        return $truncate;
    }


    https://stackoverflow.com/a/16583897
    Ответ написан
    Комментировать
  • Как найти дубликаты в MySQL?

    Sanovskiy
    @Sanovskiy
    Веб-разработчик с 2005 года
    Дубликаты ищем группируя по значению и фильтруя те, которых меньше двух
    Пример
    SELECT
        valueField1,
        valueField2,
        count(*)
    FROM
        myTable
    GROUP BY
        valueField1,
        valueField2
    HAVING
        count(*)>1

    Не забудьте указать все значимые поля.

    Удалять по какому принципу? Все, кроме первого попавшегося?
    Ответ написан
    3 комментария
  • Где достать либу для склонения слов и приведение их к числу?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если вам просто нужно правильно склонять слова, в зависимости от числа, то это всего несколько строк (на разных ЯП). На PHP:
    /**
     * Функция возвращает окончание для множественного числа слова на основании числа и массива окончаний
     * param  $number Integer Число на основе которого нужно сформировать окончание
     * param  $endingsArray  Array Массив слов или окончаний для чисел (1, 4, 5),
     *         например array('яблоко', 'яблока', 'яблок')
     * return String
     */
    function getNumEnding($number, $endingArray)
    {
        $number = $number % 100;
        if ($number>=11 && $number<=19) {
            $ending=$endingArray[2];
        }
        else {
            $i = $number % 10;
            switch ($i)
            {
                case (1): $ending = $endingArray[0]; break;
                case (2):
                case (3):
                case (4): $ending = $endingArray[1]; break;
                default: $ending=$endingArray[2];
            }
        }
        return $ending;
    }
    Ответ написан
    1 комментарий
  • Как вывести часть текста в Yii2?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    \yii\helpers\StringHelper::truncate('Текст который нужно обрезать',150,'...');
    Ответ написан
    1 комментарий
  • OpenVpn подключается, но нельзя зайти на сайты. Почему?

    Sanes
    @Sanes
    Ох и настрадались вы похоже с настройками
    wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh

    И будет вам нормальный рабочий VPN
    Ответ написан
    1 комментарий
  • Как вставить слово через определенное количество символов+ до пробела?

    lidacriss
    @lidacriss
    wtf
    $s = "Очень длинное предложение каждый раз  разное поэтому привязки к определенным символам класс ам нет и не будет";
    $insert = '[spoiler]';
    $str = preg_replace('#^(.{30}\S*?) #', "$1 {$insert} ", $s);
    Ответ написан
    2 комментария