Jump to content

valan

Members
  • Posts

    303
  • Joined

  • Last visited

Posts posted by valan

  1. On 7/2/2022 at 12:23 PM, bernhard said:

    Is anything missing for that to work from the PW side? Couldn't you just create such a docker compose file and share it with the community?

    https://mariadb.com/kb/en/setting-up-a-lamp-stack-with-docker-compose/

    From the PW side the install option is missing) I've created one for my own purposes and happy to share with the community: https://bitbucket.org/valieand/pw 

    Someone who has more time and competence can fork and polish it in order to add to official install options. 

    • Like 3
  2. Thank you to all replied. Unfortunately all suggested options require either extra tools (like ddev) and/or time to read, follow X instructions one-by-one, etc.

    I still think that PW should has official install option that 1) enables ready-to-serve PW in one-line command, e.g. smth like "git clone ... & docker-compose -up d" 2) has Nginx, PHP-FPM and MySql under the hood. From marketing perspective it should be the best option to engage newcomers with no extra time to dive deeper in the very beginning.

    @ryan what do you think?)

  3. Hi! Thank you for responses. It's clear how to access PW from external PHP script. What's not clear yet is what would be a right setup in my case. As far as I understand, first, PW should be included in vendor directory via "composer require processwire/processwire"; second, it should be installed (e.g. direct some subdomain like pw.mydomain.com to index.php).  Correct?

  4. @BitPoet thank you for link. Haven't heard about this setting, as well as about FileCompiler=?

    Checked. Doesn't help. As far as I understand, because PHP compiler already declared class earlier.

    Looks like in my case Order_Status.class.php should not be required_once as soon as it has been compiled somewhere before + class is in use already.

    Or (I guess) Order_Status.class.php should never be compiled. But this scenario looks ugly to me as there are a lot of files that I need to prevent from compilation...).

  5. I'm trying to upgrade PW from 2.8 to 3.0 and get:

    Compile Error: Cannot declare class Order\Order_Status, because the name is already in use (line 6 of /path-to-file/Order_Status.class.php) 

    File Order_Status.class.php:

    <?php
    namespace Order;
    
    require_once('SomeClass.php');
    
    class Order_Status {
       // ...
    }
    ?>

    File where compiler breaks Master_Order.class.php:

    <?php
    namespace MM\User\Master;
    
    require_once('/path-to-file/Order_Status.class.php');
    
    use Order\Order_Status;
    
    class Master_Order {
       // ...
    }

     

    I've checked FileCompiler cache and discovered that:

    • Order_Status.class.php is compiled as expected (e.g. there is 'SomeClass.php' wrapped by file compiler)
    • Master_Order.class.php is uncompiled as required_once('/path-to-file/Order_Status.class.php') is not wrapped

    Most probably conflict appears as a result of Order_Status.class.php compilation and its usage at early stage (this class is used both in modules and in template files).

    So my question is - how to fix compiler error in this case?

  6. @AndZyk thanks.

    Yes, there are associative and regular arrays used for selectors. It is exactly a reason of the question - how to merge them and get one:

    $selector1 = 'template=basic-page|product';
    $selector2 = [
      'title|body%=' => $sanitizer->text($input->get('q')),
    ];
    $selector3 = [
      ['categories', '=', $input->get('categories'), 'int'],
      ['sort', '-created']
    ]
    
    $selector = mergeSelectors($selector1, $selector2, $selector3); // <- I need this kind of method
    $results = $pages->find($selector);

     

  7. At our site we use both email and phone authorizations at frontend. To make life easier, I've developed HelperPhone pack that handles phone numbers. This pack includes following modules for ProcessWire CMS/CMF:

    • FieldtypePhoneNumber: module that stores phone numbers
    • InputfieldPhoneNumber: module that renders inputfield for phone numbers
    • HelperPhone: module that loads PhoneNumber and PhoneNumberConst classes, and 'libphonenumber' namespace

    All these modules require included PW WireData-derived class PhoneNumber and PhoneNumberConst.

    • PhoneNumber class is a thin wrapper over giggsey/libphonenumber-for-php, itself is port of Google's libphonenumber.
    • PhoneNumberConst class stores constants, used by PhoneNumber class

    Usage: PhoneNumber class

    $phone = '8 (916) 318-07-29 ext 1234'; // input string could be in any phone-recognizable format
    $phoneNumber = new PhoneNumber($phone, 'RU');
    // or wire('modules')->get('HelperPhone')->makePhoneNumber($phone, 'RU');
    
    echo ($phoneNumber->isValidNumber() ? 'Yes':'No');
    // Yes
    
    echo ($phoneNumber->isValidNumberForRegion($regionCode) ? 'Yes':'No');
    // Yes
    
    echo $phoneNumber->getNumberTypeTitle();
    // Mobile
    
    echo $phoneNumber->getCountryCode();
    // 7
    
    echo $phoneNumber->getRegionCode();
    // RU
    
    echo $phoneNumber->getNationalNumber();
    // 9163180729
    
    echo $phoneNumber->getExtension();
    // 1234
    
    echo $phoneNumber->formatForCallingFrom('US')
    // 011 7 916 318-07-28
    
    echo $phoneNumber->formatForCallingFrom('GE')
    // 00 7 916 318-07-28


    For more methods and properties please refer to PhoneNumber and PhoneNumberConst source files. Need more? Check giggsey/libphonenumber-for-php and use it by accessing $phoneNumber->phoneNumber property - it is instance of \libphonenumber\PhoneNumber or null (if empty).

    Usage: field

    Note: on field creation, make sure that you've configured field settings

    Default region: assumed region if input phone number string is not in international format (starts with '+', etc)
    Enabled/disabled phone extentions: if disabled, phone extension will be removed on field save.
    Phone field settings in example below: default region code 'RU', phone extensions are enabled

    echo $page->phone;
    // +79163180729
    // Note1: $page->phone stores instance of PhoneNumber and renders to string in E164 format.
    // Note2: E164 format does not include extension.
    
    echo $page->getFormatted('phone');
    // +7 916 318-07-29 ext. 1234
    
    echo $page->getUnformatted('phone');
    // +79163180729
    
    echo $page->phone->format(PhoneNumberConst::RFC3966);
    // tel:+7-916-318-07-29;ext=1234
    
    echo $page->phone->getNationalNumber();
    // 9163180729

    Usage: PW selectors

    FieldtypePhoneNumber is instance of FieldtypeText. It stores phone numbers and extensions as string in E164 format with #extention (if provided by user and enabled in settings) E.g. in db it looks like this: '+79163180729#1234'. This makes it easy to query fields as any text field.

    echo $pages->find([
        'template' => 'my_temlate',
        'phone^=' => '+79163180729',
    ]);
    // will echo page ids where phone starts with '+79163180729'

    Finally

    I've decided to put it here first and later to Modules directory (based on your feedbacks).

    GitHub: https://github.com/valieand/HelperPhone

    Enjoy :)

    • Like 12
  8. There is excellent article here https://processwire.com/docs/tutorials/using-custom-page-types-in-processwire/ by @LostKobrakai that describes how to use custom page types and extend the Page class.

    Q: How to extend (e.g. w/o hooks, using method described in article) core Users and User classes and reload $users and $user api variables (they are locked) with new/extended classes? Currently I think about changing User to MyUser class in systems tab (e.g. set another class to be used for 'user' template) and installing module like below. As you can see it adds $myusers and $myuser api variables but I'm not sure that it won't conflict with core.

     

    // MyUsers.php
    class MyUsers extends Users {
    
        public function __construct(ProcessWire $wire, $templates = array(), $parents = array()) {
            parent::__construct($wire, $templates, $parents);
            $this->setPageClass('MyUser');
        }
    
        // my non-overlapping methods here ...
    }
    
    // MyUser.php
    class MyUser extends User {
        // my non-overlapping methods here ...
    }
    
    class ResourceUser extends WireData implements Module {
        public static function getModuleInfo() {
            return [
                'title'    => 'Extend Users and User',
                'version'  => 100,
                'autoload' => true,
                'singular' => true,
            ];
        }
    
        public function __construct() {
            require_once(dirname(__FILE__) . '/MyUsers.php');
            require_once(dirname(__FILE__) . '/MyUser.php');
        }
    
        public function init() {
            $pagesType = new MyUsers($this->wire);
            $this->wire('myusers', $pagesType, true);
    
            $page = new MyUser;
            $this->wire('myuser', $page, true);
        }
    }


     

  9. @Robin S @LostKobrakai  thanks. This method looks like a right method for input-specific js/css. It creates config under $this->attr('id') on initial page load... but now w/o values. Looks like when Ajax visibility is set, PW knows $this->attr('id') but doesn't know $this->my_config_key and $this->attr('value'). How to get these values in this method when Ajax visibility is set? P.S. If visibility set to "Open", everything works OK, e.g. it does not work with 2 Ajax visibility options.

    public function renderReady(Inputfield $parent = null, $renderValueMode = false) {
        $this->config->js($this->attr('id'), [
            'config' => [
                'my_config_key' => $this->my_config_key,     // = null (it's an inputfield config parameter)
                'pageId'  => $this->attr('value'),     // = 0 (it's a page id from InputfieldPage)
            ],
         ]);
         parent::renderReady($parent, $renderValueMode);
    }

     

     

  10. @arjen thanks. I guess that such kind of errors like "endless loops somewhere in the core" require line-by-line execution debugger in order to find where it occurs. Not sure that Tracy may help here, but will give it a try.

    I also think its a core issue, not site-specific. Could you check it in admin? - move any page under any user (preliminary make sure you've enabled 'may have children' in user template). Page will be moved, but spinner will continue to run, blocking any further work in admin, so you'll need to create a new session (restart browser/login again).

  11. Code below works everywhere else, except if applied to pages in Admin tree. Specifically, I change parent to some 'user-car' pages and place them under some 'user' page in admin tree.

    $page->of(false);
    $page->parent = $some_user_page;
    $page->save();

    $page->save() freezes, e.g. method does not not return any value/looks like in falls in endless loop somewhere inside. It also does not generate any errors.

    As it happens only in Admin tree (everywhere else it works), root cause could be:

    (1) in template settings (I've checked and didn't found any "restrictions", e.g. 'user-car' pages can be freely moved, 'user' may have children) or

    (2) in core code, somewhere in Page::save()

    Please, advise how to fix this issue.

  12. Well, specifically, I'm interested to know how to pass js to the page on ajax call. Currently ajax-driven inputfields work only for fields that do not set js inside render(). But what to do if I have such code in render()?

            $this->wire('config')->js($this->attr('id'), [
                'config' => $my_array,
            ]); 

    Moving it to init() does not work, as $this->attr('id') is not set at that moment.

    Adding js script (with <script>my_js_code_that_sets_config();</script>) to redner() output also does not work - script tags are removed by PW.

    P.S. Just in case if it matters - I'm developing inputfield for FieldtypePage, e.g. it is added to InputfieldPage inputfieldClasses setting.

×
×
  • Create New...