• Как отменить коммит, но оставить все изменения?

    это отменит последний коммит, но оставит изменения
    git reset --soft HEAD~1

    а это -- дополнит текущий коммит обновленными данными.
    git commit --amend

    очень важно НЕ делать эти манипуляции если отменяемый коммит уже был залит на сервер и скачан коллегами.
    Ответ написан
  • Как заполнить PDF?

    zenden2k
    @zenden2k
    PHP & C++ programmer
    На самом деле, вопрос не так прост, как кажется.
    После долгих мучений я так и не нашел идеального варианта.
    Почти все решения, имеющиеся в инете, имеют проблемы с юникодом.
    И тут проблема может быть не только в кодировке, а и то, что в pdf файле могут отсутствовать шрифты для нужных букв, или буквы отображаются каким-то нестандартным образом.
    Почти все портят pdf файл или поддерживают далеко не все файлы (например защищенные или запакованные файл). Тут уж как повезет.
    Еще решение зависит от того, нужно ли вам, чтобы поля оставались редактируемыми, или нет.
    Если поля вы оставите редактируемыми, то может оказаться, что скажем значение в поле правильное, а отображается неправильно. Или наоборот, отображается правильно, а редактируется неправильное значение. Или вообще не отображается (например, в гугл хроме)
    Все усложняется, если в форме есть комбобоксы, радиобаттоны и т.д.

    Сперва надо узнать список полей программой pdftk:
    pdftk samplex.pdf dump_data_fields

    Вот мои варианты:

    Вариант с zend1
    нужен патченный zend pdf.php https://drive.google.com/file/d/0B_RKTUl10DcrOF9uZ...
    весь архив с zend1 https://drive.google.com/file/d/0B_RKTUl10DcrbV8wN...

    set_include_path(implode(PATH_SEPARATOR, array(
        realpath('./zend1/library/'),//the path
        get_include_path(),
    )));
    require "Zend/Loader/Autoloader.php";
    $autoloader = Zend_Loader_Autoloader::getInstance();
    
    $pdf = Zend_Pdf::load('form.pdf');
    $pdf->setTextField("name","value");
    $pdf->save('outputfile.pdf');


    Вариант с FPDM:
    $pdf = new FPDM('template.pdf');
    $pdf->Load(array("field" => "value"), false); // second parameter: false if field values are in ISO-8859-1, true if UTF-8
    $pdf->Merge();
    $pdf->Output();


    Вариант с xfdf файлом:
    function createXFDF($file,$info,$enc='UTF-8'){
        $data=
            '<?xml version="1.0" encoding="'.$enc.'"?>
    <xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
        <fields>';
        foreach($info as $field => $val){
            $data.='
            <field name="'.$field.'">';
            if(is_array($val)){
                foreach($val as $opt)
    //2013.01.17 - Jon Hulka - all non-ascii characters get character references
                $data.='
                <value>'.mb_encode_numericentity(htmlspecialchars($opt),array(0x0080, 0xffff, 0, 0xffff), 'UTF-8').'</value>';
            }else{
                $data.='
                <value>'.mb_encode_numericentity(htmlspecialchars($val),array(0x0080, 0xffff, 0, 0xffff), 'UTF-8').'</value>';
            }
            $data.='
            </field>';
        }
        $data.='
        </fields>
        <ids original="'.md5($file).'" modified="'.time().'" />
        <f href="'.$file.'" />
    </xfdf>';
        return $data;
    }
    
    $pdf = new FPDM('template.pdf', 'fields.fdf');
    $pdf->Merge();
    $pdf->Output();

    Вариант с программой pdftk:
    pdftk formfile.pdf fill_form fieldinfo.fdf output outputfile.pdf flatten

    Если убрать flatten поля останутся редактируемыми.
    fdf файл имеет формат:
    %FDF-1.2
    %,,oe"
    1 0 obj
    <<
    /FDF << /Fields [
    << /T (CheckBox1) /V /A>>
    << /T (CheckBox2) /V /Off>>
    << /T (CheckBox3) /V /Off>>
    << /T (ComboBox1) /V (Option 1)>>
    << /T (ListBox1) /V (Item2)>>
    << /T (MultiLineText1) 
    /V (This is a Multi-line text box. Note that the text wraps around to the next line!)>>
    << /T (RadioGroup1) /V /Yes>>
    << /T (TextBox1) /V (Sample Text)>>
    ]
    /F (testfile.pdf)>>
    >>
    endobj
    trailer
    <<
    /Root 1 0 R
    >>
    %%EOF


    Вариант со встроенным javascript и скриптом addjstopdf.py (заполнение полей внутри просмотрщика с помощью javascript, поля остаются редактируемыми, работает в adobe reader, foxit, x-pdf, не работает в google chrome, едва ли работает в firefox, не работает в линуксе):
    <?php
    class Helper_Pdf {
    
        protected function build_pdf_javascript(array $fields) {
            $js = "app.alert({cMsg: \"Please fill out this form.\",cTitle: \"Title\", nIcon: 3});";
            foreach ( $fields as $key => $value) {
                if ( $value === null ) {
                    $value = '';
                }
                $encodedValue = json_encode($value);
                $encodedValue = str_replace("\\u", "\\\\u", $encodedValue);
                $keyEncode = str_replace("\\u", "\\\\u", json_encode($key));
                $js .= " if ( this.getField($keyEncode) != null) {
                this.getField($keyEncode).value=$encodedValue;
                }
                ";
            }
    
            return $js;
        }
    
        function escapeJs($js) {
            $js = str_replace("(","\\(",$js);
            $js = str_replace(")","\\)",$js);
            $js = str_replace("/","\\/",$js);
            $js = str_replace("\r\n","\\r\\n",$js);
            return $js;
        }
        public function generate(){
    
            $addJsToPdfFilePath = DOCROOT . "plugins/addjstopdf/addjstopdf.py";
            $sourcePdf = DOCROOT . "data/pdf/rental_contract.pdf";
            $embeddedJsPath = DOCROOT . "data/pdf/js/" . uniqid().".js";
    
            $fields =
            array(
            'field1' => 'value'
            'field2' => 'value2'
            );
    
            $embeddedJs = $this->build_pdf_javascript($fields);
            file_put_contents($embeddedJsPath,$this->escapeJs($embeddedJs));
            $outFilePath = DOCROOT . "data/pdf/temp/" .  uniqid().".pdf";
            $pythonPath = Kohana::$is_windows ? "c:\\Python27\\python2.exe" : "/usr/bin/python2";
            $command = "$pythonPath $addJsToPdfFilePath -f $embeddedJsPath $sourcePdf $outFilePath";
            $command = str_replace( "\\","/", $command);
            system($command);
        }
    }


    Все варианты, кроме javascript, плохо работают с юникодом.
    Ответ написан
  • Как в Yii2 создать правило валидации при условии "ИЛИ"?

    SamDark
    @SamDark
    Yii2 core team
    public function rules()
    {
        return [
            [['email', 'phone'], 'atLeastOneRequired'],
        ];
    }
    
    public function atLeastOneRequired($attribute, $params)
    {
        if (empty($this->email) && empty($this->phone)) {
                $this->addError($attribute, 'Please enter either email or phone.');
            }
    }
    Ответ написан
  • Как удалить все записи с одинаковыми полями?

    SagePtr
    @SagePtr
    Еда - это святое
    Как-то так:
    INSERT IGNORE INTO table_name_copy SELECT * FROM table_name;

    Где table_name_copy - это копия таблицы, но пустая и с уникальным индексом на полях, которые должны быть уникальны.
    После этого исходную таблицу можно будет удалить и копию переименовать в оригинал.
    Ответ написан
  • Как настроить Rules() для модели в Yii2

    Для автора, скорее всего, вопрос уже не актуален, но может кому-нибудь это пригодится.
    Столкнулся с такой же проблемой. Решил следующим образом, причём средствами дефолтного валидатора:
    1. копируем поле $model->username в $model->oldUsername.
    2. в rules пишем следующее:
    public function rules() {
        return [
            //...
            ['username', 'unique', 'targetClass' => Users::className(), 'message' => 'Имя пользователя уже занято', 'filter' => ['!=', 'username', $this->oldUsername]],
            //...
        ];
    }

    Собственно, вот страница документации, которая помогла решить проблему: www.yiiframework.com/doc-2.0/yii-validators-unique...
    Ответ написан